1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-11 12:54:15 +02:00

More fixed to while statement

This commit is contained in:
Brian Fiete 2020-05-05 07:33:02 -07:00
parent 3bc83157e7
commit 13b5359458

View file

@ -5191,6 +5191,8 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
{ {
UpdateSrcPos(whileStmt); UpdateSrcPos(whileStmt);
bool prevHadReturn = mCurMethodState->mHadReturn;
auto condBB = mBfIRBuilder->CreateBlock("while.cond"); auto condBB = mBfIRBuilder->CreateBlock("while.cond");
auto bodyBB = mBfIRBuilder->CreateBlock("while.body"); auto bodyBB = mBfIRBuilder->CreateBlock("while.body");
auto endBB = mBfIRBuilder->CreateBlock("while.end"); auto endBB = mBfIRBuilder->CreateBlock("while.end");
@ -5247,7 +5249,13 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
// We may have a call in the loop body // We may have a call in the loop body
mCurMethodState->mMayNeedThisAccessCheck = true; mCurMethodState->mMayNeedThisAccessCheck = true;
mBfIRBuilder->CreateCondBr(checkVal.mValue, bodyBB, endBB); // For BeefBackend we continue to do CondBr because it helps our flow analysis and we optimize it anyway
if ((isInfiniteLoop) && (!IsTargetingBeefBackend()))
mBfIRBuilder->CreateBr(bodyBB);
else if ((isFalseLoop) && (!IsTargetingBeefBackend()))
mBfIRBuilder->CreateBr(endBB);
else
mBfIRBuilder->CreateCondBr(checkVal.mValue, bodyBB, endBB);
// Apply deferred local assign to mEmbeddedStatement and itrStmt // Apply deferred local assign to mEmbeddedStatement and itrStmt
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope); BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
@ -5276,17 +5284,14 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
{ {
isInfiniteLoop = false; isInfiniteLoop = false;
} }
if (!isFalseLoop) if ((!mCurMethodState->mLeftBlockUncond) && (!isFalseLoop))
{ {
if (!mCurMethodState->mLeftBlockUncond) mBfIRBuilder->CreateBr(condBB);
{ }
mBfIRBuilder->CreateBr(condBB);
}
}
if (!isInfiniteLoop) if (!isInfiniteLoop)
mCurMethodState->mHadReturn = false; mCurMethodState->mHadReturn = prevHadReturn;
mCurMethodState->mLeftBlockUncond = false; mCurMethodState->mLeftBlockUncond = false;
mCurMethodState->mLeftBlockCond = false; mCurMethodState->mLeftBlockCond = false;
@ -5294,6 +5299,11 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
mBfIRBuilder->AddBlock(endBB); mBfIRBuilder->AddBlock(endBB);
mBfIRBuilder->SetInsertPoint(endBB); mBfIRBuilder->SetInsertPoint(endBB);
if (isFalseLoop)
{
mBfIRBuilder->EraseFromParent(bodyBB);
}
RestoreScopeState(); RestoreScopeState();
if ((isInfiniteLoop) && (mCurMethodInstance != NULL)) if ((isInfiniteLoop) && (mCurMethodInstance != NULL))