1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-17 10:30:43 +00:00

Improved exception for recursive aliases.

This commit is contained in:
jespergravgaard 2019-09-02 19:15:28 +02:00
parent a2ce3a5e14
commit f234f5a1ae
3 changed files with 64 additions and 4 deletions

View File

@ -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<VariableRef> 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<VariableRef> variableRefs : blockUsedVars.values()) {
sub += variableRefs.size();
}
sizeInfo.append(" " + sub + " varrefs" + "\n");
}
{
sizeInfo.append("stmtDefinedVars " + stmtDefinedVars.size() + " ints ");
int sub = 0;
for(Collection<VariableRef> variableRefs : stmtDefinedVars.values()) {
sub += variableRefs.size();
}
sizeInfo.append(" " + sub + " varrefs" + "\n");
}
{
sizeInfo.append("stmtReferencedVars " + stmtReferencedVars.size() + " ints ");
int sub = 0;
for(Collection<VariableRef> variableRefs : stmtReferencedVars.values()) {
sub += variableRefs.size();
}
sizeInfo.append(" " + sub + " varrefs" + "\n");
}
{
sizeInfo.append("symbolVarReferences " + symbolVarReferences.size() + " SymbolVariableRefs ");
int sub = 0;
for(Collection<ReferenceToSymbolVar> value : symbolVarReferences.values()) {
sub += value.size();
}
sizeInfo.append(" " + sub + " ReferenceToSymbolVars" + "\n");
}
return sizeInfo.toString();
}
/**

View File

@ -38,7 +38,7 @@ public class AliasReplacer implements ProgramValueHandler {
@Override
public void execute(ProgramValue programValue, Statement currentStmt, ListIterator<Statement> 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<? extends SymbolRef, ? extends RValue> aliases) {
private static RValue getReplacement(Value rValue, Map<? extends SymbolRef, ? extends RValue> 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 {

View File

@ -101,7 +101,11 @@ public class PassNCalcVariableReferenceInfos extends PassNCalcBase<VariableRefer
}
});
}
return new VariableReferenceInfos(blockReferencedVars, blockUsedVars, stmtReferenced, stmtDefined, symbolVarReferences);
VariableReferenceInfos variableReferenceInfos = new VariableReferenceInfos(blockReferencedVars, blockUsedVars, stmtReferenced, stmtDefined, symbolVarReferences);
if(getLog().isVerboseSSAOptimize()) {
getLog().append(variableReferenceInfos.getSizeInfo());
}
return variableReferenceInfos;
}
/**