diff --git a/BeefySysLib/platform/win/Platform.cpp b/BeefySysLib/platform/win/Platform.cpp index e648c2e0..8cc97a20 100644 --- a/BeefySysLib/platform/win/Platform.cpp +++ b/BeefySysLib/platform/win/Platform.cpp @@ -416,7 +416,7 @@ void Beefy::BFFatalError(const StringImpl& message, const StringImpl& file, int #endif #ifdef _DEBUG - OutputDebugStrF("FATAL ERROR: %s\n", message.c_str()); + OutputDebugStrF("FATAL ERROR: %s\n", message.c_str()); _wassert(UTF8Decode(message).c_str(), UTF8Decode(file).c_str(), line); #else String error = StrFormat("%s in %s:%d", message.c_str(), file.c_str(), line); diff --git a/IDEHelper/Backend/BeMCContext.cpp b/IDEHelper/Backend/BeMCContext.cpp index a62201e5..860286fb 100644 --- a/IDEHelper/Backend/BeMCContext.cpp +++ b/IDEHelper/Backend/BeMCContext.cpp @@ -7576,16 +7576,14 @@ void BeMCContext::DoInstCombinePass() continue; auto vregInfoFrom = mVRegInfo[remapFrom]; auto vregInfoTo = mVRegInfo[remapTo]; - int bestVRegIdx = (vregInfoFrom->mDefOrderIdx < vregInfoTo->mDefOrderIdx) ? remapFrom : remapTo; + int bestVRegIdx = remapTo; //auto itr = defMap.find(remapTo); //if (itr != defMap.end()) int* prevBestVRegIdxPtr = NULL; if (defMap.TryGetValue(remapTo, &prevBestVRegIdxPtr)) { - auto prevBestVRegIdx = *prevBestVRegIdxPtr; - if (mVRegInfo[bestVRegIdx]->mDefOrderIdx < mVRegInfo[prevBestVRegIdx]->mDefOrderIdx) - defMap[remapTo] = bestVRegIdx; + } else defMap[remapTo] = bestVRegIdx; diff --git a/IDEHelper/Backend/BeMCContext.h b/IDEHelper/Backend/BeMCContext.h index 786d66d4..f2c0c1c1 100644 --- a/IDEHelper/Backend/BeMCContext.h +++ b/IDEHelper/Backend/BeMCContext.h @@ -748,8 +748,7 @@ public: bool mMustExist; // Regs we must be able to debug // Must be refreshed with RefreshRefCounts int mRefCount; - int mAssignCount; - int mDefOrderIdx; // Indicates instruction # in def assignment + int mAssignCount; BeMCBlock* mClosedBlock; int mClosedInstIdx; @@ -789,8 +788,7 @@ public: mAssignCount = -1; mVolatileVRegSave = -1; mMustExist = false; - mIsRetVal = false; - mDefOrderIdx = -1; + mIsRetVal = false; mClosedBlock = NULL; mClosedInstIdx = -1; diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 979f48fd..7a3783f0 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -3264,11 +3264,15 @@ BfSwitchStatement* BfReducer::CreateSwitchStatement(BfTokenNode* tokenNode) { auto nextNode = mVisitorPos.GetNext(); whenToken = BfNodeDynCast(nextNode); - if ((whenToken != NULL) && (whenToken->GetToken() != BfToken_When)) + if ((whenToken != NULL) && (whenToken->GetToken() == BfToken_When)) + { + mVisitorPos.MoveNext(); + } + else whenToken = NULL; } if (whenToken != NULL) - { + { auto whenExpr = mAlloc->Alloc(); whenExpr->mWhenToken = whenToken; ReplaceNode(whenToken, whenExpr); diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index aa4966f7..98cbabfa 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -4397,6 +4397,20 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) lastDefaultBlock = notEqBB; } + if ((whenExpr != NULL) && (switchCase->mCaseExpressions.size() == 1)) + { + // This was a "case when" expression, always matches + mayHaveMatch = true; + + auto notEqBB = mBfIRBuilder->CreateBlock(StrFormat("switch.notEq_when.%d", blockIdx)); + + mBfIRBuilder->CreateBr(caseBlock); + mBfIRBuilder->AddBlock(notEqBB); + mBfIRBuilder->SetInsertPoint(notEqBB); + + lastNotEqBlock = notEqBB; + } + if (lastDefaultBlock) mBfIRBuilder->SetSwitchDefaultDest(switchStatement, lastDefaultBlock);