Fix optimizing loop with subtract negative constant on counter
This commit is contained in:
parent
534a42d2fe
commit
8bd5ec76c3
|
@ -7986,6 +7986,9 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab
|
||||||
vr.mMaxState = IntegerValueRange::S_UNBOUND;
|
vr.mMaxState = IntegerValueRange::S_UNBOUND;
|
||||||
else if (ins->mSrc[0].mIntConst < 0 && vr.mMinState == IntegerValueRange::S_WEAK)
|
else if (ins->mSrc[0].mIntConst < 0 && vr.mMinState == IntegerValueRange::S_WEAK)
|
||||||
vr.mMinState = IntegerValueRange::S_UNBOUND;
|
vr.mMinState = IntegerValueRange::S_UNBOUND;
|
||||||
|
if (ins->mDst.mType == IT_INT8 && ins->mSrc[0].mIntConst >= 128 && vr.mMaxState != IntegerValueRange::S_BOUND)
|
||||||
|
vr.mMinState = IntegerValueRange::S_UNBOUND;
|
||||||
|
|
||||||
vr.mMaxValue += ins->mSrc[0].mIntConst;
|
vr.mMaxValue += ins->mSrc[0].mIntConst;
|
||||||
vr.mMinValue += ins->mSrc[0].mIntConst;
|
vr.mMinValue += ins->mSrc[0].mIntConst;
|
||||||
}
|
}
|
||||||
|
@ -10635,7 +10638,6 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
|
||||||
|
|
||||||
mVisited = true;
|
mVisited = true;
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < mInstructions.Size(); i++)
|
for (int i = 0; i < mInstructions.Size(); i++)
|
||||||
{
|
{
|
||||||
InterInstruction* ins = mInstructions[i];
|
InterInstruction* ins = mInstructions[i];
|
||||||
|
@ -10690,6 +10692,7 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
|
||||||
ins->mOperator = ains->mOperator;
|
ins->mOperator = ains->mOperator;
|
||||||
ins->mSrc[0] = ains->mSrc[0];
|
ins->mSrc[0] = ains->mSrc[0];
|
||||||
ins->mSrc[0].mIntConst <<= nins->mSrc[0].mIntConst;
|
ins->mSrc[0].mIntConst <<= nins->mSrc[0].mIntConst;
|
||||||
|
ins->mSrc[0].mType = IT_INT16;
|
||||||
ins->mSrc[1] = nins->mDst;
|
ins->mSrc[1] = nins->mDst;
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
|
@ -15712,7 +15715,12 @@ void InterCodeBasicBlock::EliminateDoubleLoopCounter(void)
|
||||||
{
|
{
|
||||||
lc.mStart = lc.mInit->mConst.mIntConst;
|
lc.mStart = lc.mInit->mConst.mIntConst;
|
||||||
if (lc.mInc->mSrc[0].mTemp < 0)
|
if (lc.mInc->mSrc[0].mTemp < 0)
|
||||||
lc.mStep = lc.mInc->mSrc[0].mIntConst;
|
{
|
||||||
|
if (lc.mInc->mOperator == IA_SUB)
|
||||||
|
lc.mStep = -lc.mInc->mSrc[0].mIntConst;
|
||||||
|
else
|
||||||
|
lc.mStep = lc.mInc->mSrc[0].mIntConst;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
lc.mStep = lc.mInc->mSrc[1].mIntConst;
|
lc.mStep = lc.mInc->mSrc[1].mIntConst;
|
||||||
lcs.Push(lc);
|
lcs.Push(lc);
|
||||||
|
@ -15735,9 +15743,6 @@ void InterCodeBasicBlock::EliminateDoubleLoopCounter(void)
|
||||||
int64 end = lcs[k].mEnd;
|
int64 end = lcs[k].mEnd;
|
||||||
int64 step = lcs[k].mStep;
|
int64 step = lcs[k].mStep;
|
||||||
|
|
||||||
if (lcs[k].mInc->mCode == IC_BINARY_OPERATOR && lcs[k].mInc->mOperator == IA_SUB)
|
|
||||||
step = -step;
|
|
||||||
|
|
||||||
if (step > 0 && end > start || step < 0 && end < start)
|
if (step > 0 && end > start || step < 0 && end < start)
|
||||||
loop = (end - start) / step;
|
loop = (end - start) / step;
|
||||||
}
|
}
|
||||||
|
@ -22062,7 +22067,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "main");
|
CheckFunc = !strcmp(mIdent->mString, "f");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
Loading…
Reference in New Issue