@@ -1548,26 +1548,16 @@ namespace LCompilers {
1548
1548
void LLVMDict::_check_key_present_or_default (llvm::Module& module, llvm::Value *key, llvm::Value *key_list,
1549
1549
ASR::ttype_t * key_asr_type, llvm::Value *value_list, llvm::Value *pos,
1550
1550
llvm::Value *def_value, llvm::Value* &result) {
1551
- llvm::Function *fn_single_match = builder->GetInsertBlock ()->getParent ();
1552
- llvm::BasicBlock *thenBB_single_match = llvm::BasicBlock::Create (context, " then" , fn_single_match);
1553
- llvm::BasicBlock *elseBB_single_match = llvm::BasicBlock::Create (context, " else" );
1554
- llvm::BasicBlock *mergeBB_single_match = llvm::BasicBlock::Create (context, " ifcont" );
1555
1551
llvm::Value* is_key_matching = llvm_utils->is_equal_by_value (key,
1556
1552
llvm_utils->list_api ->read_item (key_list, pos, false , module,
1557
1553
LLVM::is_llvm_struct (key_asr_type)), module, key_asr_type);
1558
- builder->CreateCondBr (is_key_matching, thenBB_single_match, elseBB_single_match);
1559
- builder->SetInsertPoint (thenBB_single_match);
1560
- {
1554
+ llvm_utils->create_if_else (is_key_matching, [&]() {
1561
1555
llvm::Value* item = llvm_utils->list_api ->read_item (value_list, pos,
1562
1556
false , module, false );
1563
1557
LLVM::CreateStore (*builder, item, result);
1564
- }
1565
- builder->CreateBr (mergeBB_single_match);
1566
- llvm_utils->start_new_block (elseBB_single_match);
1567
- {
1558
+ }, [=]() {
1568
1559
LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), result);
1569
- }
1570
- llvm_utils->start_new_block (mergeBB_single_match);
1560
+ });
1571
1561
}
1572
1562
1573
1563
llvm::Value* LLVMDict::resolve_collision_for_read_with_default (
@@ -1621,19 +1611,13 @@ namespace LCompilers {
1621
1611
// In the above case we will end up returning value for a key
1622
1612
// which is not present in the dict. Instead we should return an error
1623
1613
// which is done in the below code.
1624
- llvm::Function *fn_single_match = builder->GetInsertBlock ()->getParent ();
1625
- llvm::BasicBlock *thenBB_single_match = llvm::BasicBlock::Create (context, " then" , fn_single_match);
1626
- llvm::BasicBlock *elseBB_single_match = llvm::BasicBlock::Create (context, " else" );
1627
- llvm::BasicBlock *mergeBB_single_match = llvm::BasicBlock::Create (context, " ifcont" );
1628
1614
llvm::Value* is_key_matching = llvm_utils->is_equal_by_value (key,
1629
1615
llvm_utils->list_api ->read_item (key_list, key_hash, false , module,
1630
1616
LLVM::is_llvm_struct (key_asr_type)), module, key_asr_type);
1631
- builder->CreateCondBr (is_key_matching, thenBB_single_match, elseBB_single_match);
1632
- builder->SetInsertPoint (thenBB_single_match);
1633
- LLVM::CreateStore (*builder, key_hash, pos_ptr);
1634
- builder->CreateBr (mergeBB_single_match);
1635
- llvm_utils->start_new_block (elseBB_single_match);
1636
- {
1617
+
1618
+ llvm_utils->create_if_else (is_key_matching, [=]() {
1619
+ LLVM::CreateStore (*builder, key_hash, pos_ptr);
1620
+ }, [&]() {
1637
1621
std::string message = " The dict does not contain the specified key" ;
1638
1622
llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1639
1623
llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
@@ -1642,8 +1626,7 @@ namespace LCompilers {
1642
1626
llvm::Value *exit_code = llvm::ConstantInt::get (context,
1643
1627
llvm::APInt (32 , exit_code_int));
1644
1628
exit (context, module, *builder, exit_code);
1645
- }
1646
- llvm_utils->start_new_block (mergeBB_single_match);
1629
+ });
1647
1630
}
1648
1631
builder->CreateBr (mergeBB);
1649
1632
llvm_utils->start_new_block (elseBB);
@@ -1687,22 +1670,14 @@ namespace LCompilers {
1687
1670
builder->CreateCondBr (is_prob_not_neeeded, thenBB, elseBB);
1688
1671
builder->SetInsertPoint (thenBB);
1689
1672
{
1690
- llvm::Function *fn_single_match = builder->GetInsertBlock ()->getParent ();
1691
- llvm::BasicBlock *thenBB_single_match = llvm::BasicBlock::Create (context, " then" , fn_single_match);
1692
- llvm::BasicBlock *elseBB_single_match = llvm::BasicBlock::Create (context, " else" );
1693
- llvm::BasicBlock *mergeBB_single_match = llvm::BasicBlock::Create (context, " ifcont" );
1694
1673
llvm::Value* is_key_matching = llvm_utils->is_equal_by_value (key,
1695
1674
llvm_utils->list_api ->read_item (key_list, key_hash, false , module,
1696
1675
LLVM::is_llvm_struct (key_asr_type)), module, key_asr_type);
1697
- builder->CreateCondBr (is_key_matching, thenBB_single_match, elseBB_single_match);
1698
- builder->SetInsertPoint (thenBB_single_match);
1699
- LLVM::CreateStore (*builder, key_hash, pos_ptr);
1700
- builder->CreateBr (mergeBB_single_match);
1701
- llvm_utils->start_new_block (elseBB_single_match);
1702
- {
1676
+ llvm_utils->create_if_else (is_key_matching, [=]() {
1677
+ LLVM::CreateStore (*builder, key_hash, pos_ptr);
1678
+ }, [=]() {
1703
1679
LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), result);
1704
- }
1705
- llvm_utils->start_new_block (mergeBB_single_match);
1680
+ });
1706
1681
}
1707
1682
builder->CreateBr (mergeBB);
1708
1683
llvm_utils->start_new_block (elseBB);
@@ -1740,10 +1715,6 @@ namespace LCompilers {
1740
1715
} else {
1741
1716
tmp_value_ptr_local = builder->CreateBitCast (tmp_value_ptr, value_type->getPointerTo ());
1742
1717
}
1743
- llvm::Function *fn_single_match = builder->GetInsertBlock ()->getParent ();
1744
- llvm::BasicBlock *thenBB_single_match = llvm::BasicBlock::Create (context, " then" , fn_single_match);
1745
- llvm::BasicBlock *elseBB_single_match = llvm::BasicBlock::Create (context, " else" );
1746
- llvm::BasicBlock *mergeBB_single_match = llvm::BasicBlock::Create (context, " ifcont" );
1747
1718
llvm::Value* key_mask_value = LLVM::CreateLoad (*builder,
1748
1719
llvm_utils->create_ptr_gep (key_mask, key_hash));
1749
1720
llvm::Value* does_kv_exists = builder->CreateICmpEQ (key_mask_value,
@@ -1752,18 +1723,13 @@ namespace LCompilers {
1752
1723
builder->CreateICmpNE (LLVM::CreateLoad (*builder, chain_itr),
1753
1724
llvm::ConstantPointerNull::get (llvm::Type::getInt8PtrTy (context)))
1754
1725
);
1755
- builder->CreateCondBr (does_kv_exists, thenBB_single_match, elseBB_single_match);
1756
- builder->SetInsertPoint (thenBB_single_match);
1757
- {
1726
+
1727
+ llvm_utils->create_if_else (does_kv_exists, [=]() {
1758
1728
llvm::Value* kv_struct_i8 = LLVM::CreateLoad (*builder, chain_itr);
1759
1729
llvm::Value* kv_struct = builder->CreateBitCast (kv_struct_i8, kv_struct_type->getPointerTo ());
1760
1730
llvm::Value* value = LLVM::CreateLoad (*builder, llvm_utils->create_gep (kv_struct, 1 ));
1761
1731
LLVM::CreateStore (*builder, value, tmp_value_ptr_local);
1762
-
1763
- }
1764
- builder->CreateBr (mergeBB_single_match);
1765
- llvm_utils->start_new_block (elseBB_single_match);
1766
- {
1732
+ }, [&]() {
1767
1733
std::string message = " The dict does not contain the specified key" ;
1768
1734
llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1769
1735
llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
@@ -1772,8 +1738,7 @@ namespace LCompilers {
1772
1738
llvm::Value *exit_code = llvm::ConstantInt::get (context,
1773
1739
llvm::APInt (32 , exit_code_int));
1774
1740
exit (context, module, *builder, exit_code);
1775
- }
1776
- llvm_utils->start_new_block (mergeBB_single_match);
1741
+ });
1777
1742
return tmp_value_ptr;
1778
1743
}
1779
1744
@@ -1800,10 +1765,6 @@ namespace LCompilers {
1800
1765
} else {
1801
1766
tmp_value_ptr_local = builder->CreateBitCast (tmp_value_ptr, value_type->getPointerTo ());
1802
1767
}
1803
- llvm::Function *fn_single_match = builder->GetInsertBlock ()->getParent ();
1804
- llvm::BasicBlock *thenBB_single_match = llvm::BasicBlock::Create (context, " then" , fn_single_match);
1805
- llvm::BasicBlock *elseBB_single_match = llvm::BasicBlock::Create (context, " else" );
1806
- llvm::BasicBlock *mergeBB_single_match = llvm::BasicBlock::Create (context, " ifcont" );
1807
1768
llvm::Value* key_mask_value = LLVM::CreateLoad (*builder,
1808
1769
llvm_utils->create_ptr_gep (key_mask, key_hash));
1809
1770
llvm::Value* does_kv_exists = builder->CreateICmpEQ (key_mask_value,
@@ -1812,21 +1773,15 @@ namespace LCompilers {
1812
1773
builder->CreateICmpNE (LLVM::CreateLoad (*builder, chain_itr),
1813
1774
llvm::ConstantPointerNull::get (llvm::Type::getInt8PtrTy (context)))
1814
1775
);
1815
- builder->CreateCondBr (does_kv_exists, thenBB_single_match, elseBB_single_match);
1816
- builder->SetInsertPoint (thenBB_single_match);
1817
- {
1776
+
1777
+ llvm_utils->create_if_else (does_kv_exists, [=]() {
1818
1778
llvm::Value* kv_struct_i8 = LLVM::CreateLoad (*builder, chain_itr);
1819
1779
llvm::Value* kv_struct = builder->CreateBitCast (kv_struct_i8, kv_struct_type->getPointerTo ());
1820
1780
llvm::Value* value = LLVM::CreateLoad (*builder, llvm_utils->create_gep (kv_struct, 1 ));
1821
1781
LLVM::CreateStore (*builder, value, tmp_value_ptr_local);
1822
-
1823
- }
1824
- builder->CreateBr (mergeBB_single_match);
1825
- llvm_utils->start_new_block (elseBB_single_match);
1826
- {
1782
+ }, [&]() {
1827
1783
LLVM::CreateStore (*builder, LLVM::CreateLoad (*builder, def_value), tmp_value_ptr_local);
1828
- }
1829
- llvm_utils->start_new_block (mergeBB_single_match);
1784
+ });
1830
1785
return tmp_value_ptr;
1831
1786
}
1832
1787
0 commit comments