Skip to content

Commit

Permalink
Propagation of unsigend attribute accross function arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
drmortalwombat committed Jan 13, 2023
1 parent fdb051b commit 761206d
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 47 deletions.
15 changes: 10 additions & 5 deletions include/gfx/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ static const byte rmask[8] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};

void bm_scan_fill(int left, int right, char * lp, int x0, int x1, char pat)
{
__assume(left >= 0);
__assume(right >= 0);

if (x0 < left)
x0 = left;
if (x1 > right)
Expand All @@ -95,7 +98,7 @@ void bm_scan_fill(int left, int right, char * lp, int x0, int x1, char pat)
if (x1 > x0)
{
char * dp = lp + (x0 & ~7);
char l = (x1 >> 3) - (x0 >> 3);
unsigned l = (x1 & ~7) - (x0 & ~7);
char lm = lmask[x0 & 7], rm = rmask[x1 & 7];
char o = 0;

Expand All @@ -105,17 +108,19 @@ void bm_scan_fill(int left, int right, char * lp, int x0, int x1, char pat)
{
*dp = (*dp & ~lm) | (pat & lm);
o = 8;
if (l >= 32)
{
if (l >= 256)
{
#pragma unroll(full)
for(char i=0; i<31; i++)
{
dp[o] = pat;
o += 8;
}
dp += 256;
l -= 31;
l -= 248;
}
for(char i=1; i<l; i++)

while (o < (char)l)
{
dp[o] = pat;
o += 8;
Expand Down
113 changes: 94 additions & 19 deletions oscar64/InterCode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2570,6 +2570,11 @@ bool InterOperand::IsSByte(void) const
mRange.mMaxState == IntegerValueRange::S_BOUND && mRange.mMaxValue < 128;
}

bool InterOperand::IsPositive(void) const
{
return mRange.mMinState == IntegerValueRange::S_BOUND && mRange.mMinValue >= 0;
}

bool InterOperand::IsUnsigned(void) const
{
if (mRange.mMinState == IntegerValueRange::S_BOUND && mRange.mMinValue >= 0 && mRange.mMaxState == IntegerValueRange::S_BOUND)
Expand Down Expand Up @@ -3898,6 +3903,7 @@ void InterInstruction::Disassemble(FILE* file)
InterCodeBasicBlock::InterCodeBasicBlock(void)
: mInstructions(nullptr), mEntryRenameTable(-1), mExitRenameTable(-1), mMergeTValues(nullptr), mMergeAValues(nullptr), mTrueJump(nullptr), mFalseJump(nullptr), mLoopPrefix(nullptr), mDominator(nullptr),
mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()),
mEntryParamValueRange(IntegerValueRange()), mTrueParamValueRange(IntegerValueRange()), mFalseParamValueRange(IntegerValueRange()), mLocalParamValueRange(IntegerValueRange()),
mReverseValueRange(IntegerValueRange()), mEntryBlocks(nullptr), mLoadStoreInstructions(nullptr), mLoopPathBlocks(nullptr), mMemoryValueSize(0), mEntryMemoryValueSize(0)
{
mVisited = false;
Expand Down Expand Up @@ -5430,7 +5436,7 @@ void InterCodeBasicBlock::SimplifyIntegerRangeRelops(void)
}


bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial, const GrowingVariableArray& localVars)
bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial, const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars)
{
bool changed = false;

Expand All @@ -5439,37 +5445,48 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial, const Growin
return false;

mLocalValueRange.Clear();
mLocalParamValueRange.Clear();

assert(mLocalValueRange.Size() == mExitRequiredTemps.Size());
assert(mLocalParamValueRange.Size() == paramVars.Size());

bool firstEntry = true;

for (int j = 0; j < mEntryBlocks.Size(); j++)
{
InterCodeBasicBlock* from = mEntryBlocks[j];
GrowingIntegerValueRangeArray& range(this == from->mTrueJump ? from->mTrueValueRange : from->mFalseValueRange);
GrowingIntegerValueRangeArray& prange(this == from->mTrueJump ? from->mTrueParamValueRange : from->mFalseParamValueRange);

if (range.Size())
{
if (firstEntry)
{
firstEntry = false;
mLocalValueRange = range;
mLocalParamValueRange = prange;
}
else
{
for (int i = 0; i < mLocalValueRange.Size(); i++)
mLocalValueRange[i].Merge(range[i], mLoopHead, initial);
for (int i = 0; i < mLocalParamValueRange.Size(); i++)
mLocalParamValueRange[i].Merge(prange[i], mLoopHead, initial);
}
}
}

assert(mLocalValueRange.Size() == mExitRequiredTemps.Size());
assert(mLocalParamValueRange.Size() == paramVars.Size());

for (int i = 0; i < mLocalValueRange.Size(); i++)
if (!mLocalValueRange[i].Same(mEntryValueRange[i]))
changed = true;

for (int i = 0; i < mLocalParamValueRange.Size(); i++)
if (!mLocalParamValueRange[i].Same(mEntryParamValueRange[i]))
changed = true;

if (mVisited && mNumEntered >= 2 * mEntryBlocks.Size())
return changed;

Expand All @@ -5489,14 +5506,15 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial, const Growin
if (changed)
{
mEntryValueRange = mLocalValueRange;
mEntryParamValueRange = mLocalParamValueRange;

UpdateLocalIntegerRangeSets(localVars);
UpdateLocalIntegerRangeSets(localVars, paramVars);

}

if (mTrueJump && mTrueJump->BuildGlobalIntegerRangeSets(initial, localVars))
if (mTrueJump && mTrueJump->BuildGlobalIntegerRangeSets(initial, localVars, paramVars))
changed = true;
if (mFalseJump && mFalseJump->BuildGlobalIntegerRangeSets(initial, localVars))
if (mFalseJump && mFalseJump->BuildGlobalIntegerRangeSets(initial, localVars, paramVars))
changed = true;
}

Expand Down Expand Up @@ -5540,7 +5558,7 @@ static int64 BuildLowerBitsMask(int64 v)
return v;
}

void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray& localVars)
void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars)
{
mLocalValueRange = mEntryValueRange;

Expand Down Expand Up @@ -5585,6 +5603,9 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
{
case IC_LOAD:
vr = ins->mDst.mRange;

if (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mMemory == IM_FPARAM)
vr.Limit(mLocalParamValueRange[ins->mSrc[0].mVarIndex]);
#if 1
if (ins->mDst.mType == IT_INT8)
{
Expand Down Expand Up @@ -6132,6 +6153,11 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
}
#endif
}
else if (ins->mCode == IC_STORE)
{
if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mMemory == IM_FPARAM)
mLocalParamValueRange[ins->mSrc[1].mVarIndex] = ins->mSrc[0].mRange;
}

