Reverse integer range limit calculation
This commit is contained in:
parent
8f32b87b18
commit
72d2fc1fac
|
@ -0,0 +1,22 @@
|
||||||
|
int a[10];
|
||||||
|
|
||||||
|
int get(int i)
|
||||||
|
{
|
||||||
|
return a[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
void put(int i, int x)
|
||||||
|
{
|
||||||
|
a[i] = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
for(int j=0; j<10; j++)
|
||||||
|
put(j, j);
|
||||||
|
int s = -45;
|
||||||
|
for(int j=0; j<10; j++)
|
||||||
|
s += get[j];
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// stdlibtest
|
// stdlibtest
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
|
@ -158,7 +158,7 @@ struct sinfo
|
||||||
bool sign, left, prefix;
|
bool sign, left, prefix;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline int nformi(const sinfo * si, char * str, int v, bool s)
|
int nformi(const sinfo * si, char * str, int v, bool s)
|
||||||
{
|
{
|
||||||
char * sp = str;
|
char * sp = str;
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,13 @@ IntegerValueRange::IntegerValueRange(void)
|
||||||
IntegerValueRange::~IntegerValueRange(void)
|
IntegerValueRange::~IntegerValueRange(void)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void IntegerValueRange::Reset(void)
|
||||||
|
{
|
||||||
|
mMinState = S_UNKNOWN;
|
||||||
|
mMaxState = S_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool IntegerValueRange::Same(const IntegerValueRange& range) const
|
bool IntegerValueRange::Same(const IntegerValueRange& range) const
|
||||||
{
|
{
|
||||||
if (mMinState == range.mMinState && mMaxState == range.mMaxState)
|
if (mMinState == range.mMinState && mMaxState == range.mMaxState)
|
||||||
|
@ -83,7 +90,15 @@ bool IntegerValueRange::IsConstant(void) const
|
||||||
return mMinState == S_BOUND && mMaxState == S_BOUND && mMinValue == mMaxValue;
|
return mMinState == S_BOUND && mMaxState == S_BOUND && mMinValue == mMaxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head)
|
void IntegerValueRange::Limit(const IntegerValueRange& range)
|
||||||
|
{
|
||||||
|
if (range.mMinState == S_BOUND)
|
||||||
|
LimitMin(range.mMinValue);
|
||||||
|
if (range.mMaxState == S_BOUND)
|
||||||
|
LimitMax(range.mMaxValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head, bool initial)
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
|
||||||
|
@ -118,12 +133,12 @@ bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head)
|
||||||
}
|
}
|
||||||
else if (range.mMinValue < mMinValue)
|
else if (range.mMinValue < mMinValue)
|
||||||
{
|
{
|
||||||
if (range.mMinState == S_WEAK)
|
if (range.mMinState == S_WEAK && (initial || !head))
|
||||||
mMinState = S_WEAK;
|
mMinState = S_WEAK;
|
||||||
mMinValue = range.mMinValue;
|
mMinValue = range.mMinValue;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
else if (mMinState == S_BOUND && range.mMinState == S_WEAK && !head)
|
else if (mMinState == S_BOUND && range.mMinState == S_WEAK && (initial || !head))
|
||||||
{
|
{
|
||||||
mMinState = S_WEAK;
|
mMinState = S_WEAK;
|
||||||
changed = true;
|
changed = true;
|
||||||
|
@ -161,12 +176,12 @@ bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head)
|
||||||
}
|
}
|
||||||
else if (range.mMaxValue > mMaxValue)
|
else if (range.mMaxValue > mMaxValue)
|
||||||
{
|
{
|
||||||
if (range.mMaxState == S_WEAK)
|
if (range.mMaxState == S_WEAK && (initial || !head))
|
||||||
mMaxState = S_WEAK;
|
mMaxState = S_WEAK;
|
||||||
mMaxValue = range.mMaxValue;
|
mMaxValue = range.mMaxValue;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
else if (mMaxState == S_BOUND && range.mMaxState == S_WEAK && !head)
|
else if (mMaxState == S_BOUND && range.mMaxState == S_WEAK && (initial || !head))
|
||||||
{
|
{
|
||||||
mMaxState = S_WEAK;
|
mMaxState = S_WEAK;
|
||||||
changed = true;
|
changed = true;
|
||||||
|
@ -3443,7 +3458,7 @@ void InterInstruction::Disassemble(FILE* file)
|
||||||
|
|
||||||
InterCodeBasicBlock::InterCodeBasicBlock(void)
|
InterCodeBasicBlock::InterCodeBasicBlock(void)
|
||||||
: mInstructions(nullptr), mEntryRenameTable(-1), mExitRenameTable(-1), mMergeTValues(nullptr), mTrueJump(nullptr), mFalseJump(nullptr), mLoopPrefix(nullptr), mDominator(nullptr),
|
: mInstructions(nullptr), mEntryRenameTable(-1), mExitRenameTable(-1), mMergeTValues(nullptr), mTrueJump(nullptr), mFalseJump(nullptr), mLoopPrefix(nullptr), mDominator(nullptr),
|
||||||
mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()), mEntryBlocks(nullptr), mLoadStoreInstructions(nullptr), mLoopPathBlocks(nullptr)
|
mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()), mReverseValueRange(IntegerValueRange()), mEntryBlocks(nullptr), mLoadStoreInstructions(nullptr), mLoopPathBlocks(nullptr)
|
||||||
{
|
{
|
||||||
mInPath = false;
|
mInPath = false;
|
||||||
mLoopHead = false;
|
mLoopHead = false;
|
||||||
|
@ -3602,7 +3617,7 @@ void InterCodeBasicBlock::GenerateTraces(bool expand)
|
||||||
if (mFalseJump)
|
if (mFalseJump)
|
||||||
mFalseJump->mNumEntries++;
|
mFalseJump->mNumEntries++;
|
||||||
}
|
}
|
||||||
else if (mTrueJump && !mFalseJump && ((expand && mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump, mTrueJump))
|
else if (mTrueJump && !mFalseJump && ((expand && mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1 && !mLoopHead) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump, mTrueJump))
|
||||||
{
|
{
|
||||||
mTrueJump->mNumEntries--;
|
mTrueJump->mNumEntries--;
|
||||||
int n = mTrueJump->mNumEntries;
|
int n = mTrueJump->mNumEntries;
|
||||||
|
@ -4797,7 +4812,8 @@ void InterCodeBasicBlock::SimplifyIntegerRangeRelops(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(void)
|
|
||||||
|
bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial)
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
|
||||||
|
@ -4816,7 +4832,7 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(void)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int i = 0; i < mLocalValueRange.Size(); i++)
|
for (int i = 0; i < mLocalValueRange.Size(); i++)
|
||||||
mLocalValueRange[i].Merge(range[i], mLoopHead);
|
mLocalValueRange[i].Merge(range[i], mLoopHead, initial);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4838,9 +4854,9 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(void)
|
||||||
UpdateLocalIntegerRangeSets();
|
UpdateLocalIntegerRangeSets();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mTrueJump && mTrueJump->BuildGlobalIntegerRangeSets())
|
if (mTrueJump && mTrueJump->BuildGlobalIntegerRangeSets(initial))
|
||||||
changed = true;
|
changed = true;
|
||||||
if (mFalseJump && mFalseJump->BuildGlobalIntegerRangeSets())
|
if (mFalseJump && mFalseJump->BuildGlobalIntegerRangeSets(initial))
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5330,6 +5346,131 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
mReverseValueRange.SetSize(mLocalValueRange.Size());
|
||||||
|
GrowingArray<int64> msize(0);
|
||||||
|
msize.SetSize(mLocalValueRange.Size());
|
||||||
|
|
||||||
|
for (int i = 0; i < mReverseValueRange.Size(); i++)
|
||||||
|
mReverseValueRange[i].Reset();
|
||||||
|
|
||||||
|
for (int i = sz - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
InterInstruction* ins(mInstructions[i]);
|
||||||
|
if (ins->mCode == IC_LOAD && ins->mSrc[0].mMemory == IM_INDIRECT && ins->mSrc[0].mTemp >= 0)
|
||||||
|
msize[ins->mSrc[0].mTemp] = int64max(msize[ins->mSrc[0].mTemp], ins->mSrc[0].mIntConst + InterTypeSize[ins->mDst.mType]);
|
||||||
|
else if (ins->mCode == IC_STORE && ins->mSrc[1].mMemory == IM_INDIRECT && ins->mSrc[1].mTemp >= 0)
|
||||||
|
msize[ins->mSrc[1].mTemp] = int64max(msize[ins->mSrc[1].mTemp], ins->mSrc[1].mIntConst + InterTypeSize[ins->mSrc[0].mType]);
|
||||||
|
else if (ins->mCode == IC_LEA && ins->mSrc[1].mMemory != IM_INDIRECT && ins->mSrc[0].mTemp >= 0 && msize[ins->mDst.mTemp] > 0)
|
||||||
|
{
|
||||||
|
int asize = 0;
|
||||||
|
if (ins->mSrc[1].mMemory == IM_GLOBAL)
|
||||||
|
asize = ins->mSrc[1].mLinkerObject->mSize;
|
||||||
|
|
||||||
|
if (asize > 0)
|
||||||
|
{
|
||||||
|
mReverseValueRange[ins->mSrc[0].mTemp].LimitMin(0);
|
||||||
|
mReverseValueRange[ins->mSrc[0].mTemp].LimitMax(asize - msize[ins->mDst.mTemp]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ins->mDst.mTemp >= 0)
|
||||||
|
{
|
||||||
|
ins->mDst.mRange.Limit(mReverseValueRange[ins->mDst.mTemp]);
|
||||||
|
mReverseValueRange[ins->mDst.mTemp].Reset();
|
||||||
|
IntegerValueRange& vr(ins->mDst.mRange);
|
||||||
|
|
||||||
|
switch (ins->mCode)
|
||||||
|
{
|
||||||
|
case IC_BINARY_OPERATOR:
|
||||||
|
switch (ins->mOperator)
|
||||||
|
{
|
||||||
|
case IA_SHL:
|
||||||
|
if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0)
|
||||||
|
{
|
||||||
|
if (vr.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMin(vr.mMinValue >> ins->mSrc[0].mIntConst);
|
||||||
|
if (vr.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMax(vr.mMaxValue >> ins->mSrc[0].mIntConst);
|
||||||
|
mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IA_SUB:
|
||||||
|
if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0)
|
||||||
|
{
|
||||||
|
if (vr.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMin(vr.mMinValue + ins->mSrc[0].mIntConst);
|
||||||
|
if (vr.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMax(vr.mMaxValue + ins->mSrc[0].mIntConst);
|
||||||
|
mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IA_ADD:
|
||||||
|
if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0)
|
||||||
|
{
|
||||||
|
if (vr.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMin(vr.mMinValue - ins->mSrc[0].mIntConst);
|
||||||
|
if (vr.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMax(vr.mMaxValue - ins->mSrc[0].mIntConst);
|
||||||
|
mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange);
|
||||||
|
}
|
||||||
|
else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[0].mTemp >= 0)
|
||||||
|
{
|
||||||
|
if (vr.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[0].mRange.LimitMin(vr.mMinValue - ins->mSrc[1].mIntConst);
|
||||||
|
if (vr.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[0].mRange.LimitMax(vr.mMaxValue - ins->mSrc[1].mIntConst);
|
||||||
|
mReverseValueRange[ins->mSrc[0].mTemp].Limit(ins->mSrc[0].mRange);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IA_MUL:
|
||||||
|
if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0 && ins->mSrc[0].mIntConst > 0)
|
||||||
|
{
|
||||||
|
if (vr.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMin(vr.mMinValue / ins->mSrc[0].mIntConst);
|
||||||
|
if (vr.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[1].mRange.LimitMax(vr.mMaxValue / ins->mSrc[0].mIntConst);
|
||||||
|
mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange);
|
||||||
|
}
|
||||||
|
else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[0].mTemp >= 0 && ins->mSrc[1].mIntConst > 0)
|
||||||
|
{
|
||||||
|
if (vr.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[0].mRange.LimitMin(vr.mMinValue / ins->mSrc[1].mIntConst);
|
||||||
|
if (vr.mMaxState == IntegerValueRange::S_BOUND)
|
||||||
|
ins->mSrc[0].mRange.LimitMax(vr.mMaxValue / ins->mSrc[1].mIntConst);
|
||||||
|
mReverseValueRange[ins->mSrc[0].mTemp].Limit(ins->mSrc[0].mRange);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IC_LEA:
|
||||||
|
if (ins->mSrc[1].mMemory == IM_INDIRECT && msize[ins->mDst.mTemp] > 0)
|
||||||
|
{
|
||||||
|
if (ins->mSrc[0].mTemp < 0)
|
||||||
|
{
|
||||||
|
msize[ins->mSrc[1].mTemp] = msize[ins->mDst.mTemp] - ins->mSrc[0].mIntConst;
|
||||||
|
}
|
||||||
|
else if (ins->mSrc[0].mRange.mMinState == IntegerValueRange::S_BOUND)
|
||||||
|
{
|
||||||
|
msize[ins->mSrc[1].mTemp] = msize[ins->mDst.mTemp] - ins->mSrc[0].mRange.mMinValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < ins->mNumOperands; i++)
|
||||||
|
{
|
||||||
|
if (ins->mSrc[i].mTemp >= 0)
|
||||||
|
ins->mSrc[i].mRange.Limit(mReverseValueRange[ins->mSrc[i].mTemp]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ins->mDst.mTemp >= 0)
|
||||||
|
msize[ins->mDst.mTemp] = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
mTrueValueRange = mLocalValueRange;
|
mTrueValueRange = mLocalValueRange;
|
||||||
mFalseValueRange = mLocalValueRange;
|
mFalseValueRange = mLocalValueRange;
|
||||||
|
@ -7079,11 +7220,10 @@ bool InterCodeBasicBlock::ForwardDiamondMovedTemp(void)
|
||||||
|
|
||||||
if (mins->mCode == IC_LOAD_TEMPORARY)
|
if (mins->mCode == IC_LOAD_TEMPORARY)
|
||||||
{
|
{
|
||||||
|
|
||||||
int ttemp = mins->mDst.mTemp;
|
int ttemp = mins->mDst.mTemp;
|
||||||
int stemp = mins->mSrc[0].mTemp;
|
int stemp = mins->mSrc[0].mTemp;
|
||||||
|
|
||||||
if (!IsTempModifiedOnPath(ttemp, i + 1) && !IsTempModifiedOnPath(stemp, i + 1))
|
if (!IsTempModifiedOnPath(ttemp, i + 1) && !IsTempModifiedOnPath(stemp, i + 1) && !tblock->mExitRequiredTemps[stemp])
|
||||||
{
|
{
|
||||||
int j = 0;
|
int j = 0;
|
||||||
while (j < tblock->mInstructions.Size() &&
|
while (j < tblock->mInstructions.Size() &&
|
||||||
|
@ -7107,6 +7247,8 @@ bool InterCodeBasicBlock::ForwardDiamondMovedTemp(void)
|
||||||
nins->mSrc[0].mType = mins->mDst.mType;
|
nins->mSrc[0].mType = mins->mDst.mType;
|
||||||
fblock->mInstructions.Insert(0, nins);
|
fblock->mInstructions.Insert(0, nins);
|
||||||
|
|
||||||
|
tblock->mExitRequiredTemps += stemp;
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9114,6 +9256,25 @@ void InterCodeBasicBlock::PeepholeOptimization(void)
|
||||||
mInstructions[i + 1]->mCode = IC_NONE; mInstructions[i + 1]->mNumOperands = 0;
|
mInstructions[i + 1]->mCode = IC_NONE; mInstructions[i + 1]->mNumOperands = 0;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
else if (
|
||||||
|
mInstructions[i + 0]->mCode == IC_LEA && mInstructions[i + 0]->mSrc[1].mMemory == IM_GLOBAL &&
|
||||||
|
mInstructions[i + 1]->mCode == IC_LEA && mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[1].mFinal &&
|
||||||
|
mInstructions[i + 0]->mSrc[0].IsUByte() && mInstructions[i + 1]->mSrc[0].IsUByte() && mInstructions[i + 0]->mSrc[0].mRange.mMaxValue + mInstructions[i + 1]->mSrc[0].mRange.mMaxValue < 252)
|
||||||
|
{
|
||||||
|
mInstructions[i + 1]->mSrc[1] = mInstructions[i + 0]->mSrc[1];
|
||||||
|
|
||||||
|
mInstructions[i + 0]->mCode = IC_BINARY_OPERATOR;
|
||||||
|
mInstructions[i + 0]->mOperator = IA_ADD;
|
||||||
|
mInstructions[i + 0]->mSrc[1] = mInstructions[i + 1]->mSrc[0];
|
||||||
|
mInstructions[i + 0]->mDst.mType = IT_INT16;
|
||||||
|
mInstructions[i + 0]->mDst.mRange.mMaxState = IntegerValueRange::S_BOUND;
|
||||||
|
mInstructions[i + 0]->mDst.mRange.mMaxValue = mInstructions[i + 0]->mSrc[1].mRange.mMaxValue + mInstructions[i + 0]->mSrc[0].mRange.mMaxValue;
|
||||||
|
mInstructions[i + 0]->mDst.mRange.mMinState = IntegerValueRange::S_BOUND;
|
||||||
|
mInstructions[i + 0]->mDst.mRange.mMinValue = 0;
|
||||||
|
|
||||||
|
mInstructions[i + 1]->mSrc[0] = mInstructions[i + 0]->mDst;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
// Postincrement artifact
|
// Postincrement artifact
|
||||||
|
@ -10060,7 +10221,14 @@ void InterCodeProcedure::Close(void)
|
||||||
DisassembleDebug("tt");
|
DisassembleDebug("tt");
|
||||||
|
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
} while (mEntryBlock->BuildGlobalIntegerRangeSets());
|
} while (mEntryBlock->BuildGlobalIntegerRangeSets(true));
|
||||||
|
|
||||||
|
do {
|
||||||
|
DisassembleDebug("tq");
|
||||||
|
|
||||||
|
ResetVisited();
|
||||||
|
} while (mEntryBlock->BuildGlobalIntegerRangeSets(false));
|
||||||
|
|
||||||
|
|
||||||
DisassembleDebug("Estimated value range");
|
DisassembleDebug("Estimated value range");
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -10071,7 +10239,13 @@ void InterCodeProcedure::Close(void)
|
||||||
DisassembleDebug("tr");
|
DisassembleDebug("tr");
|
||||||
|
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
} while (mEntryBlock->BuildGlobalIntegerRangeSets());
|
} while (mEntryBlock->BuildGlobalIntegerRangeSets(true));
|
||||||
|
|
||||||
|
do {
|
||||||
|
DisassembleDebug("tr");
|
||||||
|
|
||||||
|
ResetVisited();
|
||||||
|
} while (mEntryBlock->BuildGlobalIntegerRangeSets(false));
|
||||||
|
|
||||||
DisassembleDebug("Estimated value range 2");
|
DisassembleDebug("Estimated value range 2");
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -136,6 +136,8 @@ public:
|
||||||
IntegerValueRange(void);
|
IntegerValueRange(void);
|
||||||
~IntegerValueRange(void);
|
~IntegerValueRange(void);
|
||||||
|
|
||||||
|
void Reset(void);
|
||||||
|
|
||||||
int64 mMinValue, mMaxValue;
|
int64 mMinValue, mMaxValue;
|
||||||
|
|
||||||
enum State
|
enum State
|
||||||
|
@ -147,7 +149,9 @@ public:
|
||||||
} mMinState, mMaxState;
|
} mMinState, mMaxState;
|
||||||
|
|
||||||
bool Same(const IntegerValueRange& range) const;
|
bool Same(const IntegerValueRange& range) const;
|
||||||
bool Merge(const IntegerValueRange& range, bool head);
|
bool Merge(const IntegerValueRange& range, bool head, bool initial);
|
||||||
|
|
||||||
|
void Limit(const IntegerValueRange& range);
|
||||||
|
|
||||||
bool IsConstant(void) const;
|
bool IsConstant(void) const;
|
||||||
|
|
||||||
|
@ -345,7 +349,7 @@ public:
|
||||||
|
|
||||||
GrowingInstructionArray mLoadStoreInstructions;
|
GrowingInstructionArray mLoadStoreInstructions;
|
||||||
|
|
||||||
GrowingIntegerValueRangeArray mEntryValueRange, mTrueValueRange, mFalseValueRange, mLocalValueRange;
|
GrowingIntegerValueRangeArray mEntryValueRange, mTrueValueRange, mFalseValueRange, mLocalValueRange, mReverseValueRange;
|
||||||
|
|
||||||
GrowingArray<InterCodeBasicBlock*> mEntryBlocks, mLoopPathBlocks;
|
GrowingArray<InterCodeBasicBlock*> mEntryBlocks, mLoopPathBlocks;
|
||||||
|
|
||||||
|
@ -395,7 +399,7 @@ public:
|
||||||
void RestartLocalIntegerRangeSets(void);
|
void RestartLocalIntegerRangeSets(void);
|
||||||
void BuildLocalIntegerRangeSets(int num);
|
void BuildLocalIntegerRangeSets(int num);
|
||||||
void UpdateLocalIntegerRangeSets(void);
|
void UpdateLocalIntegerRangeSets(void);
|
||||||
bool BuildGlobalIntegerRangeSets(void);
|
bool BuildGlobalIntegerRangeSets(bool initial);
|
||||||
void SimplifyIntegerRangeRelops(void);
|
void SimplifyIntegerRangeRelops(void);
|
||||||
|
|
||||||
GrowingIntArray mEntryRenameTable;
|
GrowingIntArray mEntryRenameTable;
|
||||||
|
|
|
@ -95,3 +95,7 @@ extern uint8 BC_REG_LOCALS;
|
||||||
extern uint8 BC_REG_TMP;
|
extern uint8 BC_REG_TMP;
|
||||||
extern uint8 BC_REG_TMP_SAVED;
|
extern uint8 BC_REG_TMP_SAVED;
|
||||||
|
|
||||||
|
inline int64 int64max(int64 a, int64 b)
|
||||||
|
{
|
||||||
|
return a > b ? a : b;
|
||||||
|
}
|
|
@ -11530,6 +11530,7 @@ bool NativeCodeBasicBlock::PatchForwardSumYPointer(const NativeCodeBasicBlock* b
|
||||||
bool done = !(ins.mLive & LIVE_MEM);
|
bool done = !(ins.mLive & LIVE_MEM);
|
||||||
|
|
||||||
ins.mAddress = base;
|
ins.mAddress = base;
|
||||||
|
ins.mFlags &= ~NCIF_YZERO;
|
||||||
|
|
||||||
if (ins.mLive & LIVE_CPU_REG_Y)
|
if (ins.mLive & LIVE_CPU_REG_Y)
|
||||||
mIns.Insert(at + 1, NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, yval));
|
mIns.Insert(at + 1, NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, yval));
|
||||||
|
@ -11562,6 +11563,13 @@ bool NativeCodeBasicBlock::PatchForwardSumYPointer(const NativeCodeBasicBlock* b
|
||||||
changed = true;
|
changed = true;
|
||||||
if (mFalseJump && mFalseJump->PatchForwardSumYPointer(block, reg, base, index, 0, yval))
|
if (mFalseJump && mFalseJump->PatchForwardSumYPointer(block, reg, base, index, 0, yval))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
|
if (changed)
|
||||||
|
{
|
||||||
|
mEntryRequiredRegs += base;
|
||||||
|
mEntryRequiredRegs += base + 1;
|
||||||
|
mEntryRequiredRegs += index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return changed;
|
return changed;
|
||||||
|
@ -12985,7 +12993,7 @@ bool NativeCodeBasicBlock::MoveStoreXUp(int at)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (mIns[at - 1].mType == ASMIT_LDX || mIns[at - 1].mType == ASMIT_TAX)
|
if (mIns[at - 1].mType == ASMIT_LDX || mIns[at - 1].mType == ASMIT_TAX || mIns[at - 1].mType == ASMIT_TXA)
|
||||||
return done;
|
return done;
|
||||||
else if (mIns[at - 1].ChangesXReg() || mIns[at - 1].mType == ASMIT_STX)
|
else if (mIns[at - 1].ChangesXReg() || mIns[at - 1].mType == ASMIT_STX)
|
||||||
return done;
|
return done;
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
enum TType
|
|
||||||
{
|
|
||||||
TT_VOID,
|
|
||||||
TT_NULL,
|
|
||||||
TT_BOOL,
|
|
||||||
TT_INTEGER,
|
|
||||||
TT_FLOAT,
|
|
||||||
TT_POINTER,
|
|
||||||
TT_ARRAY,
|
|
||||||
TT_STRUCT,
|
|
||||||
TT_UNION,
|
|
||||||
TT_FUNCTION
|
|
||||||
};
|
|
||||||
|
|
||||||
class Type
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TType mType;
|
|
||||||
Type* mBase;
|
|
||||||
Scope* mScope;
|
|
||||||
};
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ int main2(int argc, const char** argv)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
strcpy(strProductName, "oscar64");
|
strcpy(strProductName, "oscar64");
|
||||||
strcpy(strProductVersion, "1.5.116");
|
strcpy(strProductVersion, "1.5.117");
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
uint32_t length = sizeof(basePath);
|
uint32_t length = sizeof(basePath);
|
||||||
|
|
|
@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,5,116,0
|
FILEVERSION 1,5,117,0
|
||||||
PRODUCTVERSION 1,5,116,0
|
PRODUCTVERSION 1,5,117,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -43,12 +43,12 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "oscar64"
|
VALUE "CompanyName", "oscar64"
|
||||||
VALUE "FileDescription", "oscar64 compiler"
|
VALUE "FileDescription", "oscar64 compiler"
|
||||||
VALUE "FileVersion", "1.5.116.0"
|
VALUE "FileVersion", "1.5.117.0"
|
||||||
VALUE "InternalName", "oscar64.exe"
|
VALUE "InternalName", "oscar64.exe"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2021"
|
VALUE "LegalCopyright", "Copyright (C) 2021"
|
||||||
VALUE "OriginalFilename", "oscar64.exe"
|
VALUE "OriginalFilename", "oscar64.exe"
|
||||||
VALUE "ProductName", "oscar64"
|
VALUE "ProductName", "oscar64"
|
||||||
VALUE "ProductVersion", "1.5.116.0"
|
VALUE "ProductVersion", "1.5.117.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -189,7 +189,6 @@
|
||||||
<ClInclude Include="Preprocessor.h" />
|
<ClInclude Include="Preprocessor.h" />
|
||||||
<ClInclude Include="resource.h" />
|
<ClInclude Include="resource.h" />
|
||||||
<ClInclude Include="Scanner.h" />
|
<ClInclude Include="Scanner.h" />
|
||||||
<ClInclude Include="Type.h" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="oscar64.rc" />
|
<ResourceCompile Include="oscar64.rc" />
|
||||||
|
|
|
@ -128,9 +128,6 @@
|
||||||
<ClInclude Include="Scanner.h">
|
<ClInclude Include="Scanner.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="Type.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="resource.h">
|
<ClInclude Include="resource.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
|
@ -4023,15 +4023,15 @@
|
||||||
{
|
{
|
||||||
"Name" = "8:Microsoft Visual Studio"
|
"Name" = "8:Microsoft Visual Studio"
|
||||||
"ProductName" = "8:oscar64"
|
"ProductName" = "8:oscar64"
|
||||||
"ProductCode" = "8:{0ED76161-EB93-44B9-8ED5-B52DAE35B818}"
|
"ProductCode" = "8:{13BD934B-1637-4989-8616-270CF677ADF6}"
|
||||||
"PackageCode" = "8:{B9A27BFE-6C41-4995-B0B1-AA37F7D48E99}"
|
"PackageCode" = "8:{2EA4AD42-948A-48FA-A940-0325656775A8}"
|
||||||
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
||||||
"AspNetVersion" = "8:2.0.50727.0"
|
"AspNetVersion" = "8:2.0.50727.0"
|
||||||
"RestartWWWService" = "11:FALSE"
|
"RestartWWWService" = "11:FALSE"
|
||||||
"RemovePreviousVersions" = "11:TRUE"
|
"RemovePreviousVersions" = "11:TRUE"
|
||||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
"DetectNewerInstalledVersion" = "11:TRUE"
|
||||||
"InstallAllUsers" = "11:FALSE"
|
"InstallAllUsers" = "11:FALSE"
|
||||||
"ProductVersion" = "8:1.5.116"
|
"ProductVersion" = "8:1.5.117"
|
||||||
"Manufacturer" = "8:oscar64"
|
"Manufacturer" = "8:oscar64"
|
||||||
"ARPHELPTELEPHONE" = "8:"
|
"ARPHELPTELEPHONE" = "8:"
|
||||||
"ARPHELPLINK" = "8:"
|
"ARPHELPLINK" = "8:"
|
||||||
|
|
Loading…
Reference in New Issue