@@ -175,7 +175,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
175
175
std::unique_ptr<LLVMTuple> tuple_api;
176
176
std::unique_ptr<LLVMDictInterface> dict_api_lp;
177
177
std::unique_ptr<LLVMDictInterface> dict_api_sc;
178
- std::unique_ptr<LLVMSetInterface> set_api; // linear probing
178
+ std::unique_ptr<LLVMSetInterface> set_api_lp;
179
+ std::unique_ptr<LLVMSetInterface> set_api_sc;
179
180
std::unique_ptr<LLVMArrUtils::Descriptor> arr_descr;
180
181
181
182
ASRToLLVMVisitor (Allocator &al, llvm::LLVMContext &context, std::string infile,
@@ -200,18 +201,21 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
200
201
tuple_api (std::make_unique<LLVMTuple>(context, llvm_utils.get(), builder.get())),
201
202
dict_api_lp (std::make_unique<LLVMDictOptimizedLinearProbing>(context, llvm_utils.get(), builder.get())),
202
203
dict_api_sc (std::make_unique<LLVMDictSeparateChaining>(context, llvm_utils.get(), builder.get())),
203
- set_api (std::make_unique<LLVMSetLinearProbing>(context, llvm_utils.get(), builder.get())),
204
+ set_api_lp (std::make_unique<LLVMSetLinearProbing>(context, llvm_utils.get(), builder.get())),
205
+ set_api_sc (std::make_unique<LLVMSetSeparateChaining>(context, llvm_utils.get(), builder.get())),
204
206
arr_descr (LLVMArrUtils::Descriptor::get_descriptor(context,
205
207
builder.get(), llvm_utils.get(),
206
208
LLVMArrUtils::DESCR_TYPE::_SimpleCMODescriptor))
207
209
{
208
210
llvm_utils->tuple_api = tuple_api.get ();
209
211
llvm_utils->list_api = list_api.get ();
210
212
llvm_utils->dict_api = nullptr ;
211
- llvm_utils->set_api = set_api. get () ;
213
+ llvm_utils->set_api = nullptr ;
212
214
llvm_utils->arr_api = arr_descr.get ();
213
215
llvm_utils->dict_api_lp = dict_api_lp.get ();
214
216
llvm_utils->dict_api_sc = dict_api_sc.get ();
217
+ llvm_utils->set_api_lp = set_api_lp.get ();
218
+ llvm_utils->set_api_sc = set_api_sc.get ();
215
219
}
216
220
217
221
llvm::Value* CreateLoad (llvm::Value *x) {
@@ -1152,12 +1156,13 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1152
1156
llvm::Type* const_set_type = llvm_utils->get_set_type (x.m_type , module .get ());
1153
1157
llvm::Value* const_set = builder->CreateAlloca (const_set_type, nullptr , " const_set" );
1154
1158
ASR::Set_t* x_set = ASR::down_cast<ASR::Set_t>(x.m_type );
1159
+ llvm_utils->set_set_api (x_set);
1155
1160
std::string el_type_code = ASRUtils::get_type_code (x_set->m_type );
1156
1161
llvm_utils->set_api ->set_init (el_type_code, const_set, module .get (), x.n_elements );
1157
1162
int64_t ptr_loads_el = !LLVM::is_llvm_struct (x_set->m_type );
1158
1163
int64_t ptr_loads_copy = ptr_loads;
1164
+ ptr_loads = ptr_loads_el;
1159
1165
for ( size_t i = 0 ; i < x.n_elements ; i++ ) {
1160
- ptr_loads = ptr_loads_el;
1161
1166
visit_expr_wrapper (x.m_elements [i], true );
1162
1167
llvm::Value* element = tmp;
1163
1168
llvm_utils->set_api ->write_item (const_set, element, module .get (),
@@ -1516,6 +1521,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1516
1521
this ->visit_expr (*x.m_arg );
1517
1522
ptr_loads = ptr_loads_copy;
1518
1523
llvm::Value* pset = tmp;
1524
+ ASR::Set_t* x_set = ASR::down_cast<ASR::Set_t>(ASRUtils::expr_type (x.m_arg ));
1525
+ llvm_utils->set_set_api (x_set);
1519
1526
tmp = llvm_utils->set_api ->len (pset);
1520
1527
}
1521
1528
@@ -1724,6 +1731,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1724
1731
}
1725
1732
1726
1733
void generate_SetAdd (ASR::expr_t * m_arg, ASR::expr_t * m_ele) {
1734
+ ASR::Set_t* set_type = ASR::down_cast<ASR::Set_t>(
1735
+ ASRUtils::expr_type (m_arg));
1727
1736
ASR::ttype_t * asr_el_type = ASRUtils::get_contained_type (ASRUtils::expr_type (m_arg));
1728
1737
int64_t ptr_loads_copy = ptr_loads;
1729
1738
ptr_loads = 0 ;
@@ -1734,10 +1743,13 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1734
1743
this ->visit_expr_wrapper (m_ele, true );
1735
1744
ptr_loads = ptr_loads_copy;
1736
1745
llvm::Value *el = tmp;
1737
- set_api->write_item (pset, el, module .get (), asr_el_type, name2memidx);
1746
+ llvm_utils->set_set_api (set_type);
1747
+ llvm_utils->set_api ->write_item (pset, el, module .get (), asr_el_type, name2memidx);
1738
1748
}
1739
1749
1740
1750
void generate_SetRemove (ASR::expr_t * m_arg, ASR::expr_t * m_ele) {
1751
+ ASR::Set_t* set_type = ASR::down_cast<ASR::Set_t>(
1752
+ ASRUtils::expr_type (m_arg));
1741
1753
ASR::ttype_t * asr_el_type = ASRUtils::get_contained_type (ASRUtils::expr_type (m_arg));
1742
1754
int64_t ptr_loads_copy = ptr_loads;
1743
1755
ptr_loads = 0 ;
@@ -1748,7 +1760,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1748
1760
this ->visit_expr_wrapper (m_ele, true );
1749
1761
ptr_loads = ptr_loads_copy;
1750
1762
llvm::Value *el = tmp;
1751
- set_api->remove_item (pset, el, *module , asr_el_type);
1763
+ llvm_utils->set_set_api (set_type);
1764
+ llvm_utils->set_api ->remove_item (pset, el, *module , asr_el_type);
1752
1765
}
1753
1766
1754
1767
void visit_IntrinsicFunction (const ASR::IntrinsicFunction_t& x) {
@@ -2773,6 +2786,10 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
2773
2786
bool is_dict_present_copy_sc = dict_api_sc->is_dict_present ();
2774
2787
dict_api_lp->set_is_dict_present (false );
2775
2788
dict_api_sc->set_is_dict_present (false );
2789
+ bool is_set_present_copy_lp = set_api_lp->is_set_present ();
2790
+ bool is_set_present_copy_sc = set_api_sc->is_set_present ();
2791
+ set_api_lp->set_is_set_present (false );
2792
+ set_api_sc->set_is_set_present (false );
2776
2793
llvm_goto_targets.clear ();
2777
2794
// Generate code for nested subroutines and functions first:
2778
2795
for (auto &item : x.m_symtab ->get_scope ()) {
@@ -2832,6 +2849,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
2832
2849
builder->CreateRet (ret_val2);
2833
2850
dict_api_lp->set_is_dict_present (is_dict_present_copy_lp);
2834
2851
dict_api_sc->set_is_dict_present (is_dict_present_copy_sc);
2852
+ set_api_lp->set_is_set_present (is_set_present_copy_lp);
2853
+ set_api_sc->set_is_set_present (is_set_present_copy_sc);
2835
2854
2836
2855
// Finalize the debug info.
2837
2856
if (compiler_options.emit_debug_info ) DBuilder->finalize ();
@@ -3323,6 +3342,10 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
3323
3342
bool is_dict_present_copy_sc = dict_api_sc->is_dict_present ();
3324
3343
dict_api_lp->set_is_dict_present (false );
3325
3344
dict_api_sc->set_is_dict_present (false );
3345
+ bool is_set_present_copy_lp = set_api_lp->is_set_present ();
3346
+ bool is_set_present_copy_sc = set_api_sc->is_set_present ();
3347
+ set_api_lp->set_is_set_present (false );
3348
+ set_api_sc->set_is_set_present (false );
3326
3349
llvm_goto_targets.clear ();
3327
3350
instantiate_function (x);
3328
3351
if (ASRUtils::get_FunctionType (x)->m_deftype == ASR::deftypeType::Interface) {
@@ -3335,6 +3358,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
3335
3358
parent_function = nullptr ;
3336
3359
dict_api_lp->set_is_dict_present (is_dict_present_copy_lp);
3337
3360
dict_api_sc->set_is_dict_present (is_dict_present_copy_sc);
3361
+ set_api_lp->set_is_set_present (is_set_present_copy_lp);
3362
+ set_api_sc->set_is_set_present (is_set_present_copy_sc);
3338
3363
3339
3364
// Finalize the debug info.
3340
3365
if (compiler_options.emit_debug_info ) DBuilder->finalize ();
@@ -4187,6 +4212,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
4187
4212
llvm::Value* target_set = tmp;
4188
4213
ptr_loads = ptr_loads_copy;
4189
4214
ASR::Set_t* value_set_type = ASR::down_cast<ASR::Set_t>(asr_value_type);
4215
+ llvm_utils->set_set_api (value_set_type);
4190
4216
llvm_utils->set_api ->set_deepcopy (value_set, target_set,
4191
4217
value_set_type, module .get (), name2memidx);
4192
4218
return ;
0 commit comments