Improve unsigned compare result propagation

This commit is contained in:
drmortalwombat 2024-12-24 15:23:02 +01:00
parent e7cece0f0f
commit 8e46ae95ec
2 changed files with 19 additions and 1 deletions

View File

@ -9170,6 +9170,21 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsBackward(const GrowingVaria
}
}
bool InterCodeBasicBlock::TempIsUnsigned(int temp)
{
for (int i = 0; i < mInstructions.Size(); i++)
{
InterInstruction* ins = mInstructions[i];
if (ins->UsesTemp(temp))
{
if (ins->mCode == IC_CONVERSION_OPERATOR && (ins->mOperator == IA_EXT8TO16U || ins->mOperator == IA_EXT8TO32U))
return true;
}
}
return false;
}
void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars)
{
mProc->mLocalValueRange = mEntryValueRange;
@ -9533,7 +9548,8 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
mTrueValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst);
mTrueValueRange[s1].LimitMin(0);
if (mFalseValueRange[s1].mMinState == IntegerValueRange::S_BOUND && mFalseValueRange[s1].mMinValue >= 0)
if (mFalseValueRange[s1].mMinState == IntegerValueRange::S_BOUND &&
mFalseValueRange[s1].mMinValue >= 0 || mFalseJump->TempIsUnsigned(s1))
{
mFalseValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst + 1);
}

View File

@ -480,6 +480,8 @@ public:
bool CheckSingleBlockLimitedLoop(InterCodeBasicBlock*& pblock, int64 & nloop);
bool TempIsUnsigned(int temp);
void RestartLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars);
void BuildLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars);
void UpdateLocalIntegerRangeSets(const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars);