From d40f7fa75997cc3b3e183a1e0ab7c719a7fb5cb4 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 21 Feb 2020 15:34:08 -0800 Subject: [PATCH] More fixes for switch unreachable --- IDEHelper/Backend/BeMCContext.h | 2 +- IDEHelper/Compiler/BfStmtEvaluator.cpp | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/IDEHelper/Backend/BeMCContext.h b/IDEHelper/Backend/BeMCContext.h index a1b9a15c..786d66d4 100644 --- a/IDEHelper/Backend/BeMCContext.h +++ b/IDEHelper/Backend/BeMCContext.h @@ -606,7 +606,7 @@ public: { return (mKind <= BeMCInstKind_Unwind_SetBP); } - + BeMCOperand* GetDest() { if (mResult) diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index e3365781..aa4966f7 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -4040,10 +4040,9 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) } defaultBlock = mBfIRBuilder->CreateBlock("default"); - if (switchStmt->mDefaultCase != NULL) - { - blocks.push_back(defaultBlock); - } + bool hasDefaultCase = switchStmt->mDefaultCase != NULL; + if (hasDefaultCase) + blocks.push_back(defaultBlock); SizedArray deferredLocalAssignDataVec; deferredLocalAssignDataVec.resize(blocks.size()); @@ -4585,8 +4584,14 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) mBfIRBuilder->AddBlock(defaultBlock); mBfIRBuilder->SetInsertPoint(defaultBlock); if (isComprehensive) + { mBfIRBuilder->CreateUnreachable(); - mBfIRBuilder->CreateBr(endBlock); + //TODO: This masks a bug in our backend + if (IsTargetingBeefBackend()) + mBfIRBuilder->CreateBr(endBlock); + } + else + mBfIRBuilder->CreateBr(endBlock); } if (isComprehensive) @@ -4601,12 +4606,6 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) if (deferredLocalAssignData->mHadFallthrough) continue; -// if ((deferredLocalAssignData->mHadFallthrough) && (blockIdx < (int)blocks.size() - 1)) -// { -// auto nextDeferredLocalAssignData = &deferredLocalAssignDataVec[blockIdx + 1]; -// deferredLocalAssignData->SetUnion(*nextDeferredLocalAssignData); -// } - if (mergedDeferredLocalAssignData == NULL) mergedDeferredLocalAssignData = deferredLocalAssignData; else @@ -4618,12 +4617,12 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) } if ((caseCount > 0) && (allHadReturns) && - ((defaultBlock != endBlock) || (isComprehensive))) + ((hasDefaultCase) || (isComprehensive))) { mCurMethodState->SetHadReturn(true); mCurMethodState->mLeftBlockUncond = true; - if ((defaultBlock != endBlock) && (switchStmt->mDefaultCase != NULL)) + if ((!hasDefaultCase) && (!isComprehensive)) mBfIRBuilder->DeleteBlock(endBlock); else {