From bd9a403b6442568686e48b5ef7b654098b4ce720 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Mon, 10 Feb 2020 00:33:16 +0100 Subject: [PATCH] Improving ssa_mem variable support. --- .../camelot64/kickc/passes/Pass4CodeGeneration.java | 5 +++-- .../kickc/passes/Pass4MemoryCoalesceCallGraph.java | 11 +++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 69cbfefa6..8f37f7e5e 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -531,8 +531,9 @@ public class Pass4CodeGeneration { setCurrentSegment(variable.getDataSegment(), asm); // Add any comments generateComments(asm, variable.getComments()); - if(!mainVar.getAsmName().equals(variable.getAsmName())) { - asm.addLabelDecl(variable.getAsmName(), AsmFormat.getAsmConstant(program, new ConstantSymbolPointer(mainVar.getRef()), 99, scopeRef)); + final String mainAsmName = AsmFormat.getAsmConstant(program, new ConstantSymbolPointer(mainVar.getRef()), 99, scopeRef); + if(!mainAsmName.equals(variable.getAsmName())) { + asm.addLabelDecl(variable.getAsmName(), mainAsmName); } else { // Add any alignment Integer declaredAlignment = variable.getMemoryAlignment(); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesceCallGraph.java b/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesceCallGraph.java index df647affc..229067f30 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesceCallGraph.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesceCallGraph.java @@ -1,9 +1,6 @@ package dk.camelot64.kickc.passes; -import dk.camelot64.kickc.model.CallGraph; -import dk.camelot64.kickc.model.LiveRangeEquivalenceClass; -import dk.camelot64.kickc.model.LiveRangeEquivalenceClassSet; -import dk.camelot64.kickc.model.Program; +import dk.camelot64.kickc.model.*; import dk.camelot64.kickc.model.values.ScopeRef; import dk.camelot64.kickc.model.values.VariableRef; @@ -54,6 +51,9 @@ public class Pass4MemoryCoalesceCallGraph extends Pass2Base { List handledECs = new ArrayList<>(); List allECs = new ArrayList<>(liveRangeEquivalenceClassSet.getEquivalenceClasses()); for(LiveRangeEquivalenceClass thisEC : allECs) { + // Skip main-memory registers + if(Registers.RegisterType.MAIN_MEM.equals(thisEC.getRegister().getType())) + continue; // Find all calling scopes - since we want to avoid coalescing with variables in these Set allCallingScopes = new LinkedHashSet<>(); for(ScopeRef ecScope : getEquivalenceClassScopes(thisEC)) { @@ -62,6 +62,9 @@ public class Pass4MemoryCoalesceCallGraph extends Pass2Base { // Go through the already handled equivalence classes - and try to coalesce with any that does not have variables from the calling scopes boolean coalesced = false; for(LiveRangeEquivalenceClass otherEC : handledECs) { + // Skip main-memory registers + if(Registers.RegisterType.MAIN_MEM.equals(otherEC.getRegister().getType())) + continue; // Skip if there is a scope overlap if(isScopeOverlap(otherEC, allCallingScopes)) continue;