diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 56d8209a..26daf2fb 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -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))