Disable const parameter optimization in variadic functions

This commit is contained in:
drmortalwombat 2024-09-21 12:13:19 +02:00
parent e80f9812ef
commit b61aa37f71

View File

@ -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;
}
} }
} }