Fix parameter loss in intermediate code branch forwarding

This commit is contained in:
drmortalwombat 2022-06-19 18:31:07 +02:00
parent 657b79cd3f
commit 3cdc9032b4
5 changed files with 44 additions and 9 deletions

View File

@ -3783,6 +3783,7 @@ void InterCodeBasicBlock::GenerateTraces(bool expand, bool compact)
mInstructions[ns - 1]->mCode = IC_BRANCH;
mInstructions[ns - 1]->mOperator = tj->mInstructions[0]->mOperator;
mInstructions[ns - 1]->mSrc[0].Forward(tj->mInstructions[0]->mSrc[0]);
mInstructions[ns - 1]->mNumOperands = 1;
mTrueJump = tj->mTrueJump;
mFalseJump = tj->mFalseJump;
@ -10897,6 +10898,24 @@ void InterCodeProcedure::ResetVisited(void)
for (i = 0; i < mBlocks.Size(); i++)
{
#if 0
if (mBlocks[i]->mInstructions.Size() > 0)
{
const InterInstruction* ins(mBlocks[i]->mInstructions.Last());
if (ins)
{
if (ins->mCode == IC_BRANCH)
{
assert(mBlocks[i]->mTrueJump && mBlocks[i]->mFalseJump && ins->mNumOperands >= 1 && ins->mSrc[0].mTemp >= 0);
}
else if (ins->mCode == IC_JUMP)
{
assert(mBlocks[i]->mTrueJump);
}
}
}
#endif
mBlocks[i]->mVisited = false;
mBlocks[i]->mNumEntered = 0;
}
@ -12334,6 +12353,10 @@ void InterCodeProcedure::MapCallerSavedTemps(void)
callerSavedTemps = freeCallerSavedTemps;
int maxCallerSavedTemps = mCallerSavedTemps;
assert(freeCallerSavedTemps <= mCallerSavedTemps);
mTempOffset.SetSize(0);
mTempSizes.SetSize(0);
@ -12347,7 +12370,7 @@ void InterCodeProcedure::MapCallerSavedTemps(void)
mTempSizes.Push(size);
freeTemps += size;
}
else if (callerSavedTemps + size <= 16)
else if (callerSavedTemps + size <= maxCallerSavedTemps)
{
mTempOffset.Push(callerSavedTemps);
mTempSizes.Push(size);
@ -12362,6 +12385,8 @@ void InterCodeProcedure::MapCallerSavedTemps(void)
}
mTempSize = calleeSavedTemps;
mCallerSavedTemps = callerSavedTemps;
// printf("Map %s, %d, %d, %d, %d\n", mIdent->mString, freeTemps, callerSavedTemps, calleeSavedTemps, freeCallerSavedTemps);
}
void InterCodeProcedure::Disassemble(FILE* file)

View File

@ -18490,6 +18490,8 @@ bool NativeCodeBasicBlock::OptimizeSelect(NativeCodeProcedure* proc)
mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, vt ^ vf));
mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, vt));
changed = true;
mBranch = ASMIT_JMP;
}
}
@ -24139,6 +24141,8 @@ void NativeCodeBasicBlock::CheckLive(void)
#if _DEBUG
uint32 live = 0;
assert(mBranch == ASMIT_RTS || (mBranch == ASMIT_JMP) == (mFalseJump == nullptr));
if (mBranch == ASMIT_BCC || mBranch == ASMIT_BCS)
live |= LIVE_CPU_REG_C;
if (mBranch == ASMIT_BEQ || mBranch == ASMIT_BNE || mBranch == ASMIT_BPL || mBranch == ASMIT_BMI)
@ -24447,6 +24451,7 @@ void NativeCodeBasicBlock::CopyCode(NativeCodeProcedure * proc, uint8* target)
NativeCodeBasicBlock::NativeCodeBasicBlock(void)
: mIns(NativeCodeInstruction(ASMIT_INV, ASMIM_IMPLIED)), mRelocations({ 0 }), mEntryBlocks(nullptr), mCode(0)
{
mBranch = ASMIT_RTS;
mTrueJump = mFalseJump = NULL;
mOffset = -1;
mPlaced = false;
@ -25051,6 +25056,11 @@ void NativeCodeProcedure::Optimize(void)
int step = 0;
int cnt = 0;
#if _DEBUG
ResetVisited();
mEntryBlock->CheckBlocks();
#endif
bool changed, xmapped = false, ymapped = false;
do
{

View File

@ -74,7 +74,7 @@ int main2(int argc, const char** argv)
#else
strcpy(strProductName, "oscar64");
strcpy(strProductVersion, "1.7.136");
strcpy(strProductVersion, "1.7.137");
#ifdef __APPLE__
uint32_t length = sizeof(basePath);

View File

@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,7,136,0
PRODUCTVERSION 1,7,136,0
FILEVERSION 1,7,137,0
PRODUCTVERSION 1,7,137,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -43,12 +43,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "oscar64"
VALUE "FileDescription", "oscar64 compiler"
VALUE "FileVersion", "1.7.136.0"
VALUE "FileVersion", "1.7.137.0"
VALUE "InternalName", "oscar64.exe"
VALUE "LegalCopyright", "Copyright (C) 2021"
VALUE "OriginalFilename", "oscar64.exe"
VALUE "ProductName", "oscar64"
VALUE "ProductVersion", "1.7.136.0"
VALUE "ProductVersion", "1.7.137.0"
END
END
BLOCK "VarFileInfo"

View File

@ -4127,15 +4127,15 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:oscar64"
"ProductCode" = "8:{BBBB10E0-15E4-40FE-82D3-27647FE340EE}"
"PackageCode" = "8:{E0E1AE65-F11B-4329-9A7F-73C9326FFA33}"
"ProductCode" = "8:{FD2A310E-C047-46DB-BC3A-E4704ECC3697}"
"PackageCode" = "8:{C415E608-4EAB-4BF9-9990-83BC094DFF07}"
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
"AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.7.136"
"ProductVersion" = "8:1.7.137"
"Manufacturer" = "8:oscar64"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"