From 078007c9fe063ddb5a0dd284ce974603faa7631b Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:36:52 +0200 Subject: [PATCH] Fix infinite loop during size reduction --- .gitignore | 1 + oscar64/NativeCodeGenerator.cpp | 28 +++++++++------------------- samples/memmap/charsetload.d64 | Bin 174848 -> 174848 bytes 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 193df86..d9366ad 100644 --- a/.gitignore +++ b/.gitignore @@ -344,3 +344,4 @@ make/oscar64 *.bcs *.crt *.crt +*.d64 diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index c3d6fc6..e0be57a 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -19577,13 +19577,18 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass #if 1 // move load (),y store zp down to potential user - for (int i = 0; i + 1 < mIns.Size(); i++) + for (int i = 0; i + 2 < mIns.Size(); i++) { - if (mIns[i].mType == ASMIT_LDA && mIns[i].mMode == ASMIM_INDIRECT_Y && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && !(mIns[i + 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) + if (mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && + mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_INDIRECT_Y && + mIns[i + 2].mType == ASMIT_STA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && !(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) { if (MoveLoadIndirectTempStoreUp(i)) changed = true; - else if (MoveIndirectLoadStoreDown(i)) + } + else if (mIns[i].mType == ASMIT_LDA && mIns[i].mMode == ASMIM_INDIRECT_Y && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && !(mIns[i + 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) + { + if (MoveIndirectLoadStoreDown(i)) changed = true; } } @@ -22969,22 +22974,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 3].mType = ASMIT_ADC; mIns[i + 2].mType = ASMIT_CLC; mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 2].mLive |= LIVE_CPU_REG_C; mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mMode = ASMIM_IMPLIED; - progress = true; - } - else if ( - mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && - !mIns[i + 1].ChangesAccu() && - mIns[i + 2].mType == ASMIT_LDA && - mIns[i + 3].mType == ASMIT_CLC && - mIns[i + 4].mType == ASMIT_ADC && mIns[i + 4].mMode == ASMIM_ZERO_PAGE && mIns[i + 4].mAddress == mIns[i + 0].mAddress) - { - mIns[i + 0].mLive |= LIVE_CPU_REG_A; - mIns[i + 1].mLive |= LIVE_CPU_REG_A; - - mIns[i + 3] = mIns[i + 2]; - mIns[i + 3].mType = ASMIT_ADC; - mIns[i + 2].mType = ASMIT_CLC; mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 2].mLive |= LIVE_CPU_REG_C; - mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mMode = ASMIM_IMPLIED; + mIns[i + 2].mLive |= mIns[i + 1].mLive; progress = true; } else if ( diff --git a/samples/memmap/charsetload.d64 b/samples/memmap/charsetload.d64 index ae1dbe01dab89af0b4f162a55a987a2e43cdad4c..ae07601a3ca0909d5ec04fc33e8048d5eda9efe4 100644 GIT binary patch delta 549 zcmYjJKWGzi82!Gxa1HU7U(O>*d;Nv{G40`yK^I$b2;scMLMF+eG=-o>5JjCFx)@4M zFGGh@@Y+rdC6Yvp9B8sct=moYT(T9H6e(yajv^?Dq4=xHHwFjxDdZtxqb3z3*vb_71Fn zu)eC82+i4Ym1{QU&7{*%%;d&mIjPTgFC+4}WliVs&=f=6D<~1q(?F|cg$o$vw+?H) zg#zyJ=T^u=Z;9L`Fvcn|$TPA%aR8l(8jSfD@%c@h%O0KF0b>61{(s&7q51)?P4@T3 z{CMKJ6PBonXK045(A)F@9d!+A;%xBwSa;|ioeBVC0_DJ?fQ>x=qKMZ+3F7fXih?I4 zg81|GDS<60o7VjzUc{Q!EaF+L^}ZA_&tuJsmT)J1(mXY`I$8u0AQ_%QBb!3y&#}F8}}l delta 581 zcmYj}F=!KU7{$NuE*wYv-~VEWF_(WxqG?Wt4h~`?4ng827K4L^qBKKLGdL((aOo6F zP6872K)eVhSV}Yv*l=LmCB~u4p`g)9w@#))QKUE*l%!|zE${a}-uFry?$U<4^ai=4 zVkzx1_X3u|h-5E`meRH@rOdUmyQYxDt$B_=>>+w6n-eX?Zd*!XE7b1{Sbwl%aw%Mh z_o!_t)pxX(C@Q-0nEM`#0%R|WwLnp+exc3aO{lJ$?^AeWz+~hL2y>cGC#PwWWY?%HWhWXBRV|5~jANdnAr+K`3=oE2DFiycW?g7v5*9QbPp)Q%X^LQE?W-E`!v9bC&k69iY zX1IV0$-DM-n(AGqsT%f(z^2uMeI_um>lPT> zY##Y(kIS2>2tI9A+X1hq;+|u)ps9gA`vn~A&xqZ(0z2bOcCCFDyUm{*z~C$y)}t4Q j&K5xr6{4U1EY;2Q4SYtv5=+q|wx#G%`#}+37P<6ax0{!I