@@ -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