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