Fix value propagation in loop dependency analysis
This commit is contained in:
parent
dec7580d8d
commit
ce0ac30280
|
@ -109,6 +109,30 @@ void IntegerValueRange::LimitMinWeak(int64 value)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IntegerValueRange::AddConstValue(InterType type, int64 value)
|
||||||
|
{
|
||||||
|
if (value > 0 && IntegerValueRange::S_WEAK)
|
||||||
|
mMaxState = S_UNBOUND;
|
||||||
|
else if (value < 0 && mMinState == S_WEAK)
|
||||||
|
mMinState = S_UNBOUND;
|
||||||
|
|
||||||
|
if (type == IT_INT8 && value >= 128 && mMaxState != S_BOUND)
|
||||||
|
mMinState = S_UNBOUND;
|
||||||
|
|
||||||
|
mMinValue += value;
|
||||||
|
mMaxValue += value;
|
||||||
|
|
||||||
|
if (type == IT_INT8)
|
||||||
|
{
|
||||||
|
if (mMinState == S_BOUND && mMinValue < -255 || mMaxState == S_BOUND && mMaxValue > 255)
|
||||||
|
{
|
||||||
|
LimitMax(255);
|
||||||
|
LimitMin(-128);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void IntegerValueRange::LimitMaxWeak(int64 value)
|
void IntegerValueRange::LimitMaxWeak(int64 value)
|
||||||
{
|
{
|
||||||
if (mMaxState == S_UNBOUND || mMaxState != S_UNKNOWN && mMaxValue > value)
|
if (mMaxState == S_UNBOUND || mMaxState != S_UNKNOWN && mMaxValue > value)
|
||||||
|
@ -15187,6 +15211,7 @@ bool InterCodeBasicBlock::SingleTailLoopOptimization(const NumberSet& aliasedPar
|
||||||
ains->mSrc[0].mTemp = -1;
|
ains->mSrc[0].mTemp = -1;
|
||||||
ains->mSrc[0].mIntConst = s;
|
ains->mSrc[0].mIntConst = s;
|
||||||
tail->AppendBeforeBranch(ains);
|
tail->AppendBeforeBranch(ains);
|
||||||
|
ains->mDst.mRange.AddConstValue(ains->mDst.mType, s);
|
||||||
|
|
||||||
indexScale[ains->mDst.mTemp] = s;
|
indexScale[ains->mDst.mTemp] = s;
|
||||||
|
|
||||||
|
@ -15219,7 +15244,7 @@ bool InterCodeBasicBlock::SingleTailLoopOptimization(const NumberSet& aliasedPar
|
||||||
ains->mSrc[0] = nins->mSrc[0];
|
ains->mSrc[0] = nins->mSrc[0];
|
||||||
ains->mSrc[0].mIntConst *= indexScale[lins->mSrc[0].mTemp];
|
ains->mSrc[0].mIntConst *= indexScale[lins->mSrc[0].mTemp];
|
||||||
tail->AppendBeforeBranch(ains);
|
tail->AppendBeforeBranch(ains);
|
||||||
ains->mDst.mRange.mMaxValue += ains->mSrc[0].mIntConst;
|
ains->mDst.mRange.AddConstValue(ains->mDst.mType, ains->mSrc[0].mIntConst);
|
||||||
|
|
||||||
indexScale[ains->mDst.mTemp] = (int)ains->mSrc[0].mIntConst;
|
indexScale[ains->mDst.mTemp] = (int)ains->mSrc[0].mIntConst;
|
||||||
|
|
||||||
|
@ -15254,7 +15279,7 @@ bool InterCodeBasicBlock::SingleTailLoopOptimization(const NumberSet& aliasedPar
|
||||||
ains->mSrc[0].mTemp = -1;
|
ains->mSrc[0].mTemp = -1;
|
||||||
ains->mSrc[0].mIntConst = s;
|
ains->mSrc[0].mIntConst = s;
|
||||||
tail->AppendBeforeBranch(ains);
|
tail->AppendBeforeBranch(ains);
|
||||||
ains->mDst.mRange.mMaxValue += ains->mSrc[0].mIntConst;
|
ains->mDst.mRange.AddConstValue(ains->mDst.mType, s);
|
||||||
|
|
||||||
indexScale[ains->mDst.mTemp] = s;
|
indexScale[ains->mDst.mTemp] = s;
|
||||||
|
|
||||||
|
@ -22074,7 +22099,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "bar2");
|
CheckFunc = !strcmp(mIdent->mString, "main");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
|
@ -185,6 +185,8 @@ public:
|
||||||
|
|
||||||
void LimitMinWeak(int64 value);
|
void LimitMinWeak(int64 value);
|
||||||
void LimitMaxWeak(int64 value);
|
void LimitMaxWeak(int64 value);
|
||||||
|
|
||||||
|
void AddConstValue(InterType type, int64 value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue