1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

More fixes for switch unreachable

This commit is contained in:
Brian Fiete 2020-02-21 15:34:08 -08:00
parent 748f7b8e49
commit d40f7fa759
2 changed files with 13 additions and 14 deletions

View file

@ -606,7 +606,7 @@ public:
{ {
return (mKind <= BeMCInstKind_Unwind_SetBP); return (mKind <= BeMCInstKind_Unwind_SetBP);
} }
BeMCOperand* GetDest() BeMCOperand* GetDest()
{ {
if (mResult) if (mResult)

View file

@ -4040,10 +4040,9 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
} }
defaultBlock = mBfIRBuilder->CreateBlock("default"); defaultBlock = mBfIRBuilder->CreateBlock("default");
if (switchStmt->mDefaultCase != NULL) bool hasDefaultCase = switchStmt->mDefaultCase != NULL;
{ if (hasDefaultCase)
blocks.push_back(defaultBlock); blocks.push_back(defaultBlock);
}
SizedArray<BfDeferredLocalAssignData, 8> deferredLocalAssignDataVec; SizedArray<BfDeferredLocalAssignData, 8> deferredLocalAssignDataVec;
deferredLocalAssignDataVec.resize(blocks.size()); deferredLocalAssignDataVec.resize(blocks.size());
@ -4585,8 +4584,14 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
mBfIRBuilder->AddBlock(defaultBlock); mBfIRBuilder->AddBlock(defaultBlock);
mBfIRBuilder->SetInsertPoint(defaultBlock); mBfIRBuilder->SetInsertPoint(defaultBlock);
if (isComprehensive) if (isComprehensive)
{
mBfIRBuilder->CreateUnreachable(); mBfIRBuilder->CreateUnreachable();
mBfIRBuilder->CreateBr(endBlock); //TODO: This masks a bug in our backend
if (IsTargetingBeefBackend())
mBfIRBuilder->CreateBr(endBlock);
}
else
mBfIRBuilder->CreateBr(endBlock);
} }
if (isComprehensive) if (isComprehensive)
@ -4601,12 +4606,6 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
if (deferredLocalAssignData->mHadFallthrough) if (deferredLocalAssignData->mHadFallthrough)
continue; continue;
// if ((deferredLocalAssignData->mHadFallthrough) && (blockIdx < (int)blocks.size() - 1))
// {
// auto nextDeferredLocalAssignData = &deferredLocalAssignDataVec[blockIdx + 1];
// deferredLocalAssignData->SetUnion(*nextDeferredLocalAssignData);
// }
if (mergedDeferredLocalAssignData == NULL) if (mergedDeferredLocalAssignData == NULL)
mergedDeferredLocalAssignData = deferredLocalAssignData; mergedDeferredLocalAssignData = deferredLocalAssignData;
else else
@ -4618,12 +4617,12 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
} }
if ((caseCount > 0) && (allHadReturns) && if ((caseCount > 0) && (allHadReturns) &&
((defaultBlock != endBlock) || (isComprehensive))) ((hasDefaultCase) || (isComprehensive)))
{ {
mCurMethodState->SetHadReturn(true); mCurMethodState->SetHadReturn(true);
mCurMethodState->mLeftBlockUncond = true; mCurMethodState->mLeftBlockUncond = true;
if ((defaultBlock != endBlock) && (switchStmt->mDefaultCase != NULL)) if ((!hasDefaultCase) && (!isComprehensive))
mBfIRBuilder->DeleteBlock(endBlock); mBfIRBuilder->DeleteBlock(endBlock);
else else
{ {