Fix loop integer range propagation
This commit is contained in:
parent
0d7ffd787f
commit
34947da898
|
@ -289,6 +289,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
|
||||||
{
|
{
|
||||||
if (!(procDec->mBase->mFlags & DTF_FASTCALL) && (procDec->mType == DT_CONST_FUNCTION) && !(procDec->mFlags & DTF_FUNC_ANALYZING))
|
if (!(procDec->mBase->mFlags & DTF_FASTCALL) && (procDec->mType == DT_CONST_FUNCTION) && !(procDec->mFlags & DTF_FUNC_ANALYZING))
|
||||||
{
|
{
|
||||||
|
// printf("CheckFastcall1 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags);
|
||||||
|
|
||||||
procDec->mFlags |= DTF_FUNC_ANALYZING;
|
procDec->mFlags |= DTF_FUNC_ANALYZING;
|
||||||
int nbase = 0;
|
int nbase = 0;
|
||||||
for (int i = 0; i < procDec->mCalled.Size(); i++)
|
for (int i = 0; i < procDec->mCalled.Size(); i++)
|
||||||
|
@ -328,6 +330,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
|
||||||
nbase = n;
|
nbase = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// printf("CheckFastcall2 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags);
|
||||||
|
|
||||||
if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH)
|
if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH)
|
||||||
{
|
{
|
||||||
Declaration* maxf = nullptr;
|
Declaration* maxf = nullptr;
|
||||||
|
@ -388,6 +392,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
|
||||||
|
|
||||||
procDec->mFlags &= ~DTF_FUNC_ANALYZING;
|
procDec->mFlags &= ~DTF_FUNC_ANALYZING;
|
||||||
|
|
||||||
|
// printf("CheckFastcall3 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags);
|
||||||
|
|
||||||
if (procDec->mBase->mFlags & DTF_STACKCALL)
|
if (procDec->mBase->mFlags & DTF_STACKCALL)
|
||||||
{
|
{
|
||||||
procDec->mBase->mFlags |= DTF_STACKCALL;
|
procDec->mBase->mFlags |= DTF_STACKCALL;
|
||||||
|
@ -461,19 +467,17 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
|
||||||
procDec->mBase->mFastCallSize = nparams;
|
procDec->mBase->mFastCallSize = nparams;
|
||||||
|
|
||||||
procDec->mBase->mFlags |= DTF_FASTCALL;
|
procDec->mBase->mFlags |= DTF_FASTCALL;
|
||||||
#if 0
|
// printf("FASTCALL %s\n", procDec->mQualIdent->mString);
|
||||||
printf("FASTCALL %s\n", f->mIdent->mString);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// printf("STACKCALL %s, %d %d\n", procDec->mIdent->mString, cnparams, fplimit);
|
// printf("STACKCALL %s, %d %d\n", procDec->mQualIdent->mString, cnparams, fplimit);
|
||||||
procDec->mBase->mFlags |= DTF_STACKCALL;
|
procDec->mBase->mFlags |= DTF_STACKCALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// printf("STACKCALL %s, F%d\n", procDec->mIdent->mString, !!(procDec->mFlags& DTF_FUNC_VARIABLE));
|
// printf("STACKCALL %s, F%d\n", procDec->mQualIdent->mString, !!(procDec->mFlags& DTF_FUNC_VARIABLE));
|
||||||
procDec->mBase->mFlags |= DTF_STACKCALL;
|
procDec->mBase->mFlags |= DTF_STACKCALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6964,6 +6964,13 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
|
||||||
tempChain[ins->mDst.mTemp].mBaseTemp = tempChain[ins->mSrc[1].mTemp].mBaseTemp;
|
tempChain[ins->mDst.mTemp].mBaseTemp = tempChain[ins->mSrc[1].mTemp].mBaseTemp;
|
||||||
tempChain[ins->mDst.mTemp].mOffset = tempChain[ins->mSrc[1].mTemp].mOffset + ins->mSrc[0].mIntConst;
|
tempChain[ins->mDst.mTemp].mOffset = tempChain[ins->mSrc[1].mTemp].mOffset + ins->mSrc[0].mIntConst;
|
||||||
}
|
}
|
||||||
|
else if (ins->mCode == IC_BINARY_OPERATOR && ins->mOperator == IA_ADD &&
|
||||||
|
ins->mSrc[0].mTemp >= 0 && ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst > 0 &&
|
||||||
|
tempChain[ins->mSrc[0].mTemp].mBaseTemp >= 0)
|
||||||
|
{
|
||||||
|
tempChain[ins->mDst.mTemp].mBaseTemp = tempChain[ins->mSrc[0].mTemp].mBaseTemp;
|
||||||
|
tempChain[ins->mDst.mTemp].mOffset = tempChain[ins->mSrc[0].mTemp].mOffset + ins->mSrc[1].mIntConst;
|
||||||
|
}
|
||||||
else if (ins->mCode == IC_CONVERSION_OPERATOR && ins->mOperator == IA_EXT8TO16U && ins->mSrc[0].mTemp >= 0)
|
else if (ins->mCode == IC_CONVERSION_OPERATOR && ins->mOperator == IA_EXT8TO16U && ins->mSrc[0].mTemp >= 0)
|
||||||
tempChain[ins->mDst.mTemp] = tempChain[ins->mSrc[0].mTemp];
|
tempChain[ins->mDst.mTemp] = tempChain[ins->mSrc[0].mTemp];
|
||||||
else if (ins->mDst.mTemp >= 0)
|
else if (ins->mDst.mTemp >= 0)
|
||||||
|
@ -9654,7 +9661,16 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
|
||||||
nins->mSrc[1] = cins->mDst;
|
nins->mSrc[1] = cins->mDst;
|
||||||
nins->mDst.mTemp = spareTemps++;
|
nins->mDst.mTemp = spareTemps++;
|
||||||
nins->mDst.mType = IT_INT16;
|
nins->mDst.mType = IT_INT16;
|
||||||
nins->mDst.mRange = ins->mDst.mRange;
|
if (cins->mDst.mRange.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
{
|
||||||
|
nins->mDst.mRange.mMinState = IntegerValueRange::S_BOUND;
|
||||||
|
nins->mDst.mRange.mMinValue = cins->mDst.mRange.mMinValue << nins->mSrc[0].mIntConst;
|
||||||
|
}
|
||||||
|
if (cins->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
{
|
||||||
|
nins->mDst.mRange.mMaxState = IntegerValueRange::S_BOUND;
|
||||||
|
nins->mDst.mRange.mMaxValue = cins->mDst.mRange.mMaxValue << nins->mSrc[0].mIntConst;
|
||||||
|
}
|
||||||
mInstructions.Insert(i + 1, nins);
|
mInstructions.Insert(i + 1, nins);
|
||||||
|
|
||||||
ins->mOperator = ains->mOperator;
|
ins->mOperator = ains->mOperator;
|
||||||
|
@ -15560,6 +15576,8 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
ins->mOperator = IA_ADD;
|
ins->mOperator = IA_ADD;
|
||||||
ins->mSrc[0].mIntConst = indexStep[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst;
|
ins->mSrc[0].mIntConst = indexStep[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst;
|
||||||
ins->mSrc[1] = ins->mDst;
|
ins->mSrc[1] = ins->mDst;
|
||||||
|
if (ins->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mDst.mRange.mMaxValue += ins->mSrc[0].mIntConst;
|
||||||
|
|
||||||
indexins.Push(ins);
|
indexins.Push(ins);
|
||||||
}
|
}
|
||||||
|
@ -15577,6 +15595,8 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
ains->mSrc[1] = ins->mDst;
|
ains->mSrc[1] = ins->mDst;
|
||||||
ains->mSrc[1].mTemp = -1;
|
ains->mSrc[1].mTemp = -1;
|
||||||
ains->mSrc[1].mIntConst = indexStep[ins->mSrc[1].mTemp];
|
ains->mSrc[1].mIntConst = indexStep[ins->mSrc[1].mTemp];
|
||||||
|
if (ains->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ains->mDst.mRange.mMaxValue += ains->mSrc[1].mIntConst;
|
||||||
|
|
||||||
indexins.Push(ains);
|
indexins.Push(ains);
|
||||||
}
|
}
|
||||||
|
@ -15595,8 +15615,14 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
ains->mSrc[0].mTemp = -1;
|
ains->mSrc[0].mTemp = -1;
|
||||||
ains->mSrc[0].mIntConst = indexStep[ins->mSrc[0].mTemp];
|
ains->mSrc[0].mIntConst = indexStep[ins->mSrc[0].mTemp];
|
||||||
|
|
||||||
|
if (ains->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ains->mDst.mRange.mMaxValue += ains->mSrc[0].mIntConst;
|
||||||
indexins.Push(ains);
|
indexins.Push(ains);
|
||||||
}
|
}
|
||||||
|
else if (ins->mCode == IC_LEA && ins->mSrc[1].mTemp < 0 && ins->mSrc[0].IsUByte() && (ins->mSrc[1].mMemory == IM_ABSOLUTE || ins->mSrc[1].mMemory == IM_GLOBAL))
|
||||||
|
{
|
||||||
|
mInstructions[j++] = ins;
|
||||||
|
}
|
||||||
else if (ins->mCode == IC_LEA && (ins->mSrc[1].mTemp < 0 || dep[ins->mSrc[1].mTemp] == DEP_UNKNOWN || dep[ins->mSrc[1].mTemp] == DEP_DEFINED) && dep[ins->mSrc[0].mTemp] == DEP_INDEX_DERIVED)
|
else if (ins->mCode == IC_LEA && (ins->mSrc[1].mTemp < 0 || dep[ins->mSrc[1].mTemp] == DEP_UNKNOWN || dep[ins->mSrc[1].mTemp] == DEP_DEFINED) && dep[ins->mSrc[0].mTemp] == DEP_INDEX_DERIVED)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -19145,7 +19171,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "tile_collide");
|
CheckFunc = !strcmp(mIdent->mString, "_menuShowSprites");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
@ -19544,6 +19570,12 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
LoadStoreForwarding(paramMemory);
|
||||||
|
|
||||||
|
RebuildIntegerRangeSet();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
BuildLoopPrefix();
|
BuildLoopPrefix();
|
||||||
DisassembleDebug("added dominators");
|
DisassembleDebug("added dominators");
|
||||||
|
|
Loading…
Reference in New Issue