assert(mLocalValueRange.Size() == mExitRequiredTemps.Size());
}
Expand Down Expand Up @@ -6307,6 +6333,8 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray

mTrueValueRange = mLocalValueRange;
mFalseValueRange = mLocalValueRange;
mTrueParamValueRange = mLocalParamValueRange;
mFalseParamValueRange = mLocalParamValueRange;

if (sz >= 1)
{
Expand Down Expand Up @@ -6437,12 +6465,33 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
mFalseValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst);
mFalseValueRange[s1].LimitMinWeak(SignedTypeMin(mInstructions[sz - 2]->mSrc[1].mType));
}
else if (s1 < 0)
{
mTrueValueRange[s0].LimitMax(mInstructions[sz - 2]->mSrc[1].mIntConst - 1);
mTrueValueRange[s0].LimitMinWeak(SignedTypeMax(mInstructions[sz - 2]->mSrc[0].mType));
mFalseValueRange[s0].LimitMin(mInstructions[sz - 2]->mSrc[1].mIntConst);
mFalseValueRange[s0].LimitMaxWeak(SignedTypeMin(mInstructions[sz - 2]->mSrc[0].mType));
}
else
{
if (mLocalValueRange[s0].mMaxState == IntegerValueRange::S_BOUND)
mTrueValueRange[s1].LimitMin(mLocalValueRange[s0].mMinValue + 1);
if (mLocalValueRange[s0].mMinState == IntegerValueRange::S_BOUND)
mFalseValueRange[s1].LimitMax(mLocalValueRange[s0].mMaxValue);

if (mLocalValueRange[s1].mMaxState == IntegerValueRange::S_BOUND)
mTrueValueRange[s0].LimitMax(mLocalValueRange[s1].mMaxValue - 1);
if (mLocalValueRange[s1].mMinState == IntegerValueRange::S_BOUND)
mFalseValueRange[s0].LimitMin(mLocalValueRange[s1].mMinValue);
}
break;
case IA_CMPGES:
if (s0 < 0)
{
mTrueValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst);
mTrueValueRange[s1].LimitMaxWeak(SignedTypeMax(mInstructions[sz - 2]->mSrc[1].mType));
mFalseValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1);
mFalseValueRange[s1].LimitMinWeak(SignedTypeMin(mInstructions[sz - 2]->mSrc[1].mType));
}
break;

Expand Down Expand Up @@ -6512,6 +6561,17 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray
mTrueValueRange[mInstructions[sz - 3]->mDst.mTemp] = mTrueValueRange[s1];
mFalseValueRange[mInstructions[sz - 3]->mDst.mTemp] = mFalseValueRange[s1];
}

if (sz >= 3 && mInstructions[sz - 3]->mCode == IC_LOAD)
{
InterInstruction* ins = mInstructions[sz - 3];

if (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mMemory == IM_FPARAM)
{
mTrueParamValueRange[ins->mSrc[0].mVarIndex].Limit(mTrueValueRange[ins->mDst.mTemp]);
mFalseParamValueRange[ins->mSrc[0].mVarIndex].Limit(mFalseValueRange[ins->mDst.mTemp]);
}
}
}
}

Expand All @@ -6527,7 +6587,7 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray



void InterCodeBasicBlock::RestartLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars)
void InterCodeBasicBlock::RestartLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars)
{
if (!mVisited)
{
Expand All @@ -6549,14 +6609,24 @@ void InterCodeBasicBlock::RestartLocalIntegerRangeSets(int num, const GrowingVar
vr.mMaxState = IntegerValueRange::S_UNKNOWN;
}

UpdateLocalIntegerRangeSets(localVars);
for (int i = 0; i < mEntryParamValueRange.Size(); i++)
{
IntegerValueRange& vr(mEntryParamValueRange[i]);
if (vr.mMinState == IntegerValueRange::S_UNBOUND)
vr.mMinState = IntegerValueRange::S_UNKNOWN;
if (vr.mMaxState == IntegerValueRange::S_UNBOUND)
vr.mMaxState = IntegerValueRange::S_UNKNOWN;
}


if (mTrueJump) mTrueJump->RestartLocalIntegerRangeSets(num, localVars);
if (mFalseJump) mFalseJump->RestartLocalIntegerRangeSets(num, localVars);
UpdateLocalIntegerRangeSets(localVars, paramVars);

if (mTrueJump) mTrueJump->RestartLocalIntegerRangeSets(num, localVars, paramVars);
if (mFalseJump) mFalseJump->RestartLocalIntegerRangeSets(num, localVars, paramVars);
}
}

