Common sub expression across if
This commit is contained in:
parent
313b6dcf93
commit
e084035a71
|
@ -10902,6 +10902,91 @@ static bool CanMoveInstructionBeforePath(const GrowingInterCodeBasicBlockPtrArra
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool InterCodeBasicBlock::IsDirectDominatorBlock(InterCodeBasicBlock* block)
|
||||||
|
{
|
||||||
|
if (this == block)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (block->mLoopHead)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (block->mEntryBlocks.Size() == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (int i = 0; i < block->mEntryBlocks.Size(); i++)
|
||||||
|
if (!IsDirectDominatorBlock(block->mEntryBlocks[i]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InterCodeBasicBlock::HoistCommonConditionalPath(void)
|
||||||
|
{
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
if (!mVisited)
|
||||||
|
{
|
||||||
|
mVisited = true;
|
||||||
|
|
||||||
|
if (mFalseJump)
|
||||||
|
{
|
||||||
|
InterCodeBasicBlock* cblock = nullptr, * eblock = nullptr;
|
||||||
|
|
||||||
|
if (!mTrueJump->mFalseJump && mTrueJump->mTrueJump && IsDirectDominatorBlock(mTrueJump->mTrueJump))
|
||||||
|
{
|
||||||
|
cblock = mTrueJump;
|
||||||
|
eblock = mTrueJump->mTrueJump;
|
||||||
|
}
|
||||||
|
else if (!mFalseJump->mFalseJump && mFalseJump->mTrueJump && IsDirectDominatorBlock(mFalseJump->mTrueJump))
|
||||||
|
{
|
||||||
|
cblock = mFalseJump;
|
||||||
|
eblock = mFalseJump->mTrueJump;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cblock && cblock->mNumEntries == 1)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < cblock->mInstructions.Size(); i++)
|
||||||
|
{
|
||||||
|
InterInstruction* ins = cblock->mInstructions[i];
|
||||||
|
|
||||||
|
if (cblock->CanMoveInstructionBeforeBlock(i) && !HasSideEffect(ins->mCode) && ins->mDst.mTemp >= 0 && !cblock->IsTempModifiedInRange(i + 1, cblock->mInstructions.Size(), ins->mDst.mTemp))
|
||||||
|
{
|
||||||
|
int j = 0;
|
||||||
|
while (j < eblock->mInstructions.Size() && !eblock->mInstructions[j]->IsEqualSource(ins))
|
||||||
|
j++;
|
||||||
|
|
||||||
|
if (j < eblock->mInstructions.Size() && !eblock->IsTempModifiedInRange(0, j, ins->mDst.mTemp) && eblock->CanMoveInstructionBeforeBlock(j) && cblock->CanMoveInstructionBeforeBlock(cblock->mInstructions.Size(), eblock->mInstructions[j]))
|
||||||
|
{
|
||||||
|
eblock->mInstructions[j]->mCode = IC_LOAD_TEMPORARY;
|
||||||
|
eblock->mInstructions[j]->mSrc[0] = ins->mDst;
|
||||||
|
eblock->mInstructions[j]->mNumOperands = 1;
|
||||||
|
|
||||||
|
mInstructions.Insert(mInstructions.Size() - 1, ins);
|
||||||
|
cblock->mInstructions.Remove(i);
|
||||||
|
|
||||||
|
mExitRequiredTemps += ins->mDst.mTemp;
|
||||||
|
cblock->mEntryRequiredTemps += ins->mDst.mTemp;
|
||||||
|
cblock->mExitRequiredTemps += ins->mDst.mTemp;
|
||||||
|
eblock->mEntryRequiredTemps += ins->mDst.mTemp;
|
||||||
|
i--;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump && mTrueJump->HoistCommonConditionalPath())
|
||||||
|
changed = true;
|
||||||
|
if (mFalseJump && mFalseJump->HoistCommonConditionalPath())
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool InterCodeBasicBlock::MoveTrainCrossBlock(void)
|
bool InterCodeBasicBlock::MoveTrainCrossBlock(void)
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
@ -15115,6 +15200,27 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray
|
||||||
mInstructions[i + 1]->mCode = IC_NONE; mInstructions[i + 1]->mNumOperands = 0;
|
mInstructions[i + 1]->mCode = IC_NONE; mInstructions[i + 1]->mNumOperands = 0;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if 1
|
||||||
|
else if (
|
||||||
|
mInstructions[i + 0]->mCode == IC_LEA && mInstructions[i + 0]->mSrc[0].mTemp >= 0 &&
|
||||||
|
mInstructions[i + 1]->mCode == IC_LEA && mInstructions[i + 1]->mSrc[0].mTemp >= 0 &&
|
||||||
|
mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp &&
|
||||||
|
mInstructions[i + 1]->mSrc[1].mFinal &&
|
||||||
|
mInstructions[i + 0]->mSrc[0].IsUByte() && mInstructions[i + 1]->mSrc[0].IsUByte() && mInstructions[i + 0]->mSrc[0].mRange.mMaxValue + mInstructions[i + 1]->mSrc[0].mRange.mMaxValue < 256)
|
||||||
|
{
|
||||||
|
mInstructions[i + 1]->mSrc[1] = mInstructions[i + 0]->mSrc[1];
|
||||||
|
|
||||||
|
mInstructions[i + 0]->mCode = IC_BINARY_OPERATOR;
|
||||||
|
mInstructions[i + 0]->mOperator = IA_ADD;
|
||||||
|
mInstructions[i + 0]->mDst.mType = IT_INT16;
|
||||||
|
mInstructions[i + 0]->mSrc[1] = mInstructions[i + 1]->mSrc[0];
|
||||||
|
mInstructions[i + 0]->mDst.mRange = mInstructions[i + 0]->mSrc[0].mRange;
|
||||||
|
mInstructions[i + 0]->mDst.mRange.mMaxValue += mInstructions[i + 0]->mSrc[1].mRange.mMaxValue;
|
||||||
|
|
||||||
|
mInstructions[i + 1]->mSrc[0] = mInstructions[i + 0]->mDst;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (
|
else if (
|
||||||
mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_ADD && mInstructions[i + 0]->mSrc[1].mTemp < 0 && mInstructions[i + 0]->mSrc[0].mType == IT_INT16 &&
|
mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_ADD && mInstructions[i + 0]->mSrc[1].mTemp < 0 && mInstructions[i + 0]->mSrc[0].mType == IT_INT16 &&
|
||||||
|
@ -16129,7 +16235,6 @@ void InterCodeBasicBlock::WarnUsedUndefinedVariables(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InterCodeBasicBlock::CollectVariables(GrowingVariableArray& globalVars, GrowingVariableArray& localVars, GrowingVariableArray& paramVars, InterMemory paramMemory)
|
void InterCodeBasicBlock::CollectVariables(GrowingVariableArray& globalVars, GrowingVariableArray& localVars, GrowingVariableArray& paramVars, InterMemory paramMemory)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -17284,7 +17389,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "test");
|
CheckFunc = !strcmp(mIdent->mString, "tile_row");
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
||||||
|
@ -17666,6 +17771,9 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
HoistCommonConditionalPath();
|
||||||
|
DisassembleDebug("HoistCommonConditionalPath");
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
mEntryBlock->MoveLoopHeadCheckToTail();
|
mEntryBlock->MoveLoopHeadCheckToTail();
|
||||||
|
@ -18640,6 +18748,19 @@ bool InterCodeProcedure::GlobalConstantPropagation(void)
|
||||||
return mEntryBlock->PropagateConstTemps(ctemps);
|
return mEntryBlock->PropagateConstTemps(ctemps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InterCodeProcedure::HoistCommonConditionalPath(void)
|
||||||
|
{
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
ResetVisited();
|
||||||
|
if (!mEntryBlock->HoistCommonConditionalPath())
|
||||||
|
return;
|
||||||
|
TempForwarding();
|
||||||
|
RemoveUnusedInstructions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void InterCodeProcedure::ReduceTemporaries(void)
|
void InterCodeProcedure::ReduceTemporaries(void)
|
||||||
{
|
{
|
||||||
NumberSet* collisionSet;
|
NumberSet* collisionSet;
|
||||||
|
|
|
@ -499,6 +499,8 @@ public:
|
||||||
bool ForwardLoopMovedTemp(void);
|
bool ForwardLoopMovedTemp(void);
|
||||||
|
|
||||||
bool MoveTrainCrossBlock(void);
|
bool MoveTrainCrossBlock(void);
|
||||||
|
bool HoistCommonConditionalPath(void);
|
||||||
|
bool IsDirectDominatorBlock(InterCodeBasicBlock* block);
|
||||||
|
|
||||||
void MarkRelevantStatics(void);
|
void MarkRelevantStatics(void);
|
||||||
void RemoveNonRelevantStatics(void);
|
void RemoveNonRelevantStatics(void);
|
||||||
|
@ -679,6 +681,7 @@ protected:
|
||||||
void RebuildIntegerRangeSet(void);
|
void RebuildIntegerRangeSet(void);
|
||||||
void CombineIndirectAddressing(void);
|
void CombineIndirectAddressing(void);
|
||||||
void SingleTailLoopOptimization(InterMemory paramMemory);
|
void SingleTailLoopOptimization(InterMemory paramMemory);
|
||||||
|
void HoistCommonConditionalPath(void);
|
||||||
|
|
||||||
void MergeBasicBlocks(void);
|
void MergeBasicBlocks(void);
|
||||||
void CheckUsedDefinedTemps(void);
|
void CheckUsedDefinedTemps(void);
|
||||||
|
|
Loading…
Reference in New Issue