Fix integer range when combining same instruction on alternate paths

This commit is contained in:
drmortalwombat 2025-05-05 16:52:17 +02:00
parent 0a9c43757a
commit 8b0790588b

View File

@ -7654,6 +7654,7 @@ void InterCodeBasicBlock::SimplifyIntegerRangeRelops(void)
if (!mVisited) if (!mVisited)
{ {
mVisited = true; mVisited = true;
#if 1 #if 1
int sz = mInstructions.Size(); int sz = mInstructions.Size();
if (sz >= 2 && mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && mInstructions[sz - 2]->mDst.mTemp == mInstructions[sz - 1]->mSrc[0].mTemp) if (sz >= 2 && mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && mInstructions[sz - 2]->mDst.mTemp == mInstructions[sz - 1]->mSrc[0].mTemp)
@ -9638,6 +9639,9 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
case IA_CMPGEU: case IA_CMPGEU:
if (s0 < 0) if (s0 < 0)
{ {
if (mInstructions[sz - 2]->mSrc[1].mRange.mMinState == IntegerValueRange::S_BOUND && mInstructions[sz - 2]->mSrc[1].mRange.mMinValue < 0)
mTrueValueRange[s1].mMaxState = IntegerValueRange::S_UNBOUND;
mTrueValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst); mTrueValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst);
mFalseValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1); mFalseValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1);
mFalseValueRange[s1].LimitMin(0); mFalseValueRange[s1].LimitMin(0);
@ -13433,6 +13437,10 @@ bool InterCodeBasicBlock::MergeCommonPathInstructions(void)
tindex++; tindex++;
if (tins->mDst.mTemp != -1) if (tins->mDst.mTemp != -1)
{ {
for (int i = 0; i < tins->mNumOperands; i++)
tins->mSrc[i].mRange.Union(fins->mSrc[i].mRange);
tins->mDst.mRange.Union(fins->mDst.mRange);
if (fins->mDst.mTemp != tins->mDst.mTemp) if (fins->mDst.mTemp != tins->mDst.mTemp)
{ {
InterInstruction* nins = new InterInstruction(tins->mLocation, IC_LOAD_TEMPORARY); InterInstruction* nins = new InterInstruction(tins->mLocation, IC_LOAD_TEMPORARY);
@ -23498,7 +23506,7 @@ void InterCodeProcedure::Close(void)
{ {
GrowingTypeArray tstack(IT_NONE); GrowingTypeArray tstack(IT_NONE);
CheckFunc = !strcmp(mIdent->mString, "dijkstra"); CheckFunc = !strcmp(mIdent->mString, "main");
CheckCase = false; CheckCase = false;
mEntryBlock = mBlocks[0]; mEntryBlock = mBlocks[0];
@ -24329,6 +24337,9 @@ void InterCodeProcedure::Close(void)
RebuildIntegerRangeSet(); RebuildIntegerRangeSet();
ResetVisited();
mEntryBlock->SimplifyIntegerRangeRelops();
PeepholeOptimization(); PeepholeOptimization();
DisassembleDebug("Peephole Temp Check"); DisassembleDebug("Peephole Temp Check");