@@ -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
{
@@ -1583,36 +1589,42 @@ namespace LCompilers {
1583
1589
LLVM::is_llvm_struct (key_asr_type)), module, key_asr_type);
1584
1590
builder->CreateCondBr (is_key_matching, thenBB_single_match, elseBB_single_match);
1585
1591
builder->SetInsertPoint (thenBB_single_match);
1586
- LLVM::CreateStore (*builder, key_hash, pos_ptr);
1592
+ {
1593
+ LLVM::CreateStore (*builder, key_hash, pos_ptr);
1594
+ llvm::Value* pos = LLVM::CreateLoad (*builder, pos_ptr);
1595
+ llvm::Value* item = llvm_utils->list_api ->read_item (value_list, pos,
1596
+ false , module, false );
1597
+ LLVM::CreateStore (*builder, item, result);
1598
+ }
1587
1599
builder->CreateBr (mergeBB_single_match);
1588
1600
llvm_utils->start_new_block (elseBB_single_match);
1589
1601
{
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);
1602
+ if (def_value != nullptr ) {
1603
+ LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), result);
1604
+ } else {
1605
+ std::string message = " The dict does not contain the specified key" ;
1606
+ llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1607
+ llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
1608
+ print_error (context, module, *builder, {fmt_ptr, fmt_ptr2});
1609
+ int exit_code_int = 1 ;
1610
+ llvm::Value *exit_code = llvm::ConstantInt::get (context,
1611
+ llvm::APInt (32 , exit_code_int));
1612
+ exit (context, module, *builder, exit_code);
1613
+ }
1598
1614
}
1599
1615
llvm_utils->start_new_block (mergeBB_single_match);
1600
1616
}
1601
1617
builder->CreateBr (mergeBB);
1602
1618
llvm_utils->start_new_block (elseBB);
1603
1619
{
1604
1620
if (def_value != nullptr ) {
1605
- llvm_utils->start_new_block (mergeBB);
1606
- return def_value;
1621
+ LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), result);
1607
1622
}
1608
1623
this ->resolve_collision (capacity, key_hash, key, key_list, key_mask,
1609
1624
module, key_asr_type, true );
1610
1625
}
1611
1626
llvm_utils->start_new_block (mergeBB);
1612
- 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;
1627
+ return result;
1616
1628
}
1617
1629
1618
1630
llvm::Value* LLVMDictSeparateChaining::resolve_collision_for_read (
@@ -1663,17 +1675,17 @@ namespace LCompilers {
1663
1675
llvm_utils->start_new_block (elseBB_single_match);
1664
1676
{
1665
1677
if (def_value != nullptr ) {
1666
- llvm_utils->start_new_block (mergeBB_single_match);
1667
- return def_value;
1678
+ LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), tmp_value_ptr_local);
1679
+ } else {
1680
+ std::string message = " The dict does not contain the specified key" ;
1681
+ llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1682
+ llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
1683
+ print_error (context, module, *builder, {fmt_ptr, fmt_ptr2});
1684
+ int exit_code_int = 1 ;
1685
+ llvm::Value *exit_code = llvm::ConstantInt::get (context,
1686
+ llvm::APInt (32 , exit_code_int));
1687
+ exit (context, module, *builder, exit_code);
1668
1688
}
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
1689
}
1678
1690
llvm_utils->start_new_block (mergeBB_single_match);
1679
1691
return tmp_value_ptr;
0 commit comments