Skip to content

Commit f29970a

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

File tree

1 file changed

+38
-82
lines changed

1 file changed

+38
-82
lines changed

src/engine/internal/llvm/llvmbuildutils.cpp

Lines changed: 38 additions & 82 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-
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

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

0 commit comments

Comments
 (0)