@@ -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- switch (targetType) {
417- case Compiler::StaticType::Number: {
418- Compiler::StaticType type = reg->type ();
419-
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 );
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+ }
428433
429- std::vector<std::pair<llvm::BasicBlock *, llvm::Value *>> results ;
434+ Compiler::StaticType type = reg-> type () ;
430435
436+ switch (targetType) {
437+ case Compiler::StaticType::Number: {
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,10 @@ 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: {
486- Compiler::StaticType type = reg->type ();
487-
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-
499480 // Number case
500481 if ((type & Compiler::StaticType::Number) == Compiler::StaticType::Number) {
501482 llvm::BasicBlock *numberBlock = llvm::BasicBlock::Create (m_llvmCtx, " number" , m_function);
@@ -534,36 +515,10 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
534515 results.push_back ({ stringBlock, stringResult });
535516 }
536517
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;
518+ break ;
551519 }
552520
553521 case Compiler::StaticType::String: {
554- Compiler::StaticType type = reg->type ();
555-
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-
567522 // Number case
568523 if ((type & Compiler::StaticType::Number) == Compiler::StaticType::Number) {
569524 llvm::BasicBlock *numberBlock = llvm::BasicBlock::Create (m_llvmCtx, " number" , m_function);
@@ -607,27 +562,28 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
607562 results.push_back ({ stringBlock, stringResult });
608563 }
609564
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;
565+ break ;
625566 }
626567
627568 default :
628569 // Multiple types
629570 return createValue (reg);
630571 }
572+
573+ // Default case
574+ m_builder.SetInsertPoint (defaultBlock);
575+
576+ // All possible types are covered, mark as unreachable
577+ m_builder.CreateUnreachable ();
578+
579+ // Create phi node to merge results
580+ m_builder.SetInsertPoint (mergeBlock);
581+ llvm::PHINode *result = m_builder.CreatePHI (getType (targetType, false ), results.size ());
582+
583+ for (auto &pair : results)
584+ result->addIncoming (pair.second , pair.first );
585+
586+ return result;
631587}
632588
633589llvm::Type *LLVMBuildUtils::getType (Compiler::StaticType type, bool isReturnType)
0 commit comments