Fix errors introduced with strength reduction

This commit is contained in:
drmortalwombat 2022-01-20 13:39:55 +01:00
parent 1c403dfeeb
commit 76322c005d
4 changed files with 204 additions and 191 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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);

View File

@ -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)
{ {