1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-13 22:04:09 +02:00

Fixed some constant evaluation issues with 'while' statement

This commit is contained in:
Brian Fiete 2020-05-04 17:32:03 -07:00
parent 2cd37ef6c6
commit dedaf989a6

View file

@ -5230,12 +5230,18 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
} }
bool isInfiniteLoop = false; bool isInfiniteLoop = false;
bool isFalseLoop = false;
if (checkVal.mValue.IsConst()) if (checkVal.mValue.IsConst())
{ {
mBfIRBuilder->CreateEnsureInstructionAt();
auto constVal = mBfIRBuilder->GetConstantById(checkVal.mValue.mId); auto constVal = mBfIRBuilder->GetConstantById(checkVal.mValue.mId);
if (constVal->mTypeCode == BfTypeCode_Boolean) if (constVal->mTypeCode == BfTypeCode_Boolean)
{
isInfiniteLoop = constVal->mBool; isInfiniteLoop = constVal->mBool;
isFalseLoop = !isInfiniteLoop;
}
} }
// We may have a call in the loop body // We may have a call in the loop body
@ -5254,6 +5260,12 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
mBfIRBuilder->SetInsertPoint(bodyBB); mBfIRBuilder->SetInsertPoint(bodyBB);
if (whileStmt->mEmbeddedStatement != NULL) if (whileStmt->mEmbeddedStatement != NULL)
{ {
if (isFalseLoop)
{
SetAndRestoreValue<bool> ignoreWrites(mBfIRBuilder->mIgnoreWrites, true);
VisitEmbeddedStatement(whileStmt->mEmbeddedStatement);
}
else
VisitEmbeddedStatement(whileStmt->mEmbeddedStatement); VisitEmbeddedStatement(whileStmt->mEmbeddedStatement);
} }
else else
@ -5264,10 +5276,18 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
{ {
isInfiniteLoop = false; isInfiniteLoop = false;
} }
if (!isFalseLoop)
{
if (!mCurMethodState->mLeftBlockUncond) if (!mCurMethodState->mLeftBlockUncond)
{ {
mBfIRBuilder->CreateBr(condBB); mBfIRBuilder->CreateBr(condBB);
} }
}
if (!isInfiniteLoop)
mCurMethodState->mHadReturn = false;
mCurMethodState->mLeftBlockUncond = false; mCurMethodState->mLeftBlockUncond = false;
mCurMethodState->mLeftBlockCond = false; mCurMethodState->mLeftBlockCond = false;