Improve auto inline heuristics
This commit is contained in:
parent
d4a381f71c
commit
bf5099f57b
|
@ -193,7 +193,8 @@ void GlobalAnalyzer::AutoInline(void)
|
|||
{
|
||||
if (f->mCallers.Size() == 1 && f->mComplexity > 100)
|
||||
{
|
||||
if (f->mCallers[0]->mCalled.Size() == 1)
|
||||
// printf("CHECK INLINING2 %s <- %s %d\n", f->mIdent->mString, f->mCallers[0]->mIdent->mString, f->mCallers[0]->mCalled.Size());
|
||||
if (cost < 0 || f->mCallers[0]->mComplexity + cost < 1000 || f->mCallers[0]->mCalled.Size() == 1)
|
||||
doinline = true;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -3919,7 +3919,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
|
|||
if (funcexp->mDecValue && (funcexp->mDecValue->mFlags & DTF_FUNC_PURE))
|
||||
cins->mNoSideEffects = true;
|
||||
|
||||
if (funcexp->mType == EX_CONSTANT && (funcexp->mDecValue->mFlags & DTF_FUNC_CONSTEXPR))
|
||||
if (funcexp->mType == EX_CONSTANT && (funcexp->mDecValue->mFlags & DTF_FUNC_CONSTEXPR) && funcexp->mDecType->mBase->mType != DT_TYPE_STRUCT)
|
||||
cins->mConstExpr = true;
|
||||
|
||||
cins->mSrc[0].mType = IT_POINTER;
|
||||
|
|
|
@ -47658,6 +47658,26 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
|||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#if 1
|
||||
if (sz >= 3 && (mBranch == ASMIT_BEQ || mBranch == ASMIT_BNE) && !mExitRequiredRegs[CPU_REG_Z] && !mExitRequiredRegs[CPU_REG_C] && !mExitRequiredRegs[CPU_REG_A])
|
||||
{
|
||||
if (mIns[sz - 3].mType == ASMIT_LDA && mIns[sz - 3].mMode == ASMIM_IMMEDIATE && mIns[sz - 3].mAddress == 0 &&
|
||||
mIns[sz - 2].mType == ASMIT_ROL && mIns[sz - 2].mMode == ASMIM_IMPLIED &&
|
||||
mIns[sz - 1].mType == ASMIT_EOR && mIns[sz - 1].mMode == ASMIM_IMMEDIATE && mIns[sz - 1].mAddress == 1)
|
||||
{
|
||||
if (mBranch == ASMIT_BEQ)
|
||||
mBranch = ASMIT_BCS;
|
||||
else
|
||||
mBranch = ASMIT_BCC;
|
||||
|
||||
mIns[sz - 3].mType = ASMIT_NOP; mIns[sz - 3].mMode = ASMIM_IMPLIED;
|
||||
mIns[sz - 2].mType = ASMIT_NOP; mIns[sz - 2].mMode = ASMIM_IMPLIED;
|
||||
mIns[sz - 1].mType = ASMIT_NOP; mIns[sz - 1].mMode = ASMIM_IMPLIED;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (sz >= 4 && (mBranch == ASMIT_BCC || mBranch == ASMIT_BCS) && !mExitRequiredRegs[CPU_REG_C])
|
||||
|
@ -49178,6 +49198,21 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
|||
mExitBlock->mIns.Push(NativeCodeInstruction(mExitBlock->mBranchIns, ASMIT_RTS, ASMIM_IMPLIED));
|
||||
|
||||
|
||||
if (mExitBlock->mIns.Size() == 1 && rflags == NCIF_LOWER && !mExitBlock->mExitRegA && (mGenerator->mCompilerOptions & COPT_NATIVE))
|
||||
{
|
||||
if (mExitBlock->mEntryBlocks.Size() == 1)
|
||||
{
|
||||
NativeCodeBasicBlock* eblock = mExitBlock->mEntryBlocks[0];
|
||||
int sz = eblock->mIns.Size();
|
||||
if (sz >= 0 && eblock->mIns[sz - 1].mType == ASMIT_STA && eblock->mIns[sz - 1].mMode == ASMIM_ZERO_PAGE && eblock->mIns[sz - 1].mAddress == BC_REG_ACCU)
|
||||
{
|
||||
mExitBlock->mExitRegA = true;
|
||||
eblock->mIns.Remove(sz - 1);
|
||||
proc->mLinkerObject->mFlags |= LOBJF_RET_REG_A;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
proc->mLinkerObject->mType = LOT_NATIVE_CODE;
|
||||
|
||||
if (!mInterProc->mNoInline)
|
||||
|
|
Loading…
Reference in New Issue