diff --git a/src/main/java/dk/camelot64/kickc/model/VariableReferenceInfos.java b/src/main/java/dk/camelot64/kickc/model/VariableReferenceInfos.java index a262b8885..59a8516ab 100644 --- a/src/main/java/dk/camelot64/kickc/model/VariableReferenceInfos.java +++ b/src/main/java/dk/camelot64/kickc/model/VariableReferenceInfos.java @@ -137,6 +137,52 @@ public class VariableReferenceInfos { this.stmtDefinedVars = stmtDefinedVars; this.stmtReferencedVars = stmtReferencedVars; this.symbolVarReferences = symbolVarReferences; + + } + + public String getSizeInfo() { + StringBuilder sizeInfo = new StringBuilder(); + if(blockReferencedVars!=null) { + sizeInfo.append("blockReferencedVars " + blockReferencedVars.size() + " labels "); + int sub = 0; + for(Collection variableRefs : blockReferencedVars.values()) { + sub += variableRefs.size(); + } + sizeInfo.append(" " + sub + " varrefs" + "\n"); + } + if(blockUsedVars!=null) { + sizeInfo.append("blockUsedVars " + blockUsedVars.size() + " labels "); + int sub = 0; + for(Collection variableRefs : blockUsedVars.values()) { + sub += variableRefs.size(); + } + sizeInfo.append(" " + sub + " varrefs" + "\n"); + } + { + sizeInfo.append("stmtDefinedVars " + stmtDefinedVars.size() + " ints "); + int sub = 0; + for(Collection variableRefs : stmtDefinedVars.values()) { + sub += variableRefs.size(); + } + sizeInfo.append(" " + sub + " varrefs" + "\n"); + } + { + sizeInfo.append("stmtReferencedVars " + stmtReferencedVars.size() + " ints "); + int sub = 0; + for(Collection variableRefs : stmtReferencedVars.values()) { + sub += variableRefs.size(); + } + sizeInfo.append(" " + sub + " varrefs" + "\n"); + } + { + sizeInfo.append("symbolVarReferences " + symbolVarReferences.size() + " SymbolVariableRefs "); + int sub = 0; + for(Collection value : symbolVarReferences.values()) { + sub += value.size(); + } + sizeInfo.append(" " + sub + " ReferenceToSymbolVars" + "\n"); + } + return sizeInfo.toString(); } /** diff --git a/src/main/java/dk/camelot64/kickc/passes/AliasReplacer.java b/src/main/java/dk/camelot64/kickc/passes/AliasReplacer.java index d46466e46..98897b6c7 100644 --- a/src/main/java/dk/camelot64/kickc/passes/AliasReplacer.java +++ b/src/main/java/dk/camelot64/kickc/passes/AliasReplacer.java @@ -38,7 +38,7 @@ public class AliasReplacer implements ProgramValueHandler { @Override public void execute(ProgramValue programValue, Statement currentStmt, ListIterator stmtIt, ControlFlowBlock currentBlock) { if(programValue.get() != null) { - Value replacement = getReplacement(programValue.get(), aliases); + Value replacement = getReplacement(programValue.get(), aliases, 0); if(replacement != null) { // System.out.println("Replacing "+programValue.get() + " with " +replacement + " in " +currentStmt); programValue.set(replacement); @@ -55,11 +55,21 @@ public class AliasReplacer implements ProgramValueHandler { * @param rValue The RValue to find an alias for * @return The alias to use. Null if no alias exists. */ - private static RValue getReplacement(Value rValue, Map aliases) { + private static RValue getReplacement(Value rValue, Map aliases, int depth) { + if(depth>50) { + StringBuilder aliasList = new StringBuilder(); + Value rVal = rValue; + do { + aliasList.append(rVal.toString()).append(" > "); + rVal = aliases.get(rVal); + } while(rVal!=rValue); + aliasList.append(rVal.toString()); + throw new InternalError("Error! Recursive aliases: "+aliasList); + } if(rValue instanceof SymbolRef) { RValue alias = aliases.get(rValue); if(alias != null) { - RValue replacement = getReplacement(alias, aliases); + RValue replacement = getReplacement(alias, aliases, depth+1); if(replacement != null) { return replacement; } else { diff --git a/src/main/java/dk/camelot64/kickc/passes/calcs/PassNCalcVariableReferenceInfos.java b/src/main/java/dk/camelot64/kickc/passes/calcs/PassNCalcVariableReferenceInfos.java index b33cfe26b..dd7e24aab 100644 --- a/src/main/java/dk/camelot64/kickc/passes/calcs/PassNCalcVariableReferenceInfos.java +++ b/src/main/java/dk/camelot64/kickc/passes/calcs/PassNCalcVariableReferenceInfos.java @@ -101,7 +101,11 @@ public class PassNCalcVariableReferenceInfos extends PassNCalcBase