Move more invariants out of complex loops

This commit is contained in:
drmortalwombat 2022-09-18 12:59:01 +02:00
parent d1c22573da
commit 01365c38b7

View File

@ -9770,6 +9770,25 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
} }
} }
for (int bi = 0; bi < body.Size(); bi++)
{
InterCodeBasicBlock* block = body[bi];
for (int i = 0; i < block->mInstructions.Size(); i++)
{
InterInstruction* ins = block->mInstructions[i];
if (ins->mCode == IC_LEA && ins->mSrc[1].mMemory != IM_FRAME || ins->mCode == IC_UNARY_OPERATOR || ins->mCode == IC_BINARY_OPERATOR || ins->mCode == IC_RELATIONAL_OPERATOR)
{
if (!block->mEntryRequiredTemps[ins->mDst.mTemp] && !block->mExitRequiredTemps[ins->mDst.mTemp])
{
ins->mInvariant = true;
}
}
}
}
enum Dependency enum Dependency
{ {
DEP_UNKNOWN, DEP_UNKNOWN,
@ -9815,6 +9834,8 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
case IC_LEA: case IC_LEA:
if (ins->mSrc[0].mTemp >= 0 && ins->mSrc[1].mTemp >= 0) if (ins->mSrc[0].mTemp >= 0 && ins->mSrc[1].mTemp >= 0)
ins->mExpensive = true; ins->mExpensive = true;
else if (ins->mSrc[0].mTemp >= 0 && ins->mSrc[0].mRange.mMaxState == IntegerValueRange::S_BOUND && ins->mSrc[0].mRange.mMaxValue >= 256)
ins->mExpensive = true;
break; break;
case IC_LOAD: case IC_LOAD:
case IC_STORE: case IC_STORE:
@ -9836,9 +9857,9 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
{ {
changed = false; changed = false;
for (int bi = 0; bi < path.Size(); bi++) for (int bi = 0; bi < body.Size(); bi++)
{ {
InterCodeBasicBlock* block = path[bi]; InterCodeBasicBlock* block = body[bi];
for (int i = 0; i < block->mInstructions.Size(); i++) for (int i = 0; i < block->mInstructions.Size(); i++)
{ {
@ -9877,9 +9898,9 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
{ {
changed = false; changed = false;
for (int bi = 0; bi < path.Size(); bi++) for (int bi = 0; bi < body.Size(); bi++)
{ {
InterCodeBasicBlock* block = path[bi]; InterCodeBasicBlock* block = body[bi];
for (int i = 0; i < block->mInstructions.Size(); i++) for (int i = 0; i < block->mInstructions.Size(); i++)
{ {
@ -9905,9 +9926,9 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
} while(changed); } while(changed);
for (int bi = 0; bi < path.Size(); bi++) for (int bi = 0; bi < body.Size(); bi++)
{ {
InterCodeBasicBlock* block = path[bi]; InterCodeBasicBlock* block = body[bi];
int j = 0; int j = 0;
for (int i = 0; i < block->mInstructions.Size(); i++) for (int i = 0; i < block->mInstructions.Size(); i++)
@ -12863,6 +12884,16 @@ void InterCodeProcedure::Close(void)
#endif #endif
#if 1
BuildTraces(false);
ResetVisited();
mEntryBlock->InnerLoopOptimization(mParamAliasedSet);
DisassembleDebug("inner loop opt 2");
BuildDataFlowSets();
#endif
#if 1 #if 1
ResetVisited(); ResetVisited();