From 1598360b653320751b1a16096eb90d0b8b15e71c Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sat, 22 Jun 2024 15:41:02 +0200 Subject: [PATCH] Fix relational bool ops constant folding --- oscar64/InterCode.cpp | 4 ++-- oscar64/InterCodeGenerator.cpp | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 1f21d5e..3245fb7 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -4905,7 +4905,7 @@ bool InterInstruction::ConstantFolding(void) mCode = IC_CONSTANT; if (mSrc[0].mType == IT_POINTER) mConst.mIntConst = ::ConstantRelationalPointerFolding(mOperator, mSrc[1], mSrc[0]); - else if (IsIntegerType(mSrc[0].mType)) + else if (IsIntegerType(mSrc[0].mType) || mSrc[0].mType == IT_BOOL) mConst.mIntConst = ::ConstantFolding(mOperator, mSrc[0].mType, mSrc[1].mIntConst, mSrc[0].mIntConst); else mConst.mIntConst = ConstantRelationalFolding(mOperator, mSrc[1].mFloatConst, mSrc[0].mFloatConst); @@ -21034,7 +21034,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "test"); + CheckFunc = !strcmp(mIdent->mString, "draw_face"); CheckCase = false; mEntryBlock = mBlocks[0]; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 921fa45..45b5161 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -60,9 +60,6 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure* ins->mSrc[0].mType = IT_POINTER; ins->mSrc[0].mTemp = v.mTemp; ins->mDst.mType = v.mReference == 1 ? InterTypeOf(v.mType) : IT_POINTER; - ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); - ins->mSrc[0].mOperandSize = v.mReference == 1 ? v.mType->mSize : 2; - ins->mSrc[0].mStride = v.mReference == 1 ? v.mType->mStripe : 1; if (ins->mDst.mType == IT_NONE) { @@ -70,6 +67,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure* return v; } + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); + ins->mSrc[0].mOperandSize = v.mReference == 1 ? v.mType->mSize : 2; + ins->mSrc[0].mStride = v.mReference == 1 ? v.mType->mStripe : 1; + + if (v.mReference == 1 && v.mType->mType == DT_TYPE_ENUM) { ins->mDst.mRange.LimitMin(v.mType->mMinValue); @@ -4536,10 +4538,18 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* else vr = Dereference(proc, exp, block, inlineMapper, vr); - if (vl.mType->mBase->IsSubType(vr.mType->mBase)) - dtype = vr.mType; - else if (vr.mType->mBase->IsSubType(vl.mType->mBase)) - dtype = vl.mType; + if (vl.mType->mBase && vr.mType->mBase) + { + if (vl.mType->mBase->IsSubType(vr.mType->mBase)) + dtype = vr.mType; + else if (vr.mType->mBase->IsSubType(vl.mType->mBase)) + dtype = vl.mType; + else + { + mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Incompatible conditional types"); + dtype = vl.mType; + } + } else { mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Incompatible conditional types");