@@ -161,6 +161,10 @@ void LLVMBuildUtils::init(llvm::Function *function, BlockPrototype *procedurePro
161161 reloadVariables ();
162162 reloadLists ();
163163
164+ // Mark the target as valid
165+ m_targetValidFlag = m_builder.CreateAlloca (m_builder.getInt1Ty ());
166+ m_builder.CreateStore (m_builder.getInt1 (true ), m_targetValidFlag);
167+
164168 // Create end branches
165169 m_endBranch = llvm::BasicBlock::Create (m_llvmCtx, " end" , m_function);
166170 m_endThreadBranch = llvm::BasicBlock::Create (m_llvmCtx, " endThread" , m_function);
@@ -438,6 +442,12 @@ LLVMListPtr &LLVMBuildUtils::listPtr(List *list)
438442
439443void LLVMBuildUtils::syncVariables ()
440444{
445+ llvm::BasicBlock *syncBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVariables" , m_function);
446+ llvm::BasicBlock *syncNextBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVariables.next" , m_function);
447+ m_builder.CreateCondBr (m_builder.CreateLoad (m_builder.getInt1Ty (), m_targetValidFlag), syncBlock, syncNextBlock);
448+
449+ m_builder.SetInsertPoint (syncBlock);
450+
441451 // Copy stack variables to the actual variables
442452 for (auto &[var, varPtr] : m_variablePtrs) {
443453 llvm::BasicBlock *copyBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVar" , m_function);
@@ -451,6 +461,9 @@ void LLVMBuildUtils::syncVariables()
451461
452462 m_builder.SetInsertPoint (nextBlock);
453463 }
464+
465+ m_builder.CreateBr (syncNextBlock);
466+ m_builder.SetInsertPoint (syncNextBlock);
454467}
455468
456469void LLVMBuildUtils::reloadVariables ()
@@ -481,6 +494,11 @@ void LLVMBuildUtils::reloadLists()
481494 }
482495}
483496
497+ void LLVMBuildUtils::invalidateTarget ()
498+ {
499+ m_builder.CreateStore (m_builder.getInt1 (false ), m_targetValidFlag);
500+ }
501+
484502std::vector<LLVMIfStatement> &LLVMBuildUtils::ifStatements ()
485503{
486504 return m_ifStatements;
0 commit comments