Fix errors introduced with strength reduction
This commit is contained in:
parent
1c403dfeeb
commit
76322c005d
|
@ -4561,7 +4561,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
||||||
// assert(!(live & LIVE_ACCU));
|
// assert(!(live & LIVE_ACCU));
|
||||||
|
|
||||||
int accuTemp = -1, addrTemp = -1, accuVal = 0, accuTempByte = -1;
|
int accuTemp = -1, addrTemp = -1, accuVal = 0, accuTempByte = -1;
|
||||||
bool accuConst = false;
|
bool accuConst = false, accuLong = false;
|
||||||
|
|
||||||
for (int i = 0; i < mIns.Size(); i++)
|
for (int i = 0; i < mIns.Size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -5564,7 +5564,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BC_CONST_32:
|
case BC_CONST_32:
|
||||||
if (mIns[i].mValue == accuVal)
|
if (mIns[i].mValue == accuVal && accuLong)
|
||||||
{
|
{
|
||||||
mIns[i].mCode = BC_NOP;
|
mIns[i].mCode = BC_NOP;
|
||||||
progress = true;
|
progress = true;
|
||||||
|
@ -5585,6 +5585,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
||||||
accuTemp = -1;
|
accuTemp = -1;
|
||||||
accuTempByte = -1;
|
accuTempByte = -1;
|
||||||
accuConst = false;
|
accuConst = false;
|
||||||
|
accuLong = false;
|
||||||
}
|
}
|
||||||
if (mIns[i].ChangesAddr())
|
if (mIns[i].ChangesAddr())
|
||||||
addrTemp = -1;
|
addrTemp = -1;
|
||||||
|
@ -5613,6 +5614,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
||||||
case BC_CONST_32:
|
case BC_CONST_32:
|
||||||
accuVal = mIns[i].mValue;
|
accuVal = mIns[i].mValue;
|
||||||
accuConst = true;
|
accuConst = true;
|
||||||
|
accuLong = true;
|
||||||
break;
|
break;
|
||||||
case BC_CONST_8:
|
case BC_CONST_8:
|
||||||
accuVal = mIns[i].mValue & 0xff;
|
accuVal = mIns[i].mValue & 0xff;
|
||||||
|
|
|
@ -625,6 +625,113 @@ void ValueSet::Intersect(ValueSet& set)
|
||||||
mNum = k;
|
mNum = k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TempForwardingTable::TempForwardingTable(void) : mAssoc(Assoc(-1, -1, -1))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
TempForwardingTable::TempForwardingTable(const TempForwardingTable& table) : mAssoc(Assoc(-1, -1, -1))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < table.mAssoc.Size(); i++)
|
||||||
|
{
|
||||||
|
mAssoc[i].mAssoc = table.mAssoc[i].mAssoc;
|
||||||
|
mAssoc[i].mSucc = table.mAssoc[i].mSucc;
|
||||||
|
mAssoc[i].mPred = table.mAssoc[i].mPred;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TempForwardingTable& TempForwardingTable::operator=(const TempForwardingTable& table)
|
||||||
|
{
|
||||||
|
mAssoc.SetSize(table.mAssoc.Size());
|
||||||
|
for (int i = 0; i < table.mAssoc.Size(); i++)
|
||||||
|
{
|
||||||
|
mAssoc[i].mAssoc = table.mAssoc[i].mAssoc;
|
||||||
|
mAssoc[i].mSucc = table.mAssoc[i].mSucc;
|
||||||
|
mAssoc[i].mPred = table.mAssoc[i].mPred;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TempForwardingTable::Intersect(const TempForwardingTable& table)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < table.mAssoc.Size(); i++)
|
||||||
|
{
|
||||||
|
if (mAssoc[i].mAssoc != table.mAssoc[i].mAssoc)
|
||||||
|
this->Destroy(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TempForwardingTable::SetSize(int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
mAssoc.SetSize(size);
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
mAssoc[i] = Assoc(i, i, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TempForwardingTable::Reset(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < mAssoc.Size(); i++)
|
||||||
|
mAssoc[i] = Assoc(i, i, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TempForwardingTable::operator[](int n)
|
||||||
|
{
|
||||||
|
return mAssoc[n].mAssoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TempForwardingTable::Destroy(int n)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if (mAssoc[n].mAssoc == n)
|
||||||
|
{
|
||||||
|
i = mAssoc[n].mSucc;
|
||||||
|
while (i != n)
|
||||||
|
{
|
||||||
|
j = mAssoc[i].mSucc;
|
||||||
|
mAssoc[i] = Assoc(i, i, i);
|
||||||
|
i = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mAssoc[mAssoc[n].mPred].mSucc = mAssoc[n].mSucc;
|
||||||
|
mAssoc[mAssoc[n].mSucc].mPred = mAssoc[n].mPred;
|
||||||
|
}
|
||||||
|
|
||||||
|
mAssoc[n] = Assoc(n, n, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TempForwardingTable::Build(int from, int to)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
from = mAssoc[from].mAssoc;
|
||||||
|
to = mAssoc[to].mAssoc;
|
||||||
|
|
||||||
|
if (from != to)
|
||||||
|
{
|
||||||
|
i = mAssoc[from].mSucc;
|
||||||
|
while (i != from)
|
||||||
|
{
|
||||||
|
mAssoc[i].mAssoc = to;
|
||||||
|
i = mAssoc[i].mSucc;
|
||||||
|
}
|
||||||
|
mAssoc[from].mAssoc = to;
|
||||||
|
|
||||||
|
mAssoc[mAssoc[to].mSucc].mPred = mAssoc[from].mPred;
|
||||||
|
mAssoc[mAssoc[from].mPred].mSucc = mAssoc[to].mSucc;
|
||||||
|
mAssoc[to].mSucc = from;
|
||||||
|
mAssoc[from].mPred = to;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool InterInstruction::ReferencesTemp(int temp) const
|
bool InterInstruction::ReferencesTemp(int temp) const
|
||||||
{
|
{
|
||||||
if (temp == mDst.mTemp)
|
if (temp == mDst.mTemp)
|
||||||
|
@ -1710,28 +1817,6 @@ static bool TypeArithmetic(InterType t)
|
||||||
return t == IT_INT8 || t == IT_INT16 || t == IT_INT32 || t == IT_BOOL || t == IT_FLOAT;
|
return t == IT_INT8 || t == IT_INT16 || t == IT_INT32 || t == IT_BOOL || t == IT_FLOAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static InterType TypeCheckArithmecitResult(InterType t1, InterType t2)
|
|
||||||
{
|
|
||||||
if (t1 == IT_FLOAT && t2 == IT_FLOAT)
|
|
||||||
return IT_FLOAT;
|
|
||||||
else if (TypeInteger(t1) && TypeInteger(t2))
|
|
||||||
return t1 > t2 ? t1 : t2;
|
|
||||||
else
|
|
||||||
throw InterCodeTypeMismatchException();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TypeCheckAssign(InterType& t, InterType s)
|
|
||||||
{
|
|
||||||
if (s == IT_NONE)
|
|
||||||
throw InterCodeUninitializedException();
|
|
||||||
else if (t == IT_NONE)
|
|
||||||
t = s;
|
|
||||||
else if (!TypeCompatible(t, s))
|
|
||||||
throw InterCodeTypeMismatchException();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void FilterTempUseUsage(NumberSet& requiredTemps, NumberSet& providedTemps, int temp)
|
static void FilterTempUseUsage(NumberSet& requiredTemps, NumberSet& providedTemps, int temp)
|
||||||
{
|
{
|
||||||
if (temp >= 0)
|
if (temp >= 0)
|
||||||
|
@ -2674,7 +2759,7 @@ void InterInstruction::Disassemble(FILE* file)
|
||||||
}
|
}
|
||||||
|
|
||||||
InterCodeBasicBlock::InterCodeBasicBlock(void)
|
InterCodeBasicBlock::InterCodeBasicBlock(void)
|
||||||
: mInstructions(nullptr), mEntryRenameTable(-1), mExitRenameTable(-1), mMergeTValues(nullptr), mTrueJump(nullptr), mFalseJump(nullptr), mDominator(nullptr),
|
: mInstructions(nullptr), mEntryRenameTable(-1), mExitRenameTable(-1), mMergeTValues(nullptr), mTrueJump(nullptr), mFalseJump(nullptr), mLoopPrefix(nullptr),
|
||||||
mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()), mEntryBlocks(nullptr)
|
mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()), mEntryBlocks(nullptr)
|
||||||
{
|
{
|
||||||
mInPath = false;
|
mInPath = false;
|
||||||
|
@ -2729,6 +2814,47 @@ void InterCodeBasicBlock::CollectEntryBlocks(InterCodeBasicBlock* from)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InterCodeBasicBlock::BuildDominatorTree(InterCodeBasicBlock* from)
|
||||||
|
{
|
||||||
|
if (!mDominator)
|
||||||
|
mDominator = from;
|
||||||
|
else if (from == mDominator)
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GrowingInterCodeBasicBlockPtrArray d1(nullptr), d2(nullptr);
|
||||||
|
|
||||||
|
InterCodeBasicBlock* b = mDominator;
|
||||||
|
while (b)
|
||||||
|
{
|
||||||
|
d1.Push(b);
|
||||||
|
b = b->mDominator;
|
||||||
|
}
|
||||||
|
b = from;
|
||||||
|
while (b)
|
||||||
|
{
|
||||||
|
d2.Push(b);
|
||||||
|
b = b->mDominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
b = nullptr;
|
||||||
|
while (d1.Size() > 0 && d2.Size() > 0 && d1.Last() == d2.Last())
|
||||||
|
{
|
||||||
|
b = d1.Pop(); d2.Pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mDominator == b)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mDominator = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump)
|
||||||
|
mTrueJump->BuildDominatorTree(this);
|
||||||
|
if (mFalseJump)
|
||||||
|
mFalseJump->BuildDominatorTree(this);
|
||||||
|
}
|
||||||
|
|
||||||
void InterCodeBasicBlock::CollectEntries(void)
|
void InterCodeBasicBlock::CollectEntries(void)
|
||||||
{
|
{
|
||||||
mNumEntries++;
|
mNumEntries++;
|
||||||
|
@ -6278,16 +6404,16 @@ InterCodeBasicBlock* InterCodeBasicBlock::PropagateDominator(InterCodeProcedure*
|
||||||
|
|
||||||
if (mLoopHead)
|
if (mLoopHead)
|
||||||
{
|
{
|
||||||
mDominator = new InterCodeBasicBlock();
|
mLoopPrefix = new InterCodeBasicBlock();
|
||||||
proc->Append(mDominator);
|
proc->Append(mLoopPrefix);
|
||||||
InterInstruction * jins = new InterInstruction();
|
InterInstruction * jins = new InterInstruction();
|
||||||
jins->mCode = IC_JUMP;
|
jins->mCode = IC_JUMP;
|
||||||
mDominator->Append(jins);
|
mLoopPrefix->Append(jins);
|
||||||
mDominator->Close(this, nullptr);
|
mLoopPrefix->Close(this, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return mDominator ? mDominator : this;
|
return mLoopPrefix ? mLoopPrefix : this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InterCodeBasicBlock::CollectLoopBody(InterCodeBasicBlock* head, GrowingArray<InterCodeBasicBlock*> & body)
|
bool InterCodeBasicBlock::CollectLoopBody(InterCodeBasicBlock* head, GrowingArray<InterCodeBasicBlock*> & body)
|
||||||
|
@ -6349,7 +6475,7 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
|
||||||
|
|
||||||
for (int i = 0; i < mEntryBlocks.Size(); i++)
|
for (int i = 0; i < mEntryBlocks.Size(); i++)
|
||||||
{
|
{
|
||||||
if (mEntryBlocks[i] != mDominator)
|
if (mEntryBlocks[i] != mLoopPrefix)
|
||||||
{
|
{
|
||||||
if (!mEntryBlocks[i]->CollectLoopBody(this, body))
|
if (!mEntryBlocks[i]->CollectLoopBody(this, body))
|
||||||
innerLoop = false;
|
innerLoop = false;
|
||||||
|
@ -6581,7 +6707,7 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
|
||||||
InterInstruction* ins = block->mInstructions[i];
|
InterInstruction* ins = block->mInstructions[i];
|
||||||
if (ins->mInvariant && ins->mExpensive)
|
if (ins->mInvariant && ins->mExpensive)
|
||||||
{
|
{
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ins);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -6679,7 +6805,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
};
|
};
|
||||||
|
|
||||||
GrowingArray<Dependency> dep(DEP_UNKNOWN);
|
GrowingArray<Dependency> dep(DEP_UNKNOWN);
|
||||||
GrowingArray<int> indexStep(0), indexBase(0);
|
GrowingArray<int64> indexStep(0), indexBase(0);
|
||||||
GrowingArray<InterInstructionPtr> tvalues(nullptr);
|
GrowingArray<InterInstructionPtr> tvalues(nullptr);
|
||||||
|
|
||||||
for (int i = 0; i < mInstructions.Size(); i++)
|
for (int i = 0; i < mInstructions.Size(); i++)
|
||||||
|
@ -6787,7 +6913,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
InterInstruction* ins = mInstructions[i];
|
InterInstruction* ins = mInstructions[i];
|
||||||
if (ins->mInvariant)
|
if (ins->mInvariant)
|
||||||
{
|
{
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ins);
|
||||||
}
|
}
|
||||||
else if (ins->mDst.mTemp >= 0 && dep[ins->mDst.mTemp] == DEP_INDEX)
|
else if (ins->mDst.mTemp >= 0 && dep[ins->mDst.mTemp] == DEP_INDEX)
|
||||||
{
|
{
|
||||||
|
@ -6807,7 +6933,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
bins->mDst = ins->mDst;
|
bins->mDst = ins->mDst;
|
||||||
bins->mSrc[0] = ins->mSrc[0];
|
bins->mSrc[0] = ins->mSrc[0];
|
||||||
bins->mSrc[1] = ins->mSrc[1];
|
bins->mSrc[1] = ins->mSrc[1];
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, bins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, bins);
|
||||||
|
|
||||||
InterInstruction* ains = new InterInstruction();
|
InterInstruction* ains = new InterInstruction();
|
||||||
ains->mCode = IC_BINARY_OPERATOR;
|
ains->mCode = IC_BINARY_OPERATOR;
|
||||||
|
@ -6815,7 +6941,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
ains->mDst = ins->mDst;
|
ains->mDst = ins->mDst;
|
||||||
ains->mSrc[0] = ins->mDst;
|
ains->mSrc[0] = ins->mDst;
|
||||||
ains->mSrc[1] = ins->mSrc[1]; ains->mSrc[1].mIntConst = ins->mSrc[1].mIntConst * indexBase[ins->mSrc[0].mTemp];
|
ains->mSrc[1] = ins->mSrc[1]; ains->mSrc[1].mIntConst = ins->mSrc[1].mIntConst * indexBase[ins->mSrc[0].mTemp];
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ains);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ains);
|
||||||
|
|
||||||
ins->mOperator = IA_ADD;
|
ins->mOperator = IA_ADD;
|
||||||
ins->mSrc[1].mIntConst = ins->mSrc[1].mIntConst * indexStep[ins->mSrc[0].mTemp];
|
ins->mSrc[1].mIntConst = ins->mSrc[1].mIntConst * indexStep[ins->mSrc[0].mTemp];
|
||||||
|
@ -6834,7 +6960,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
bins->mDst = ins->mDst;
|
bins->mDst = ins->mDst;
|
||||||
bins->mSrc[0] = ins->mSrc[0];
|
bins->mSrc[0] = ins->mSrc[0];
|
||||||
bins->mSrc[1] = ins->mSrc[1];
|
bins->mSrc[1] = ins->mSrc[1];
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, bins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, bins);
|
||||||
|
|
||||||
InterInstruction* ains = new InterInstruction();
|
InterInstruction* ains = new InterInstruction();
|
||||||
ains->mCode = IC_BINARY_OPERATOR;
|
ains->mCode = IC_BINARY_OPERATOR;
|
||||||
|
@ -6842,7 +6968,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
ains->mDst = ins->mDst;
|
ains->mDst = ins->mDst;
|
||||||
ains->mSrc[1] = ins->mDst;
|
ains->mSrc[1] = ins->mDst;
|
||||||
ains->mSrc[0] = ins->mSrc[0]; ains->mSrc[0].mIntConst = ins->mSrc[0].mIntConst * indexBase[ins->mSrc[1].mTemp];
|
ains->mSrc[0] = ins->mSrc[0]; ains->mSrc[0].mIntConst = ins->mSrc[0].mIntConst * indexBase[ins->mSrc[1].mTemp];
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ains);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ains);
|
||||||
|
|
||||||
ins->mOperator = IA_ADD;
|
ins->mOperator = IA_ADD;
|
||||||
ins->mSrc[0].mIntConst = ins->mSrc[0].mIntConst * indexStep[ins->mSrc[1].mTemp];
|
ins->mSrc[0].mIntConst = ins->mSrc[0].mIntConst * indexStep[ins->mSrc[1].mTemp];
|
||||||
|
@ -6861,7 +6987,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
bins->mDst = ins->mDst;
|
bins->mDst = ins->mDst;
|
||||||
bins->mSrc[0] = ins->mSrc[0];
|
bins->mSrc[0] = ins->mSrc[0];
|
||||||
bins->mSrc[1] = ins->mSrc[1];
|
bins->mSrc[1] = ins->mSrc[1];
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, bins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, bins);
|
||||||
|
|
||||||
InterInstruction* ains = new InterInstruction();
|
InterInstruction* ains = new InterInstruction();
|
||||||
ains->mCode = IC_BINARY_OPERATOR;
|
ains->mCode = IC_BINARY_OPERATOR;
|
||||||
|
@ -6869,7 +6995,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
ains->mDst = ins->mDst;
|
ains->mDst = ins->mDst;
|
||||||
ains->mSrc[1] = ins->mDst;
|
ains->mSrc[1] = ins->mDst;
|
||||||
ains->mSrc[0] = ins->mSrc[0]; ains->mSrc[0].mIntConst = indexBase[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst;
|
ains->mSrc[0] = ins->mSrc[0]; ains->mSrc[0].mIntConst = indexBase[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst;
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ains);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ains);
|
||||||
|
|
||||||
ins->mOperator = IA_ADD;
|
ins->mOperator = IA_ADD;
|
||||||
ins->mSrc[0].mIntConst = indexStep[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst;
|
ins->mSrc[0].mIntConst = indexStep[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst;
|
||||||
|
@ -6882,7 +7008,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[1].mTemp];
|
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[1].mTemp];
|
||||||
indexBase[ins->mDst.mTemp] = 0;
|
indexBase[ins->mDst.mTemp] = 0;
|
||||||
|
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ins);
|
||||||
|
|
||||||
InterInstruction* ains = new InterInstruction();
|
InterInstruction* ains = new InterInstruction();
|
||||||
ains->mCode = IC_BINARY_OPERATOR;
|
ains->mCode = IC_BINARY_OPERATOR;
|
||||||
|
@ -6900,7 +7026,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[0].mTemp];
|
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[0].mTemp];
|
||||||
indexBase[ins->mDst.mTemp] = 0;
|
indexBase[ins->mDst.mTemp] = 0;
|
||||||
|
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ins);
|
||||||
|
|
||||||
InterInstruction* ains = new InterInstruction();
|
InterInstruction* ains = new InterInstruction();
|
||||||
ains->mCode = IC_BINARY_OPERATOR;
|
ains->mCode = IC_BINARY_OPERATOR;
|
||||||
|
@ -6918,7 +7044,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[0].mTemp];
|
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[0].mTemp];
|
||||||
indexBase[ins->mDst.mTemp] = 0;
|
indexBase[ins->mDst.mTemp] = 0;
|
||||||
|
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ins);
|
||||||
|
|
||||||
InterInstruction* ains = new InterInstruction();
|
InterInstruction* ains = new InterInstruction();
|
||||||
ains->mCode = IC_LEA;
|
ains->mCode = IC_LEA;
|
||||||
|
@ -6938,7 +7064,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[0].mTemp];
|
indexStep[ins->mDst.mTemp] = indexStep[ins->mSrc[0].mTemp];
|
||||||
indexBase[ins->mDst.mTemp] = indexBase[ins->mSrc[0].mTemp];
|
indexBase[ins->mDst.mTemp] = indexBase[ins->mSrc[0].mTemp];
|
||||||
|
|
||||||
mDominator->mInstructions.Insert(mDominator->mInstructions.Size() - 1, ins);
|
mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ins);
|
||||||
|
|
||||||
InterInstruction* ains = new InterInstruction();
|
InterInstruction* ains = new InterInstruction();
|
||||||
ains->mCode = ins->mCode;
|
ains->mCode = ins->mCode;
|
||||||
|
@ -7454,7 +7580,7 @@ void InterCodeBasicBlock::Disassemble(FILE* file, bool dumpSets)
|
||||||
mVisited = true;
|
mVisited = true;
|
||||||
|
|
||||||
const char* s = mLoopHead ? "Head" : "";
|
const char* s = mLoopHead ? "Head" : "";
|
||||||
fprintf(file, "L%d: (%d) %s\n", mIndex, mNumEntries, s);
|
fprintf(file, "L%d: <= D%d: (%d) %s \n", mIndex, (mDominator ? mDominator->mIndex : -1), mNumEntries, s);
|
||||||
|
|
||||||
if (dumpSets)
|
if (dumpSets)
|
||||||
{
|
{
|
||||||
|
@ -7560,6 +7686,11 @@ void InterCodeProcedure::BuildTraces(bool expand)
|
||||||
for (int i = 0; i < mBlocks.Size(); i++)
|
for (int i = 0; i < mBlocks.Size(); i++)
|
||||||
mBlocks[i]->mNumEntries = 0;
|
mBlocks[i]->mNumEntries = 0;
|
||||||
mEntryBlock->CollectEntries();
|
mEntryBlock->CollectEntries();
|
||||||
|
|
||||||
|
ResetVisited();
|
||||||
|
for (int i = 0; i < mBlocks.Size(); i++)
|
||||||
|
mBlocks[i]->mDominator = nullptr;
|
||||||
|
mEntryBlock->BuildDominatorTree(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterCodeProcedure::BuildDataFlowSets(void)
|
void InterCodeProcedure::BuildDataFlowSets(void)
|
||||||
|
@ -8164,6 +8295,17 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
BuildTraces(false);
|
BuildTraces(false);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->PeepholeOptimization();
|
||||||
|
|
||||||
|
TempForwarding();
|
||||||
|
RemoveUnusedInstructions();
|
||||||
|
|
||||||
|
DisassembleDebug("Peephole optimized");
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MapVariables();
|
MapVariables();
|
||||||
|
|
|
@ -198,110 +198,22 @@ protected:
|
||||||
GrowingArray<Assoc> mAssoc;
|
GrowingArray<Assoc> mAssoc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TempForwardingTable(void) : mAssoc(Assoc(-1, -1, -1))
|
TempForwardingTable(void);
|
||||||
{
|
TempForwardingTable(const TempForwardingTable& table);
|
||||||
}
|
|
||||||
|
|
||||||
TempForwardingTable(const TempForwardingTable & table) : mAssoc(Assoc(-1, -1, -1))
|
TempForwardingTable& operator=(const TempForwardingTable& table);
|
||||||
{
|
|
||||||
for (int i = 0; i < table.mAssoc.Size(); i++)
|
|
||||||
{
|
|
||||||
mAssoc[i].mAssoc = table.mAssoc[i].mAssoc;
|
|
||||||
mAssoc[i].mSucc = table.mAssoc[i].mSucc;
|
|
||||||
mAssoc[i].mPred = table.mAssoc[i].mPred;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TempForwardingTable& operator=(const TempForwardingTable& table)
|
void Intersect(const TempForwardingTable& table);
|
||||||
{
|
|
||||||
mAssoc.SetSize(table.mAssoc.Size());
|
|
||||||
for (int i = 0; i < table.mAssoc.Size(); i++)
|
|
||||||
{
|
|
||||||
mAssoc[i].mAssoc = table.mAssoc[i].mAssoc;
|
|
||||||
mAssoc[i].mSucc = table.mAssoc[i].mSucc;
|
|
||||||
mAssoc[i].mPred = table.mAssoc[i].mPred;
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
void SetSize(int size);
|
||||||
}
|
|
||||||
|
|
||||||
void Intersect(const TempForwardingTable& table)
|
void Reset(void);
|
||||||
{
|
|
||||||
for (int i = 0; i < table.mAssoc.Size(); i++)
|
|
||||||
{
|
|
||||||
if (mAssoc[i].mAssoc != table.mAssoc[i].mAssoc)
|
|
||||||
this->Destroy(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetSize(int size)
|
int operator[](int n);
|
||||||
{
|
|
||||||
int i;
|
|
||||||
mAssoc.SetSize(size);
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++)
|
void Destroy(int n);
|
||||||
mAssoc[i] = Assoc(i, i, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reset(void)
|
void Build(int from, int to);
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < mAssoc.Size(); i++)
|
|
||||||
mAssoc[i] = Assoc(i, i, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
int operator[](int n)
|
|
||||||
{
|
|
||||||
return mAssoc[n].mAssoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Destroy(int n)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
if (mAssoc[n].mAssoc == n)
|
|
||||||
{
|
|
||||||
i = mAssoc[n].mSucc;
|
|
||||||
while (i != n)
|
|
||||||
{
|
|
||||||
j = mAssoc[i].mSucc;
|
|
||||||
mAssoc[i] = Assoc(i, i, i);
|
|
||||||
i = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mAssoc[mAssoc[n].mPred].mSucc = mAssoc[n].mSucc;
|
|
||||||
mAssoc[mAssoc[n].mSucc].mPred = mAssoc[n].mPred;
|
|
||||||
}
|
|
||||||
|
|
||||||
mAssoc[n] = Assoc(n, n, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Build(int from, int to)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
from = mAssoc[from].mAssoc;
|
|
||||||
to = mAssoc[to].mAssoc;
|
|
||||||
|
|
||||||
if (from != to)
|
|
||||||
{
|
|
||||||
i = mAssoc[from].mSucc;
|
|
||||||
while (i != from)
|
|
||||||
{
|
|
||||||
mAssoc[i].mAssoc = to;
|
|
||||||
i = mAssoc[i].mSucc;
|
|
||||||
}
|
|
||||||
mAssoc[from].mAssoc = to;
|
|
||||||
|
|
||||||
mAssoc[mAssoc[to].mSucc].mPred = mAssoc[from].mPred;
|
|
||||||
mAssoc[mAssoc[from].mPred].mSucc = mAssoc[to].mSucc;
|
|
||||||
mAssoc[to].mSucc = from;
|
|
||||||
mAssoc[from].mPred = to;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class InterVariable
|
class InterVariable
|
||||||
|
@ -400,56 +312,11 @@ public:
|
||||||
void Disassemble(FILE* file);
|
void Disassemble(FILE* file);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class InterCodeException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
InterCodeException()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class InterCodeStackException : public InterCodeException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
InterCodeStackException()
|
|
||||||
: InterCodeException()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class InterCodeUndefinedException : public InterCodeException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
InterCodeUndefinedException()
|
|
||||||
: InterCodeException()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class InterCodeTypeMismatchException : public InterCodeException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
InterCodeTypeMismatchException()
|
|
||||||
: InterCodeException()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class InterCodeUninitializedException : public InterCodeException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
InterCodeUninitializedException()
|
|
||||||
: InterCodeException()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class InterCodeBasicBlock
|
class InterCodeBasicBlock
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int mIndex, mNumEntries, mNumEntered, mTraceIndex;
|
int mIndex, mNumEntries, mNumEntered, mTraceIndex;
|
||||||
InterCodeBasicBlock * mTrueJump, * mFalseJump, * mDominator;
|
InterCodeBasicBlock * mTrueJump, * mFalseJump, * mLoopPrefix, * mDominator;
|
||||||
GrowingInstructionArray mInstructions;
|
GrowingInstructionArray mInstructions;
|
||||||
|
|
||||||
bool mVisited, mInPath, mLoopHead, mChecked, mConditionBlockTrue, mUnreachable;
|
bool mVisited, mInPath, mLoopHead, mChecked, mConditionBlockTrue, mUnreachable;
|
||||||
|
@ -487,6 +354,7 @@ public:
|
||||||
void CollectEntries(void);
|
void CollectEntries(void);
|
||||||
void CollectEntryBlocks(InterCodeBasicBlock* from);
|
void CollectEntryBlocks(InterCodeBasicBlock* from);
|
||||||
void GenerateTraces(bool expand);
|
void GenerateTraces(bool expand);
|
||||||
|
void BuildDominatorTree(InterCodeBasicBlock * from);
|
||||||
|
|
||||||
void LocalToTemp(int vindex, int temp);
|
void LocalToTemp(int vindex, int temp);
|
||||||
|
|
||||||
|
|
|
@ -9495,7 +9495,7 @@ bool NativeCodeBasicBlock::PatchGlobalAdressSumYByX(int at, int reg, const Nativ
|
||||||
yindex = 0;
|
yindex = 0;
|
||||||
for (int i = at; i <= last; i++)
|
for (int i = at; i <= last; i++)
|
||||||
{
|
{
|
||||||
mIns[i].mLive | LIVE_CPU_REG_X;
|
mIns[i].mLive |= LIVE_CPU_REG_X;
|
||||||
|
|
||||||
if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_IMMEDIATE)
|
if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_IMMEDIATE)
|
||||||
yindex = mIns[i].mAddress;
|
yindex = mIns[i].mAddress;
|
||||||
|
@ -9561,7 +9561,7 @@ bool NativeCodeBasicBlock::PatchDirectAddressSumY(int at, int reg, int apos, int
|
||||||
|
|
||||||
for (int i = apos; i <= last; i++)
|
for (int i = apos; i <= last; i++)
|
||||||
{
|
{
|
||||||
mIns[i].mLive | LIVE_CPU_REG_Y;
|
mIns[i].mLive |= LIVE_CPU_REG_Y;
|
||||||
|
|
||||||
if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_IMMEDIATE)
|
if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_IMMEDIATE)
|
||||||
{
|
{
|
||||||
|
@ -9842,6 +9842,7 @@ bool NativeCodeBasicBlock::MoveIndirectLoadStoreDown(int at)
|
||||||
{
|
{
|
||||||
mIns[j].mMode = ASMIM_INDIRECT_Y;
|
mIns[j].mMode = ASMIM_INDIRECT_Y;
|
||||||
mIns[j].mAddress = mIns[at].mAddress;
|
mIns[j].mAddress = mIns[at].mAddress;
|
||||||
|
mIns[j].mLive |= LIVE_MEM;
|
||||||
mIns[at + 0].mType = ASMIT_NOP; mIns[at + 0].mMode = ASMIM_IMPLIED;
|
mIns[at + 0].mType = ASMIT_NOP; mIns[at + 0].mMode = ASMIM_IMPLIED;
|
||||||
mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mMode = ASMIM_IMPLIED;
|
mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
|
||||||
|
@ -12430,7 +12431,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
||||||
if (FindAddressSumY(i, sreg, apos, breg, ireg))
|
if (FindAddressSumY(i, sreg, apos, breg, ireg))
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
if (!(breg == sreg || ireg == sreg)|| !(mIns[i + 0].mLive & LIVE_MEM))
|
if (!(breg == sreg || ireg == sreg) || !(mIns[i + 0].mLive & LIVE_MEM))
|
||||||
{
|
{
|
||||||
if (breg == sreg || ireg == sreg)
|
if (breg == sreg || ireg == sreg)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue