Skip to content

Commit e5f03c3

Browse files
committed
Optimize list type update
1 parent 01006dc commit e5f03c3

File tree

1 file changed

+30
-33
lines changed
  • src/engine/internal/llvm/instructions

1 file changed

+30
-33
lines changed

src/engine/internal/llvm/instructions/lists.cpp

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -387,43 +387,40 @@ void Lists::createListTypeUpdate(const LLVMListPtr &listPtr, const LLVMRegister
387387
newType = m_builder.CreateLoad(m_builder.getInt32Ty(), typeField);
388388
}
389389

390-
// Set the appropriate type flag
391-
llvm::BasicBlock *defaultBlock = llvm::BasicBlock::Create(m_utils.llvmCtx(), "updateListType.default", m_utils.function());
392-
llvm::BasicBlock *mergeBlock = llvm::BasicBlock::Create(m_utils.llvmCtx(), "updateListType.merge", m_utils.function());
393-
llvm::SwitchInst *sw = m_builder.CreateSwitch(newType, defaultBlock, 4);
394-
395-
// Number case
396-
if ((newValueType & Compiler::StaticType::Number) == Compiler::StaticType::Number) {
397-
llvm::BasicBlock *numberBlock = llvm::BasicBlock::Create(m_utils.llvmCtx(), "updateListType.number", m_utils.function());
398-
sw->addCase(m_builder.getInt32(static_cast<uint32_t>(ValueType::Number)), numberBlock);
399-
m_builder.SetInsertPoint(numberBlock);
400-
m_builder.CreateStore(m_builder.getInt1(true), listPtr.hasNumber);
401-
m_builder.CreateBr(mergeBlock);
402-
}
390+
bool staticHasNumber = (newValueType & Compiler::StaticType::Number) == Compiler::StaticType::Number;
391+
bool staticHasBool = (newValueType & Compiler::StaticType::Bool) == Compiler::StaticType::Bool;
392+
bool staticHasString = (newValueType & Compiler::StaticType::String) == Compiler::StaticType::String;
403393

404-
// Bool case
405-
if ((newValueType & Compiler::StaticType::Bool) == Compiler::StaticType::Bool) {
406-
llvm::BasicBlock *boolBlock = llvm::BasicBlock::Create(m_utils.llvmCtx(), "updateListType.bool", m_utils.function());
407-
sw->addCase(m_builder.getInt32(static_cast<uint32_t>(ValueType::Bool)), boolBlock);
408-
m_builder.SetInsertPoint(boolBlock);
409-
m_builder.CreateStore(m_builder.getInt1(true), listPtr.hasBool);
410-
m_builder.CreateBr(mergeBlock);
411-
}
394+
llvm::Value *isNumber;
412395

413-
// String case
414-
if ((newValueType & Compiler::StaticType::String) == Compiler::StaticType::String) {
415-
llvm::BasicBlock *stringBlock = llvm::BasicBlock::Create(m_utils.llvmCtx(), "updateListType.string", m_utils.function());
416-
sw->addCase(m_builder.getInt32(static_cast<uint32_t>(ValueType::String)), stringBlock);
417-
m_builder.SetInsertPoint(stringBlock);
418-
m_builder.CreateStore(m_builder.getInt1(true), listPtr.hasString);
419-
m_builder.CreateBr(mergeBlock);
420-
}
396+
if (staticHasNumber)
397+
isNumber = m_builder.CreateICmpEQ(newType, m_builder.getInt32(static_cast<uint32_t>(ValueType::Number)));
398+
else
399+
isNumber = m_builder.getInt1(false);
400+
401+
llvm::Value *isBool;
402+
403+
if (staticHasBool)
404+
isBool = m_builder.CreateICmpEQ(newType, m_builder.getInt32(static_cast<uint32_t>(ValueType::Bool)));
405+
else
406+
isBool = m_builder.getInt1(false);
407+
408+
llvm::Value *isString;
409+
410+
if (staticHasString)
411+
isString = m_builder.CreateICmpEQ(newType, m_builder.getInt32(static_cast<uint32_t>(ValueType::String)));
412+
else
413+
isString = m_builder.getInt1(false);
414+
415+
// Update flags
416+
llvm::Value *previous = m_builder.CreateLoad(m_builder.getInt1Ty(), listPtr.hasNumber);
417+
m_builder.CreateStore(m_builder.CreateOr(previous, isNumber), listPtr.hasNumber);
421418

422-
// Default case
423-
m_builder.SetInsertPoint(defaultBlock);
424-
m_builder.CreateBr(mergeBlock);
419+
previous = m_builder.CreateLoad(m_builder.getInt1Ty(), listPtr.hasBool);
420+
m_builder.CreateStore(m_builder.CreateOr(previous, isBool), listPtr.hasBool);
425421

426-
m_builder.SetInsertPoint(mergeBlock);
422+
previous = m_builder.CreateLoad(m_builder.getInt1Ty(), listPtr.hasString);
423+
m_builder.CreateStore(m_builder.CreateOr(previous, isString), listPtr.hasString);
427424
}
428425
}
429426

0 commit comments

Comments
 (0)