mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-08-09 04:25:12 +00:00
Improved exception for recursive aliases.
This commit is contained in:
@@ -137,6 +137,52 @@ public class VariableReferenceInfos {
|
|||||||
this.stmtDefinedVars = stmtDefinedVars;
|
this.stmtDefinedVars = stmtDefinedVars;
|
||||||
this.stmtReferencedVars = stmtReferencedVars;
|
this.stmtReferencedVars = stmtReferencedVars;
|
||||||
this.symbolVarReferences = symbolVarReferences;
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -38,7 +38,7 @@ public class AliasReplacer implements ProgramValueHandler {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(ProgramValue programValue, Statement currentStmt, ListIterator<Statement> stmtIt, ControlFlowBlock currentBlock) {
|
public void execute(ProgramValue programValue, Statement currentStmt, ListIterator<Statement> stmtIt, ControlFlowBlock currentBlock) {
|
||||||
if(programValue.get() != null) {
|
if(programValue.get() != null) {
|
||||||
Value replacement = getReplacement(programValue.get(), aliases);
|
Value replacement = getReplacement(programValue.get(), aliases, 0);
|
||||||
if(replacement != null) {
|
if(replacement != null) {
|
||||||
// System.out.println("Replacing "+programValue.get() + " with " +replacement + " in " +currentStmt);
|
// System.out.println("Replacing "+programValue.get() + " with " +replacement + " in " +currentStmt);
|
||||||
programValue.set(replacement);
|
programValue.set(replacement);
|
||||||
@@ -55,11 +55,21 @@ public class AliasReplacer implements ProgramValueHandler {
|
|||||||
* @param rValue The RValue to find an alias for
|
* @param rValue The RValue to find an alias for
|
||||||
* @return The alias to use. Null if no alias exists.
|
* @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) {
|
if(rValue instanceof SymbolRef) {
|
||||||
RValue alias = aliases.get(rValue);
|
RValue alias = aliases.get(rValue);
|
||||||
if(alias != null) {
|
if(alias != null) {
|
||||||
RValue replacement = getReplacement(alias, aliases);
|
RValue replacement = getReplacement(alias, aliases, depth+1);
|
||||||
if(replacement != null) {
|
if(replacement != null) {
|
||||||
return replacement;
|
return replacement;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user