From 0336b18a626eb621b7da79deb09f05c8dbc4156c Mon Sep 17 00:00:00 2001
From: jespergravgaard <jesper@balmangravgaard.dk>
Date: Wed, 5 Feb 2020 00:45:08 +0100
Subject: [PATCH] Working on new ValueSource based unwinding!

A few __ptr__ problems in test outputs remain.
---
 .../model/StructVariableMemberUnwinding.java  |   8 +-
 .../kickc/passes/Pass1UnwindStructValues.java |  38 +-
 .../kickc/passes/unwinding/ValueSource.java   |   4 +-
 .../passes/unwinding/ValueSourceConstant.java |   4 +-
 .../ValueSourcePointerDereferenceIndexed.java | 101 +++++
 .../ValueSourcePointerDereferenceSimple.java  | 123 ++----
 ...Variable.java => ValueSourceVariable.java} |  27 +-
 .../passes/unwinding/ValueSourceZero.java     |   9 +-
 .../ref/complex/clearscreen/clearscreen.log   |   2 +-
 .../ref/complex/splines/truetype-splines.cfg  |  20 +-
 .../ref/complex/splines/truetype-splines.log  | 414 ++++++++----------
 .../ref/complex/splines/truetype-splines.sym  |  12 +-
 src/test/ref/struct-19.log                    |   8 +-
 src/test/ref/struct-20.log                    |   4 +-
 src/test/ref/struct-35.log                    |   2 +-
 src/test/ref/struct-39.asm                    |   2 +-
 src/test/ref/struct-39.cfg                    |   4 +-
 src/test/ref/struct-39.log                    |  69 ++-
 src/test/ref/struct-39.sym                    |   4 +-
 src/test/ref/struct-41.log                    |   4 +-
 src/test/ref/struct-42.log                    |   2 +-
 src/test/ref/struct-8.log                     |  17 +-
 src/test/ref/struct-9.log                     |  24 +-
 src/test/ref/struct-9.sym                     |   1 +
 src/test/ref/struct-ptr-10.log                |   2 +-
 src/test/ref/struct-ptr-11.log                |   2 +-
 src/test/ref/struct-ptr-18.log                |   4 +-
 src/test/ref/struct-ptr-9.log                 |   2 +-
 28 files changed, 468 insertions(+), 445 deletions(-)
 create mode 100644 src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java
 rename src/main/java/dk/camelot64/kickc/passes/unwinding/{ValueSourceStructVariable.java => ValueSourceVariable.java} (72%)

diff --git a/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java b/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java
index 9e65ec547..e8d591200 100644
--- a/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java
+++ b/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java
@@ -52,7 +52,7 @@ public class StructVariableMemberUnwinding {
       StructDefinition structDefinition;
 
       /** Maps member names to the unwound variables. */
-      Map<String, RValue> memberUnwinding;
+      Map<String, SymbolVariableRef> memberUnwinding;
 
       public VariableUnwinding(StructDefinition structDefinition) {
          this.structDefinition = structDefinition;
@@ -60,7 +60,7 @@ public class StructVariableMemberUnwinding {
       }
 
       /** Set how a member variable was unwound to a specific (new) variable. */
-      public void setMemberUnwinding(String memberName, RValue memberVariableUnwound) {
+      public void setMemberUnwinding(String memberName, SymbolVariableRef memberVariableUnwound) {
          this.memberUnwinding.put(memberName, memberVariableUnwound);
       }
 
@@ -68,6 +68,10 @@ public class StructVariableMemberUnwinding {
          return new ArrayList<>(memberUnwinding.keySet());
       }
 
+      public SymbolVariableRef getMemberUnwound(String memberName) {
+         return memberUnwinding.get(memberName);
+      }
+
       @Override
       public RValueUnwinding getMemberUnwinding(String memberName, ProgramScope programScope) {
          return new RValueUnwinding() {
diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java
index 813fb7f40..0e6bb347b 100644
--- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java
+++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java
@@ -225,11 +225,12 @@ public class Pass1UnwindStructValues extends Pass1Base {
 
          // Check for bulk assignable values
          if(isBulkAssignable(lValue) && isBulkAssignable(rValue)) {
-            RValueUnwinding lValueUnwinding = getValueUnwinding(lValue, assignment, stmtIt, currentBlock);
-            RValueUnwinding rValueUnwinding = getValueUnwinding(rValue, assignment, stmtIt, currentBlock);
-            unwindAssignment(lValueUnwinding, rValueUnwinding, null, stmtIt, initialAssignment, source);
-            stmtIt.remove();
-            return true;
+            throw new InternalError("E!");
+            //RValueUnwinding lValueUnwinding = getValueUnwinding(lValue, assignment, stmtIt, currentBlock);
+            //RValueUnwinding rValueUnwinding = getValueUnwinding(rValue, assignment, stmtIt, currentBlock);
+            //unwindAssignment(lValueUnwinding, rValueUnwinding, null, stmtIt, initialAssignment, source);
+            //stmtIt.remove();
+            //return true;
          }
 
          // Check for struct unwinding
@@ -268,7 +269,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
    }
 
    private boolean copyValues(ValueSource lValueSource, ValueSource rValueSource, List<RValue> lValueUnwoundList, boolean initialAssignment, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
-      if(lValueSource==null || rValueSource==null)
+      if(lValueSource == null || rValueSource == null)
          return false;
       if(lValueSource.isSimple() && rValueSource.isSimple()) {
          stmtIt.previous();
@@ -299,8 +300,8 @@ public class Pass1UnwindStructValues extends Pass1Base {
       } else if(lValueSource.isUnwindable() && rValueSource.isUnwindable()) {
          getLog().append("Unwinding value copy " + currentStmt.toString(getProgram(), false));
          for(String memberName : lValueSource.getMemberNames(getScope())) {
-            ValueSource lValueSubSource = lValueSource.getMemberUnwinding(memberName, getScope(), currentStmt, currentBlock, stmtIt);
-            ValueSource rValueSubSource = rValueSource.getMemberUnwinding(memberName, getScope(), currentStmt, currentBlock, stmtIt);
+            ValueSource lValueSubSource = lValueSource.getMemberUnwinding(memberName, getProgram(), getScope(), currentStmt, currentBlock, stmtIt);
+            ValueSource rValueSubSource = rValueSource.getMemberUnwinding(memberName, getProgram(), getScope(), currentStmt, currentBlock, stmtIt);
             boolean success = copyValues(lValueSubSource, rValueSubSource, lValueUnwoundList, initialAssignment, currentStmt, currentBlock, stmtIt);
             if(!success)
                throw new InternalError("Error during value unwinding copy! ", currentStmt);
@@ -312,6 +313,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
 
    /**
     * Get a value source for copying a value
+    *
     * @param value The value being copied
     * @param currentStmt The current statement
     * @param stmtIt The statement iterator
@@ -321,14 +323,24 @@ public class Pass1UnwindStructValues extends Pass1Base {
    private ValueSource getValueSource(Value value, Statement currentStmt, ListIterator<Statement> stmtIt, ControlFlowBlock currentBlock) {
       if(value instanceof VariableRef) {
          Variable variable = getScope().getVariable((VariableRef) value);
-         if(variable.isStructClassic()) {
-            return new ValueSourceStructVariable(variable);
+         if(variable.getType() instanceof SymbolTypeStruct) {
+            return new ValueSourceVariable(variable);
          }
       }
       if(value instanceof StructZero)
          return new ValueSourceZero(((StructZero) value).getTypeStruct(), null);
       if(value instanceof ConstantStructValue)
          return new ValueSourceConstant(((ConstantStructValue) value).getType(getScope()), null, (ConstantStructValue) value);
+      if(value instanceof PointerDereferenceSimple)
+         return new ValueSourcePointerDereferenceSimple((PointerDereferenceSimple) value, SymbolTypeInference.inferType(getScope(), (RValue) value), null);
+      if(value instanceof PointerDereferenceIndexed)
+         return new ValueSourcePointerDereferenceIndexed((PointerDereferenceIndexed) value, SymbolTypeInference.inferType(getScope(), (RValue) value), null);
+      if(value instanceof StructMemberRef) {
+         final RValue structValue = ((StructMemberRef) value).getStruct();
+         final ValueSource structValueSource = getValueSource(structValue, currentStmt, stmtIt, currentBlock);
+         final ValueSource structMemberSource = structValueSource.getMemberUnwinding(((StructMemberRef) value).getMemberName(), getProgram(), getScope(), currentStmt, currentBlock, stmtIt);
+         return structMemberSource;
+      }
       return null;
    }
 
@@ -431,7 +443,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
                final PointerDereferenceIndexed structPointerDerefIdx = (PointerDereferenceIndexed) structMemberRef.getStruct();
                final SymbolType structPointerType = SymbolTypeInference.inferType(getScope(), structPointerDerefIdx);
                if(!(structPointerType instanceof SymbolTypeStruct))
-                  throw new CompileError("Value is not a struct"+structPointerDerefIdx.toString(getProgram()), currentStmt);
+                  throw new CompileError("Value is not a struct" + structPointerDerefIdx.toString(getProgram()), currentStmt);
 
                final StructDefinition structDefinition = ((SymbolTypeStruct) structPointerType).getStructDefinition(getScope());
                final String memberName = structMemberRef.getMemberName();
@@ -483,7 +495,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
                   return new StructUnwindingVariable(variable, structDefinition);
                }
             } else if(value instanceof StructMemberRef && ((StructMemberRef) value).getStruct() instanceof VariableRef) {
-               getLog().append("Postponing unwinding for "+currentStmt.toString(getProgram(), false));
+               getLog().append("Postponing unwinding for " + currentStmt.toString(getProgram(), false));
                return POSTPONE_UNWINDING;
             } else if(value instanceof PointerDereferenceSimple) {
                return new StructUnwindingPointerDerefSimple((PointerDereferenceSimple) value, structDefinition, stmtIt, currentBlock, currentStmt);
@@ -491,7 +503,7 @@ public class Pass1UnwindStructValues extends Pass1Base {
                return new StructUnwindingPointerDerefIndexed((PointerDereferenceIndexed) value, structDefinition, stmtIt, currentBlock, currentStmt);
             } else if(value instanceof StructMemberRef && ((StructMemberRef) value).getStruct() instanceof PointerDereferenceIndexed) {
                final StructMemberRef structMemberRef = (StructMemberRef) value;
-               return new StructUnwindingMemberOfPointerDerefIndexed((PointerDereferenceIndexed) structMemberRef.getStruct(),structMemberRef.getMemberName(), structDefinition, stmtIt, currentBlock, currentStmt);
+               return new StructUnwindingMemberOfPointerDerefIndexed((PointerDereferenceIndexed) structMemberRef.getStruct(), structMemberRef.getMemberName(), structDefinition, stmtIt, currentBlock, currentStmt);
             } else if(value instanceof ConstantStructValue) {
                return new StructUnwindingConstant((ConstantStructValue) value, structDefinition);
             } else if(value instanceof StructZero) {
diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java
index c8bb5e233..40c27afa8 100644
--- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java
+++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java
@@ -1,6 +1,7 @@
 package dk.camelot64.kickc.passes.unwinding;
 
 import dk.camelot64.kickc.model.ControlFlowBlock;
+import dk.camelot64.kickc.model.Program;
 import dk.camelot64.kickc.model.statements.Statement;
 import dk.camelot64.kickc.model.symbols.ArraySpec;
 import dk.camelot64.kickc.model.symbols.ProgramScope;
@@ -80,12 +81,13 @@ public interface ValueSource {
     * Get a sub value source for one member to use for copying that member.
     *
     * @param memberName The member name
+    * @param program
     * @param programScope The program scope
     * @param currentStmt
     * @param currentBlock
     * @param stmtIt
     * @return The unwinding of the member
     */
-   ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt);
+   ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt);
 
 }
diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java
index 3f31d20b2..b684a79de 100644
--- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java
+++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java
@@ -1,7 +1,7 @@
 package dk.camelot64.kickc.passes.unwinding;
 
 import dk.camelot64.kickc.model.ControlFlowBlock;
-import dk.camelot64.kickc.model.operators.OperatorSizeOf;
+import dk.camelot64.kickc.model.Program;
 import dk.camelot64.kickc.model.statements.Statement;
 import dk.camelot64.kickc.model.symbols.*;
 import dk.camelot64.kickc.model.types.SymbolType;
@@ -44,7 +44,7 @@ public class ValueSourceConstant extends ValueSourceBase {
    }
 
    @Override
-   public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
+   public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
       StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope);
       ConstantStructValue constantStructValue = (ConstantStructValue) value;
       final Variable member = structDefinition.getMember(memberName);
diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java
new file mode 100644
index 000000000..23721c08f
--- /dev/null
+++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java
@@ -0,0 +1,101 @@
+package dk.camelot64.kickc.passes.unwinding;
+
+import dk.camelot64.kickc.model.ControlFlowBlock;
+import dk.camelot64.kickc.model.InternalError;
+import dk.camelot64.kickc.model.Program;
+import dk.camelot64.kickc.model.operators.Operators;
+import dk.camelot64.kickc.model.statements.Statement;
+import dk.camelot64.kickc.model.statements.StatementAssignment;
+import dk.camelot64.kickc.model.symbols.*;
+import dk.camelot64.kickc.model.types.SymbolType;
+import dk.camelot64.kickc.model.types.SymbolTypePointer;
+import dk.camelot64.kickc.model.types.SymbolTypeStruct;
+import dk.camelot64.kickc.model.values.*;
+import dk.camelot64.kickc.passes.PassNStructPointerRewriting;
+
+import java.util.ListIterator;
+
+/** Unwinding for a indexed pointer deref. */
+public class ValueSourcePointerDereferenceIndexed extends ValueSourceBase {
+
+   private final PointerDereferenceIndexed pointerDereferenceIndexed;
+   /** The type of the value. */
+   private SymbolType valueType;
+   /** The array spec of the value. */
+   private final ArraySpec valueArraySpec;
+
+   public ValueSourcePointerDereferenceIndexed(PointerDereferenceIndexed pointerDereferenceIndexed, SymbolType valueType, ArraySpec valueArraySpec) {
+      this.pointerDereferenceIndexed = pointerDereferenceIndexed;
+      this.valueType = valueType;
+      this.valueArraySpec = valueArraySpec;
+   }
+
+   @Override
+   public SymbolType getSymbolType() {
+      return valueType;
+   }
+
+   @Override
+   public ArraySpec getArraySpec() {
+      return valueArraySpec;
+   }
+
+   @Override
+   protected boolean isStructClassic() {
+      return getSymbolType() instanceof SymbolTypeStruct;
+   }
+
+   @Override
+   public RValue getSimpleValue(ProgramScope programScope) {
+      if(getArraySpec() != null) {
+         // For arrays return the pointer to the array - not the deref
+         //return pointerDereferenceIndexed.getPointer();
+         // Maybe return pointer + index ?
+         throw new InternalError("Not implemented! ");
+      } else {
+         return pointerDereferenceIndexed;
+      }
+   }
+
+   @Override
+   public LValue getBulkLValue(ProgramScope scope) {
+      return pointerDereferenceIndexed;
+   }
+
+   @Override
+   public RValue getBulkRValue(ProgramScope scope) {
+      return new MemcpyValue(pointerDereferenceIndexed, getByteSize(scope), getSymbolType());
+   }
+
+   @Override
+   public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
+      StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope);
+      final SymbolType memberType = structDefinition.getMember(memberName).getType();
+      final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec();
+      ConstantRef memberOffsetConstant = PassNStructPointerRewriting.getMemberOffsetConstant(programScope, structDefinition, memberName);
+      // Simple member value - unwind to value of member *((type*)&struct + OFFSET_MEMBER)
+      final RValue structPointer = pointerDereferenceIndexed.getPointer();
+      if(structPointer instanceof ConstantValue) {
+         // Pointer to member type
+         ConstantCastValue structTypedPointer = new ConstantCastValue(new SymbolTypePointer(memberType), (ConstantValue) structPointer);
+         // Calculate member address  (type*)&struct + OFFSET_MEMBER
+         ConstantBinary memberPointer = new ConstantBinary(structTypedPointer, Operators.PLUS, memberOffsetConstant);
+         // Unwind to *((type*)&struct + OFFSET_MEMBER)
+         PointerDereferenceIndexed memberDeref = new PointerDereferenceIndexed(memberPointer, pointerDereferenceIndexed.getIndex());
+         return new ValueSourcePointerDereferenceIndexed(memberDeref, memberType, memberArraySpec);
+      } else {
+         Scope scope = programScope.getScope(currentBlock.getScope());
+         Variable memberAddress = scope.addVariableIntermediate();
+         memberAddress.setType(new SymbolTypePointer(memberType));
+         CastValue structTypedPointer = new CastValue(new SymbolTypePointer(memberType), structPointer);
+         // Add statement $1 = (memberType*)ptr_struct + OFFSET_MEMBER
+         stmtIt.previous();
+         stmtIt.add(new StatementAssignment((LValue) memberAddress.getRef(), structTypedPointer, Operators.PLUS, memberOffsetConstant, true, currentStmt.getSource(), currentStmt.getComments()));
+         stmtIt.next();
+         // Unwind to *((memberType*)ptr_struct+OFFSET_MEMBER)
+         PointerDereferenceIndexed memberDeref = new PointerDereferenceIndexed(memberAddress.getRef(), pointerDereferenceIndexed.getIndex());
+         return new ValueSourcePointerDereferenceIndexed(memberDeref, memberType, memberArraySpec);
+      }
+   }
+
+}
diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java
index e3591b29f..1011ce31f 100644
--- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java
+++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java
@@ -1,7 +1,7 @@
 package dk.camelot64.kickc.passes.unwinding;
 
 import dk.camelot64.kickc.model.ControlFlowBlock;
-import dk.camelot64.kickc.model.operators.OperatorSizeOf;
+import dk.camelot64.kickc.model.Program;
 import dk.camelot64.kickc.model.operators.Operators;
 import dk.camelot64.kickc.model.statements.Statement;
 import dk.camelot64.kickc.model.statements.StatementAssignment;
@@ -12,13 +12,10 @@ import dk.camelot64.kickc.model.types.SymbolTypeStruct;
 import dk.camelot64.kickc.model.values.*;
 import dk.camelot64.kickc.passes.PassNStructPointerRewriting;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 import java.util.ListIterator;
 
 /** Value Source for a pointer dereference. */
-public class ValueSourcePointerDereferenceSimple implements ValueSource {
+public class ValueSourcePointerDereferenceSimple extends ValueSourceBase {
 
    /** The pointer dereference. */
    private final PointerDereferenceSimple pointerDereference;
@@ -44,91 +41,53 @@ public class ValueSourcePointerDereferenceSimple implements ValueSource {
    }
 
    @Override
-   public boolean isSimple() {
-      return getArraySpec() == null && !(getSymbolType() instanceof SymbolTypeStruct);
-   }
-
-   @Override
-   public RValue getSimpleValue(ProgramScope programScope) {
-      if(getArraySpec() != null) {
-         // For arrays return the pointer to the array - not the deref
-         return pointerDereference.getPointer();
-      } else {
-         return pointerDereference;
-      }
-   }
-
-   @Override
-   public boolean isBulkCopyable() {
-      return getArraySpec() != null || getSymbolType() instanceof SymbolTypeStruct;
-   }
-
-   @Override
-   public LValue getBulkLValue(ProgramScope scope) {
-      RValue memberArrayPointer = pointerDereference.getPointer();
-      return new PointerDereferenceSimple(memberArrayPointer);
-   }
-
-   private ConstantValue getByteSize(ProgramScope scope) {
-      return getArraySpec() != null ? getArraySpec().getArraySize() : OperatorSizeOf.getSizeOfConstantVar(scope, getSymbolType());
-   }
-
-   @Override
-   public RValue getBulkRValue(ProgramScope scope) {
-      RValue memberArrayPointer = pointerDereference.getPointer();
-      return new MemcpyValue(new PointerDereferenceSimple(memberArrayPointer), getByteSize(scope), getSymbolType());
-   }
-
-   @Override
-   public boolean isUnwindable() {
+   protected boolean isStructClassic() {
       return getSymbolType() instanceof SymbolTypeStruct;
    }
 
    @Override
-   public List<String> getMemberNames(ProgramScope scope) {
-      if(getSymbolType() instanceof SymbolTypeStruct) {
-         StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(scope);
-         Collection<Variable> structMemberVars = structDefinition.getAllVars(false);
-         ArrayList<String> memberNames = new ArrayList<>();
-         for(Variable structMemberVar : structMemberVars) {
-            memberNames.add(structMemberVar.getLocalName());
-         }
-         return memberNames;
-      } else {
-         return null;
-      }
+   public RValue getSimpleValue(ProgramScope programScope) {
+      return pointerDereference;
    }
 
    @Override
-   public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
-      if(getSymbolType() instanceof SymbolTypeStruct) {
-         StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope);
-         final SymbolType memberType = structDefinition.getMember(memberName).getType();
-         final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec();
-         ConstantRef memberOffsetConstant = PassNStructPointerRewriting.getMemberOffsetConstant(programScope, structDefinition, memberName);
-         // Simple member value - unwind to value of member *((type*)&struct + OFFSET_MEMBER)
-         final RValue structPointer = pointerDereference.getPointer();
-         if(structPointer instanceof ConstantValue) {
-            // Pointer to member type
-            ConstantCastValue structTypedPointer = new ConstantCastValue(new SymbolTypePointer(memberType), (ConstantValue) structPointer);
-            // Calculate member address  (type*)&struct + OFFSET_MEMBER
-            ConstantBinary memberPointer = new ConstantBinary(structTypedPointer, Operators.PLUS, memberOffsetConstant);
-            // Unwind to *((type*)&struct + OFFSET_MEMBER)
-            PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberPointer);
-            return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec);
-         }  else {
-            Scope scope = programScope.getScope(currentBlock.getScope());
-            Variable memberAddress = scope.addVariableIntermediate();
-            memberAddress.setType(new SymbolTypePointer(memberType));
-            CastValue structTypedPointer = new CastValue(new SymbolTypePointer(memberType), structPointer);
-            // Add statement $1 = (memberType*)ptr_struct + OFFSET_MEMBER
-            stmtIt.add(new StatementAssignment((LValue) memberAddress.getRef(), structTypedPointer, Operators.PLUS, memberOffsetConstant, true, currentStmt.getSource(), currentStmt.getComments()));
-            // Unwind to *((memberType*)ptr_struct+OFFSET_MEMBER)
-            PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberAddress.getRef());
-            return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec);
-         }
+   public LValue getBulkLValue(ProgramScope scope) {
+      return pointerDereference;
+   }
+
+   @Override
+   public RValue getBulkRValue(ProgramScope scope) {
+      return new MemcpyValue(pointerDereference, getByteSize(scope), getSymbolType());
+   }
+
+   @Override
+   public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
+      StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope);
+      final SymbolType memberType = structDefinition.getMember(memberName).getType();
+      final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec();
+      ConstantRef memberOffsetConstant = PassNStructPointerRewriting.getMemberOffsetConstant(programScope, structDefinition, memberName);
+      // Simple member value - unwind to value of member *((type*)&struct + OFFSET_MEMBER)
+      final RValue structPointer = pointerDereference.getPointer();
+      if(structPointer instanceof ConstantValue) {
+         // Pointer to member type
+         ConstantCastValue structTypedPointer = new ConstantCastValue(new SymbolTypePointer(memberType), (ConstantValue) structPointer);
+         // Calculate member address  (type*)&struct + OFFSET_MEMBER
+         ConstantBinary memberPointer = new ConstantBinary(structTypedPointer, Operators.PLUS, memberOffsetConstant);
+         // Unwind to *((type*)&struct + OFFSET_MEMBER)
+         PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberPointer);
+         return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec);
       } else {
-         return null;
+         Scope scope = programScope.getScope(currentBlock.getScope());
+         Variable memberAddress = scope.addVariableIntermediate();
+         memberAddress.setType(new SymbolTypePointer(memberType));
+         CastValue structTypedPointer = new CastValue(new SymbolTypePointer(memberType), structPointer);
+         // Add statement $1 = (memberType*)ptr_struct + OFFSET_MEMBER
+         stmtIt.previous();
+         stmtIt.add(new StatementAssignment((LValue) memberAddress.getRef(), structTypedPointer, Operators.PLUS, memberOffsetConstant, true, currentStmt.getSource(), currentStmt.getComments()));
+         stmtIt.next();
+         // Unwind to *((memberType*)ptr_struct+OFFSET_MEMBER)
+         PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberAddress.getRef());
+         return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec);
       }
    }
 }
diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceStructVariable.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceVariable.java
similarity index 72%
rename from src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceStructVariable.java
rename to src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceVariable.java
index d0f4d60bd..7fc09b705 100644
--- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceStructVariable.java
+++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceVariable.java
@@ -1,7 +1,9 @@
 package dk.camelot64.kickc.passes.unwinding;
 
 import dk.camelot64.kickc.model.ControlFlowBlock;
-import dk.camelot64.kickc.model.operators.OperatorSizeOf;
+import dk.camelot64.kickc.model.InternalError;
+import dk.camelot64.kickc.model.Program;
+import dk.camelot64.kickc.model.StructVariableMemberUnwinding;
 import dk.camelot64.kickc.model.operators.Operators;
 import dk.camelot64.kickc.model.statements.Statement;
 import dk.camelot64.kickc.model.symbols.ArraySpec;
@@ -14,18 +16,15 @@ import dk.camelot64.kickc.model.types.SymbolTypeStruct;
 import dk.camelot64.kickc.model.values.*;
 import dk.camelot64.kickc.passes.PassNStructPointerRewriting;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 import java.util.ListIterator;
 
 /** Value Source for a variable */
-public class ValueSourceStructVariable extends ValueSourceBase {
+public class ValueSourceVariable extends ValueSourceBase {
 
    /** The variable. */
    private final Variable variable;
 
-   public ValueSourceStructVariable(Variable variable) {
+   public ValueSourceVariable(Variable variable) {
       this.variable = variable;
    }
 
@@ -46,7 +45,9 @@ public class ValueSourceStructVariable extends ValueSourceBase {
 
    @Override
    public RValue getSimpleValue(ProgramScope programScope) {
-      return new ConstantSymbolPointer(variable.getRef());
+      // Historically this returned a pointer - why?
+      //return new ConstantSymbolPointer(variable.getRef());
+      return variable.getRef();
    }
 
    @Override
@@ -63,8 +64,8 @@ public class ValueSourceStructVariable extends ValueSourceBase {
    }
 
    @Override
-   public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
-      if(getSymbolType() instanceof SymbolTypeStruct) {
+   public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
+      if(variable.isStructClassic()) {
          StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope);
          final SymbolType memberType = structDefinition.getMember(memberName).getType();
          final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec();
@@ -78,8 +79,14 @@ public class ValueSourceStructVariable extends ValueSourceBase {
          // Unwind to *((type*)&struct + OFFSET_MEMBER)
          PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberPointer);
          return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec);
+      } else if(variable.isStructUnwind()) {
+         StructVariableMemberUnwinding structVariableMemberUnwinding = program.getStructVariableMemberUnwinding();
+         final StructVariableMemberUnwinding.VariableUnwinding variableUnwinding = structVariableMemberUnwinding.getVariableUnwinding(variable.getRef());
+         final SymbolVariableRef memberUnwound = variableUnwinding.getMemberUnwound(memberName);
+         final Variable memberVariable = programScope.getVar(memberUnwound);
+         return new ValueSourceVariable(memberVariable);
       } else {
-         return null;
+         throw new InternalError("Not implemented!");
       }
    }
 
diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java
index d22b8637a..c85cf9de4 100644
--- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java
+++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java
@@ -3,22 +3,17 @@ package dk.camelot64.kickc.passes.unwinding;
 import dk.camelot64.kickc.model.ControlFlowBlock;
 import dk.camelot64.kickc.model.Initializers;
 import dk.camelot64.kickc.model.InternalError;
-import dk.camelot64.kickc.model.operators.OperatorSizeOf;
+import dk.camelot64.kickc.model.Program;
 import dk.camelot64.kickc.model.statements.Statement;
 import dk.camelot64.kickc.model.symbols.ArraySpec;
 import dk.camelot64.kickc.model.symbols.ProgramScope;
 import dk.camelot64.kickc.model.symbols.StructDefinition;
-import dk.camelot64.kickc.model.symbols.Variable;
 import dk.camelot64.kickc.model.types.SymbolType;
 import dk.camelot64.kickc.model.types.SymbolTypeStruct;
-import dk.camelot64.kickc.model.values.ConstantValue;
 import dk.camelot64.kickc.model.values.LValue;
 import dk.camelot64.kickc.model.values.MemsetValue;
 import dk.camelot64.kickc.model.values.RValue;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 import java.util.ListIterator;
 
 /** Value Source for a zero value. */
@@ -53,7 +48,7 @@ public class ValueSourceZero extends ValueSourceBase {
    }
 
    @Override
-   public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
+   public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) {
       StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope);
       final SymbolType memberType = structDefinition.getMember(memberName).getType();
       final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec();
diff --git a/src/test/ref/complex/clearscreen/clearscreen.log b/src/test/ref/complex/clearscreen/clearscreen.log
index 2c0609aaa..8237159b5 100644
--- a/src/test/ref/complex/clearscreen/clearscreen.log
+++ b/src/test/ref/complex/clearscreen/clearscreen.log
@@ -42,7 +42,7 @@ Created struct value member variable (byte) startProcessing::center_y
 Created struct value member variable (byte) startProcessing::center_dist
 Converted struct value to member variables (struct ProcessingChar) startProcessing::center
 Converted procedure struct value parameter to member unwinding (void()) startProcessing((byte) startProcessing::center_x , (byte) startProcessing::center_y , (byte) startProcessing::center_dist)
-Adding struct value member variable copy *((const struct ProcessingSprite*) PROCESSING + (byte~) main::$10) ← memcpy(*(&(const struct ProcessingSprite) $2), struct ProcessingSprite, (const byte) SIZEOF_STRUCT_PROCESSINGSPRITE)
+Adding value bulk copy *((const struct ProcessingSprite*) PROCESSING + (byte~) main::$10) ← memcpy(*(&(const struct ProcessingSprite) $2), struct ProcessingSprite, (const byte) SIZEOF_STRUCT_PROCESSINGSPRITE)
 Converted procedure call LValue to member unwinding { (byte~) main::$5_x, (byte~) main::$5_y, (byte~) main::$5_dist } ← call getCharToProcess 
 Adding struct value member variable copy (byte) main::center_x ← (byte~) main::$5_x
 Adding struct value member variable copy (byte) main::center_y ← (byte~) main::$5_y
diff --git a/src/test/ref/complex/splines/truetype-splines.cfg b/src/test/ref/complex/splines/truetype-splines.cfg
index eec98ee67..e6ff0b4d1 100644
--- a/src/test/ref/complex/splines/truetype-splines.cfg
+++ b/src/test/ref/complex/splines/truetype-splines.cfg
@@ -71,10 +71,10 @@ show_letter::@1: scope:[show_letter]  from show_letter show_letter::@9
   [28] (signed word) show_letter::current_y#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_y#11 )
   [28] (signed word) show_letter::current_x#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_x#11 )
   [28] (byte) show_letter::i#10 ← phi( show_letter/(byte) 0 show_letter::@9/(byte) show_letter::i#1 )
-  [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3
-  [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10
-  [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20)
-  [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20)
+  [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3
+  [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10
+  [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20)
+  [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20)
   [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32
   [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96
   [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1
@@ -89,10 +89,10 @@ show_letter::@6: scope:[show_letter]  from show_letter::@1
   [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0
   [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64
   [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64
-  [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3
-  [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10
-  [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21)
-  [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21)
+  [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3
+  [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10
+  [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21)
+  [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21)
   [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32
   [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96
   [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1
@@ -107,8 +107,8 @@ show_letter::@7: scope:[show_letter]  from show_letter::@6
   [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1
   [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64
   [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64
-  [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3
-  [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10
+  [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3
+  [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10
   [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22)
   [64] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@3
   to:show_letter::@4
diff --git a/src/test/ref/complex/splines/truetype-splines.log b/src/test/ref/complex/splines/truetype-splines.log
index 2f028990d..23124a10e 100644
--- a/src/test/ref/complex/splines/truetype-splines.log
+++ b/src/test/ref/complex/splines/truetype-splines.log
@@ -199,47 +199,62 @@ Adding struct value member variable copy (signed word) spline_8segB::i_x ← (si
 Adding struct value member variable copy (signed word) spline_8segB::i_y ← (signed word~) spline_8segB::$29
 Adding struct value member variable copy *((signed word*~) spline_8segB::$35 + (number~) spline_8segB::$32) ← (signed word)(number~) spline_8segB::$19
 Adding struct value member variable copy *((signed word*~) spline_8segB::$36 + (number~) spline_8segB::$32) ← (signed word)(number~) spline_8segB::$21
-Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) 0
-Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) 0
-Adding struct value member variable copy (signed word) show_letter::to_x ← *((signed word*~) show_letter::$24 + (byte~) show_letter::$20)
-Adding struct value member variable copy (signed word) show_letter::to_y ← *((signed word*~) show_letter::$26 + (byte~) show_letter::$20)
+Unwinding value copy (struct SplineVector16) show_letter::current ← { x: (signed word) 0, y: (signed word) 0 }
+Adding value simple copy (signed word) show_letter::current_x ← (signed word) 0
+Adding value simple copy (signed word) show_letter::current_y ← (signed word) 0
+Unwinding value copy (struct SplineVector16) show_letter::to ← *((const struct Segment*) letter_c + (byte~) show_letter::$20).to
+Adding value simple copy (signed word) show_letter::to_x ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$20)
+Adding value simple copy (signed word) show_letter::to_y ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20)
 Adding struct value member variable copy (signed word) show_letter::to_x ← (signed word)(number~) show_letter::$0
 Adding struct value member variable copy (signed word) show_letter::to_y ← (signed word)(number~) show_letter::$1
 Converted procedure call LValue to member unwinding { (signed word~) show_letter::$2_x, (signed word~) show_letter::$2_y } ← call rotate (struct SplineVector16) show_letter::to (byte) show_letter::angle 
 Converted procedure struct value parameter to member unwinding in call { (signed word~) show_letter::$2_x, (signed word~) show_letter::$2_y } ← call rotate (signed word) show_letter::to_x (signed word) show_letter::to_y (byte) show_letter::angle 
-Adding struct value member variable copy (signed word) show_letter::to_x ← (signed word~) show_letter::$2_x
-Adding struct value member variable copy (signed word) show_letter::to_y ← (signed word~) show_letter::$2_y
+Unwinding value copy (struct SplineVector16) show_letter::to ← (struct SplineVector16~) show_letter::$2
+Adding value simple copy (signed word) show_letter::to_x ← (signed word~) show_letter::$2_x
+Adding value simple copy (signed word) show_letter::to_y ← (signed word~) show_letter::$2_y
 Adding struct value member variable copy (signed word) show_letter::to_x ← (signed word)(number~) show_letter::$3
 Adding struct value member variable copy (signed word) show_letter::to_y ← (signed word)(number~) show_letter::$4
-Adding struct value member variable copy (signed word) show_letter::via_x ← *((signed word*~) show_letter::$28 + (byte~) show_letter::$21)
-Adding struct value member variable copy (signed word) show_letter::via_y ← *((signed word*~) show_letter::$30 + (byte~) show_letter::$21)
+Unwinding value copy (struct SplineVector16) show_letter::via ← *((const struct Segment*) letter_c + (byte~) show_letter::$21).via
+Adding value simple copy (signed word) show_letter::via_x ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$21)
+Adding value simple copy (signed word) show_letter::via_y ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21)
 Adding struct value member variable copy (signed word) show_letter::via_x ← (signed word)(number~) show_letter::$5
 Adding struct value member variable copy (signed word) show_letter::via_y ← (signed word)(number~) show_letter::$6
 Converted procedure call LValue to member unwinding { (signed word~) show_letter::$7_x, (signed word~) show_letter::$7_y } ← call rotate (struct SplineVector16) show_letter::via (byte) show_letter::angle 
 Converted procedure struct value parameter to member unwinding in call { (signed word~) show_letter::$7_x, (signed word~) show_letter::$7_y } ← call rotate (signed word) show_letter::via_x (signed word) show_letter::via_y (byte) show_letter::angle 
-Adding struct value member variable copy (signed word) show_letter::via_x ← (signed word~) show_letter::$7_x
-Adding struct value member variable copy (signed word) show_letter::via_y ← (signed word~) show_letter::$7_y
+Unwinding value copy (struct SplineVector16) show_letter::via ← (struct SplineVector16~) show_letter::$7
+Adding value simple copy (signed word) show_letter::via_x ← (signed word~) show_letter::$7_x
+Adding value simple copy (signed word) show_letter::via_y ← (signed word~) show_letter::$7_y
 Adding struct value member variable copy (signed word) show_letter::via_x ← (signed word)(number~) show_letter::$8
 Adding struct value member variable copy (signed word) show_letter::via_y ← (signed word)(number~) show_letter::$9
 Adding struct value member variable copy (byte) show_letter::segment_type ← *((const struct Segment*) letter_c + (byte~) show_letter::$22).type
 Adding struct value member variable copy (struct SplineVector16) show_letter::segment_to ← (struct SplineVector16) show_letter::to
 Adding struct value member variable copy (struct SplineVector16) show_letter::segment_via ← (struct SplineVector16) show_letter::via
-Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to
+Unwinding value copy (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to
+Adding value simple copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x
+Adding value simple copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y
 Postponing unwinding for (void~) show_letter::$17 ← call spline_8segB (struct SplineVector16) show_letter::current (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to 
 Postponing unwinding for (void~) show_letter::$17 ← call spline_8segB (struct SplineVector16) show_letter::current (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to 
 Converted procedure struct value parameter to member unwinding in call (void~) show_letter::$17 ← call spline_8segB (signed word) show_letter::current_x (signed word) show_letter::current_y (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to 
-Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to
-Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to
-Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*~) bitmap_plot_spline_8seg::$10 + (number~) bitmap_plot_spline_8seg::$6)
-Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*~) bitmap_plot_spline_8seg::$11 + (number~) bitmap_plot_spline_8seg::$6)
-Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*~) bitmap_plot_spline_8seg::$12 + (byte~) bitmap_plot_spline_8seg::$9)
-Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*~) bitmap_plot_spline_8seg::$13 + (byte~) bitmap_plot_spline_8seg::$9)
+Unwinding value copy (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to
+Adding value simple copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x
+Adding value simple copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y
+Unwinding value copy (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to
+Adding value simple copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x
+Adding value simple copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y
+Unwinding value copy (struct SplineVector16) bitmap_plot_spline_8seg::current ← *((const struct SplineVector16*) SPLINE_8SEG + (number~) bitmap_plot_spline_8seg::$6)
+Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (number~) bitmap_plot_spline_8seg::$6)
+Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (number~) bitmap_plot_spline_8seg::$6)
+Unwinding value copy (struct SplineVector16) bitmap_plot_spline_8seg::current ← *((const struct SplineVector16*) SPLINE_8SEG + (byte~) bitmap_plot_spline_8seg::$9)
+Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) bitmap_plot_spline_8seg::$9)
+Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) bitmap_plot_spline_8seg::$9)
 Adding struct value member variable copy (signed word) rotate::rotated_x ← (signed word~) rotate::$16
 Adding struct value member variable copy (signed word) rotate::rotated_y ← (signed word~) rotate::$19
-Adding struct value member variable copy (signed word) rotate::return_x ← (signed word) rotate::rotated_x
-Adding struct value member variable copy (signed word) rotate::return_y ← (signed word) rotate::rotated_y
-Adding struct value member variable copy (signed word) rotate::return_x ← (signed word) rotate::return_x
-Adding struct value member variable copy (signed word) rotate::return_y ← (signed word) rotate::return_y
+Unwinding value copy (struct SplineVector16) rotate::return ← (struct SplineVector16) rotate::rotated
+Adding value simple copy (signed word) rotate::return_x ← (signed word) rotate::rotated_x
+Adding value simple copy (signed word) rotate::return_y ← (signed word) rotate::rotated_y
+Unwinding value copy (struct SplineVector16) rotate::return ← (struct SplineVector16) rotate::return
+Adding value simple copy (signed word) rotate::return_x ← (signed word) rotate::return_x
+Adding value simple copy (signed word) rotate::return_y ← (signed word) rotate::return_y
 Converted procedure struct return value to member unwinding return { (signed word) rotate::return_x, (signed word) rotate::return_y }
 Replacing struct member reference (struct SplineVector16) spline_16seg::p1.x with member unwinding reference (signed word) spline_16seg::p1_x
 Replacing struct member reference (struct SplineVector16) spline_16seg::p2.x with member unwinding reference (signed word) spline_16seg::p2_x
@@ -340,33 +355,26 @@ Replacing struct member reference (struct SplineVector16) show_letter::via.y wit
 Replacing struct member reference (struct SplineVector16) show_letter::via.x with member unwinding reference (signed word) show_letter::via_x
 Replacing struct member reference (struct SplineVector16) show_letter::via.y with member unwinding reference (signed word) show_letter::via_y
 Replacing struct member reference (struct Segment) show_letter::segment.type with member unwinding reference (byte) show_letter::segment_type
-Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to
 Replacing struct member reference (struct Segment) show_letter::segment.type with member unwinding reference (byte) show_letter::segment_type
 Replacing struct member reference (struct Segment) show_letter::segment.via with member unwinding reference (struct SplineVector16) show_letter::segment_via
 Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to
-Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to
 Replacing struct member reference (struct SplineVector16) show_letter::current.x with member unwinding reference (signed word) show_letter::current_x
 Replacing struct member reference (struct SplineVector16) show_letter::current.y with member unwinding reference (signed word) show_letter::current_y
 Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to
 Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to
-Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to
 Replacing struct member reference (struct SplineVector16) bitmap_plot_spline_8seg::current.x with member unwinding reference (signed word) bitmap_plot_spline_8seg::current_x
 Replacing struct member reference (struct SplineVector16) bitmap_plot_spline_8seg::current.y with member unwinding reference (signed word) bitmap_plot_spline_8seg::current_y
 Replacing struct member reference (struct SplineVector16) rotate::vector.x with member unwinding reference (signed word) rotate::vector_x
 Replacing struct member reference (struct SplineVector16) rotate::vector.y with member unwinding reference (signed word) rotate::vector_y
 Replacing struct member reference (struct SplineVector16) rotate::vector.y with member unwinding reference (signed word) rotate::vector_y
 Replacing struct member reference (struct SplineVector16) rotate::vector.x with member unwinding reference (signed word) rotate::vector_x
-Adding struct value member variable copy (signed word) show_letter::segment_to_x ← (signed word) show_letter::to_x
-Adding struct value member variable copy (signed word) show_letter::segment_to_y ← (signed word) show_letter::to_y
-Adding struct value member variable copy (signed word) show_letter::segment_via_x ← (signed word) show_letter::via_x
-Adding struct value member variable copy (signed word) show_letter::segment_via_y ← (signed word) show_letter::via_y
-Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x
-Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y
+Unwinding value copy (struct SplineVector16) show_letter::segment_to ← (struct SplineVector16) show_letter::to
+Adding value simple copy (signed word) show_letter::segment_to_x ← (signed word) show_letter::to_x
+Adding value simple copy (signed word) show_letter::segment_to_y ← (signed word) show_letter::to_y
+Unwinding value copy (struct SplineVector16) show_letter::segment_via ← (struct SplineVector16) show_letter::via
+Adding value simple copy (signed word) show_letter::segment_via_x ← (signed word) show_letter::via_x
+Adding value simple copy (signed word) show_letter::segment_via_y ← (signed word) show_letter::via_y
 Converted procedure struct value parameter to member unwinding in call (void~) show_letter::$17 ← call spline_8segB (signed word) show_letter::current_x (signed word) show_letter::current_y (signed word) show_letter::segment_via_x (signed word) show_letter::segment_via_y (signed word) show_letter::segment_to_x (signed word) show_letter::segment_to_y 
-Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x
-Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y
-Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x
-Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y
 Replacing struct member reference (struct SplineVector16) show_letter::segment_to.x with member unwinding reference (signed word) show_letter::segment_to_x
 Replacing struct member reference (struct SplineVector16) show_letter::segment_to.y with member unwinding reference (signed word) show_letter::segment_to_y
 Rewriting struct pointer member access *((const struct Segment*) letter_c + (byte~) show_letter::$22).type
@@ -1409,12 +1417,8 @@ show_letter::@1: scope:[show_letter]  from show_letter show_letter::@5
   (byte) show_letter::angle#1 ← phi( show_letter/(byte) show_letter::angle#3 show_letter::@5/(byte) show_letter::angle#4 )
   (byte) show_letter::i#2 ← phi( show_letter/(byte) show_letter::i#0 show_letter::@5/(byte) show_letter::i#1 )
   (byte~) show_letter::$20 ← (byte) show_letter::i#2 * (const byte) SIZEOF_STRUCT_SEGMENT
-  (signed word*~) show_letter::$24 ← (signed word*)(signed word*~) show_letter::$23 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-  (signed word) show_letter::to_x#0 ← *((signed word*~) show_letter::$24 + (byte~) show_letter::$20)
-  (signed word*~) show_letter::$23 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO
-  (signed word*~) show_letter::$26 ← (signed word*)(signed word*~) show_letter::$25 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-  (signed word) show_letter::to_y#0 ← *((signed word*~) show_letter::$26 + (byte~) show_letter::$20)
-  (signed word*~) show_letter::$25 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO
+  (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$20)
+  (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20)
   (number~) show_letter::$0 ← (signed word) show_letter::to_x#0 - (number) $32
   (number~) show_letter::$1 ← (signed word) show_letter::to_y#0 - (number) $96
   (signed word) show_letter::to_x#1 ← (signed word)(number~) show_letter::$0
@@ -1442,12 +1446,8 @@ show_letter::@11: scope:[show_letter]  from show_letter::@1
   (signed word) show_letter::to_x#3 ← (signed word)(number~) show_letter::$3
   (signed word) show_letter::to_y#3 ← (signed word)(number~) show_letter::$4
   (byte~) show_letter::$21 ← (byte) show_letter::i#3 * (const byte) SIZEOF_STRUCT_SEGMENT
-  (signed word*~) show_letter::$28 ← (signed word*)(signed word*~) show_letter::$27 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-  (signed word) show_letter::via_x#0 ← *((signed word*~) show_letter::$28 + (byte~) show_letter::$21)
-  (signed word*~) show_letter::$27 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA
-  (signed word*~) show_letter::$30 ← (signed word*)(signed word*~) show_letter::$29 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-  (signed word) show_letter::via_y#0 ← *((signed word*~) show_letter::$30 + (byte~) show_letter::$21)
-  (signed word*~) show_letter::$29 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA
+  (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$21)
+  (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21)
   (number~) show_letter::$5 ← (signed word) show_letter::via_x#0 - (number) $32
   (number~) show_letter::$6 ← (signed word) show_letter::via_y#0 - (number) $96
   (signed word) show_letter::via_x#1 ← (signed word)(number~) show_letter::$5
@@ -1477,8 +1477,8 @@ show_letter::@12: scope:[show_letter]  from show_letter::@11
   (signed word) show_letter::via_x#3 ← (signed word)(number~) show_letter::$8
   (signed word) show_letter::via_y#3 ← (signed word)(number~) show_letter::$9
   (byte~) show_letter::$22 ← (byte) show_letter::i#4 * (const byte) SIZEOF_STRUCT_SEGMENT
-  (byte*~) show_letter::$31 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE
-  (byte) show_letter::segment_type#0 ← *((byte*~) show_letter::$31 + (byte~) show_letter::$22)
+  (byte*~) show_letter::$23 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE
+  (byte) show_letter::segment_type#0 ← *((byte*~) show_letter::$23 + (byte~) show_letter::$22)
   (signed word) show_letter::segment_to_x#0 ← (signed word) show_letter::to_x#4
   (signed word) show_letter::segment_to_y#0 ← (signed word) show_letter::to_y#4
   (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#3
@@ -1580,10 +1580,8 @@ show_letter::@return: scope:[show_letter]  from show_letter::@5
 (void()) bitmap_plot_spline_8seg()
 bitmap_plot_spline_8seg: scope:[bitmap_plot_spline_8seg]  from show_letter::@13
   (number~) bitmap_plot_spline_8seg::$6 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
-  (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-  (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*~) bitmap_plot_spline_8seg::$10 + (number~) bitmap_plot_spline_8seg::$6)
-  (signed word*~) bitmap_plot_spline_8seg::$11 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-  (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((signed word*~) bitmap_plot_spline_8seg::$11 + (number~) bitmap_plot_spline_8seg::$6)
+  (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (number~) bitmap_plot_spline_8seg::$6)
+  (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (number~) bitmap_plot_spline_8seg::$6)
   (byte) bitmap_plot_spline_8seg::n#0 ← (byte) 1
   to:bitmap_plot_spline_8seg::@1
 bitmap_plot_spline_8seg::@1: scope:[bitmap_plot_spline_8seg]  from bitmap_plot_spline_8seg bitmap_plot_spline_8seg::@3
@@ -1593,11 +1591,11 @@ bitmap_plot_spline_8seg::@1: scope:[bitmap_plot_spline_8seg]  from bitmap_plot_s
   (word~) bitmap_plot_spline_8seg::$0 ← ((word)) (signed word) bitmap_plot_spline_8seg::current_x#2
   (word~) bitmap_plot_spline_8seg::$1 ← ((word)) (signed word) bitmap_plot_spline_8seg::current_y#2
   (byte~) bitmap_plot_spline_8seg::$7 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
-  (signed word*~) bitmap_plot_spline_8seg::$14 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-  (word~) bitmap_plot_spline_8seg::$2 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$14 + (byte~) bitmap_plot_spline_8seg::$7)
+  (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
+  (word~) bitmap_plot_spline_8seg::$2 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$10 + (byte~) bitmap_plot_spline_8seg::$7)
   (byte~) bitmap_plot_spline_8seg::$8 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
-  (signed word*~) bitmap_plot_spline_8seg::$15 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-  (word~) bitmap_plot_spline_8seg::$3 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$15 + (byte~) bitmap_plot_spline_8seg::$8)
+  (signed word*~) bitmap_plot_spline_8seg::$11 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
+  (word~) bitmap_plot_spline_8seg::$3 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$11 + (byte~) bitmap_plot_spline_8seg::$8)
   (word) bitmap_line::x1#1 ← (word~) bitmap_plot_spline_8seg::$0
   (word) bitmap_line::y1#1 ← (word~) bitmap_plot_spline_8seg::$1
   (word) bitmap_line::x2#1 ← (word~) bitmap_plot_spline_8seg::$2
@@ -1607,10 +1605,8 @@ bitmap_plot_spline_8seg::@1: scope:[bitmap_plot_spline_8seg]  from bitmap_plot_s
 bitmap_plot_spline_8seg::@3: scope:[bitmap_plot_spline_8seg]  from bitmap_plot_spline_8seg::@1
   (byte) bitmap_plot_spline_8seg::n#3 ← phi( bitmap_plot_spline_8seg::@1/(byte) bitmap_plot_spline_8seg::n#2 )
   (byte~) bitmap_plot_spline_8seg::$9 ← (byte) bitmap_plot_spline_8seg::n#3 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
-  (signed word*~) bitmap_plot_spline_8seg::$12 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-  (signed word) bitmap_plot_spline_8seg::current_x#1 ← *((signed word*~) bitmap_plot_spline_8seg::$12 + (byte~) bitmap_plot_spline_8seg::$9)
-  (signed word*~) bitmap_plot_spline_8seg::$13 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-  (signed word) bitmap_plot_spline_8seg::current_y#1 ← *((signed word*~) bitmap_plot_spline_8seg::$13 + (byte~) bitmap_plot_spline_8seg::$9)
+  (signed word) bitmap_plot_spline_8seg::current_x#1 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) bitmap_plot_spline_8seg::$9)
+  (signed word) bitmap_plot_spline_8seg::current_y#1 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) bitmap_plot_spline_8seg::$9)
   (byte) bitmap_plot_spline_8seg::n#1 ← (byte) bitmap_plot_spline_8seg::n#3 + rangenext(1,8)
   (bool~) bitmap_plot_spline_8seg::$5 ← (byte) bitmap_plot_spline_8seg::n#1 != rangelast(1,8)
   if((bool~) bitmap_plot_spline_8seg::$5) goto bitmap_plot_spline_8seg::@1
@@ -2132,10 +2128,6 @@ SYMBOL TABLE SSA
 (word~) bitmap_plot_spline_8seg::$1
 (signed word*~) bitmap_plot_spline_8seg::$10
 (signed word*~) bitmap_plot_spline_8seg::$11
-(signed word*~) bitmap_plot_spline_8seg::$12
-(signed word*~) bitmap_plot_spline_8seg::$13
-(signed word*~) bitmap_plot_spline_8seg::$14
-(signed word*~) bitmap_plot_spline_8seg::$15
 (word~) bitmap_plot_spline_8seg::$2
 (word~) bitmap_plot_spline_8seg::$3
 (bool~) bitmap_plot_spline_8seg::$5
@@ -2618,18 +2610,10 @@ SYMBOL TABLE SSA
 (byte~) show_letter::$20
 (byte~) show_letter::$21
 (byte~) show_letter::$22
-(signed word*~) show_letter::$23
-(signed word*~) show_letter::$24
-(signed word*~) show_letter::$25
-(signed word*~) show_letter::$26
-(signed word*~) show_letter::$27
-(signed word*~) show_letter::$28
-(signed word*~) show_letter::$29
+(byte*~) show_letter::$23
 (signed word~) show_letter::$2_x
 (signed word~) show_letter::$2_y
 (number~) show_letter::$3
-(signed word*~) show_letter::$30
-(byte*~) show_letter::$31
 (number~) show_letter::$4
 (number~) show_letter::$5
 (number~) show_letter::$6
@@ -3020,8 +3004,8 @@ Inlining cast (word~) show_letter::$14 ← (word)(signed word) show_letter::segm
 Inlining cast (word~) show_letter::$15 ← (word)(signed word) show_letter::segment_to_y#4
 Inlining cast (word~) bitmap_plot_spline_8seg::$0 ← (word)(signed word) bitmap_plot_spline_8seg::current_x#2
 Inlining cast (word~) bitmap_plot_spline_8seg::$1 ← (word)(signed word) bitmap_plot_spline_8seg::current_y#2
-Inlining cast (word~) bitmap_plot_spline_8seg::$2 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$14 + (byte~) bitmap_plot_spline_8seg::$7)
-Inlining cast (word~) bitmap_plot_spline_8seg::$3 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$15 + (byte~) bitmap_plot_spline_8seg::$8)
+Inlining cast (word~) bitmap_plot_spline_8seg::$2 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$10 + (byte~) bitmap_plot_spline_8seg::$7)
+Inlining cast (word~) bitmap_plot_spline_8seg::$3 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$11 + (byte~) bitmap_plot_spline_8seg::$8)
 Inlining cast (signed word~) rotate::$0 ← (signed word)*((const signed byte*) COS + (byte) rotate::angle#2)
 Inlining cast (signed word~) rotate::$2 ← (signed word)(signed dword~) rotate::$1
 Inlining cast (signed word~) rotate::$5 ← (signed word)(signed dword~) rotate::$4
@@ -3114,14 +3098,10 @@ Simplifying constant integer cast $fe
 Simplifying constant integer cast $ff
 Simplifying constant integer cast 9
 Simplifying constant integer cast $3e7
-Simplifying constant integer cast (signed word*~) show_letter::$23
-Simplifying constant integer cast (signed word*~) show_letter::$25
 Simplifying constant integer cast $32
 Simplifying constant integer cast $96
 Simplifying constant integer cast $64
 Simplifying constant integer cast $64
-Simplifying constant integer cast (signed word*~) show_letter::$27
-Simplifying constant integer cast (signed word*~) show_letter::$29
 Simplifying constant integer cast $32
 Simplifying constant integer cast $96
 Simplifying constant integer cast $64
@@ -3544,7 +3524,7 @@ Identical Phi Values (byte*) bitmap_screen#7 (byte*) bitmap_screen#1
 Identical Phi Values (byte*) bitmap_gfx#12 (byte*) bitmap_gfx#1
 Successful SSA optimization Pass2IdenticalPhiElimination
 Identified duplicate assignment right side [111] (byte~) bitmap_init::$7 ← (byte) bitmap_init::y#2 & (byte) 7
-Identified duplicate assignment right side [551] (byte~) bitmap_plot_spline_8seg::$8 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
+Identified duplicate assignment right side [541] (byte~) bitmap_plot_spline_8seg::$8 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
 Successful SSA optimization Pass2DuplicateRValueIdentification
 Simple Condition (bool~) spline_8segB::$30 [50] if((byte) spline_8segB::n#1!=rangelast(0,7)) goto spline_8segB::@1
 Simple Condition (bool~) memset::$1 [65] if((word) memset::num#2<=(byte) 0) goto memset::@1
@@ -3569,10 +3549,10 @@ Simple Condition (bool~) mulf16s::$6 [337] if((signed word) mulf16s::b#4>=(signe
 Simple Condition (bool~) main::$7 [418] if(*((const byte*) RASTER)!=(byte) $fe) goto main::@5
 Simple Condition (bool~) main::$8 [421] if(*((const byte*) RASTER)!=(byte) $ff) goto main::@7
 Simple Condition (bool~) main::$9 [425] if((byte) main::w#1!=rangelast(0,$3c)) goto main::@5
-Simple Condition (bool~) show_letter::$10 [501] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@2
-Simple Condition (bool~) show_letter::$11 [507] if((byte) show_letter::segment_type#0==(const byte) SPLINE_TO) goto show_letter::@3
-Simple Condition (bool~) show_letter::$19 [537] if((byte) show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1
-Simple Condition (bool~) bitmap_plot_spline_8seg::$5 [567] if((byte) bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1
+Simple Condition (bool~) show_letter::$10 [493] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@2
+Simple Condition (bool~) show_letter::$11 [499] if((byte) show_letter::segment_type#0==(const byte) SPLINE_TO) goto show_letter::@3
+Simple Condition (bool~) show_letter::$19 [529] if((byte) show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1
+Simple Condition (bool~) bitmap_plot_spline_8seg::$5 [555] if((byte) bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1
 Successful SSA optimization Pass2ConditionalJumpSimplification
 Rewriting ! if()-condition to reversed if() [171] (bool~) bitmap_line::$7 ← ! (bool~) bitmap_line::$6
 Rewriting && if()-condition to two if()s [170] (bool~) bitmap_line::$6 ← (bool~) bitmap_line::$4 && (bool~) bitmap_line::$5
@@ -3582,18 +3562,10 @@ Constant right-side identified [38] (signed word*~) spline_8segB::$34 ← (signe
 Constant right-side identified [56] (byte~) spline_8segB::$32 ← (byte) 8 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
 Constant right-side identified [57] (signed word*~) spline_8segB::$35 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
 Constant right-side identified [59] (signed word*~) spline_8segB::$36 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant right-side identified [444] (signed word*~) show_letter::$23 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO
-Constant right-side identified [447] (signed word*~) show_letter::$25 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO
-Constant right-side identified [470] (signed word*~) show_letter::$27 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA
-Constant right-side identified [473] (signed word*~) show_letter::$29 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA
-Constant right-side identified [494] (byte*~) show_letter::$31 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE
-Constant right-side identified [539] (byte~) bitmap_plot_spline_8seg::$6 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
-Constant right-side identified [540] (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
+Constant right-side identified [486] (byte*~) show_letter::$23 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE
+Constant right-side identified [531] (byte~) bitmap_plot_spline_8seg::$6 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16
+Constant right-side identified [539] (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
 Constant right-side identified [542] (signed word*~) bitmap_plot_spline_8seg::$11 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant right-side identified [549] (signed word*~) bitmap_plot_spline_8seg::$14 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-Constant right-side identified [552] (signed word*~) bitmap_plot_spline_8seg::$15 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant right-side identified [561] (signed word*~) bitmap_plot_spline_8seg::$12 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-Constant right-side identified [563] (signed word*~) bitmap_plot_spline_8seg::$13 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
 Successful SSA optimization Pass2ConstantRValueConsolidation
 Constant (const byte) spline_8segB::n#0 = 0
 Constant (const signed word*) spline_8segB::$33 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X
@@ -3636,19 +3608,11 @@ Constant (const byte) main::w#0 = 0
 Constant (const signed word) show_letter::current_x#0 = 0
 Constant (const signed word) show_letter::current_y#0 = 0
 Constant (const byte) show_letter::i#0 = 0
-Constant (const signed word*) show_letter::$23 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_TO
-Constant (const signed word*) show_letter::$25 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_TO
-Constant (const signed word*) show_letter::$27 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_VIA
-Constant (const signed word*) show_letter::$29 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_VIA
-Constant (const byte*) show_letter::$31 = (byte*)letter_c+OFFSET_STRUCT_SEGMENT_TYPE
+Constant (const byte*) show_letter::$23 = (byte*)letter_c+OFFSET_STRUCT_SEGMENT_TYPE
 Constant (const byte) bitmap_plot_spline_8seg::$6 = 0*SIZEOF_STRUCT_SPLINEVECTOR16
+Constant (const byte) bitmap_plot_spline_8seg::n#0 = 1
 Constant (const signed word*) bitmap_plot_spline_8seg::$10 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X
 Constant (const signed word*) bitmap_plot_spline_8seg::$11 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant (const byte) bitmap_plot_spline_8seg::n#0 = 1
-Constant (const signed word*) bitmap_plot_spline_8seg::$14 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X
-Constant (const signed word*) bitmap_plot_spline_8seg::$15 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant (const signed word*) bitmap_plot_spline_8seg::$12 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X
-Constant (const signed word*) bitmap_plot_spline_8seg::$13 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y
 Successful SSA optimization Pass2ConstantIdentification
 Constant (const byte*) bitmap_gfx#1 = bitmap_init::gfx#0
 Constant (const byte*) bitmap_screen#1 = bitmap_init::screen#0
@@ -3670,27 +3634,27 @@ Resolved ranged next value [116] bitmap_init::y#1 ← ++ bitmap_init::y#2 to ++
 Resolved ranged comparison value [118] if(bitmap_init::y#1!=rangelast(0,$ff)) goto bitmap_init::@5 to (number) 0
 Resolved ranged next value [423] main::w#1 ← ++ main::w#4 to ++
 Resolved ranged comparison value [425] if(main::w#1!=rangelast(0,$3c)) goto main::@5 to (number) $3d
-Resolved ranged next value [535] show_letter::i#1 ← ++ show_letter::i#10 to ++
-Resolved ranged comparison value [537] if(show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1 to (number) $16
-Resolved ranged next value [565] bitmap_plot_spline_8seg::n#1 ← ++ bitmap_plot_spline_8seg::n#2 to ++
-Resolved ranged comparison value [567] if(bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1 to (number) 9
+Resolved ranged next value [527] show_letter::i#1 ← ++ show_letter::i#10 to ++
+Resolved ranged comparison value [529] if(show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1 to (number) $16
+Resolved ranged next value [553] bitmap_plot_spline_8seg::n#1 ← ++ bitmap_plot_spline_8seg::n#2 to ++
+Resolved ranged comparison value [555] if(bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1 to (number) 9
 Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_SPLINEVECTOR16 in 
 Successful SSA optimization PassNSimplifyConstantZero
 Simplifying expression containing zero (signed word*)SPLINE_8SEG in 
 Simplifying expression containing zero (signed word*)SPLINE_8SEG in 
 Simplifying expression containing zero (byte*)letter_c in 
 Simplifying expression containing zero (signed word*)SPLINE_8SEG in 
-Simplifying expression containing zero (signed word*)SPLINE_8SEG in 
-Simplifying expression containing zero (signed word*)SPLINE_8SEG in 
-Simplifying expression containing zero show_letter::$23 in [442] (signed word*~) show_letter::$24 ← (const signed word*) show_letter::$23 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-Simplifying expression containing zero show_letter::$27 in [468] (signed word*~) show_letter::$28 ← (const signed word*) show_letter::$27 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
-Simplifying expression containing zero bitmap_plot_spline_8seg::$10 in [541] (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((const signed word*) bitmap_plot_spline_8seg::$10 + (const byte) bitmap_plot_spline_8seg::$6)
-Simplifying expression containing zero bitmap_plot_spline_8seg::$11 in [543] (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((const signed word*) bitmap_plot_spline_8seg::$11 + (const byte) bitmap_plot_spline_8seg::$6)
+Simplifying expression containing zero (signed word*)(struct SplineVector16*)letter_c+OFFSET_STRUCT_SEGMENT_TO in [442] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$20)
+Simplifying expression containing zero (signed word*)(struct SplineVector16*)letter_c+OFFSET_STRUCT_SEGMENT_VIA in [464] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$21)
+Simplifying expression containing zero (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X in [532] (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (const byte) bitmap_plot_spline_8seg::$6)
+Simplifying expression containing zero (signed word*)SPLINE_8SEG in [532] (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X)
+Simplifying expression containing zero (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y in [533] (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (const byte) bitmap_plot_spline_8seg::$6)
+Simplifying expression containing zero (signed word*)SPLINE_8SEG in [551] (signed word) bitmap_plot_spline_8seg::current_x#1 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) bitmap_plot_spline_8seg::$9)
 Successful SSA optimization PassNSimplifyExpressionWithZero
 Eliminating unused variable (void*) memset::return#2 and assignment [75] (void*) memset::return#2 ← (void*) memset::str#3
 Eliminating unused variable (void*) memset::return#3 and assignment [77] (void*) memset::return#3 ← (void*) memset::str#3
-Eliminating unused variable (struct SplineVector16) rotate::return#0 and assignment [352] (struct SplineVector16) rotate::return#0 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2}
-Eliminating unused variable (struct SplineVector16) rotate::return#1 and assignment [353] (struct SplineVector16) rotate::return#1 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2}
+Eliminating unused variable (struct SplineVector16) rotate::return#0 and assignment [348] (struct SplineVector16) rotate::return#0 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2}
+Eliminating unused variable (struct SplineVector16) rotate::return#1 and assignment [349] (struct SplineVector16) rotate::return#1 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2}
 Eliminating unused constant (const byte) bitmap_plot_spline_8seg::$6
 Eliminating unused constant (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X
 Eliminating unused constant (const byte) OFFSET_STRUCT_SEGMENT_TYPE
@@ -3748,23 +3712,17 @@ Alias (signed word) show_letter::segment_via_y#0 = (signed word~) show_letter::$
 Alias (byte~) bitmap_plot_spline_8seg::$8 = (byte~) bitmap_plot_spline_8seg::$7 
 Successful SSA optimization Pass2AliasElimination
 Simple Condition (bool~) bitmap_line::$4 [96] if((word) bitmap_line::dx#0==(byte) 0) goto bitmap_line::@24
-Simple Condition (bool~) bitmap_line::$5 [350] if((word) bitmap_line::dy#0==(byte) 0) goto bitmap_line::@4
+Simple Condition (bool~) bitmap_line::$5 [346] if((word) bitmap_line::dy#0==(byte) 0) goto bitmap_line::@4
 Successful SSA optimization Pass2ConditionalJumpSimplification
 Negating conditional jump and destination [96] if((word) bitmap_line::dx#0!=(byte) 0) goto bitmap_line::@1
 Successful SSA optimization Pass2ConditionalJumpSequenceImprovement
 Constant right-side identified [207] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0
 Constant right-side identified [211] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff
 Constant right-side identified [214] (byte~) main::toD0181_$5 ← > (const word) main::toD0181_$4
-Constant right-side identified [234] (signed word*~) show_letter::$26 ← (const signed word*) show_letter::$25 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant right-side identified [255] (signed word*~) show_letter::$30 ← (const signed word*) show_letter::$29 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
 Successful SSA optimization Pass2ConstantRValueConsolidation
 Constant (const byte) main::vicSelectGfxBank1_toDd001_$1 = >main::vicSelectGfxBank1_toDd001_$0
 Constant (const word) main::toD0181_$1 = main::toD0181_$0&$3fff
 Constant (const byte) main::toD0181_$5 = >main::toD0181_$4
-Constant (const signed word*) show_letter::$24 = show_letter::$23
-Constant (const signed word*) show_letter::$26 = show_letter::$25+OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant (const signed word*) show_letter::$28 = show_letter::$27
-Constant (const signed word*) show_letter::$30 = show_letter::$29+OFFSET_STRUCT_SPLINEVECTOR16_Y
 Successful SSA optimization Pass2ConstantIdentification
 Eliminating unused constant (const byte*) PRINT_SCREEN
 Successful SSA optimization PassNEliminateUnusedVars
@@ -3792,8 +3750,8 @@ Inlining Noop Cast [41] (byte*~) memset::$2 ← (byte*)(void*) memset::str#3 kee
 Inlining Noop Cast [43] (byte*) memset::dst#0 ← (byte*)(void*) memset::str#3 keeping memset::str#3
 Inlining Noop Cast [190] (word~) mulf16s::$10 ← (word)(signed word) mulf16s::b#4 keeping mulf16s::b#4
 Inlining Noop Cast [196] (word~) mulf16s::$14 ← (word)(signed word) mulf16s::a#4 keeping mulf16s::a#4
-Inlining Noop Cast [274] (word) bitmap_line::x2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$14 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$14 + bitmap_plot_spline_8seg::$8)
-Inlining Noop Cast [275] (word) bitmap_line::y2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$15 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$15 + bitmap_plot_spline_8seg::$8)
+Inlining Noop Cast [274] (word) bitmap_line::x2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$10 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$10 + bitmap_plot_spline_8seg::$8)
+Inlining Noop Cast [275] (word) bitmap_line::y2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$11 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$11 + bitmap_plot_spline_8seg::$8)
 Successful SSA optimization Pass2NopCastInlining
 Inlining Noop Cast [78] (byte*) bitmap_plot::plotter#0 ← (byte*)(word~) bitmap_plot::$3 keeping bitmap_plot::plotter#0
 Inlining Noop Cast [317] (signed byte~) rotate::$15 ← (signed byte)(byte~) rotate::$14 keeping rotate::$15
@@ -3879,17 +3837,11 @@ Constant inlined bitmap_gfx#1 = (const byte*) BITMAP_GRAPHICS
 Constant inlined main::toD0181_$0 = (word)(const byte*) BITMAP_SCREEN
 Constant inlined show_letter::current_x#0 = (signed word) 0
 Constant inlined main::toD0181_$6 = >(word)(const byte*) BITMAP_GRAPHICS/(byte) 4
-Constant inlined show_letter::$24 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO
 Constant inlined main::toD0181_$5 = >(word)(const byte*) BITMAP_GRAPHICS
-Constant inlined show_letter::$25 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO
 Constant inlined main::w#0 = (byte) 0
 Constant inlined main::toD0181_$4 = (word)(const byte*) BITMAP_GRAPHICS
-Constant inlined show_letter::$23 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO
 Constant inlined main::toD0181_$3 = >(word)(const byte*) BITMAP_SCREEN&(word) $3fff*(byte) 4
-Constant inlined bitmap_plot_spline_8seg::$12 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG
-Constant inlined bitmap_plot_spline_8seg::$13 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant inlined bitmap_plot_spline_8seg::$14 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG
-Constant inlined bitmap_plot_spline_8seg::$15 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
+Constant inlined show_letter::$23 = (byte*)(const struct Segment*) letter_c
 Constant inlined mulf_init::sqr1_hi#0 = (const byte*) mulf_sqr1_hi+(byte) 1
 Constant inlined mulf_init::sqr1_lo#0 = (const byte*) mulf_sqr1_lo+(byte) 1
 Constant inlined spline_8segB::n#0 = (byte) 0
@@ -3900,18 +3852,12 @@ Constant inlined bitmap_plot_spline_8seg::$11 = (signed word*)(const struct Spli
 Constant inlined mulf_init::c#0 = (byte) 0
 Constant inlined main::toD0181_screen#0 = (const byte*) BITMAP_SCREEN
 Constant inlined main::toD0181_gfx#0 = (const byte*) BITMAP_GRAPHICS
-Constant inlined show_letter::$31 = (byte*)(const struct Segment*) letter_c
-Constant inlined show_letter::$30 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
 Constant inlined bitmap_init::bits#0 = (byte) $80
 Constant inlined spline_8segB::$36 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
 Constant inlined bitmap_init::bits#2 = (byte) $80
 Constant inlined spline_8segB::$32 = (byte) 8*(const byte) SIZEOF_STRUCT_SPLINEVECTOR16
-Constant inlined show_letter::$28 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA
 Constant inlined spline_8segB::$33 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG
-Constant inlined show_letter::$29 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA
 Constant inlined spline_8segB::$34 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant inlined show_letter::$26 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y
-Constant inlined show_letter::$27 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA
 Constant inlined spline_8segB::$35 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG
 Constant inlined sgn_u16::return#3 = (byte) 1
 Constant inlined sgn_u16::return#2 = (byte) -1
@@ -3933,9 +3879,9 @@ Successful SSA optimization Pass2ConstantInlining
 Consolidated array index constant in *((signed word*)SPLINE_8SEG+8*SIZEOF_STRUCT_SPLINEVECTOR16)
 Consolidated array index constant in *((signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y+8*SIZEOF_STRUCT_SPLINEVECTOR16)
 Successful SSA optimization Pass2ConstantAdditionElimination
-Alias (byte~) show_letter::$20 = (byte~) show_letter::$33 
-Alias (byte~) show_letter::$21 = (byte~) show_letter::$35 
-Alias (byte~) show_letter::$22 = (byte~) show_letter::$37 
+Alias (byte~) show_letter::$20 = (byte~) show_letter::$25 
+Alias (byte~) show_letter::$21 = (byte~) show_letter::$27 
+Alias (byte~) show_letter::$22 = (byte~) show_letter::$29 
 Successful SSA optimization Pass2AliasElimination
 Identical Phi Values (byte) bitmap_clear::fgcol#2 (const byte) WHITE
 Identical Phi Values (byte) bitmap_clear::bgcol#2 (const byte) BLACK
@@ -4308,10 +4254,10 @@ show_letter::@1: scope:[show_letter]  from show_letter show_letter::@9
   [28] (signed word) show_letter::current_y#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_y#11 )
   [28] (signed word) show_letter::current_x#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_x#11 )
   [28] (byte) show_letter::i#10 ← phi( show_letter/(byte) 0 show_letter::@9/(byte) show_letter::i#1 )
-  [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3
-  [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10
-  [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20)
-  [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20)
+  [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3
+  [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10
+  [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20)
+  [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20)
   [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32
   [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96
   [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1
@@ -4326,10 +4272,10 @@ show_letter::@6: scope:[show_letter]  from show_letter::@1
   [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0
   [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64
   [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64
-  [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3
-  [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10
-  [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21)
-  [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21)
+  [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3
+  [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10
+  [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21)
+  [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21)
   [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32
   [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96
   [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1
@@ -4344,8 +4290,8 @@ show_letter::@7: scope:[show_letter]  from show_letter::@6
   [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1
   [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64
   [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64
-  [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3
-  [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10
+  [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3
+  [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10
   [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22)
   [64] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@3
   to:show_letter::@4
@@ -5144,9 +5090,9 @@ VARIABLE REGISTER WEIGHTS
 (byte~) show_letter::$20 151.5
 (byte~) show_letter::$21 151.5
 (byte~) show_letter::$22 202.0
-(byte~) show_letter::$32 202.0
-(byte~) show_letter::$34 202.0
-(byte~) show_letter::$36 202.0
+(byte~) show_letter::$24 202.0
+(byte~) show_letter::$26 202.0
+(byte~) show_letter::$28 202.0
 (struct SplineVector16~) show_letter::$7
 (byte) show_letter::angle
 (byte) show_letter::angle#0 3.6724137931034484
@@ -5299,7 +5245,7 @@ Initial phi equivalence classes
 [ mulf_init::dir#2 mulf_init::dir#4 ]
 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
 Added variable show_letter::angle#0 to live range equivalence class [ show_letter::angle#0 ]
-Added variable show_letter::$32 to live range equivalence class [ show_letter::$32 ]
+Added variable show_letter::$24 to live range equivalence class [ show_letter::$24 ]
 Added variable show_letter::$20 to live range equivalence class [ show_letter::$20 ]
 Added variable show_letter::to_x#0 to live range equivalence class [ show_letter::to_x#0 ]
 Added variable show_letter::to_y#0 to live range equivalence class [ show_letter::to_y#0 ]
@@ -5311,7 +5257,7 @@ Added variable show_letter::to_x#2 to live range equivalence class [ show_letter
 Added variable show_letter::to_y#2 to live range equivalence class [ show_letter::to_y#2 ]
 Added variable show_letter::current_x#10 to live range equivalence class [ show_letter::current_x#10 ]
 Added variable show_letter::current_y#10 to live range equivalence class [ show_letter::current_y#10 ]
-Added variable show_letter::$34 to live range equivalence class [ show_letter::$34 ]
+Added variable show_letter::$26 to live range equivalence class [ show_letter::$26 ]
 Added variable show_letter::$21 to live range equivalence class [ show_letter::$21 ]
 Added variable show_letter::via_x#0 to live range equivalence class [ show_letter::via_x#0 ]
 Added variable show_letter::via_y#0 to live range equivalence class [ show_letter::via_y#0 ]
@@ -5323,7 +5269,7 @@ Added variable show_letter::via_x#2 to live range equivalence class [ show_lette
 Added variable show_letter::via_y#2 to live range equivalence class [ show_letter::via_y#2 ]
 Added variable show_letter::segment_via_x#0 to live range equivalence class [ show_letter::segment_via_x#0 ]
 Added variable show_letter::segment_via_y#0 to live range equivalence class [ show_letter::segment_via_y#0 ]
-Added variable show_letter::$36 to live range equivalence class [ show_letter::$36 ]
+Added variable show_letter::$28 to live range equivalence class [ show_letter::$28 ]
 Added variable show_letter::$22 to live range equivalence class [ show_letter::$22 ]
 Added variable show_letter::segment_type#0 to live range equivalence class [ show_letter::segment_type#0 ]
 Added variable spline_8segB::p0_x#0 to live range equivalence class [ spline_8segB::p0_x#0 ]
@@ -5463,7 +5409,7 @@ Complete equivalence classes
 [ mulf_init::dir#2 mulf_init::dir#4 ]
 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
 [ show_letter::angle#0 ]
-[ show_letter::$32 ]
+[ show_letter::$24 ]
 [ show_letter::$20 ]
 [ show_letter::to_x#0 ]
 [ show_letter::to_y#0 ]
@@ -5475,7 +5421,7 @@ Complete equivalence classes
 [ show_letter::to_y#2 ]
 [ show_letter::current_x#10 ]
 [ show_letter::current_y#10 ]
-[ show_letter::$34 ]
+[ show_letter::$26 ]
 [ show_letter::$21 ]
 [ show_letter::via_x#0 ]
 [ show_letter::via_y#0 ]
@@ -5487,7 +5433,7 @@ Complete equivalence classes
 [ show_letter::via_y#2 ]
 [ show_letter::segment_via_x#0 ]
 [ show_letter::segment_via_y#0 ]
-[ show_letter::$36 ]
+[ show_letter::$28 ]
 [ show_letter::$22 ]
 [ show_letter::segment_type#0 ]
 [ spline_8segB::p0_x#0 ]
@@ -5626,7 +5572,7 @@ Allocated zp[2]:78 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
 Allocated zp[1]:80 [ mulf_init::dir#2 mulf_init::dir#4 ]
 Allocated zp[2]:81 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
 Allocated zp[1]:83 [ show_letter::angle#0 ]
-Allocated zp[1]:84 [ show_letter::$32 ]
+Allocated zp[1]:84 [ show_letter::$24 ]
 Allocated zp[1]:85 [ show_letter::$20 ]
 Allocated zp[2]:86 [ show_letter::to_x#0 ]
 Allocated zp[2]:88 [ show_letter::to_y#0 ]
@@ -5638,7 +5584,7 @@ Allocated zp[2]:98 [ show_letter::to_x#2 ]
 Allocated zp[2]:100 [ show_letter::to_y#2 ]
 Allocated zp[2]:102 [ show_letter::current_x#10 ]
 Allocated zp[2]:104 [ show_letter::current_y#10 ]
-Allocated zp[1]:106 [ show_letter::$34 ]
+Allocated zp[1]:106 [ show_letter::$26 ]
 Allocated zp[1]:107 [ show_letter::$21 ]
 Allocated zp[2]:108 [ show_letter::via_x#0 ]
 Allocated zp[2]:110 [ show_letter::via_y#0 ]
@@ -5650,7 +5596,7 @@ Allocated zp[2]:120 [ show_letter::via_x#2 ]
 Allocated zp[2]:122 [ show_letter::via_y#2 ]
 Allocated zp[2]:124 [ show_letter::segment_via_x#0 ]
 Allocated zp[2]:126 [ show_letter::segment_via_y#0 ]
-Allocated zp[1]:128 [ show_letter::$36 ]
+Allocated zp[1]:128 [ show_letter::$28 ]
 Allocated zp[1]:129 [ show_letter::$22 ]
 Allocated zp[1]:130 [ show_letter::segment_type#0 ]
 Allocated zp[2]:131 [ spline_8segB::p0_x#0 ]
@@ -5946,9 +5892,9 @@ show_letter: {
     .label current_y = 7
     .label current_x_1 = $66
     .label current_y_1 = $68
-    .label __32 = $54
-    .label __34 = $6a
-    .label __36 = $80
+    .label __24 = $54
+    .label __26 = $6a
+    .label __28 = $80
     // [28] phi from show_letter to show_letter::@1 [phi:show_letter->show_letter::@1]
   __b1_from_show_letter:
     // [28] phi (signed word) show_letter::current_y#4 = (signed word) 0 [phi:show_letter->show_letter::@1#0] -- vwsz1=vwsc1 
@@ -5967,24 +5913,24 @@ show_letter: {
     jmp __b1
     // show_letter::@1
   __b1:
-    // [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 
+    // [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 
     lda.z i
     asl
     asl
     asl
-    sta.z __32
-    // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 
-    lda.z __32
+    sta.z __24
+    // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 
+    lda.z __24
     clc
     adc.z i
     sta.z __20
-    // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 
+    // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 
     ldy.z __20
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO,y
     sta.z to_x
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+1,y
     sta.z to_x+1
-    // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 
+    // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 
     ldy.z __20
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y,y
     sta.z to_y
@@ -6065,24 +6011,24 @@ show_letter: {
     lda.z to_y_2+1
     adc #>$64
     sta.z current_y_1+1
-    // [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 
+    // [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 
     lda.z i
     asl
     asl
     asl
-    sta.z __34
-    // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 
-    lda.z __34
+    sta.z __26
+    // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 
+    lda.z __26
     clc
     adc.z i
     sta.z __21
-    // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 
+    // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 
     ldy.z __21
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA,y
     sta.z via_x
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+1,y
     sta.z via_x+1
-    // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 
+    // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 
     ldy.z __21
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y,y
     sta.z via_y
@@ -6163,14 +6109,14 @@ show_letter: {
     lda.z via_y_2+1
     adc #>$64
     sta.z segment_via_y+1
-    // [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 
+    // [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 
     lda.z i
     asl
     asl
     asl
-    sta.z __36
-    // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 
-    lda.z __36
+    sta.z __28
+    // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 
+    lda.z __28
     clc
     adc.z i
     sta.z __22
@@ -8418,13 +8364,13 @@ Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::a
 Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::w#4 main::w#1 ]
 Statement [23] if(*((const byte*) RASTER)!=(byte) $ff) goto main::@4 [ main::angle#2 main::w#4 ] ( main:2 [ main::angle#2 main::w#4 ] ) always clobbers reg byte a 
 Statement [26] (byte) main::angle#1 ← (byte) main::angle#2 + (byte) 9 [ main::angle#1 ] ( main:2 [ main::angle#1 ] ) always clobbers reg byte a 
-Statement [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ) always clobbers reg byte a 
+Statement [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ) always clobbers reg byte a 
 Removing always clobbered register reg byte a as potential for zp[1]:83 [ show_letter::angle#0 ]
 Removing always clobbered register reg byte a as potential for zp[1]:4 [ show_letter::i#10 show_letter::i#1 ]
-Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a 
-Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a 
+Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a 
+Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a 
 Removing always clobbered register reg byte a as potential for zp[1]:85 [ show_letter::$20 ]
-Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a 
+Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a 
 Statement [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ) always clobbers reg byte a 
 Statement [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ) always clobbers reg byte a 
 Statement [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ) always clobbers reg byte a 
@@ -8435,11 +8381,11 @@ Statement [41] (signed word) show_letter::to_x#2 ← (signed word) rotate::retur
 Statement [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ) always clobbers reg byte a 
 Statement [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ) always clobbers reg byte a 
 Statement [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ) always clobbers reg byte a 
-Statement [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ) always clobbers reg byte a 
-Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a 
-Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a 
+Statement [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ) always clobbers reg byte a 
+Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a 
+Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a 
 Removing always clobbered register reg byte a as potential for zp[1]:107 [ show_letter::$21 ]
-Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a 
+Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a 
 Statement [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ) always clobbers reg byte a 
 Statement [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ) always clobbers reg byte a 
 Statement [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ) always clobbers reg byte a 
@@ -8450,8 +8396,8 @@ Statement [57] (signed word) show_letter::via_x#2 ← (signed word) rotate::retu
 Statement [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ) always clobbers reg byte a 
 Statement [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ) always clobbers reg byte a 
 Statement [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ) always clobbers reg byte a 
-Statement [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ) always clobbers reg byte a 
-Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a 
+Statement [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ) always clobbers reg byte a 
+Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a 
 Statement [66] (word) bitmap_line::x1#0 ← (word)(signed word) show_letter::current_x#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ) always clobbers reg byte a 
 Statement [67] (word) bitmap_line::y1#0 ← (word)(signed word) show_letter::current_y#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ) always clobbers reg byte a 
 Statement [68] (word) bitmap_line::x2#0 ← (word)(signed word) show_letter::current_x#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ) always clobbers reg byte a 
@@ -8656,10 +8602,10 @@ Statement [19] (byte) show_letter::angle#0 ← (byte) main::angle#2 [ main::angl
 Statement [22] if(*((const byte*) RASTER)!=(byte) $fe) goto main::@3 [ main::angle#2 main::w#4 ] ( main:2 [ main::angle#2 main::w#4 ] ) always clobbers reg byte a 
 Statement [23] if(*((const byte*) RASTER)!=(byte) $ff) goto main::@4 [ main::angle#2 main::w#4 ] ( main:2 [ main::angle#2 main::w#4 ] ) always clobbers reg byte a 
 Statement [26] (byte) main::angle#1 ← (byte) main::angle#2 + (byte) 9 [ main::angle#1 ] ( main:2 [ main::angle#1 ] ) always clobbers reg byte a reg byte x 
-Statement [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ) always clobbers reg byte a 
-Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a 
-Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a 
-Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a 
+Statement [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ) always clobbers reg byte a 
+Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a 
+Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a 
+Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a 
 Statement [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ) always clobbers reg byte a 
 Statement [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ) always clobbers reg byte a 
 Statement [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ) always clobbers reg byte a 
@@ -8670,10 +8616,10 @@ Statement [41] (signed word) show_letter::to_x#2 ← (signed word) rotate::retur
 Statement [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ) always clobbers reg byte a 
 Statement [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ) always clobbers reg byte a 
 Statement [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ) always clobbers reg byte a 
-Statement [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ) always clobbers reg byte a 
-Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a 
-Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a 
-Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a 
+Statement [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ) always clobbers reg byte a 
+Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a 
+Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a 
+Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a 
 Statement [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ) always clobbers reg byte a 
 Statement [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ) always clobbers reg byte a 
 Statement [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ) always clobbers reg byte a 
@@ -8684,8 +8630,8 @@ Statement [57] (signed word) show_letter::via_x#2 ← (signed word) rotate::retu
 Statement [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ) always clobbers reg byte a 
 Statement [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ) always clobbers reg byte a 
 Statement [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ) always clobbers reg byte a 
-Statement [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ) always clobbers reg byte a 
-Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a 
+Statement [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ) always clobbers reg byte a 
+Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a 
 Statement [66] (word) bitmap_line::x1#0 ← (word)(signed word) show_letter::current_x#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ) always clobbers reg byte a 
 Statement [67] (word) bitmap_line::y1#0 ← (word)(signed word) show_letter::current_y#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ) always clobbers reg byte a 
 Statement [68] (word) bitmap_line::x2#0 ← (word)(signed word) show_letter::current_x#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ) always clobbers reg byte a 
@@ -8906,7 +8852,7 @@ Potential registers zp[2]:78 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] : zp[
 Potential registers zp[1]:80 [ mulf_init::dir#2 mulf_init::dir#4 ] : zp[1]:80 , reg byte x , 
 Potential registers zp[2]:81 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] : zp[2]:81 , 
 Potential registers zp[1]:83 [ show_letter::angle#0 ] : zp[1]:83 , 
-Potential registers zp[1]:84 [ show_letter::$32 ] : zp[1]:84 , reg byte a , reg byte x , reg byte y , 
+Potential registers zp[1]:84 [ show_letter::$24 ] : zp[1]:84 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[1]:85 [ show_letter::$20 ] : zp[1]:85 , reg byte x , reg byte y , 
 Potential registers zp[2]:86 [ show_letter::to_x#0 ] : zp[2]:86 , 
 Potential registers zp[2]:88 [ show_letter::to_y#0 ] : zp[2]:88 , 
@@ -8918,7 +8864,7 @@ Potential registers zp[2]:98 [ show_letter::to_x#2 ] : zp[2]:98 ,
 Potential registers zp[2]:100 [ show_letter::to_y#2 ] : zp[2]:100 , 
 Potential registers zp[2]:102 [ show_letter::current_x#10 ] : zp[2]:102 , 
 Potential registers zp[2]:104 [ show_letter::current_y#10 ] : zp[2]:104 , 
-Potential registers zp[1]:106 [ show_letter::$34 ] : zp[1]:106 , reg byte a , reg byte x , reg byte y , 
+Potential registers zp[1]:106 [ show_letter::$26 ] : zp[1]:106 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[1]:107 [ show_letter::$21 ] : zp[1]:107 , reg byte x , reg byte y , 
 Potential registers zp[2]:108 [ show_letter::via_x#0 ] : zp[2]:108 , 
 Potential registers zp[2]:110 [ show_letter::via_y#0 ] : zp[2]:110 , 
@@ -8930,7 +8876,7 @@ Potential registers zp[2]:120 [ show_letter::via_x#2 ] : zp[2]:120 ,
 Potential registers zp[2]:122 [ show_letter::via_y#2 ] : zp[2]:122 , 
 Potential registers zp[2]:124 [ show_letter::segment_via_x#0 ] : zp[2]:124 , 
 Potential registers zp[2]:126 [ show_letter::segment_via_y#0 ] : zp[2]:126 , 
-Potential registers zp[1]:128 [ show_letter::$36 ] : zp[1]:128 , reg byte a , reg byte x , reg byte y , 
+Potential registers zp[1]:128 [ show_letter::$28 ] : zp[1]:128 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[1]:129 [ show_letter::$22 ] : zp[1]:129 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[1]:130 [ show_letter::segment_type#0 ] : zp[1]:130 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[2]:131 [ spline_8segB::p0_x#0 ] : zp[2]:131 , 
@@ -9027,7 +8973,7 @@ Uplift Scope [bitmap_line] 7,125.57: zp[2]:20 [ bitmap_line::y#15 bitmap_line::y
 Uplift Scope [spline_8segB] 2,002: zp[2]:200 [ spline_8segB::$22 ] 2,002: zp[2]:204 [ spline_8segB::$24 ] 1,751.75: zp[1]:39 [ spline_8segB::n#2 spline_8segB::n#1 ] 1,501.5: zp[1]:208 [ spline_8segB::$31 ] 941.32: zp[2]:42 [ spline_8segB::i_y#2 spline_8segB::i_y#0 spline_8segB::i_y#1 ] 801.57: zp[2]:40 [ spline_8segB::i_x#2 spline_8segB::i_x#0 spline_8segB::i_x#1 ] 711.62: zp[2]:35 [ spline_8segB::p_x#2 spline_8segB::p_x#0 spline_8segB::p_x#1 ] 667.33: zp[2]:206 [ spline_8segB::$25 ] 624.17: zp[2]:37 [ spline_8segB::p_y#2 spline_8segB::p_y#0 spline_8segB::p_y#1 ] 500.5: zp[2]:202 [ spline_8segB::$23 ] 59: zp[2]:198 [ spline_8segB::j_y#0 ] 55.72: zp[2]:196 [ spline_8segB::j_x#0 ] 34.33: zp[2]:139 [ spline_8segB::p2_x#0 ] 20.6: zp[2]:141 [ spline_8segB::p2_y#0 ] 10.5: zp[2]:135 [ spline_8segB::p1_x#0 ] 9.55: zp[2]:137 [ spline_8segB::p1_y#0 ] 4.86: zp[2]:131 [ spline_8segB::p0_x#0 ] 4.86: zp[2]:133 [ spline_8segB::p0_y#0 ] 4: zp[2]:172 [ spline_8segB::$0 ] 4: zp[2]:174 [ spline_8segB::$1 ] 4: zp[2]:178 [ spline_8segB::$3 ] 4: zp[2]:180 [ spline_8segB::$4 ] 4: zp[2]:184 [ spline_8segB::$6 ] 4: zp[2]:188 [ spline_8segB::$8 ] 4: zp[2]:192 [ spline_8segB::$10 ] 4: zp[2]:194 [ spline_8segB::$12 ] 4: zp[2]:209 [ spline_8segB::$18 ] 4: zp[2]:213 [ spline_8segB::$20 ] 2: zp[2]:215 [ spline_8segB::$21 ] 1.33: zp[2]:186 [ spline_8segB::b_x#0 ] 1.33: zp[2]:190 [ spline_8segB::b_y#0 ] 1.33: zp[2]:211 [ spline_8segB::$19 ] 0.6: zp[2]:182 [ spline_8segB::a_y#0 ] 0.5: zp[2]:176 [ spline_8segB::a_x#0 ] 
 Uplift Scope [bitmap_plot] 4,514.5: zp[2]:27 [ bitmap_plot::x#4 bitmap_plot::x#3 bitmap_plot::x#2 bitmap_plot::x#0 bitmap_plot::x#1 ] 4,016: zp[1]:26 [ bitmap_plot::y#4 bitmap_plot::y#3 bitmap_plot::y#2 bitmap_plot::y#0 bitmap_plot::y#1 ] 4: zp[2]:163 [ bitmap_plot::$1 ] 4: zp[1]:167 [ bitmap_plot::$2 ] 3: zp[2]:165 [ bitmap_plot::plotter#1 ] 1: zp[2]:161 [ bitmap_plot::plotter#0 ] 
 Uplift Scope [bitmap_plot_spline_8seg] 1,901.9: zp[1]:13 [ bitmap_plot_spline_8seg::n#2 bitmap_plot_spline_8seg::n#1 ] 1,505.5: zp[2]:9 [ bitmap_plot_spline_8seg::current_x#2 bitmap_plot_spline_8seg::current_x#0 bitmap_plot_spline_8seg::current_x#1 ] 1,501.5: zp[1]:144 [ bitmap_plot_spline_8seg::$9 ] 1,172.83: zp[2]:11 [ bitmap_plot_spline_8seg::current_y#2 bitmap_plot_spline_8seg::current_y#0 bitmap_plot_spline_8seg::current_y#1 ] 500.5: zp[1]:143 [ bitmap_plot_spline_8seg::$8 ] 
-Uplift Scope [show_letter] 207.05: zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] 202: zp[1]:84 [ show_letter::$32 ] 202: zp[1]:106 [ show_letter::$34 ] 202: zp[1]:128 [ show_letter::$36 ] 202: zp[1]:129 [ show_letter::$22 ] 151.5: zp[1]:85 [ show_letter::$20 ] 151.5: zp[1]:107 [ show_letter::$21 ] 151.5: zp[1]:130 [ show_letter::segment_type#0 ] 106.32: zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] 101: zp[2]:86 [ show_letter::to_x#0 ] 101: zp[2]:88 [ show_letter::to_y#0 ] 101: zp[2]:90 [ show_letter::to_x#1 ] 101: zp[2]:92 [ show_letter::to_y#1 ] 101: zp[2]:98 [ show_letter::to_x#2 ] 101: zp[2]:100 [ show_letter::to_y#2 ] 101: zp[2]:108 [ show_letter::via_x#0 ] 101: zp[2]:110 [ show_letter::via_y#0 ] 101: zp[2]:112 [ show_letter::via_x#1 ] 101: zp[2]:114 [ show_letter::via_y#1 ] 101: zp[2]:120 [ show_letter::via_x#2 ] 101: zp[2]:122 [ show_letter::via_y#2 ] 91.29: zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] 22.44: zp[2]:124 [ show_letter::segment_via_x#0 ] 22.44: zp[2]:126 [ show_letter::segment_via_y#0 ] 7.77: zp[2]:102 [ show_letter::current_x#10 ] 7.77: zp[2]:104 [ show_letter::current_y#10 ] 3.67: zp[1]:83 [ show_letter::angle#0 ] 
+Uplift Scope [show_letter] 207.05: zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] 202: zp[1]:84 [ show_letter::$24 ] 202: zp[1]:106 [ show_letter::$26 ] 202: zp[1]:128 [ show_letter::$28 ] 202: zp[1]:129 [ show_letter::$22 ] 151.5: zp[1]:85 [ show_letter::$20 ] 151.5: zp[1]:107 [ show_letter::$21 ] 151.5: zp[1]:130 [ show_letter::segment_type#0 ] 106.32: zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] 101: zp[2]:86 [ show_letter::to_x#0 ] 101: zp[2]:88 [ show_letter::to_y#0 ] 101: zp[2]:90 [ show_letter::to_x#1 ] 101: zp[2]:92 [ show_letter::to_y#1 ] 101: zp[2]:98 [ show_letter::to_x#2 ] 101: zp[2]:100 [ show_letter::to_y#2 ] 101: zp[2]:108 [ show_letter::via_x#0 ] 101: zp[2]:110 [ show_letter::via_y#0 ] 101: zp[2]:112 [ show_letter::via_x#1 ] 101: zp[2]:114 [ show_letter::via_y#1 ] 101: zp[2]:120 [ show_letter::via_x#2 ] 101: zp[2]:122 [ show_letter::via_y#2 ] 91.29: zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] 22.44: zp[2]:124 [ show_letter::segment_via_x#0 ] 22.44: zp[2]:126 [ show_letter::segment_via_y#0 ] 7.77: zp[2]:102 [ show_letter::current_x#10 ] 7.77: zp[2]:104 [ show_letter::current_y#10 ] 3.67: zp[1]:83 [ show_letter::angle#0 ] 
 Uplift Scope [rotate] 416.62: zp[1]:44 [ rotate::angle#2 rotate::angle#0 rotate::angle#1 ] 213.44: zp[2]:47 [ rotate::vector_y#2 rotate::vector_y#0 rotate::vector_y#1 ] 142.59: zp[2]:45 [ rotate::vector_x#2 rotate::vector_x#0 rotate::vector_x#1 ] 101: zp[2]:94 [ rotate::return_x#0 ] 101: zp[2]:96 [ rotate::return_y#0 ] 101: zp[2]:116 [ rotate::return_x#1 ] 101: zp[2]:118 [ rotate::return_y#1 ] 34: zp[2]:274 [ rotate::return_x#2 ] 34: zp[2]:277 [ rotate::return_y#2 ] 4: zp[2]:227 [ rotate::$2 ] 4: zp[2]:239 [ rotate::$5 ] 4: zp[2]:253 [ rotate::$9 ] 4: zp[2]:255 [ rotate::$10 ] 4: zp[2]:267 [ rotate::$12 ] 4: zp[2]:269 [ rotate::$13 ] 2: zp[4]:223 [ rotate::$1 ] 2: zp[4]:235 [ rotate::$4 ] 2: zp[4]:249 [ rotate::$8 ] 2: zp[4]:263 [ rotate::$11 ] 2: zp[1]:273 [ rotate::$15 ] 2: zp[1]:276 [ rotate::$18 ] 1.33: zp[2]:271 [ rotate::yr#1 ] 0.75: zp[2]:217 [ rotate::cos_a#0 ] 0.67: zp[2]:243 [ rotate::sin_a#0 ] 0.44: zp[2]:257 [ rotate::xr#1 ] 0.25: zp[2]:229 [ rotate::xr#0 ] 0.24: zp[2]:241 [ rotate::yr#0 ] 
 Uplift Scope [main] 886.17: zp[1]:3 [ main::w#4 main::w#1 ] 25.3: zp[1]:2 [ main::angle#2 main::angle#1 ] 
 Uplift Scope [memset] 341.33: zp[2]:62 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 17.17: zp[2]:303 [ memset::end#0 ] 12.62: zp[1]:61 [ memset::c#4 ] 2: zp[2]:57 [ memset::num#2 ] 0: zp[2]:59 [ memset::str#3 ] 
@@ -9049,7 +8995,7 @@ Uplifting [bitmap_line] best 849275 combination zp[2]:20 [ bitmap_line::y#15 bit
 Uplifting [spline_8segB] best 832275 combination zp[2]:200 [ spline_8segB::$22 ] zp[2]:204 [ spline_8segB::$24 ] reg byte y [ spline_8segB::n#2 spline_8segB::n#1 ] reg byte x [ spline_8segB::$31 ] zp[2]:42 [ spline_8segB::i_y#2 spline_8segB::i_y#0 spline_8segB::i_y#1 ] zp[2]:40 [ spline_8segB::i_x#2 spline_8segB::i_x#0 spline_8segB::i_x#1 ] zp[2]:35 [ spline_8segB::p_x#2 spline_8segB::p_x#0 spline_8segB::p_x#1 ] zp[2]:206 [ spline_8segB::$25 ] zp[2]:37 [ spline_8segB::p_y#2 spline_8segB::p_y#0 spline_8segB::p_y#1 ] zp[2]:202 [ spline_8segB::$23 ] zp[2]:198 [ spline_8segB::j_y#0 ] zp[2]:196 [ spline_8segB::j_x#0 ] zp[2]:139 [ spline_8segB::p2_x#0 ] zp[2]:141 [ spline_8segB::p2_y#0 ] zp[2]:135 [ spline_8segB::p1_x#0 ] zp[2]:137 [ spline_8segB::p1_y#0 ] zp[2]:131 [ spline_8segB::p0_x#0 ] zp[2]:133 [ spline_8segB::p0_y#0 ] zp[2]:172 [ spline_8segB::$0 ] zp[2]:174 [ spline_8segB::$1 ] zp[2]:178 [ spline_8segB::$3 ] zp[2]:180 [ spline_8segB::$4 ] zp[2]:184 [ spline_8segB::$6 ] zp[2]:188 [ spline_8segB::$8 ] zp[2]:192 [ spline_8segB::$10 ] zp[2]:194 [ spline_8segB::$12 ] zp[2]:209 [ spline_8segB::$18 ] zp[2]:213 [ spline_8segB::$20 ] zp[2]:215 [ spline_8segB::$21 ] zp[2]:186 [ spline_8segB::b_x#0 ] zp[2]:190 [ spline_8segB::b_y#0 ] zp[2]:211 [ spline_8segB::$19 ] zp[2]:182 [ spline_8segB::a_y#0 ] zp[2]:176 [ spline_8segB::a_x#0 ] 
 Uplifting [bitmap_plot] best 830266 combination zp[2]:27 [ bitmap_plot::x#4 bitmap_plot::x#3 bitmap_plot::x#2 bitmap_plot::x#0 bitmap_plot::x#1 ] reg byte x [ bitmap_plot::y#4 bitmap_plot::y#3 bitmap_plot::y#2 bitmap_plot::y#0 bitmap_plot::y#1 ] zp[2]:163 [ bitmap_plot::$1 ] reg byte a [ bitmap_plot::$2 ] zp[2]:165 [ bitmap_plot::plotter#1 ] zp[2]:161 [ bitmap_plot::plotter#0 ] 
 Uplifting [bitmap_plot_spline_8seg] best 816266 combination zp[1]:13 [ bitmap_plot_spline_8seg::n#2 bitmap_plot_spline_8seg::n#1 ] zp[2]:9 [ bitmap_plot_spline_8seg::current_x#2 bitmap_plot_spline_8seg::current_x#0 bitmap_plot_spline_8seg::current_x#1 ] reg byte x [ bitmap_plot_spline_8seg::$9 ] zp[2]:11 [ bitmap_plot_spline_8seg::current_y#2 bitmap_plot_spline_8seg::current_y#0 bitmap_plot_spline_8seg::current_y#1 ] reg byte x [ bitmap_plot_spline_8seg::$8 ] 
-Uplifting [show_letter] best 814066 combination zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] reg byte a [ show_letter::$32 ] reg byte a [ show_letter::$34 ] reg byte a [ show_letter::$36 ] reg byte a [ show_letter::$22 ] zp[1]:85 [ show_letter::$20 ] zp[1]:107 [ show_letter::$21 ] zp[1]:130 [ show_letter::segment_type#0 ] zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] zp[2]:86 [ show_letter::to_x#0 ] zp[2]:88 [ show_letter::to_y#0 ] zp[2]:90 [ show_letter::to_x#1 ] zp[2]:92 [ show_letter::to_y#1 ] zp[2]:98 [ show_letter::to_x#2 ] zp[2]:100 [ show_letter::to_y#2 ] zp[2]:108 [ show_letter::via_x#0 ] zp[2]:110 [ show_letter::via_y#0 ] zp[2]:112 [ show_letter::via_x#1 ] zp[2]:114 [ show_letter::via_y#1 ] zp[2]:120 [ show_letter::via_x#2 ] zp[2]:122 [ show_letter::via_y#2 ] zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] zp[2]:124 [ show_letter::segment_via_x#0 ] zp[2]:126 [ show_letter::segment_via_y#0 ] zp[2]:102 [ show_letter::current_x#10 ] zp[2]:104 [ show_letter::current_y#10 ] zp[1]:83 [ show_letter::angle#0 ] 
+Uplifting [show_letter] best 814066 combination zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] reg byte a [ show_letter::$24 ] reg byte a [ show_letter::$26 ] reg byte a [ show_letter::$28 ] reg byte a [ show_letter::$22 ] zp[1]:85 [ show_letter::$20 ] zp[1]:107 [ show_letter::$21 ] zp[1]:130 [ show_letter::segment_type#0 ] zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] zp[2]:86 [ show_letter::to_x#0 ] zp[2]:88 [ show_letter::to_y#0 ] zp[2]:90 [ show_letter::to_x#1 ] zp[2]:92 [ show_letter::to_y#1 ] zp[2]:98 [ show_letter::to_x#2 ] zp[2]:100 [ show_letter::to_y#2 ] zp[2]:108 [ show_letter::via_x#0 ] zp[2]:110 [ show_letter::via_y#0 ] zp[2]:112 [ show_letter::via_x#1 ] zp[2]:114 [ show_letter::via_y#1 ] zp[2]:120 [ show_letter::via_x#2 ] zp[2]:122 [ show_letter::via_y#2 ] zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] zp[2]:124 [ show_letter::segment_via_x#0 ] zp[2]:126 [ show_letter::segment_via_y#0 ] zp[2]:102 [ show_letter::current_x#10 ] zp[2]:104 [ show_letter::current_y#10 ] zp[1]:83 [ show_letter::angle#0 ] 
 Limited combination testing to 100 combinations of 9216 possible.
 Uplifting [rotate] best 813448 combination reg byte y [ rotate::angle#2 rotate::angle#0 rotate::angle#1 ] zp[2]:47 [ rotate::vector_y#2 rotate::vector_y#0 rotate::vector_y#1 ] zp[2]:45 [ rotate::vector_x#2 rotate::vector_x#0 rotate::vector_x#1 ] zp[2]:94 [ rotate::return_x#0 ] zp[2]:96 [ rotate::return_y#0 ] zp[2]:116 [ rotate::return_x#1 ] zp[2]:118 [ rotate::return_y#1 ] zp[2]:274 [ rotate::return_x#2 ] zp[2]:277 [ rotate::return_y#2 ] zp[2]:227 [ rotate::$2 ] zp[2]:239 [ rotate::$5 ] zp[2]:253 [ rotate::$9 ] zp[2]:255 [ rotate::$10 ] zp[2]:267 [ rotate::$12 ] zp[2]:269 [ rotate::$13 ] zp[4]:223 [ rotate::$1 ] zp[4]:235 [ rotate::$4 ] zp[4]:249 [ rotate::$8 ] zp[4]:263 [ rotate::$11 ] reg byte a [ rotate::$15 ] reg byte a [ rotate::$18 ] zp[2]:271 [ rotate::yr#1 ] zp[2]:217 [ rotate::cos_a#0 ] zp[2]:243 [ rotate::sin_a#0 ] zp[2]:257 [ rotate::xr#1 ] zp[2]:229 [ rotate::xr#0 ] zp[2]:241 [ rotate::yr#0 ] 
 Uplifting [main] best 809848 combination reg byte x [ main::w#4 main::w#1 ] zp[1]:2 [ main::angle#2 main::angle#1 ] 
@@ -9434,21 +9380,21 @@ show_letter: {
     jmp __b1
     // show_letter::@1
   __b1:
-    // [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
+    // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
     clc
     adc.z i
     tax
-    // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO,x
     sta.z to_x
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+1,x
     sta.z to_x+1
-    // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y,x
     sta.z to_y
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x
@@ -9503,21 +9449,21 @@ show_letter: {
     lda.z to_y_1+1
     adc #>$64
     sta.z current_y_1+1
-    // [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
+    // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
     clc
     adc.z i
     tax
-    // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA,x
     sta.z via_x
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+1,x
     sta.z via_x+1
-    // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y,x
     sta.z via_y
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x
@@ -9572,12 +9518,12 @@ show_letter: {
     lda.z segment_via_y+1
     adc #>$64
     sta.z segment_via_y+1
-    // [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 
+    // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 
     clc
     adc.z i
     // [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22) -- vbuaa=pbuc1_derefidx_vbuaa 
@@ -12179,9 +12125,9 @@ FINAL SYMBOL TABLE
 (byte~) show_letter::$20 reg byte x 151.5
 (byte~) show_letter::$21 reg byte x 151.5
 (byte~) show_letter::$22 reg byte a 202.0
-(byte~) show_letter::$32 reg byte a 202.0
-(byte~) show_letter::$34 reg byte a 202.0
-(byte~) show_letter::$36 reg byte a 202.0
+(byte~) show_letter::$24 reg byte a 202.0
+(byte~) show_letter::$26 reg byte a 202.0
+(byte~) show_letter::$28 reg byte a 202.0
 (struct SplineVector16~) show_letter::$7
 (label) show_letter::@1
 (label) show_letter::@2
@@ -12317,13 +12263,13 @@ zp[1]:18 [ mulf_init::c#2 mulf_init::c#1 main::angle#2 main::angle#1 show_letter
 reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
 reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
 zp[1]:19 [ mulf_init::dir#2 mulf_init::dir#4 show_letter::i#10 show_letter::i#1 ]
-reg byte a [ show_letter::$32 ]
+reg byte a [ show_letter::$24 ]
 reg byte x [ show_letter::$20 ]
 zp[2]:20 [ show_letter::current_x#10 spline_8segB::p2_x#0 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
 zp[2]:22 [ show_letter::current_y#10 spline_8segB::p2_y#0 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
-reg byte a [ show_letter::$34 ]
+reg byte a [ show_letter::$26 ]
 reg byte x [ show_letter::$21 ]
-reg byte a [ show_letter::$36 ]
+reg byte a [ show_letter::$28 ]
 reg byte a [ show_letter::$22 ]
 reg byte a [ show_letter::segment_type#0 ]
 reg byte x [ bitmap_plot_spline_8seg::$8 ]
@@ -12519,21 +12465,21 @@ show_letter: {
     // show_letter::@1
   __b1:
     // to = letter_c[i].to
-    // [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
+    // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
     clc
     adc.z i
     tax
-    // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO,x
     sta.z to_x
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+1,x
     sta.z to_x+1
-    // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y,x
     sta.z to_y
     lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x
@@ -12591,21 +12537,21 @@ show_letter: {
     adc #>$64
     sta.z current_y_1+1
     // via = letter_c[i].via
-    // [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
+    // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 
     clc
     adc.z i
     tax
-    // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA,x
     sta.z via_x
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+1,x
     sta.z via_x+1
-    // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
+    // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx 
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y,x
     sta.z via_y
     lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x
@@ -12663,12 +12609,12 @@ show_letter: {
     adc #>$64
     sta.z segment_via_y+1
     // segment = { letter_c[i].type, to, via}
-    // [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 
+    // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 
     clc
     adc.z i
     // [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22) -- vbuaa=pbuc1_derefidx_vbuaa 
diff --git a/src/test/ref/complex/splines/truetype-splines.sym b/src/test/ref/complex/splines/truetype-splines.sym
index c8c58a08d..fb5f33da8 100644
--- a/src/test/ref/complex/splines/truetype-splines.sym
+++ b/src/test/ref/complex/splines/truetype-splines.sym
@@ -411,9 +411,9 @@
 (byte~) show_letter::$20 reg byte x 151.5
 (byte~) show_letter::$21 reg byte x 151.5
 (byte~) show_letter::$22 reg byte a 202.0
-(byte~) show_letter::$32 reg byte a 202.0
-(byte~) show_letter::$34 reg byte a 202.0
-(byte~) show_letter::$36 reg byte a 202.0
+(byte~) show_letter::$24 reg byte a 202.0
+(byte~) show_letter::$26 reg byte a 202.0
+(byte~) show_letter::$28 reg byte a 202.0
 (struct SplineVector16~) show_letter::$7
 (label) show_letter::@1
 (label) show_letter::@2
@@ -549,13 +549,13 @@ zp[1]:18 [ mulf_init::c#2 mulf_init::c#1 main::angle#2 main::angle#1 show_letter
 reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
 reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
 zp[1]:19 [ mulf_init::dir#2 mulf_init::dir#4 show_letter::i#10 show_letter::i#1 ]
-reg byte a [ show_letter::$32 ]
+reg byte a [ show_letter::$24 ]
 reg byte x [ show_letter::$20 ]
 zp[2]:20 [ show_letter::current_x#10 spline_8segB::p2_x#0 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
 zp[2]:22 [ show_letter::current_y#10 spline_8segB::p2_y#0 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
-reg byte a [ show_letter::$34 ]
+reg byte a [ show_letter::$26 ]
 reg byte x [ show_letter::$21 ]
-reg byte a [ show_letter::$36 ]
+reg byte a [ show_letter::$28 ]
 reg byte a [ show_letter::$22 ]
 reg byte a [ show_letter::segment_type#0 ]
 reg byte x [ bitmap_plot_spline_8seg::$8 ]
diff --git a/src/test/ref/struct-19.log b/src/test/ref/struct-19.log
index ce5e531aa..9c8cba783 100644
--- a/src/test/ref/struct-19.log
+++ b/src/test/ref/struct-19.log
@@ -1,16 +1,12 @@
 Adding value bulk copy *(&(struct Vector) main::v) ← memset(struct Vector, (const byte) SIZEOF_STRUCT_VECTOR)
 Adding value bulk copy *(&(struct Point) main::p1) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Adding value bulk copy *(&(struct Point) main::p2) ← memcpy(*(&(const struct Point) $1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
-Postponing unwinding for (struct Vector) main::v.p ← (struct Point) main::p1
-Postponing unwinding for (struct Vector) main::v.q ← (struct Point) main::p2
-Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P)
-Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q)
+Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P)
 Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P)
 Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q)
 Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q)
-Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
-Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).x
 Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).y
 Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q).x
diff --git a/src/test/ref/struct-20.log b/src/test/ref/struct-20.log
index 4b179c265..b9db19fbb 100644
--- a/src/test/ref/struct-20.log
+++ b/src/test/ref/struct-20.log
@@ -6,8 +6,8 @@ Replacing struct member reference (struct Vector) main::v.p with member unwindin
 Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P)
 Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q)
 Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q)
-Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
-Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).x
 Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).y
 Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q).x
diff --git a/src/test/ref/struct-35.log b/src/test/ref/struct-35.log
index 122418a83..5d785abb3 100644
--- a/src/test/ref/struct-35.log
+++ b/src/test/ref/struct-35.log
@@ -1,5 +1,5 @@
 Setting inferred volatile on symbol affected by address-of (struct Point*) main::p2 ← &(struct Point) point2
-Adding struct value member variable copy *((struct Point*) main::p2) ← memcpy(*(&(struct Point) point1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((struct Point*) main::p2) ← memcpy(*(&(struct Point) point1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Replacing struct member reference (struct Point) point2.x with member unwinding reference *((byte*)&(struct Point) point2+(const byte) OFFSET_STRUCT_POINT_X)
 Replacing struct member reference (struct Point) point2.y with member unwinding reference *((byte*)&(struct Point) point2+(const byte) OFFSET_STRUCT_POINT_Y)
 Identified constant variable (struct Point*) main::p2
diff --git a/src/test/ref/struct-39.asm b/src/test/ref/struct-39.asm
index dbcfbce8d..41a5b1e1e 100644
--- a/src/test/ref/struct-39.asm
+++ b/src/test/ref/struct-39.asm
@@ -6,8 +6,8 @@
   .const SPLINE_TO = 1
   .label SCREEN = $400
   .const OFFSET_STRUCT_SEGMENT_TO = 1
-  .const OFFSET_STRUCT_VECTOR_Y = 2
   .const SIZEOF_STRUCT_VECTOR = 4
+  .const OFFSET_STRUCT_VECTOR_Y = 2
 main: {
     .label to = 4
     .label j = 3
diff --git a/src/test/ref/struct-39.cfg b/src/test/ref/struct-39.cfg
index 64b3a5a09..831fe2c59 100644
--- a/src/test/ref/struct-39.cfg
+++ b/src/test/ref/struct-39.cfg
@@ -15,8 +15,8 @@ main: scope:[main]  from @1
 main::@1: scope:[main]  from main main::@1
   [5] (byte) main::j#3 ← phi( main/(byte) 0 main::@1/(byte) main::j#2 )
   [5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
-  [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3
-  [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2
+  [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3
+  [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2
   [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR)
   [9] (byte~) main::$2 ← (byte) main::j#3 << (byte) 1
   [10] *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to)
diff --git a/src/test/ref/struct-39.log b/src/test/ref/struct-39.log
index 33a7f6795..e0d027528 100644
--- a/src/test/ref/struct-39.log
+++ b/src/test/ref/struct-39.log
@@ -1,10 +1,9 @@
 Fixing pointer array-indexing *((const struct Segment*) letter_c + (byte) main::i)
 Fixing pointer array-indexing *((const signed word*) SCREEN + (byte) main::j)
 Fixing pointer array-indexing *((const signed word*) SCREEN + (byte) main::j)
-Adding struct value member variable copy *(&(struct Vector) main::to) ← *((struct Vector*~) main::$4 + (byte~) main::$1)
+Adding value bulk copy *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR)
 Replacing struct member reference (struct Vector) main::to.x with member unwinding reference *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_X)
 Replacing struct member reference (struct Vector) main::to.y with member unwinding reference *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_Y)
-Adding struct value member variable copy *(&(struct Vector) main::to) ← memcpy(*((struct Vector*~) main::$4 + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR)
 Culled Empty Block (label) main::@2
 
 CONTROL FLOW GRAPH SSA
@@ -20,8 +19,8 @@ main::@1: scope:[main]  from main main::@1
   (byte) main::j#3 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#2 )
   (byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
   (byte~) main::$1 ← (byte) main::i#2 * (const byte) SIZEOF_STRUCT_SEGMENT
-  (struct Vector*~) main::$4 ← (struct Vector*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO
-  *(&(struct Vector) main::to) ← memcpy(*((struct Vector*~) main::$4 + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR)
+  *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR)
+  (struct Vector) main::to ← struct-unwound {*(&(struct Vector) main::to)}
   (byte~) main::$2 ← (byte) main::j#3 * (const byte) SIZEOF_SIGNED_WORD
   *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_X)
   (byte) main::j#1 ← ++ (byte) main::j#3
@@ -70,7 +69,6 @@ SYMBOL TABLE SSA
 (byte~) main::$1
 (byte~) main::$2
 (byte~) main::$3
-(struct Vector*~) main::$4
 (label) main::@1
 (label) main::@return
 (byte) main::i
@@ -88,11 +86,9 @@ Simplifying constant pointer cast (signed word*) 1024
 Successful SSA optimization PassNCastSimplification
 Simple Condition (bool~) main::$0 [14] if((byte) main::i#1!=rangelast(0,2)) goto main::@1
 Successful SSA optimization Pass2ConditionalJumpSimplification
-Constant right-side identified [4] (struct Vector*~) main::$4 ← (struct Vector*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO
-Successful SSA optimization Pass2ConstantRValueConsolidation
+Removing C-classic struct-unwound assignment [5] (struct Vector) main::to ← struct-unwound {*(&(struct Vector) main::to)}
 Constant (const byte) main::j#0 = 0
 Constant (const byte) main::i#0 = 0
-Constant (const struct Vector*) main::$4 = (struct Vector*)letter_c+OFFSET_STRUCT_SEGMENT_TO
 Successful SSA optimization Pass2ConstantIdentification
 Resolved ranged next value [12] main::i#1 ← ++ main::i#2 to ++
 Resolved ranged comparison value [14] if(main::i#1!=rangelast(0,2)) goto main::@1 to (number) 3
@@ -113,10 +109,9 @@ Successful SSA optimization Pass2MultiplyToShiftRewriting
 Inlining constant with var siblings (const byte) main::j#0
 Inlining constant with var siblings (const byte) main::i#0
 Constant inlined main::i#0 = (byte) 0
-Constant inlined main::$4 = (struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO
 Constant inlined main::j#0 = (byte) 0
 Successful SSA optimization Pass2ConstantInlining
-Alias (byte~) main::$1 = (byte~) main::$6 
+Alias (byte~) main::$1 = (byte~) main::$5 
 Successful SSA optimization Pass2AliasElimination
 Eliminating unused constant (const byte) SIZEOF_STRUCT_SEGMENT
 Eliminating unused constant (const byte) SIZEOF_SIGNED_WORD
@@ -159,8 +154,8 @@ main: scope:[main]  from @1
 main::@1: scope:[main]  from main main::@1
   [5] (byte) main::j#3 ← phi( main/(byte) 0 main::@1/(byte) main::j#2 )
   [5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
-  [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3
-  [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2
+  [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3
+  [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2
   [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR)
   [9] (byte~) main::$2 ← (byte) main::j#3 << (byte) 1
   [10] *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to)
@@ -186,7 +181,7 @@ VARIABLE REGISTER WEIGHTS
 (byte~) main::$1 11.0
 (byte~) main::$2 22.0
 (byte~) main::$3 22.0
-(byte~) main::$5 22.0
+(byte~) main::$4 22.0
 (byte) main::i
 (byte) main::i#1 16.5
 (byte) main::i#2 4.4
@@ -199,7 +194,7 @@ VARIABLE REGISTER WEIGHTS
 Initial phi equivalence classes
 [ main::i#2 main::i#1 ]
 [ main::j#3 main::j#2 ]
-Added variable main::$5 to live range equivalence class [ main::$5 ]
+Added variable main::$4 to live range equivalence class [ main::$4 ]
 Added variable main::$1 to live range equivalence class [ main::$1 ]
 Added variable main::$2 to live range equivalence class [ main::$2 ]
 Added variable main::j#1 to live range equivalence class [ main::j#1 ]
@@ -208,7 +203,7 @@ Added variable main::to to live range equivalence class [ main::to ]
 Complete equivalence classes
 [ main::i#2 main::i#1 ]
 [ main::j#3 main::j#2 ]
-[ main::$5 ]
+[ main::$4 ]
 [ main::$1 ]
 [ main::$2 ]
 [ main::j#1 ]
@@ -216,7 +211,7 @@ Complete equivalence classes
 [ main::to ]
 Allocated zp[1]:2 [ main::i#2 main::i#1 ]
 Allocated zp[1]:3 [ main::j#3 main::j#2 ]
-Allocated zp[1]:4 [ main::$5 ]
+Allocated zp[1]:4 [ main::$4 ]
 Allocated zp[1]:5 [ main::$1 ]
 Allocated zp[1]:6 [ main::$2 ]
 Allocated zp[1]:7 [ main::j#1 ]
@@ -236,8 +231,8 @@ Target platform is c64basic / MOS6502X
   .const SPLINE_TO = 1
   .label SCREEN = $400
   .const OFFSET_STRUCT_SEGMENT_TO = 1
-  .const OFFSET_STRUCT_VECTOR_Y = 2
   .const SIZEOF_STRUCT_VECTOR = 4
+  .const OFFSET_STRUCT_VECTOR_Y = 2
   // @begin
 __bbegin:
   // [1] phi from @begin to @1 [phi:@begin->@1]
@@ -263,7 +258,7 @@ main: {
     .label j = 7
     .label j_1 = 3
     .label i = 2
-    .label __5 = 4
+    .label __4 = 4
     // [5] phi from main to main::@1 [phi:main->main::@1]
   __b1_from_main:
     // [5] phi (byte) main::j#3 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 
@@ -280,14 +275,14 @@ main: {
     jmp __b1
     // main::@1
   __b1:
-    // [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 -- vbuz1=vbuz2_rol_3 
+    // [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 -- vbuz1=vbuz2_rol_3 
     lda.z i
     asl
     asl
     asl
-    sta.z __5
-    // [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 -- vbuz1=vbuz2_plus_vbuz3 
-    lda.z __5
+    sta.z __4
+    // [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 -- vbuz1=vbuz2_plus_vbuz3 
+    lda.z __4
     clc
     adc.z i
     sta.z __1
@@ -351,10 +346,10 @@ main: {
   .word 'e', 'f', $4b, $c3
 
 REGISTER UPLIFT POTENTIAL REGISTERS
-Statement [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$5 main::to ] ( main:2 [ main::i#2 main::j#3 main::$5 main::to ] ) always clobbers reg byte a 
+Statement [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$4 main::to ] ( main:2 [ main::i#2 main::j#3 main::$4 main::to ] ) always clobbers reg byte a 
 Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ]
 Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::j#3 main::j#2 ]
-Statement [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a 
+Statement [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a 
 Statement [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) [ main::i#2 main::j#3 main::to ] ( main:2 [ main::i#2 main::j#3 main::to ] ) always clobbers reg byte a reg byte x reg byte y 
 Removing always clobbered register reg byte x as potential for zp[1]:2 [ main::i#2 main::i#1 ]
 Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::i#2 main::i#1 ]
@@ -366,8 +361,8 @@ Statement [12] (byte~) main::$3 ← (byte) main::j#1 << (byte) 1 [ main::i#2 mai
 Removing always clobbered register reg byte a as potential for zp[1]:7 [ main::j#1 ]
 Statement [13] *((const signed word*) SCREEN + (byte~) main::$3) ← *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_Y) [ main::i#2 main::to main::j#1 ] ( main:2 [ main::i#2 main::to main::j#1 ] ) always clobbers reg byte a 
 Statement [16] if((byte) main::i#1!=(byte) 3) goto main::@1 [ main::i#1 main::j#2 main::to ] ( main:2 [ main::i#1 main::j#2 main::to ] ) always clobbers reg byte a 
-Statement [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$5 main::to ] ( main:2 [ main::i#2 main::j#3 main::$5 main::to ] ) always clobbers reg byte a 
-Statement [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a 
+Statement [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$4 main::to ] ( main:2 [ main::i#2 main::j#3 main::$4 main::to ] ) always clobbers reg byte a 
+Statement [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a 
 Statement [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) [ main::i#2 main::j#3 main::to ] ( main:2 [ main::i#2 main::j#3 main::to ] ) always clobbers reg byte a reg byte x reg byte y 
 Statement [9] (byte~) main::$2 ← (byte) main::j#3 << (byte) 1 [ main::i#2 main::j#3 main::to main::$2 ] ( main:2 [ main::i#2 main::j#3 main::to main::$2 ] ) always clobbers reg byte a 
 Statement [10] *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to) [ main::i#2 main::j#3 main::to ] ( main:2 [ main::i#2 main::j#3 main::to ] ) always clobbers reg byte a 
@@ -376,7 +371,7 @@ Statement [13] *((const signed word*) SCREEN + (byte~) main::$3) ← *((signed w
 Statement [16] if((byte) main::i#1!=(byte) 3) goto main::@1 [ main::i#1 main::j#2 main::to ] ( main:2 [ main::i#1 main::j#2 main::to ] ) always clobbers reg byte a 
 Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , 
 Potential registers zp[1]:3 [ main::j#3 main::j#2 ] : zp[1]:3 , 
-Potential registers zp[1]:4 [ main::$5 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y , 
+Potential registers zp[1]:4 [ main::$4 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[1]:5 [ main::$1 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[1]:6 [ main::$2 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y , 
 Potential registers zp[1]:7 [ main::j#1 ] : zp[1]:7 , reg byte x , reg byte y , 
@@ -384,13 +379,13 @@ Potential registers zp[1]:8 [ main::$3 ] : zp[1]:8 , reg byte a , reg byte x , r
 Potential registers zp[4]:9 [ main::to ] : zp[4]:9 , 
 
 REGISTER UPLIFT SCOPES
-Uplift Scope [main] 22: zp[1]:4 [ main::$5 ] 22: zp[1]:6 [ main::$2 ] 22: zp[1]:8 [ main::$3 ] 20.9: zp[1]:2 [ main::i#2 main::i#1 ] 12.83: zp[1]:3 [ main::j#3 main::j#2 ] 11: zp[1]:5 [ main::$1 ] 11: zp[1]:7 [ main::j#1 ] 0: zp[4]:9 [ main::to ] 
+Uplift Scope [main] 22: zp[1]:4 [ main::$4 ] 22: zp[1]:6 [ main::$2 ] 22: zp[1]:8 [ main::$3 ] 20.9: zp[1]:2 [ main::i#2 main::i#1 ] 12.83: zp[1]:3 [ main::j#3 main::j#2 ] 11: zp[1]:5 [ main::$1 ] 11: zp[1]:7 [ main::j#1 ] 0: zp[4]:9 [ main::to ] 
 Uplift Scope [Vector] 
 Uplift Scope [Segment] 
 Uplift Scope [Segment::SegmentType] 
 Uplift Scope [] 
 
-Uplifting [main] best 1333 combination reg byte a [ main::$5 ] reg byte a [ main::$2 ] reg byte a [ main::$3 ] zp[1]:2 [ main::i#2 main::i#1 ] zp[1]:3 [ main::j#3 main::j#2 ] reg byte a [ main::$1 ] zp[1]:7 [ main::j#1 ] zp[4]:9 [ main::to ] 
+Uplifting [main] best 1333 combination reg byte a [ main::$4 ] reg byte a [ main::$2 ] reg byte a [ main::$3 ] zp[1]:2 [ main::i#2 main::i#1 ] zp[1]:3 [ main::j#3 main::j#2 ] reg byte a [ main::$1 ] zp[1]:7 [ main::j#1 ] zp[4]:9 [ main::to ] 
 Limited combination testing to 100 combinations of 768 possible.
 Uplifting [Vector] best 1333 combination 
 Uplifting [Segment] best 1333 combination 
@@ -416,8 +411,8 @@ ASSEMBLER BEFORE OPTIMIZATION
   .const SPLINE_TO = 1
   .label SCREEN = $400
   .const OFFSET_STRUCT_SEGMENT_TO = 1
-  .const OFFSET_STRUCT_VECTOR_Y = 2
   .const SIZEOF_STRUCT_VECTOR = 4
+  .const OFFSET_STRUCT_VECTOR_Y = 2
   // @begin
 __bbegin:
   // [1] phi from @begin to @1 [phi:@begin->@1]
@@ -455,12 +450,12 @@ main: {
     jmp __b1
     // main::@1
   __b1:
-    // [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 
+    // [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 
     clc
     adc.z i
     // [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) -- _deref_pssc1=pssc2_derefidx_vbuaa_memcpy_vbuc3 
@@ -569,7 +564,7 @@ FINAL SYMBOL TABLE
 (byte~) main::$1 reg byte a 11.0
 (byte~) main::$2 reg byte a 22.0
 (byte~) main::$3 reg byte a 22.0
-(byte~) main::$5 reg byte a 22.0
+(byte~) main::$4 reg byte a 22.0
 (label) main::@1
 (label) main::@return
 (byte) main::i
@@ -583,7 +578,7 @@ FINAL SYMBOL TABLE
 
 zp[1]:2 [ main::i#2 main::i#1 ]
 zp[1]:3 [ main::j#3 main::j#2 ]
-reg byte a [ main::$5 ]
+reg byte a [ main::$4 ]
 reg byte a [ main::$1 ]
 reg byte a [ main::$2 ]
 reg byte x [ main::j#1 ]
@@ -605,8 +600,8 @@ Score: 1141
   .const SPLINE_TO = 1
   .label SCREEN = $400
   .const OFFSET_STRUCT_SEGMENT_TO = 1
-  .const OFFSET_STRUCT_VECTOR_Y = 2
   .const SIZEOF_STRUCT_VECTOR = 4
+  .const OFFSET_STRUCT_VECTOR_Y = 2
   // @begin
   // [1] phi from @begin to @1 [phi:@begin->@1]
   // @1
@@ -631,12 +626,12 @@ main: {
     // main::@1
   __b1:
     // to = letter_c[i].to
-    // [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 
+    // [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 
     lda.z i
     asl
     asl
     asl
-    // [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 
+    // [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 
     clc
     adc.z i
     // [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) -- _deref_pssc1=pssc2_derefidx_vbuaa_memcpy_vbuc3 
diff --git a/src/test/ref/struct-39.sym b/src/test/ref/struct-39.sym
index 522bdb6f1..4868ebc35 100644
--- a/src/test/ref/struct-39.sym
+++ b/src/test/ref/struct-39.sym
@@ -20,7 +20,7 @@
 (byte~) main::$1 reg byte a 11.0
 (byte~) main::$2 reg byte a 22.0
 (byte~) main::$3 reg byte a 22.0
-(byte~) main::$5 reg byte a 22.0
+(byte~) main::$4 reg byte a 22.0
 (label) main::@1
 (label) main::@return
 (byte) main::i
@@ -34,7 +34,7 @@
 
 zp[1]:2 [ main::i#2 main::i#1 ]
 zp[1]:3 [ main::j#3 main::j#2 ]
-reg byte a [ main::$5 ]
+reg byte a [ main::$4 ]
 reg byte a [ main::$1 ]
 reg byte a [ main::$2 ]
 reg byte x [ main::j#1 ]
diff --git a/src/test/ref/struct-41.log b/src/test/ref/struct-41.log
index 60f711135..e8f5a9981 100644
--- a/src/test/ref/struct-41.log
+++ b/src/test/ref/struct-41.log
@@ -56,8 +56,8 @@ Adding struct value member variable copy *((byte*~) main::$0) ← (byte) main::v
 Adding struct value member variable copy *((byte*~) main::$1) ← (byte) main::v1_p_y
 Adding struct value member variable copy *((byte*~) main::$2) ← (byte) main::v1_q_x
 Adding struct value member variable copy *((byte*~) main::$3) ← (byte) main::v1_q_y
-Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*((struct Point*)&(struct Vector) main::v2+(const byte) OFFSET_STRUCT_VECTOR_P), struct Point, (const byte) SIZEOF_STRUCT_POINT)
-Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*((struct Point*)&(struct Vector) main::v2+(const byte) OFFSET_STRUCT_VECTOR_P), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Adding struct value member variable copy (byte) main::v5_p_x ← *((struct Point*)&(struct Vector) main::v4+(const byte) OFFSET_STRUCT_VECTOR_P).x
 Adding struct value member variable copy (byte) main::v5_p_y ← *((struct Point*)&(struct Vector) main::v4+(const byte) OFFSET_STRUCT_VECTOR_P).y
 Adding struct value member variable copy (byte) main::v5_q_x ← (byte) 8
diff --git a/src/test/ref/struct-42.log b/src/test/ref/struct-42.log
index 456176356..2dbeba13d 100644
--- a/src/test/ref/struct-42.log
+++ b/src/test/ref/struct-42.log
@@ -2,7 +2,7 @@ Fixing pointer array-indexing *((const struct Point*) points + (byte) main::i)
 Fixing pointer array-indexing *((const struct Point*) points + (number) 2)
 Fixing pointer array-indexing *((const struct Point*) points + (number) 2)
 Constantified RValue *((const struct Point*) points + (byte~) main::$1) ← { x: (byte) 2, y: (byte) 3 }
-Adding struct value member variable copy *((const struct Point*) points + (byte~) main::$1) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((const struct Point*) points + (byte~) main::$1) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Rewriting struct pointer member access *((const struct Point*) points + (number~) main::$2).x
 Rewriting struct pointer member access *((const struct Point*) points + (number~) main::$3).y
 
diff --git a/src/test/ref/struct-8.log b/src/test/ref/struct-8.log
index 5ef1cf44e..2f0768acf 100644
--- a/src/test/ref/struct-8.log
+++ b/src/test/ref/struct-8.log
@@ -10,19 +10,20 @@ Converted struct value to member variables (struct Point) main::point
 Created struct value member variable (byte) main::c_center_x
 Created struct value member variable (byte) main::c_center_y
 Converted struct value to member variables (struct Point) main::c_center
-Adding struct value member variable copy (byte) main::p_x ← (byte) $a
-Adding struct value member variable copy (byte) main::p_y ← (byte) $a
+Unwinding value copy (struct Point) main::p ← { x: (byte) $a, y: (byte) $a }
+Adding value simple copy (byte) main::p_x ← (byte) $a
+Adding value simple copy (byte) main::p_y ← (byte) $a
 Adding struct value member variable copy (struct Point) main::c_center ← (struct Point) main::p
 Adding struct value member variable copy (byte) main::c_radius ← (byte) 5
-Postponing unwinding for (struct Point) main::point ← (struct Circle) main::c.center
-Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center
+Unwinding value copy (struct Point) main::point ← (struct Circle) main::c.center
+Adding value simple copy (byte) main::point_x ← (byte) main::c_center_x
+Adding value simple copy (byte) main::point_y ← (byte) main::c_center_y
 Replacing struct member reference (struct Point) main::point.x with member unwinding reference (byte) main::point_x
 Replacing struct member reference (struct Point) main::point.y with member unwinding reference (byte) main::point_y
 Replacing struct member reference (struct Circle) main::c.radius with member unwinding reference (byte) main::c_radius
-Adding struct value member variable copy (byte) main::c_center_x ← (byte) main::p_x
-Adding struct value member variable copy (byte) main::c_center_y ← (byte) main::p_y
-Adding struct value member variable copy (byte) main::point_x ← (byte) main::c_center_x
-Adding struct value member variable copy (byte) main::point_y ← (byte) main::c_center_y
+Unwinding value copy (struct Point) main::c_center ← (struct Point) main::p
+Adding value simple copy (byte) main::c_center_x ← (byte) main::p_x
+Adding value simple copy (byte) main::c_center_y ← (byte) main::p_y
 Identified constant variable (byte) main::p_x
 Identified constant variable (byte) main::p_y
 Identified constant variable (byte) main::c_radius
diff --git a/src/test/ref/struct-9.log b/src/test/ref/struct-9.log
index a5be9a635..980ad89d7 100644
--- a/src/test/ref/struct-9.log
+++ b/src/test/ref/struct-9.log
@@ -7,20 +7,21 @@ Converted struct value to member variables (struct Circle) main::c
 Created struct value member variable (byte) main::c_center_x
 Created struct value member variable (byte) main::c_center_y
 Converted struct value to member variables (struct Point) main::c_center
-Adding struct value member variable copy (byte) main::p_x ← (byte) $a
-Adding struct value member variable copy (byte) main::p_y ← (byte) $a
-Adding struct value member variable copy (struct Point) main::c_center ← {}
-Adding struct value member variable copy (byte) main::c_radius ← (byte) 0
-Postponing unwinding for (struct Circle) main::c.center ← (struct Point) main::p
-Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center
+Unwinding value copy (struct Point) main::p ← { x: (byte) $a, y: (byte) $a }
+Adding value simple copy (byte) main::p_x ← (byte) $a
+Adding value simple copy (byte) main::p_y ← (byte) $a
+Unwinding value copy (struct Circle) main::c ← {}
+Unwinding value copy (struct Circle) main::c ← {}
+Adding value simple copy (byte) main::c_center_x ← (byte) 0
+Adding value simple copy (byte) main::c_center_y ← (byte) 0
+Adding value simple copy (byte) main::c_radius ← (byte) 0
+Unwinding value copy (struct Circle) main::c.center ← (struct Point) main::p
+Adding value simple copy (byte) main::c_center_x ← (byte) main::p_x
+Adding value simple copy (byte) main::c_center_y ← (byte) main::p_y
 Replacing struct member reference (struct Circle) main::c.radius with member unwinding reference (byte) main::c_radius
 Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center
 Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center
 Replacing struct member reference (struct Circle) main::c.radius with member unwinding reference (byte) main::c_radius
-Adding struct value member variable copy (byte) main::c_center_x ← (byte) 0
-Adding struct value member variable copy (byte) main::c_center_y ← (byte) 0
-Adding struct value member variable copy (byte) main::c_center_x ← (byte) main::p_x
-Adding struct value member variable copy (byte) main::c_center_y ← (byte) main::p_y
 Replacing struct member reference (struct Point) main::c_center.x with member unwinding reference (byte) main::c_center_x
 Replacing struct member reference (struct Point) main::c_center.y with member unwinding reference (byte) main::c_center_y
 Identified constant variable (byte) main::p_x
@@ -64,6 +65,7 @@ SYMBOL TABLE SSA
 (void()) main()
 (label) main::@return
 (const byte*) main::SCREEN = (byte*)(number) $400
+(struct Point) main::c_center
 (byte) main::c_center_x
 (byte) main::c_center_x#0
 (byte) main::c_center_x#1
@@ -155,6 +157,7 @@ VARIABLE REGISTER WEIGHTS
 (byte) Point::x
 (byte) Point::y
 (void()) main()
+(struct Point) main::c_center
 (byte) main::c_center_x
 (byte) main::c_center_y
 (byte) main::c_radius
@@ -299,6 +302,7 @@ FINAL SYMBOL TABLE
 (void()) main()
 (label) main::@return
 (const byte*) main::SCREEN = (byte*) 1024
+(struct Point) main::c_center
 (byte) main::c_center_x
 (byte) main::c_center_y
 (byte) main::c_radius
diff --git a/src/test/ref/struct-9.sym b/src/test/ref/struct-9.sym
index 31be6c1da..efc45ec5e 100644
--- a/src/test/ref/struct-9.sym
+++ b/src/test/ref/struct-9.sym
@@ -8,6 +8,7 @@
 (void()) main()
 (label) main::@return
 (const byte*) main::SCREEN = (byte*) 1024
+(struct Point) main::c_center
 (byte) main::c_center_x
 (byte) main::c_center_y
 (byte) main::c_radius
diff --git a/src/test/ref/struct-ptr-10.log b/src/test/ref/struct-ptr-10.log
index 643db2e44..c286de018 100644
--- a/src/test/ref/struct-ptr-10.log
+++ b/src/test/ref/struct-ptr-10.log
@@ -4,7 +4,7 @@ Fixing pointer array-indexing *((const struct Point*) main::SCREEN + (word) main
 Constantified RValue *((const struct Point*) points + (word~) main::$3) ← (struct Point){ (byte) 2, (byte~) main::$0 }
 Adding struct value member variable copy *((byte*~) main::$5 + (word~) main::$3) ← (byte) 2
 Adding struct value member variable copy *((byte*~) main::$6 + (word~) main::$3) ← (byte~) main::$0
-Adding struct value member variable copy *((const struct Point*) main::SCREEN + (word~) main::$4) ← memcpy(*((const struct Point*) points + (word~) main::$4), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((const struct Point*) main::SCREEN + (word~) main::$4) ← memcpy(*((const struct Point*) points + (word~) main::$4), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Culled Empty Block (label) main::@4
 
 CONTROL FLOW GRAPH SSA
diff --git a/src/test/ref/struct-ptr-11.log b/src/test/ref/struct-ptr-11.log
index 6ff09c182..1eb06ee5a 100644
--- a/src/test/ref/struct-ptr-11.log
+++ b/src/test/ref/struct-ptr-11.log
@@ -5,7 +5,7 @@ Constantified RValue *((const struct Point*) points + (byte~) main::$6) ← (str
 Adding struct value member variable copy *((signed byte*~) main::$8 + (byte~) main::$6) ← (signed byte~) main::$0
 Adding struct value member variable copy *((signed byte*~) main::$9 + (byte~) main::$6) ← (signed byte~) main::$2
 Adding struct value member variable copy *((signed byte*~) main::$10 + (byte~) main::$6) ← (signed byte~) main::$3
-Adding struct value member variable copy *((const struct Point*) main::SCREEN + (byte~) main::$7) ← memcpy(*((const struct Point*) points + (byte~) main::$7), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((const struct Point*) main::SCREEN + (byte~) main::$7) ← memcpy(*((const struct Point*) points + (byte~) main::$7), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Culled Empty Block (label) main::@4
 
 CONTROL FLOW GRAPH SSA
diff --git a/src/test/ref/struct-ptr-18.log b/src/test/ref/struct-ptr-18.log
index 62a27ca9e..09e52b8f0 100644
--- a/src/test/ref/struct-ptr-18.log
+++ b/src/test/ref/struct-ptr-18.log
@@ -7,8 +7,8 @@ Created struct value member variable (byte) print::p_x
 Created struct value member variable (byte) print::p_y
 Converted struct value to member variables (struct Point) print::p
 Converted procedure struct value parameter to member unwinding (void()) print((byte) print::p_x , (byte) print::p_y)
-Adding struct value member variable copy *((const struct Point*) points + (number~) main::$2) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT)
-Adding struct value member variable copy *((const struct Point*) points + (number~) main::$3) ← memcpy(*(&(const struct Point) $1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((const struct Point*) points + (number~) main::$2) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((const struct Point*) points + (number~) main::$3) ← memcpy(*(&(const struct Point) $1), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Converted procedure struct value parameter to member unwinding in call (void~) main::$0 ← call print *((byte*~) main::$5 + (byte~) main::$4) *((byte*~) main::$6 + (byte~) main::$4) 
 Replacing struct member reference (struct Point) print::p.x with member unwinding reference (byte) print::p_x
 Replacing struct member reference (struct Point) print::p.y with member unwinding reference (byte) print::p_y
diff --git a/src/test/ref/struct-ptr-9.log b/src/test/ref/struct-ptr-9.log
index b7cd90eb5..bb7aec055 100644
--- a/src/test/ref/struct-ptr-9.log
+++ b/src/test/ref/struct-ptr-9.log
@@ -4,7 +4,7 @@ Fixing pointer array-indexing *((const struct Point*) main::SCREEN + (byte) main
 Constantified RValue *((const struct Point*) points + (byte~) main::$2) ← (struct Point){ (byte) 2, (byte) main::i }
 Adding struct value member variable copy *((byte*~) main::$4 + (byte~) main::$2) ← (byte) 2
 Adding struct value member variable copy *((byte*~) main::$5 + (byte~) main::$2) ← (byte) main::i
-Adding struct value member variable copy *((const struct Point*) main::SCREEN + (byte~) main::$3) ← memcpy(*((const struct Point*) points + (byte~) main::$3), struct Point, (const byte) SIZEOF_STRUCT_POINT)
+Adding value bulk copy *((const struct Point*) main::SCREEN + (byte~) main::$3) ← memcpy(*((const struct Point*) points + (byte~) main::$3), struct Point, (const byte) SIZEOF_STRUCT_POINT)
 Culled Empty Block (label) main::@4
 
 CONTROL FLOW GRAPH SSA