Skip to content

Commit 19b76af

Browse files
committed
LLVMCodeBuilder: Optimize list size
1 parent 06bb0b1 commit 19b76af

File tree

3 files changed

+8
-4
lines changed

3 files changed

+8
-4
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
100100
listPtr.ptr = getListPtr(targetLists, list);
101101
listPtr.dataPtr = m_builder.CreateAlloca(m_valueDataType->getPointerTo());
102102
m_builder.CreateStore(m_builder.CreateCall(resolve_list_data(), listPtr.ptr), listPtr.dataPtr);
103+
listPtr.sizePtr = m_builder.CreateAlloca(m_builder.getInt64Ty()->getPointerTo());
104+
m_builder.CreateStore(m_builder.CreateCall(resolve_list_size_ptr(), listPtr.ptr), listPtr.sizePtr);
103105
}
104106

105107
// Execute recorded steps
@@ -548,7 +550,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
548550
case LLVMInstruction::Type::GetListSize: {
549551
assert(step.args.size() == 0);
550552
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
551-
step.functionReturnReg->value = m_builder.CreateUIToFP(m_builder.CreateCall(resolve_list_size(), listPtr.ptr), m_builder.getDoubleTy());
553+
llvm::Value *sizePtr = m_builder.CreateLoad(m_builder.getInt64Ty()->getPointerTo(), listPtr.sizePtr);
554+
step.functionReturnReg->value = m_builder.CreateUIToFP(m_builder.CreateLoad(m_builder.getInt64Ty(), sizePtr), m_builder.getDoubleTy());
552555
break;
553556
}
554557

@@ -2050,10 +2053,10 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_data()
20502053
return resolveFunction("list_data", llvm::FunctionType::get(m_valueDataType->getPointerTo(), { listPtr }, false));
20512054
}
20522055

2053-
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_size()
2056+
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_size_ptr()
20542057
{
20552058
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
2056-
return resolveFunction("list_size", llvm::FunctionType::get(m_builder.getInt64Ty(), { listPtr }, false));
2059+
return resolveFunction("list_size_ptr", llvm::FunctionType::get(m_builder.getInt64Ty()->getPointerTo()->getPointerTo(), { listPtr }, false));
20572060
}
20582061

20592062
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class LLVMCodeBuilder : public ICodeBuilder
149149
llvm::FunctionCallee resolve_list_append_empty();
150150
llvm::FunctionCallee resolve_list_insert_empty();
151151
llvm::FunctionCallee resolve_list_data();
152-
llvm::FunctionCallee resolve_list_size();
152+
llvm::FunctionCallee resolve_list_size_ptr();
153153
llvm::FunctionCallee resolve_strcasecmp();
154154

155155
Target *m_target = nullptr;

src/dev/engine/internal/llvm/llvmlistptr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct LLVMListPtr
1818
{
1919
llvm::Value *ptr = nullptr;
2020
llvm::Value *dataPtr = nullptr;
21+
llvm::Value *sizePtr = nullptr;
2122
Compiler::StaticType type = Compiler::StaticType::Unknown;
2223
};
2324

0 commit comments

Comments
 (0)