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:
parent
a2ce3a5e14
commit
f234f5a1ae
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user