Skip to content

Commit 44e5da7

Browse files
committed
LLVMCodeBuilder: Optimize list data ptr dirty checks
1 parent 953b0d9 commit 44e5da7

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/dev/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,6 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
645645
LLVMListPtr &listPtr = m_listPtrs[step.workList];
646646
llvm::Value *oldAllocatedSize = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.allocatedSizePtr);
647647
m_builder.CreateCall(resolve_list_clear(), listPtr.ptr);
648-
m_builder.CreateStore(m_builder.getInt1(true), listPtr.dataPtrDirty);
649648

650649
// Clearing may deallocate, so check if the allocated size changed
651650
llvm::Value *dataPtrDirty = m_builder.CreateLoad(m_builder.getInt1Ty(), listPtr.dataPtrDirty);
@@ -743,13 +742,10 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
743742
typeMap[&listPtr] = listPtr.type;
744743
}
745744

746-
// dataPtrDirty
747-
llvm::Value *dataPtrDirty = m_builder.CreateLoad(m_builder.getInt1Ty(), listPtr.dataPtrDirty);
748-
llvm::Value *allocatedSize = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.allocatedSizePtr);
749-
llvm::Value *size = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.sizePtr);
750-
m_builder.CreateStore(m_builder.CreateOr(dataPtrDirty, m_builder.CreateICmpEQ(allocatedSize, size)), listPtr.dataPtrDirty);
745+
llvm::Value *oldAllocatedSize = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.allocatedSizePtr);
751746

752747
// Range check
748+
llvm::Value *size = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.sizePtr);
753749
llvm::Value *min = llvm::ConstantFP::get(m_llvmCtx, llvm::APFloat(0.0));
754750
size = m_builder.CreateUIToFP(size, m_builder.getDoubleTy());
755751
llvm::Value *index = castValue(indexArg.second, indexArg.first);
@@ -763,6 +759,12 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
763759
index = m_builder.CreateFPToUI(index, m_builder.getInt64Ty());
764760
llvm::Value *itemPtr = m_builder.CreateCall(resolve_list_insert_empty(), { listPtr.ptr, index });
765761
createReusedValueStore(valueArg.second, itemPtr, type, listPtr.type);
762+
763+
// Check if the allocated size changed
764+
llvm::Value *dataPtrDirty = m_builder.CreateLoad(m_builder.getInt1Ty(), listPtr.dataPtrDirty);
765+
llvm::Value *allocatedSize = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.allocatedSizePtr);
766+
m_builder.CreateStore(m_builder.CreateOr(dataPtrDirty, m_builder.CreateICmpNE(allocatedSize, oldAllocatedSize)), listPtr.dataPtrDirty);
767+
766768
m_builder.CreateBr(nextBlock);
767769

768770
m_builder.SetInsertPoint(nextBlock);

0 commit comments

Comments
 (0)