From 8e46ae95eca48e71ce9610491099a57a229898ba Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 24 Dec 2024 15:23:02 +0100 Subject: [PATCH] Improve unsigned compare result propagation --- oscar64/InterCode.cpp | 18 +++++++++++++++++- oscar64/InterCode.h | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 019cd04..dcf4db3 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -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); } diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 283f99c..3454cee 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -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);