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))
|
||||
{
|
||||
// printf("CheckFastcall1 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags);
|
||||
|
||||
procDec->mFlags |= DTF_FUNC_ANALYZING;
|
||||
int nbase = 0;
|
||||
for (int i = 0; i < procDec->mCalled.Size(); i++)
|
||||
|
@ -328,6 +330,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
|
|||
nbase = n;
|
||||
}
|
||||
|
||||
// printf("CheckFastcall2 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags);
|
||||
|
||||
if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH)
|
||||
{
|
||||
Declaration* maxf = nullptr;
|
||||
|
@ -388,6 +392,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
|
|||
|
||||
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)
|
||||
{
|
||||
procDec->mBase->mFlags |= DTF_STACKCALL;
|
||||
|
@ -461,19 +467,17 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
|
|||
procDec->mBase->mFastCallSize = nparams;
|
||||
|
||||
procDec->mBase->mFlags |= DTF_FASTCALL;
|
||||
#if 0
|
||||
printf("FASTCALL %s\n", f->mIdent->mString);
|
||||
#endif
|
||||
// printf("FASTCALL %s\n", procDec->mQualIdent->mString);
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6964,6 +6964,13 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
|
|||
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;
|
||||
}
|
||||
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)
|
||||
tempChain[ins->mDst.mTemp] = tempChain[ins->mSrc[0].mTemp];
|
||||
else if (ins->mDst.mTemp >= 0)
|
||||
|
@ -9654,7 +9661,16 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
|
|||
nins->mSrc[1] = cins->mDst;
|
||||
nins->mDst.mTemp = spareTemps++;
|
||||
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);
|
||||
|
||||
ins->mOperator = ains->mOperator;
|
||||
|
@ -15560,6 +15576,8 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
|||
ins->mOperator = IA_ADD;
|
||||
ins->mSrc[0].mIntConst = indexStep[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst;
|
||||
ins->mSrc[1] = ins->mDst;
|
||||
if (ins->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND)
|
||||
ins->mDst.mRange.mMaxValue += ins->mSrc[0].mIntConst;
|
||||
|
||||
indexins.Push(ins);
|
||||
}
|
||||
|
@ -15577,6 +15595,8 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
|||
ains->mSrc[1] = ins->mDst;
|
||||
ains->mSrc[1].mTemp = -1;
|
||||
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);
|
||||
}
|
||||
|
@ -15595,8 +15615,14 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
|||
ains->mSrc[0].mTemp = -1;
|
||||
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);
|
||||
}
|
||||
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)
|
||||
{
|
||||
#if 1
|
||||
|
@ -19145,7 +19171,7 @@ void InterCodeProcedure::Close(void)
|
|||
{
|
||||
GrowingTypeArray tstack(IT_NONE);
|
||||
|
||||
CheckFunc = !strcmp(mIdent->mString, "tile_collide");
|
||||
CheckFunc = !strcmp(mIdent->mString, "_menuShowSprites");
|
||||
CheckCase = false;
|
||||
|
||||
mEntryBlock = mBlocks[0];
|
||||
|
@ -19544,6 +19570,12 @@ void InterCodeProcedure::Close(void)
|
|||
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
LoadStoreForwarding(paramMemory);
|
||||
|
||||
RebuildIntegerRangeSet();
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
BuildLoopPrefix();
|
||||
DisassembleDebug("added dominators");
|
||||
|
|
Loading…
Reference in New Issue