Disable const parameter optimization in variadic functions
This commit is contained in:
parent
e80f9812ef
commit
b61aa37f71
|
@ -342,54 +342,56 @@ bool GlobalOptimizer::Optimize(void)
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(ftype->mFlags & DTF_VARIADIC))
|
||||||
Declaration* pdec = ftype->mParams;
|
|
||||||
int vi = 0;
|
|
||||||
while (pdec)
|
|
||||||
{
|
{
|
||||||
pdec->mVarIndex += vi;
|
Declaration* pdec = ftype->mParams;
|
||||||
if (!(pdec->mOptFlags & OPTF_VAR_USED) && !(pdec->mFlags & DTF_FPARAM_UNUSED))
|
int vi = 0;
|
||||||
|
while (pdec)
|
||||||
{
|
{
|
||||||
if (!pdec->mBase->IsReference() || !(pdec->mOptFlags & OPTF_VAR_ADDRESS))
|
pdec->mVarIndex += vi;
|
||||||
|
if (!(pdec->mOptFlags & OPTF_VAR_USED) && !(pdec->mFlags & DTF_FPARAM_UNUSED))
|
||||||
|
{
|
||||||
|
if (!pdec->mBase->IsReference() || !(pdec->mOptFlags & OPTF_VAR_ADDRESS))
|
||||||
|
{
|
||||||
|
#if DUMP_OPTS
|
||||||
|
printf("Unused parameter %s\n", pdec->mIdent ? pdec->mIdent->mString : "_");
|
||||||
|
#endif
|
||||||
|
vi -= pdec->mSize;
|
||||||
|
|
||||||
|
pdec->mFlags |= DTF_FPARAM_UNUSED;
|
||||||
|
pdec->mVarIndex = func->mNumVars++;
|
||||||
|
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!(pdec->mOptFlags & OPTF_VAR_ADDRESS) && pdec->mBase->IsReference() && pdec->mBase->mBase->IsSimpleType())
|
||||||
{
|
{
|
||||||
#if DUMP_OPTS
|
#if DUMP_OPTS
|
||||||
printf("Unused parameter %s\n", pdec->mIdent ? pdec->mIdent->mString : "_");
|
printf("Reference parameter %s to value\n", pdec->mIdent ? pdec->mIdent->mString : "_");
|
||||||
#endif
|
#endif
|
||||||
vi -= pdec->mSize;
|
vi += pdec->mSize - 2;
|
||||||
|
|
||||||
pdec->mFlags |= DTF_FPARAM_UNUSED;
|
pdec->mBase = pdec->mBase->mBase;
|
||||||
pdec->mVarIndex = func->mNumVars++;
|
pdec->mSize = pdec->mBase->mSize;
|
||||||
|
|
||||||
|
UndoParamReference(func->mValue, pdec);
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
else if ((pdec->mOptFlags & OPTF_VAR_CONST) && !(pdec->mOptFlags & OPTF_VAR_ADDRESS))
|
||||||
else if (!(pdec->mOptFlags & OPTF_VAR_ADDRESS) && pdec->mBase->IsReference() && pdec->mBase->mBase->IsSimpleType())
|
|
||||||
{
|
|
||||||
#if DUMP_OPTS
|
|
||||||
printf("Reference parameter %s to value\n", pdec->mIdent ? pdec->mIdent->mString : "_");
|
|
||||||
#endif
|
|
||||||
vi += pdec->mSize - 2;
|
|
||||||
|
|
||||||
pdec->mBase = pdec->mBase->mBase;
|
|
||||||
pdec->mSize = pdec->mBase->mSize;
|
|
||||||
|
|
||||||
UndoParamReference(func->mValue, pdec);
|
|
||||||
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
else if ((pdec->mOptFlags & OPTF_VAR_CONST) && !(pdec->mOptFlags & OPTF_VAR_ADDRESS))
|
|
||||||
{
|
|
||||||
if (ReplaceParamConst(func->mValue, pdec))
|
|
||||||
{
|
{
|
||||||
|
if (ReplaceParamConst(func->mValue, pdec))
|
||||||
|
{
|
||||||
#if DUMP_OPTS
|
#if DUMP_OPTS
|
||||||
printf("Const parameter %s\n", pdec->mIdent ? pdec->mIdent->mString : "_");
|
printf("Const parameter %s\n", pdec->mIdent ? pdec->mIdent->mString : "_");
|
||||||
#endif
|
#endif
|
||||||
changed = true;
|
changed = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
pdec->mOptFlags = 0;
|
pdec->mOptFlags = 0;
|
||||||
pdec = pdec->mNext;
|
pdec = pdec->mNext;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue