Skip to content

Commit df7afc5

Browse files
committed
LLVMCodeBuilder: Fix dataPrtDirty in list clear
1 parent 634508d commit df7afc5

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,9 +489,15 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
489489

490490
case LLVMInstruction::Type::ClearList: {
491491
assert(step.args.size() == 0);
492-
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
492+
LLVMListPtr &listPtr = m_listPtrs[step.workList];
493+
llvm::Value *oldAllocatedSize = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.allocatedSizePtr);
493494
m_builder.CreateCall(resolve_list_clear(), listPtr.ptr);
494-
// NOTE: Clearing doesn't deallocate (see List::clear()), so there's no need to update the data pointer
495+
m_builder.CreateStore(m_builder.getInt1(true), listPtr.dataPtrDirty);
496+
497+
// Clearing may deallocate, so check if the allocated size changed
498+
llvm::Value *dataPtrDirty = m_builder.CreateLoad(m_builder.getInt1Ty(), listPtr.dataPtrDirty);
499+
llvm::Value *allocatedSize = m_builder.CreateLoad(m_builder.getInt64Ty(), listPtr.allocatedSizePtr);
500+
m_builder.CreateStore(m_builder.CreateOr(dataPtrDirty, m_builder.CreateICmpNE(allocatedSize, oldAllocatedSize)), listPtr.dataPtrDirty);
495501
break;
496502
}
497503

0 commit comments

Comments
 (0)