void InterCodeBasicBlock::BuildLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars)
void InterCodeBasicBlock::BuildLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars)
{
if (!mVisited)
{
Expand All @@ -6569,10 +6639,15 @@ void InterCodeBasicBlock::BuildLocalIntegerRangeSets(int num, const GrowingVaria
mMemoryValueSize.SetSize(num, true);
mEntryMemoryValueSize.SetSize(num, true);

UpdateLocalIntegerRangeSets(localVars);
mEntryParamValueRange.SetSize(paramVars.Size(), true);
mTrueParamValueRange.SetSize(paramVars.Size(), true);
mFalseParamValueRange.SetSize(paramVars.Size(), true);
mLocalParamValueRange.SetSize(paramVars.Size(), true);

UpdateLocalIntegerRangeSets(localVars, paramVars);

if (mTrueJump) mTrueJump->BuildLocalIntegerRangeSets(num, localVars);
if (mFalseJump) mFalseJump->BuildLocalIntegerRangeSets(num, localVars);
if (mTrueJump) mTrueJump->BuildLocalIntegerRangeSets(num, localVars, paramVars);
if (mFalseJump) mFalseJump->BuildLocalIntegerRangeSets(num, localVars, paramVars);
}
}

Expand Down Expand Up @@ -13072,19 +13147,19 @@ void InterCodeProcedure::DisassembleDebug(const char* name)
void InterCodeProcedure::RebuildIntegerRangeSet(void)
{
ResetVisited();
mEntryBlock->RestartLocalIntegerRangeSets(mTemporaries.Size(), mLocalVars);
mEntryBlock->RestartLocalIntegerRangeSets(mTemporaries.Size(), mLocalVars, mParamVars);

do {
DisassembleDebug("tr");

ResetVisited();
} while (mEntryBlock->BuildGlobalIntegerRangeSets(true, mLocalVars));
} while (mEntryBlock->BuildGlobalIntegerRangeSets(true, mLocalVars, mParamVars));

do {
DisassembleDebug("tr");

ResetVisited();
} while (mEntryBlock->BuildGlobalIntegerRangeSets(false, mLocalVars));
} while (mEntryBlock->BuildGlobalIntegerRangeSets(false, mLocalVars, mParamVars));

assert(mTemporaries.Size() == mEntryBlock->mLocalValueRange.Size());

Expand Down Expand Up @@ -13992,19 +14067,19 @@ void InterCodeProcedure::Close(void)

#if 1
ResetVisited();
mEntryBlock->BuildLocalIntegerRangeSets(mTemporaries.Size(), mLocalVars);
mEntryBlock->BuildLocalIntegerRangeSets(mTemporaries.Size(), mLocalVars, mParamVars);

do {
DisassembleDebug("tt");

ResetVisited();
} while (mEntryBlock->BuildGlobalIntegerRangeSets(true, mLocalVars));
} while (mEntryBlock->BuildGlobalIntegerRangeSets(true, mLocalVars, mParamVars));

do {
DisassembleDebug("tq");

ResetVisited();
} while (mEntryBlock->BuildGlobalIntegerRangeSets(false, mLocalVars));
} while (mEntryBlock->BuildGlobalIntegerRangeSets(false, mLocalVars, mParamVars));


DisassembleDebug("Estimated value range");
Expand Down
11 changes: 7 additions & 4 deletions oscar64/InterCode.h
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ class InterOperand
bool IsUByte(void) const;
bool IsSByte(void) const;
bool IsUnsigned(void) const;
bool IsPositive(void) const;

bool IsNotUByte(void) const;

Expand Down Expand Up @@ -362,6 +363,8 @@ class InterCodeBasicBlock
GrowingInstructionArray mLoadStoreInstructions;

GrowingIntegerValueRangeArray mEntryValueRange, mTrueValueRange, mFalseValueRange, mLocalValueRange, mReverseValueRange;
GrowingIntegerValueRangeArray mEntryParamValueRange, mTrueParamValueRange, mFalseParamValueRange, mLocalParamValueRange;

GrowingArray<int64> mMemoryValueSize, mEntryMemoryValueSize;

GrowingArray<InterCodeBasicBlock*> mEntryBlocks, mLoopPathBlocks;
Expand Down Expand Up @@ -415,10 +418,10 @@ class InterCodeBasicBlock
bool BuildGlobalRequiredStaticVariableSet(const GrowingVariableArray& staticVars, NumberSet& fromRequiredVars);
bool RemoveUnusedStaticStoreInstructions(const GrowingVariableArray& staticVars);

void RestartLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars);
void BuildLocalIntegerRangeSets(int num, const GrowingVariableArray& localVars);
void UpdateLocalIntegerRangeSets(const GrowingVariableArray& localVars);
bool BuildGlobalIntegerRangeSets(bool initial, const GrowingVariableArray& localVars);
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);
bool BuildGlobalIntegerRangeSets(bool initial, const GrowingVariableArray& localVars, const GrowingVariableArray& paramVars);
void SimplifyIntegerRangeRelops(void);

GrowingIntArray mEntryRenameTable;
Expand Down
Loading

0 comments on commit 761206d

Please sign in to comment.