Move more invariants out of complex loops
This commit is contained in:
parent
d1c22573da
commit
01365c38b7
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue