Skip to content

Commit 62cc8ac

Browse files
committed
LLVMCodeBuilder: Create allocas in entry block
1 parent 802e71f commit 62cc8ac

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
562562
break;
563563
}
564564

565-
step.functionReturnReg->value = m_builder.CreateAlloca(type);
565+
step.functionReturnReg->value = addAlloca(type);
566566
break;
567567
}
568568

@@ -895,7 +895,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
895895

896896
// index = 0
897897
llvm::Constant *zero = llvm::ConstantInt::get(m_builder.getInt64Ty(), 0, true);
898-
loop.index = m_builder.CreateAlloca(m_builder.getInt64Ty());
898+
loop.index = addAlloca(m_builder.getInt64Ty());
899899
m_builder.CreateStore(zero, loop.index);
900900

901901
// Create branches
@@ -1718,6 +1718,16 @@ LLVMRegister *LLVMCodeBuilder::addReg(std::shared_ptr<LLVMRegister> reg)
17181718
return reg.get();
17191719
}
17201720

1721+
llvm::Value *LLVMCodeBuilder::addAlloca(llvm::Type *type)
1722+
{
1723+
// Add an alloca to the entry block because allocas must be there (to avoid stack overflow)
1724+
llvm::BasicBlock *block = m_builder.GetInsertBlock();
1725+
m_builder.SetInsertPointPastAllocas(m_function);
1726+
llvm::Value *ret = m_builder.CreateAlloca(type);
1727+
m_builder.SetInsertPoint(block);
1728+
return ret;
1729+
}
1730+
17211731
void LLVMCodeBuilder::freeLater(llvm::Value *value)
17221732
{
17231733
assert(!m_heap.empty());
@@ -2206,7 +2216,7 @@ llvm::Value *LLVMCodeBuilder::getListItemIndex(const LLVMListPtr &listPtr, LLVMR
22062216
llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create(m_llvmCtx, "", m_function);
22072217

22082218
// index = 0
2209-
llvm::Value *index = m_builder.CreateAlloca(m_builder.getInt64Ty());
2219+
llvm::Value *index = addAlloca(m_builder.getInt64Ty());
22102220
m_builder.CreateStore(m_builder.getInt64(0), index);
22112221
m_builder.CreateBr(condBlock);
22122222

@@ -2250,7 +2260,7 @@ llvm::Value *LLVMCodeBuilder::createValue(LLVMRegister *reg)
22502260
if (reg->isConst()) {
22512261
// Create a constant ValueData instance and store it
22522262
llvm::Constant *value = castConstValue(reg->constValue(), TYPE_MAP[reg->constValue().type()]);
2253-
llvm::Value *ret = m_builder.CreateAlloca(m_valueDataType);
2263+
llvm::Value *ret = addAlloca(m_valueDataType);
22542264

22552265
switch (reg->constValue().type()) {
22562266
case ValueType::Number:
@@ -2279,7 +2289,7 @@ llvm::Value *LLVMCodeBuilder::createValue(LLVMRegister *reg)
22792289
return ret;
22802290
} else if (reg->isRawValue) {
22812291
llvm::Value *value = castRawValue(reg, reg->type());
2282-
llvm::Value *ret = m_builder.CreateAlloca(m_valueDataType);
2292+
llvm::Value *ret = addAlloca(m_valueDataType);
22832293

22842294
// Store value
22852295
llvm::Value *valueField = m_builder.CreateStructGEP(m_valueDataType, ret, 0);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class LLVMCodeBuilder : public ICodeBuilder
126126

127127
LLVMRegister *addReg(std::shared_ptr<LLVMRegister> reg);
128128

129+
llvm::Value *addAlloca(llvm::Type *type);
129130
void freeLater(llvm::Value *value);
130131
void freeScopeHeap();
131132
llvm::Value *castValue(LLVMRegister *reg, Compiler::StaticType targetType);

0 commit comments

Comments
 (0)