@@ -1548,7 +1548,7 @@ namespace LCompilers {
1548
1548
llvm::Value* LLVMDictOptimizedLinearProbing::resolve_collision_for_read (
1549
1549
llvm::Value* dict, llvm::Value* key_hash,
1550
1550
llvm::Value* key, llvm::Module& module,
1551
- ASR::ttype_t * key_asr_type, ASR::ttype_t * /* value_asr_type*/ , llvm::Value *def_value) {
1551
+ ASR::ttype_t * key_asr_type, ASR::ttype_t * value_asr_type, llvm::Value *def_value) {
1552
1552
llvm::Value* key_list = get_key_list (dict);
1553
1553
llvm::Value* value_list = get_value_list (dict);
1554
1554
llvm::Value* key_mask = LLVM::CreateLoad (*builder, get_pointer_to_keymask (dict));
@@ -1564,6 +1564,12 @@ namespace LCompilers {
1564
1564
llvm_utils->create_ptr_gep (key_mask, key_hash));
1565
1565
llvm::Value* is_prob_not_neeeded = builder->CreateICmpEQ (key_mask_value,
1566
1566
llvm::ConstantInt::get (llvm::Type::getInt8Ty (context), llvm::APInt (8 , 1 )));
1567
+ std::pair<std::string, std::string> llvm_key = std::make_pair (
1568
+ ASRUtils::get_type_code (key_asr_type),
1569
+ ASRUtils::get_type_code (value_asr_type)
1570
+ );
1571
+ llvm::Type* value_type = std::get<2 >(typecode2dicttype[llvm_key]).second ;
1572
+ llvm::Value* result = builder->CreateAlloca (value_type, nullptr );
1567
1573
builder->CreateCondBr (is_prob_not_neeeded, thenBB, elseBB);
1568
1574
builder->SetInsertPoint (thenBB);
1569
1575
{
@@ -1587,32 +1593,57 @@ namespace LCompilers {
1587
1593
builder->CreateBr (mergeBB_single_match);
1588
1594
llvm_utils->start_new_block (elseBB_single_match);
1589
1595
{
1590
- std::string message = " The dict does not contain the specified key" ;
1591
- llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1592
- llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
1593
- print_error (context, module, *builder, {fmt_ptr, fmt_ptr2});
1594
- int exit_code_int = 1 ;
1595
- llvm::Value *exit_code = llvm::ConstantInt::get (context,
1596
- llvm::APInt (32 , exit_code_int));
1597
- exit (context, module, *builder, exit_code);
1596
+ if (def_value != nullptr ) {
1597
+ LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), result);
1598
+ } else {
1599
+ std::string message = " The dict does not contain the specified key" ;
1600
+ llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1601
+ llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
1602
+ print_error (context, module, *builder, {fmt_ptr, fmt_ptr2});
1603
+ int exit_code_int = 1 ;
1604
+ llvm::Value *exit_code = llvm::ConstantInt::get (context,
1605
+ llvm::APInt (32 , exit_code_int));
1606
+ exit (context, module, *builder, exit_code);
1607
+ }
1598
1608
}
1599
1609
llvm_utils->start_new_block (mergeBB_single_match);
1600
1610
}
1601
1611
builder->CreateBr (mergeBB);
1602
1612
llvm_utils->start_new_block (elseBB);
1603
1613
{
1604
- if (def_value != nullptr ) {
1605
- llvm_utils->start_new_block (mergeBB);
1606
- return def_value;
1607
- }
1608
1614
this ->resolve_collision (capacity, key_hash, key, key_list, key_mask,
1609
1615
module, key_asr_type, true );
1610
1616
}
1611
1617
llvm_utils->start_new_block (mergeBB);
1612
1618
llvm::Value* pos = LLVM::CreateLoad (*builder, pos_ptr);
1613
- llvm::Value* item = llvm_utils->list_api ->read_item (value_list, pos,
1614
- false , module, true );
1615
- return item;
1619
+
1620
+ if (def_value != nullptr ) {
1621
+ llvm::Function *fn_single_match = builder->GetInsertBlock ()->getParent ();
1622
+ llvm::BasicBlock *thenBB_single_match = llvm::BasicBlock::Create (context, " then" , fn_single_match);
1623
+ llvm::BasicBlock *elseBB_single_match = llvm::BasicBlock::Create (context, " else" );
1624
+ llvm::BasicBlock *mergeBB_single_match = llvm::BasicBlock::Create (context, " ifcont" );
1625
+ llvm::Value* is_key_matching = llvm_utils->is_equal_by_value (key,
1626
+ llvm_utils->list_api ->read_item (key_list, pos, false , module,
1627
+ LLVM::is_llvm_struct (key_asr_type)), module, key_asr_type);
1628
+ builder->CreateCondBr (is_key_matching, thenBB_single_match, elseBB_single_match);
1629
+ builder->SetInsertPoint (thenBB_single_match);
1630
+ {
1631
+ llvm::Value* item = llvm_utils->list_api ->read_item (value_list, pos,
1632
+ false , module, false );
1633
+ LLVM::CreateStore (*builder, item, result);
1634
+ }
1635
+ builder->CreateBr (mergeBB_single_match);
1636
+ llvm_utils->start_new_block (elseBB_single_match);
1637
+ {
1638
+ LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), result);
1639
+ }
1640
+ llvm_utils->start_new_block (mergeBB_single_match);
1641
+ } else {
1642
+ llvm::Value* item = llvm_utils->list_api ->read_item (value_list, pos,
1643
+ false , module, false );
1644
+ LLVM::CreateStore (*builder, item, result);
1645
+ }
1646
+ return result;
1616
1647
}
1617
1648
1618
1649
llvm::Value* LLVMDictSeparateChaining::resolve_collision_for_read (
@@ -1663,17 +1694,17 @@ namespace LCompilers {
1663
1694
llvm_utils->start_new_block (elseBB_single_match);
1664
1695
{
1665
1696
if (def_value != nullptr ) {
1666
- llvm_utils->start_new_block (mergeBB_single_match);
1667
- return def_value;
1697
+ LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), tmp_value_ptr_local);
1698
+ } else {
1699
+ std::string message = " The dict does not contain the specified key" ;
1700
+ llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1701
+ llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
1702
+ print_error (context, module, *builder, {fmt_ptr, fmt_ptr2});
1703
+ int exit_code_int = 1 ;
1704
+ llvm::Value *exit_code = llvm::ConstantInt::get (context,
1705
+ llvm::APInt (32 , exit_code_int));
1706
+ exit (context, module, *builder, exit_code);
1668
1707
}
1669
- std::string message = " The dict does not contain the specified key" ;
1670
- llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1671
- llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
1672
- print_error (context, module, *builder, {fmt_ptr, fmt_ptr2});
1673
- int exit_code_int = 1 ;
1674
- llvm::Value *exit_code = llvm::ConstantInt::get (context,
1675
- llvm::APInt (32 , exit_code_int));
1676
- exit (context, module, *builder, exit_code);
1677
1708
}
1678
1709
llvm_utils->start_new_block (mergeBB_single_match);
1679
1710
return tmp_value_ptr;
0 commit comments