@@ -413,21 +413,28 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
413413
414414 assert (reg->type () != Compiler::StaticType::Void && targetType != Compiler::StaticType::Void);
415415
416+ llvm::Value *typePtr = nullptr ;
417+ llvm::Value *loadedType = nullptr ;
418+ llvm::BasicBlock *mergeBlock = nullptr ;
419+ llvm::BasicBlock *defaultBlock = nullptr ;
420+ llvm::SwitchInst *sw = nullptr ;
421+ std::vector<std::pair<llvm::BasicBlock *, llvm::Value *>> results;
422+
423+ if (isSingleType (targetType)) {
424+ // Handle multiple source type cases with runtime switch
425+ typePtr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 1 );
426+ loadedType = m_builder.CreateLoad (m_builder.getInt32Ty (), typePtr);
427+
428+ mergeBlock = llvm::BasicBlock::Create (m_llvmCtx, " merge" , m_function);
429+ defaultBlock = llvm::BasicBlock::Create (m_llvmCtx, " default" , m_function);
430+
431+ sw = m_builder.CreateSwitch (loadedType, defaultBlock, 4 );
432+ }
433+
416434 switch (targetType) {
417435 case Compiler::StaticType::Number: {
418436 Compiler::StaticType type = reg->type ();
419437
420- // Handle multiple type cases with runtime switch
421- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 1 );
422- llvm::Value *loadedType = m_builder.CreateLoad (m_builder.getInt32Ty (), typePtr);
423-
424- llvm::BasicBlock *mergeBlock = llvm::BasicBlock::Create (m_llvmCtx, " merge" , m_function);
425- llvm::BasicBlock *defaultBlock = llvm::BasicBlock::Create (m_llvmCtx, " default" , m_function);
426-
427- llvm::SwitchInst *sw = m_builder.CreateSwitch (loadedType, defaultBlock, 4 );
428-
429- std::vector<std::pair<llvm::BasicBlock *, llvm::Value *>> results;
430-
431438 // Number case
432439 if ((type & Compiler::StaticType::Number) == Compiler::StaticType::Number) {
433440 llvm::BasicBlock *numberBlock = llvm::BasicBlock::Create (m_llvmCtx, " number" , m_function);
@@ -466,36 +473,12 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
466473 results.push_back ({ stringBlock, stringResult });
467474 }
468475
469- // Default case
470- m_builder.SetInsertPoint (defaultBlock);
471-
472- // All possible types are covered, mark as unreachable
473- m_builder.CreateUnreachable ();
474-
475- // Create phi node to merge results
476- m_builder.SetInsertPoint (mergeBlock);
477- llvm::PHINode *result = m_builder.CreatePHI (m_builder.getDoubleTy (), results.size ());
478-
479- for (auto &pair : results)
480- result->addIncoming (pair.second , pair.first );
481-
482- return result;
476+ break ;
483477 }
484478
485479 case Compiler::StaticType::Bool: {
486480 Compiler::StaticType type = reg->type ();
487481
488- // Handle multiple type cases with runtime switch
489- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 1 );
490- llvm::Value *loadedType = m_builder.CreateLoad (m_builder.getInt32Ty (), typePtr);
491-
492- llvm::BasicBlock *mergeBlock = llvm::BasicBlock::Create (m_llvmCtx, " merge" , m_function);
493- llvm::BasicBlock *defaultBlock = llvm::BasicBlock::Create (m_llvmCtx, " default" , m_function);
494-
495- llvm::SwitchInst *sw = m_builder.CreateSwitch (loadedType, defaultBlock, 4 );
496-
497- std::vector<std::pair<llvm::BasicBlock *, llvm::Value *>> results;
498-
499482 // Number case
500483 if ((type & Compiler::StaticType::Number) == Compiler::StaticType::Number) {
501484 llvm::BasicBlock *numberBlock = llvm::BasicBlock::Create (m_llvmCtx, " number" , m_function);
@@ -534,36 +517,12 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
534517 results.push_back ({ stringBlock, stringResult });
535518 }
536519
537- // Default case
538- m_builder.SetInsertPoint (defaultBlock);
539-
540- // All possible types are covered, mark as unreachable
541- m_builder.CreateUnreachable ();
542-
543- // Create phi node to merge results
544- m_builder.SetInsertPoint (mergeBlock);
545- llvm::PHINode *result = m_builder.CreatePHI (m_builder.getInt1Ty (), results.size ());
546-
547- for (auto &pair : results)
548- result->addIncoming (pair.second , pair.first );
549-
550- return result;
520+ break ;
551521 }
552522
553523 case Compiler::StaticType::String: {
554524 Compiler::StaticType type = reg->type ();
555525
556- // Handle multiple type cases with runtime switch
557- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 1 );
558- llvm::Value *loadedType = m_builder.CreateLoad (m_builder.getInt32Ty (), typePtr);
559-
560- llvm::BasicBlock *mergeBlock = llvm::BasicBlock::Create (m_llvmCtx, " merge" , m_function);
561- llvm::BasicBlock *defaultBlock = llvm::BasicBlock::Create (m_llvmCtx, " default" , m_function);
562-
563- llvm::SwitchInst *sw = m_builder.CreateSwitch (loadedType, defaultBlock, 4 );
564-
565- std::vector<std::pair<llvm::BasicBlock *, llvm::Value *>> results;
566-
567526 // Number case
568527 if ((type & Compiler::StaticType::Number) == Compiler::StaticType::Number) {
569528 llvm::BasicBlock *numberBlock = llvm::BasicBlock::Create (m_llvmCtx, " number" , m_function);
@@ -607,27 +566,28 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
607566 results.push_back ({ stringBlock, stringResult });
608567 }
609568
610- // Default case
611- m_builder.SetInsertPoint (defaultBlock);
612-
613- // All possible types are covered, mark as unreachable
614- m_builder.CreateUnreachable ();
615-
616- // Create phi node to merge results
617- m_builder.SetInsertPoint (mergeBlock);
618- llvm::PHINode *result = m_builder.CreatePHI (m_stringPtrType->getPointerTo (), results.size ());
619-
620- for (auto &pair : results)
621- result->addIncoming (pair.second , pair.first );
622-
623- freeStringLater (result);
624- return result;
569+ break ;
625570 }
626571
627572 default :
628573 // Multiple types
629574 return createValue (reg);
630575 }
576+
577+ // Default case
578+ m_builder.SetInsertPoint (defaultBlock);
579+
580+ // All possible types are covered, mark as unreachable
581+ m_builder.CreateUnreachable ();
582+
583+ // Create phi node to merge results
584+ m_builder.SetInsertPoint (mergeBlock);
585+ llvm::PHINode *result = m_builder.CreatePHI (m_builder.getDoubleTy (), results.size ());
586+
587+ for (auto &pair : results)
588+ result->addIncoming (pair.second , pair.first );
589+
590+ return result;
631591}
632592
633593llvm::Type *LLVMBuildUtils::getType (Compiler::StaticType type, bool isReturnType)
0 commit comments