Improve auto inline heuristics

This commit is contained in:
drmortalwombat 2024-06-20 21:02:55 +02:00
parent d4a381f71c
commit bf5099f57b
3 changed files with 38 additions and 2 deletions

View File

@ -193,7 +193,8 @@ void GlobalAnalyzer::AutoInline(void)
{ {
if (f->mCallers.Size() == 1 && f->mComplexity > 100) 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; doinline = true;
} }
else else

View File

@ -3919,7 +3919,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
if (funcexp->mDecValue && (funcexp->mDecValue->mFlags & DTF_FUNC_PURE)) if (funcexp->mDecValue && (funcexp->mDecValue->mFlags & DTF_FUNC_PURE))
cins->mNoSideEffects = true; 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->mConstExpr = true;
cins->mSrc[0].mType = IT_POINTER; cins->mSrc[0].mType = IT_POINTER;

View File

@ -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 #endif
if (sz >= 4 && (mBranch == ASMIT_BCC || mBranch == ASMIT_BCS) && !mExitRequiredRegs[CPU_REG_C]) 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)); 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; proc->mLinkerObject->mType = LOT_NATIVE_CODE;
if (!mInterProc->mNoInline) if (!mInterProc->mNoInline)