@@ -966,24 +966,16 @@ namespace LCompilers {
966
966
llvm_utils->create_ptr_gep (src_key_mask, itr));
967
967
LLVM::CreateStore (*builder, key_mask_value,
968
968
llvm_utils->create_ptr_gep (dest_key_mask, itr));
969
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
970
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
971
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
972
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
973
969
llvm::Value* is_key_set = builder->CreateICmpEQ (key_mask_value,
974
970
llvm::ConstantInt::get (llvm::Type::getInt8Ty (context), llvm::APInt (8 , 1 )));
975
- builder->CreateCondBr (is_key_set, thenBB, elseBB);
976
- builder->SetInsertPoint (thenBB);
977
- {
978
971
972
+ llvm_utils->create_if_else (is_key_set, [&]() {
979
973
llvm::Value* srci = llvm_utils->create_ptr_gep (src_key_value_pairs, itr);
980
974
llvm::Value* desti = llvm_utils->create_ptr_gep (dest_key_value_pairs, itr);
981
975
deepcopy_key_value_pair_linked_list (srci, desti, dest_key_value_pairs,
982
976
src_capacity, dict_type, module, name2memidx);
983
- }
984
- builder->CreateBr (mergeBB);
985
- llvm_utils->start_new_block (elseBB);
986
- llvm_utils->start_new_block (mergeBB);
977
+ }, [=]() {
978
+ });
987
979
llvm::Value* tmp = builder->CreateAdd (
988
980
itr,
989
981
llvm::ConstantInt::get (context, llvm::APInt (32 , 1 )));
@@ -1004,17 +996,10 @@ namespace LCompilers {
1004
996
llvm::Value* zero = llvm::ConstantInt::get (llvm::Type::getInt32Ty (context),
1005
997
llvm::APInt (32 , 0 ));
1006
998
1007
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
1008
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
1009
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
1010
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
1011
-
1012
999
llvm::Value* cond = builder->CreateOr (
1013
1000
builder->CreateICmpSGE (pos, end_point),
1014
1001
builder->CreateICmpSLT (pos, zero));
1015
- builder->CreateCondBr (cond, thenBB, elseBB);
1016
- builder->SetInsertPoint (thenBB);
1017
- {
1002
+ llvm_utils->create_if_else (cond, [&]() {
1018
1003
std::string index_error = " IndexError: %s%d%s%d\n " ,
1019
1004
message1 = " List index is out of range. Index range is (0, " ,
1020
1005
message2 = " ), but the given index is " ;
@@ -1029,11 +1014,8 @@ namespace LCompilers {
1029
1014
llvm::Value *exit_code = llvm::ConstantInt::get (context,
1030
1015
llvm::APInt (32 , exit_code_int));
1031
1016
exit (context, module, *builder, exit_code);
1032
- }
1033
- builder->CreateBr (mergeBB);
1034
-
1035
- llvm_utils->start_new_block (elseBB);
1036
- llvm_utils->start_new_block (mergeBB);
1017
+ }, [=]() {
1018
+ });
1037
1019
}
1038
1020
1039
1021
void LLVMList::write_item (llvm::Value* list, llvm::Value* pos,
@@ -1181,26 +1163,17 @@ namespace LCompilers {
1181
1163
llvm::Value* is_key_matching = llvm::ConstantInt::get (llvm::Type::getInt1Ty (context),
1182
1164
llvm::APInt (1 , 0 ));
1183
1165
LLVM::CreateStore (*builder, is_key_matching, is_key_matching_var);
1184
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
1185
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
1186
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
1187
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
1188
1166
llvm::Value* compare_keys = builder->CreateAnd (is_key_set,
1189
1167
builder->CreateNot (is_key_skip));
1190
- builder->CreateCondBr (compare_keys, thenBB, elseBB);
1191
- builder->SetInsertPoint (thenBB);
1192
- {
1168
+ llvm_utils->create_if_else (compare_keys, [&]() {
1193
1169
llvm::Value* original_key = llvm_utils->list_api ->read_item (key_list, pos,
1194
1170
false , module, LLVM::is_llvm_struct (key_asr_type));
1195
1171
is_key_matching = llvm_utils->is_equal_by_value (key, original_key, module,
1196
1172
key_asr_type);
1197
1173
LLVM::CreateStore (*builder, is_key_matching, is_key_matching_var);
1198
- }
1199
- builder->CreateBr (mergeBB);
1200
-
1174
+ }, [=]() {
1175
+ });
1201
1176
1202
- llvm_utils->start_new_block (elseBB);
1203
- llvm_utils->start_new_block (mergeBB);
1204
1177
// TODO: Allow safe exit if pos becomes key_hash again.
1205
1178
// Ideally should not happen as dict will be resized once
1206
1179
// load factor touches a threshold (which will always be less than 1)
@@ -1269,25 +1242,16 @@ namespace LCompilers {
1269
1242
llvm::Value* is_key_matching = llvm::ConstantInt::get (llvm::Type::getInt1Ty (context),
1270
1243
llvm::APInt (1 , 0 ));
1271
1244
LLVM::CreateStore (*builder, is_key_matching, is_key_matching_var);
1272
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
1273
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
1274
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
1275
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
1276
1245
llvm::Value* compare_keys = builder->CreateAnd (is_key_set,
1277
1246
builder->CreateNot (is_key_skip));
1278
- builder->CreateCondBr (compare_keys, thenBB, elseBB);
1279
- builder->SetInsertPoint (thenBB);
1280
- {
1247
+ llvm_utils->create_if_else (compare_keys, [&]() {
1281
1248
llvm::Value* original_key = llvm_utils->list_api ->read_item (key_list, pos,
1282
1249
false , module, LLVM::is_llvm_struct (key_asr_type));
1283
1250
is_key_matching = llvm_utils->is_equal_by_value (key, original_key, module,
1284
1251
key_asr_type);
1285
1252
LLVM::CreateStore (*builder, is_key_matching, is_key_matching_var);
1286
- }
1287
- builder->CreateBr (mergeBB);
1288
-
1289
- llvm_utils->start_new_block (elseBB);
1290
- llvm_utils->start_new_block (mergeBB);
1253
+ }, [=]() {
1254
+ });
1291
1255
// TODO: Allow safe exit if pos becomes key_hash again.
1292
1256
// Ideally should not happen as dict will be resized once
1293
1257
// load factor touches a threshold (which will always be less than 1)
@@ -1371,20 +1335,11 @@ namespace LCompilers {
1371
1335
llvm::Value* break_signal = llvm_utils->is_equal_by_value (key, kv_key, module, key_asr_type);
1372
1336
break_signal = builder->CreateNot (break_signal);
1373
1337
LLVM::CreateStore (*builder, break_signal, is_key_matching_var);
1374
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
1375
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
1376
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
1377
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
1378
- builder->CreateCondBr (break_signal, thenBB, elseBB);
1379
- builder->SetInsertPoint (thenBB);
1380
- {
1338
+ llvm_utils->create_if_else (break_signal, [&]() {
1381
1339
llvm::Value* next_kv_struct = LLVM::CreateLoad (*builder, llvm_utils->create_gep (kv_struct, 2 ));
1382
1340
LLVM::CreateStore (*builder, next_kv_struct, chain_itr);
1383
- }
1384
- builder->CreateBr (mergeBB);
1385
-
1386
- llvm_utils->start_new_block (elseBB);
1387
- llvm_utils->start_new_block (mergeBB);
1341
+ }, [=]() {
1342
+ });
1388
1343
}
1389
1344
1390
1345
builder->CreateBr (loophead);
@@ -2201,22 +2156,14 @@ namespace LCompilers {
2201
2156
llvm::Value* itr = LLVM::CreateLoad (*builder, idx_ptr);
2202
2157
llvm::Value* key_mask_value = LLVM::CreateLoad (*builder,
2203
2158
llvm_utils->create_ptr_gep (old_key_mask_value, itr));
2204
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
2205
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
2206
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
2207
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
2208
2159
llvm::Value* is_key_set = builder->CreateICmpEQ (key_mask_value,
2209
2160
llvm::ConstantInt::get (llvm::Type::getInt8Ty (context), llvm::APInt (8 , 1 )));
2210
- builder->CreateCondBr (is_key_set, thenBB, elseBB);
2211
- builder->SetInsertPoint (thenBB);
2212
- {
2213
2161
2162
+ llvm_utils->create_if_else (is_key_set, [&]() {
2214
2163
llvm::Value* srci = llvm_utils->create_ptr_gep (old_key_value_pairs_value, itr);
2215
2164
write_key_value_pair_linked_list (srci, dict, capacity, key_asr_type, value_asr_type, module, name2memidx);
2216
- }
2217
- builder->CreateBr (mergeBB);
2218
- llvm_utils->start_new_block (elseBB);
2219
- llvm_utils->start_new_block (mergeBB);
2165
+ }, [=]() {
2166
+ });
2220
2167
llvm::Value* tmp = builder->CreateAdd (
2221
2168
itr,
2222
2169
llvm::ConstantInt::get (context, llvm::APInt (32 , 1 )));
@@ -2260,11 +2207,6 @@ namespace LCompilers {
2260
2207
void LLVMDict::rehash_all_at_once_if_needed (llvm::Value* dict, llvm::Module* module,
2261
2208
ASR::ttype_t * key_asr_type, ASR::ttype_t * value_asr_type,
2262
2209
std::map<std::string, std::map<std::string, int >>& name2memidx) {
2263
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
2264
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
2265
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
2266
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
2267
-
2268
2210
llvm::Value* occupancy = LLVM::CreateLoad (*builder, get_pointer_to_occupancy (dict));
2269
2211
llvm::Value* capacity = LLVM::CreateLoad (*builder, get_pointer_to_capacity (dict));
2270
2212
llvm::Value* rehash_condition = builder->CreateICmpEQ (capacity,
@@ -2278,26 +2220,16 @@ namespace LCompilers {
2278
2220
llvm::Value* load_factor_threshold = llvm::ConstantFP::get (llvm::Type::getFloatTy (context),
2279
2221
llvm::APFloat ((float ) 0.6 ));
2280
2222
rehash_condition = builder->CreateOr (rehash_condition, builder->CreateFCmpOGE (load_factor, load_factor_threshold));
2281
- builder->CreateCondBr (rehash_condition, thenBB, elseBB);
2282
- builder->SetInsertPoint (thenBB);
2283
- {
2223
+ llvm_utils->create_if_else (rehash_condition, [&]() {
2284
2224
rehash (dict, module, key_asr_type, value_asr_type, name2memidx);
2285
- }
2286
- builder->CreateBr (mergeBB);
2287
-
2288
- llvm_utils->start_new_block (elseBB);
2289
- llvm_utils->start_new_block (mergeBB);
2225
+ }, [=]() {
2226
+ });
2290
2227
}
2291
2228
2292
2229
void LLVMDictSeparateChaining::rehash_all_at_once_if_needed (
2293
2230
llvm::Value* dict, llvm::Module* module,
2294
2231
ASR::ttype_t * key_asr_type, ASR::ttype_t * value_asr_type,
2295
2232
std::map<std::string, std::map<std::string, int >>& name2memidx) {
2296
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
2297
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
2298
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
2299
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
2300
-
2301
2233
llvm::Value* occupancy = LLVM::CreateLoad (*builder, get_pointer_to_occupancy (dict));
2302
2234
llvm::Value* buckets_filled = LLVM::CreateLoad (*builder, get_pointer_to_number_of_filled_buckets (dict));
2303
2235
llvm::Value* rehash_condition = LLVM::CreateLoad (*builder, get_pointer_to_rehash_flag (dict));
@@ -2310,15 +2242,10 @@ namespace LCompilers {
2310
2242
llvm::APFloat ((float ) 2.0 ));
2311
2243
rehash_condition = builder->CreateAnd (rehash_condition,
2312
2244
builder->CreateFCmpOGE (avg_ll_length, avg_ll_length_threshold));
2313
- builder->CreateCondBr (rehash_condition, thenBB, elseBB);
2314
- builder->SetInsertPoint (thenBB);
2315
- {
2245
+ llvm_utils->create_if_else (rehash_condition, [&]() {
2316
2246
rehash (dict, module, key_asr_type, value_asr_type, name2memidx);
2317
- }
2318
- builder->CreateBr (mergeBB);
2319
-
2320
- llvm_utils->start_new_block (elseBB);
2321
- llvm_utils->start_new_block (mergeBB);
2247
+ }, [=]() {
2248
+ });
2322
2249
}
2323
2250
2324
2251
void LLVMDict::write_item (llvm::Value* dict, llvm::Value* key,
@@ -2756,17 +2683,9 @@ namespace LCompilers {
2756
2683
// end
2757
2684
llvm_utils->start_new_block (loopend);
2758
2685
2759
-
2760
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
2761
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
2762
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
2763
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
2764
-
2765
2686
llvm::Value* cond = builder->CreateICmpEQ (
2766
2687
LLVM::CreateLoad (*builder, i), current_end_point);
2767
- builder->CreateCondBr (cond, thenBB, elseBB);
2768
- builder->SetInsertPoint (thenBB);
2769
- {
2688
+ llvm_utils->create_if_else (cond, [&]() {
2770
2689
std::string message = " The list does not contain the element: " ;
2771
2690
llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" ValueError: %s%d\n " );
2772
2691
llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
@@ -2775,12 +2694,8 @@ namespace LCompilers {
2775
2694
llvm::Value *exit_code = llvm::ConstantInt::get (context,
2776
2695
llvm::APInt (32 , exit_code_int));
2777
2696
exit (context, module, *builder, exit_code);
2778
- }
2779
- builder->CreateBr (mergeBB);
2780
-
2781
- llvm_utils->start_new_block (elseBB);
2782
- llvm_utils->start_new_block (mergeBB);
2783
-
2697
+ }, [=]() {
2698
+ });
2784
2699
return LLVM::CreateLoad (*builder, i);
2785
2700
}
2786
2701
@@ -2831,27 +2746,16 @@ namespace LCompilers {
2831
2746
llvm_utils->start_new_block (loopbody);
2832
2747
{
2833
2748
// if occurrence found, increment cnt
2834
- llvm::Function *fn = builder->GetInsertBlock ()->getParent ();
2835
- llvm::BasicBlock *thenBB = llvm::BasicBlock::Create (context, " then" , fn);
2836
- llvm::BasicBlock *elseBB = llvm::BasicBlock::Create (context, " else" );
2837
- llvm::BasicBlock *mergeBB = llvm::BasicBlock::Create (context, " ifcont" );
2838
-
2839
2749
llvm::Value* left_arg = read_item (list, LLVM::CreateLoad (*builder, i),
2840
2750
false , module, LLVM::is_llvm_struct (item_type));
2841
2751
llvm::Value* cond = llvm_utils->is_equal_by_value (left_arg, item, module, item_type);
2842
- builder->CreateCondBr (cond, thenBB, elseBB);
2843
- builder->SetInsertPoint (thenBB);
2844
- {
2752
+ llvm_utils->create_if_else (cond, [&]() {
2845
2753
tmp = builder->CreateAdd (
2846
2754
LLVM::CreateLoad (*builder, cnt),
2847
2755
llvm::ConstantInt::get (context, llvm::APInt (32 , 1 )));
2848
2756
LLVM::CreateStore (*builder, tmp, cnt);
2849
- }
2850
- builder->CreateBr (mergeBB);
2851
-
2852
- llvm_utils->start_new_block (elseBB);
2853
- llvm_utils->start_new_block (mergeBB);
2854
-
2757
+ }, [=]() {
2758
+ });
2855
2759
// increment i
2856
2760
tmp = builder->CreateAdd (
2857
2761
LLVM::CreateLoad (*builder, i),
0 commit comments