1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +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);
bool prevHadReturn = mCurMethodState->mHadReturn;
auto condBB = mBfIRBuilder->CreateBlock("while.cond");
auto bodyBB = mBfIRBuilder->CreateBlock("while.body");
auto endBB = mBfIRBuilder->CreateBlock("while.end");
@ -5247,7 +5249,13 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
// We may have a call in the loop body
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
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
@ -5276,17 +5284,14 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
{
isInfiniteLoop = false;
}
if (!isFalseLoop)
if ((!mCurMethodState->mLeftBlockUncond) && (!isFalseLoop))
{
if (!mCurMethodState->mLeftBlockUncond)
{
mBfIRBuilder->CreateBr(condBB);
}
}
mBfIRBuilder->CreateBr(condBB);
}
if (!isInfiniteLoop)
mCurMethodState->mHadReturn = false;
mCurMethodState->mHadReturn = prevHadReturn;
mCurMethodState->mLeftBlockUncond = false;
mCurMethodState->mLeftBlockCond = false;
@ -5294,6 +5299,11 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
mBfIRBuilder->AddBlock(endBB);
mBfIRBuilder->SetInsertPoint(endBB);
if (isFalseLoop)
{
mBfIRBuilder->EraseFromParent(bodyBB);
}
RestoreScopeState();
if ((isInfiniteLoop) && (mCurMethodInstance != NULL))