Skip to content

Commit 6998aec

Browse files
committed
Only sync changed variables
1 parent 467ff16 commit 6998aec

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

src/engine/internal/llvm/instructions/variables.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ LLVMInstruction *Variables::buildWriteVariable(LLVMInstruction *ins)
8888
LLVMVariablePtr &varPtr = m_utils.variablePtr(ins->targetVariable);
8989

9090
m_utils.createValueStore(varPtr.stackPtr, m_utils.getValueTypePtr(varPtr.stackPtr), varPtr.isInt, varPtr.intValue, arg.second, ins->targetType, argType);
91+
m_builder.CreateStore(m_builder.getInt1(true), varPtr.changed);
9192
return ins->next;
9293
}
9394

src/engine/internal/llvm/llvmbuildutils.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ void LLVMBuildUtils::init(llvm::Function *function, BlockPrototype *procedurePro
8181

8282
// Store variables locally to enable optimizations
8383
varPtr.stackPtr = m_builder.CreateAlloca(m_valueDataType);
84+
varPtr.changed = m_builder.CreateAlloca(m_builder.getInt1Ty());
8485

8586
// Integer support
8687
varPtr.isInt = m_builder.CreateAlloca(m_builder.getInt1Ty(), nullptr, var->name() + ".isInt");
@@ -341,8 +342,18 @@ LLVMListPtr &LLVMBuildUtils::listPtr(List *list)
341342
void LLVMBuildUtils::syncVariables()
342343
{
343344
// Copy stack variables to the actual variables
344-
for (auto &[var, varPtr] : m_variablePtrs)
345+
for (auto &[var, varPtr] : m_variablePtrs) {
346+
llvm::BasicBlock *copyBlock = llvm::BasicBlock::Create(m_llvmCtx, "syncVar", m_function);
347+
llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create(m_llvmCtx, "syncVar.next", m_function);
348+
m_builder.CreateCondBr(m_builder.CreateLoad(m_builder.getInt1Ty(), varPtr.changed), copyBlock, nextBlock);
349+
350+
m_builder.SetInsertPoint(copyBlock);
345351
createValueCopy(varPtr.stackPtr, getVariablePtr(m_targetVariables, var));
352+
m_builder.CreateStore(m_builder.getInt1(false), varPtr.changed);
353+
m_builder.CreateBr(nextBlock);
354+
355+
m_builder.SetInsertPoint(nextBlock);
356+
}
346357
}
347358

348359
void LLVMBuildUtils::reloadVariables()
@@ -352,6 +363,7 @@ void LLVMBuildUtils::reloadVariables()
352363
llvm::Value *ptr = getVariablePtr(m_targetVariables, var);
353364
createValueCopy(ptr, varPtr.stackPtr);
354365
m_builder.CreateStore(m_builder.getInt1(false), varPtr.isInt);
366+
m_builder.CreateStore(m_builder.getInt1(false), varPtr.changed);
355367
}
356368
}
357369

src/engine/internal/llvm/llvmvariableptr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct LLVMVariablePtr
2020
{
2121
llvm::Value *heapPtr = nullptr;
2222
llvm::Value *stackPtr = nullptr;
23+
llvm::Value *changed = nullptr;
2324

2425
llvm::Value *isInt = nullptr;
2526
llvm::Value *intValue = nullptr;

0 commit comments

Comments
 (0)