Fix infinite loop unrolling
This commit is contained in:
parent
c2886e2532
commit
815f64d14c
|
@ -3522,6 +3522,14 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
|
||||||
mIns[i + 2].mRegisterFinal = mIns[i + 1].mRegisterFinal;
|
mIns[i + 2].mRegisterFinal = mIns[i + 1].mRegisterFinal;
|
||||||
progress = true;
|
progress = true;
|
||||||
}
|
}
|
||||||
|
else if (mIns[i].mCode == BC_STORE_REG_32 &&
|
||||||
|
mIns[i + 1].LoadsRegister(BC_REG_ACCU) &&
|
||||||
|
mIns[i + 2].IsCommutative() && mIns[i].mRegister == mIns[i + 2].mRegister && mIns[i + 2].mRegisterFinal)
|
||||||
|
{
|
||||||
|
mIns[i + 0].mCode = BC_NOP;
|
||||||
|
mIns[i + 1].mRegister = mIns[i + 2].mRegister;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
else if (mIns[i].mCode == BC_STORE_REG_16 &&
|
else if (mIns[i].mCode == BC_STORE_REG_16 &&
|
||||||
mIns[i + 1].mCode == BC_LOAD_REG_16 && mIns[i + 1].mRegister != mIns[i + 2].mRegister &&
|
mIns[i + 1].mCode == BC_LOAD_REG_16 && mIns[i + 1].mRegister != mIns[i + 2].mRegister &&
|
||||||
mIns[i + 2].IsCommutative() && mIns[i].mRegister == mIns[i + 2].mRegister)
|
mIns[i + 2].IsCommutative() && mIns[i].mRegister == mIns[i + 2].mRegister)
|
||||||
|
|
|
@ -62,7 +62,7 @@ void GlobalAnalyzer::AutoInline(void)
|
||||||
if (!(f->mFlags & DTF_INLINE) && !(f->mBase->mFlags & DTF_VARIADIC) && !(f->mFlags & DTF_FUNC_VARIABLE) && !(f->mFlags & DTF_FUNC_ASSEMBLER) && !(f->mFlags & DTF_INTRINSIC) && !(f->mFlags & DTF_FUNC_RECURSIVE) && f->mLocalSize < 100)
|
if (!(f->mFlags & DTF_INLINE) && !(f->mBase->mFlags & DTF_VARIADIC) && !(f->mFlags & DTF_FUNC_VARIABLE) && !(f->mFlags & DTF_FUNC_ASSEMBLER) && !(f->mFlags & DTF_INTRINSIC) && !(f->mFlags & DTF_FUNC_RECURSIVE) && f->mLocalSize < 100)
|
||||||
{
|
{
|
||||||
int nparams = 0;
|
int nparams = 0;
|
||||||
Declaration* dec = f->mParams;
|
Declaration* dec = f->mBase->mParams;
|
||||||
while (dec)
|
while (dec)
|
||||||
{
|
{
|
||||||
nparams++;
|
nparams++;
|
||||||
|
@ -120,10 +120,10 @@ void GlobalAnalyzer::AutoInline(void)
|
||||||
if (!(f->mFlags & DTF_INLINE) && !(f->mBase->mFlags & DTF_VARIADIC) && !(f->mFlags & DTF_FUNC_VARIABLE) && !(f->mFlags & DTF_INTRINSIC) && f->mCalled.Size() == 0)
|
if (!(f->mFlags & DTF_INLINE) && !(f->mBase->mFlags & DTF_VARIADIC) && !(f->mFlags & DTF_FUNC_VARIABLE) && !(f->mFlags & DTF_INTRINSIC) && f->mCalled.Size() == 0)
|
||||||
{
|
{
|
||||||
int nparams = 0;
|
int nparams = 0;
|
||||||
Declaration* dec = f->mParams;
|
Declaration* dec = f->mBase->mParams;
|
||||||
while (dec)
|
while (dec)
|
||||||
{
|
{
|
||||||
nparams += dec->mSize;
|
nparams += dec->mBase->mSize;
|
||||||
dec = dec->mNext;
|
dec = dec->mNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1868,7 +1868,7 @@ static bool IsInfiniteLoop(const InterCodeBasicBlock* block)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterCodeBasicBlock::GenerateTraces(void)
|
void InterCodeBasicBlock::GenerateTraces(bool expand)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1896,7 +1896,7 @@ void InterCodeBasicBlock::GenerateTraces(void)
|
||||||
if (mFalseJump)
|
if (mFalseJump)
|
||||||
mFalseJump->mNumEntries++;
|
mFalseJump->mNumEntries++;
|
||||||
}
|
}
|
||||||
else if (mTrueJump && !mFalseJump && ((mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump))
|
else if (mTrueJump && !mFalseJump && ((expand && mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump))
|
||||||
{
|
{
|
||||||
mTrueJump->mNumEntries--;
|
mTrueJump->mNumEntries--;
|
||||||
|
|
||||||
|
@ -1916,8 +1916,8 @@ void InterCodeBasicBlock::GenerateTraces(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mTrueJump) mTrueJump->GenerateTraces();
|
if (mTrueJump) mTrueJump->GenerateTraces(expand);
|
||||||
if (mFalseJump) mFalseJump->GenerateTraces();
|
if (mFalseJump) mFalseJump->GenerateTraces(expand);
|
||||||
|
|
||||||
mInPath = false;
|
mInPath = false;
|
||||||
}
|
}
|
||||||
|
@ -4265,7 +4265,7 @@ void InterCodeProcedure::DisassembleDebug(const char* name)
|
||||||
Disassemble(name);
|
Disassemble(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterCodeProcedure::BuildTraces(void)
|
void InterCodeProcedure::BuildTraces(bool expand)
|
||||||
{
|
{
|
||||||
// Count number of entries
|
// Count number of entries
|
||||||
//
|
//
|
||||||
|
@ -4281,7 +4281,7 @@ void InterCodeProcedure::BuildTraces(void)
|
||||||
// Build traces
|
// Build traces
|
||||||
//
|
//
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
mEntryBlock->GenerateTraces();
|
mEntryBlock->GenerateTraces(expand);
|
||||||
|
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
for (int i = 0; i < mBlocks.Size(); i++)
|
for (int i = 0; i < mBlocks.Size(); i++)
|
||||||
|
@ -4438,7 +4438,7 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
DisassembleDebug("start");
|
DisassembleDebug("start");
|
||||||
|
|
||||||
BuildTraces();
|
BuildTraces(true);
|
||||||
|
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
mLeafProcedure = mEntryBlock->IsLeafProcedure();
|
mLeafProcedure = mEntryBlock->IsLeafProcedure();
|
||||||
|
@ -4505,7 +4505,7 @@ void InterCodeProcedure::Close(void)
|
||||||
eliminated = mEntryBlock->EliminateDeadBranches();
|
eliminated = mEntryBlock->EliminateDeadBranches();
|
||||||
if (eliminated)
|
if (eliminated)
|
||||||
{
|
{
|
||||||
BuildTraces();
|
BuildTraces(false);
|
||||||
/*
|
/*
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
for (int i = 0; i < mBlocks.Size(); i++)
|
for (int i = 0; i < mBlocks.Size(); i++)
|
||||||
|
@ -4631,7 +4631,7 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
DisassembleDebug("local variables to temps");
|
DisassembleDebug("local variables to temps");
|
||||||
|
|
||||||
BuildTraces();
|
BuildTraces(false);
|
||||||
|
|
||||||
BuildDataFlowSets();
|
BuildDataFlowSets();
|
||||||
|
|
||||||
|
|
|
@ -431,7 +431,7 @@ public:
|
||||||
void Close(InterCodeBasicBlock* trueJump, InterCodeBasicBlock* falseJump);
|
void Close(InterCodeBasicBlock* trueJump, InterCodeBasicBlock* falseJump);
|
||||||
|
|
||||||
void CollectEntries(void);
|
void CollectEntries(void);
|
||||||
void GenerateTraces(void);
|
void GenerateTraces(bool expand);
|
||||||
|
|
||||||
void LocalToTemp(int vindex, int temp);
|
void LocalToTemp(int vindex, int temp);
|
||||||
|
|
||||||
|
@ -545,7 +545,7 @@ public:
|
||||||
void ReduceTemporaries(void);
|
void ReduceTemporaries(void);
|
||||||
void Disassemble(const char* name, bool dumpSets = false);
|
void Disassemble(const char* name, bool dumpSets = false);
|
||||||
protected:
|
protected:
|
||||||
void BuildTraces(void);
|
void BuildTraces(bool expand);
|
||||||
void BuildDataFlowSets(void);
|
void BuildDataFlowSets(void);
|
||||||
void RenameTemporaries(void);
|
void RenameTemporaries(void);
|
||||||
void TempForwarding(void);
|
void TempForwarding(void);
|
||||||
|
|
Loading…
Reference in New Issue