Skip to content

Commit b53d25d

Browse files
committed
LLVMBuildUtils: Simplify castValue()
1 parent 2e1a537 commit b53d25d

File tree

1 file changed

+36
-76
lines changed

1 file changed

+36
-76
lines changed

src/engine/internal/llvm/llvmbuildutils.cpp

Lines changed: 36 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -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

633593
llvm::Type *LLVMBuildUtils::getType(Compiler::StaticType type, bool isReturnType)

0 commit comments

Comments
 (0)