@@ -130,8 +130,6 @@ def _create_graph_functions(self):
130130 self ._create_graph_cleanup ()
131131
132132 def _compare_strings (self , str1 , str2 , length ):
133- """Compare two strings byte by byte"""
134-
135133 same_ptr = self .builder .icmp_signed ('==' , str1 , str2 )
136134
137135 true_block = self .builder .block .parent .append_basic_block (name = "strings_equal" )
@@ -172,17 +170,15 @@ def _compare_strings(self, str1, str2, length):
172170 self .builder .branch (loop_block )
173171
174172 self .builder .position_at_end (true_block )
175- result_true = ir .Constant (self .bool_type , 1 )
176173 self .builder .branch (merge_block )
177174
178175 self .builder .position_at_end (false_block )
179- result_false = ir .Constant (self .bool_type , 0 )
180176 self .builder .branch (merge_block )
181177
182178 self .builder .position_at_end (merge_block )
183179 phi = self .builder .phi (self .bool_type , name = "string_cmp_result" )
184- phi .add_incoming (result_true , true_block )
185- phi .add_incoming (result_false , false_block )
180+ phi .add_incoming (ir . Constant ( self . bool_type , 1 ) , true_block )
181+ phi .add_incoming (ir . Constant ( self . bool_type , 0 ) , false_block )
186182
187183 return phi
188184
@@ -650,26 +646,31 @@ def _create_is_adjacent(self):
650646 [self .graph_type .as_pointer (), self .char_ptr , self .int_type , self .char_ptr , self .int_type ])
651647 self .is_adjacent = ir .Function (self .module , is_adj_type , name = "is_adjacent" )
652648
653- block = self .is_adjacent .append_basic_block (name = "entry" )
654- self .builder = ir .IRBuilder (block )
649+ entry_block = self .is_adjacent .append_basic_block (name = "entry" )
650+ node1_found_block = self .is_adjacent .append_basic_block (name = "node1_found" )
651+ check_adjacency_block = self .is_adjacent .append_basic_block (name = "check_adjacency" )
652+ search_adj_block = self .is_adjacent .append_basic_block (name = "search_adjacency" )
653+ adj_loop_block = self .is_adjacent .append_basic_block (name = "adj_search_loop" )
654+ adj_check_block = self .is_adjacent .append_basic_block (name = "adj_check_node" )
655+ adj_next_block = self .is_adjacent .append_basic_block (name = "adj_next" )
656+ adj_loop_end_block = self .is_adjacent .append_basic_block (name = "adj_loop_end" )
657+ true_block = self .is_adjacent .append_basic_block (name = "return_true" )
658+ false_block = self .is_adjacent .append_basic_block (name = "return_false" )
659+
660+ self .builder .position_at_end (entry_block )
655661
656662 graph_ptr , node1_name , node1_name_len , node2_name , node2_name_len = self .is_adjacent .args
657663
658664 node_map_ptr = self .builder .gep (graph_ptr , [ir .Constant (self .int_type , 0 ), ir .Constant (self .int_type , 3 )])
659665 node_map = self .builder .load (node_map_ptr )
660666 node1_void = self .builder .call (self .hash_lookup , [node_map , node1_name , node1_name_len ])
661667
662- node1_found_block = self .is_adjacent .append_basic_block (name = "node1_found" )
663- false_block = self .is_adjacent .append_basic_block (name = "return_false" )
664-
665668 node1_exists = self .builder .icmp_signed ('!=' , node1_void , ir .Constant (self .void_ptr , None ))
666669 self .builder .cbranch (node1_exists , node1_found_block , false_block )
667670
668671 self .builder .position_at_end (node1_found_block )
669672 node2_void = self .builder .call (self .hash_lookup , [node_map , node2_name , node2_name_len ])
670673 node2_exists = self .builder .icmp_signed ('!=' , node2_void , ir .Constant (self .void_ptr , None ))
671-
672- check_adjacency_block = self .is_adjacent .append_basic_block (name = "check_adjacency" )
673674 self .builder .cbranch (node2_exists , check_adjacency_block , false_block )
674675
675676 self .builder .position_at_end (check_adjacency_block )
@@ -686,26 +687,18 @@ def _create_is_adjacent(self):
686687 count_positive = self .builder .icmp_signed ('>' , adj_count , ir .Constant (self .int_type , 0 ))
687688 should_search = self .builder .and_ (adj_exists , count_positive )
688689
689- search_adj_block = self .is_adjacent .append_basic_block (name = "search_adjacency" )
690690 self .builder .cbranch (should_search , search_adj_block , false_block )
691691
692692 self .builder .position_at_end (search_adj_block )
693693 adj_array_typed = self .builder .bitcast (adj_list_void , self .node_type .as_pointer ().as_pointer ())
694-
695694 i = self .builder .alloca (self .int_type , name = "adj_search_i" )
696695 self .builder .store (ir .Constant (self .int_type , 0 ), i )
697-
698- adj_loop_block = self .is_adjacent .append_basic_block (name = "adj_search_loop" )
699- adj_check_block = self .is_adjacent .append_basic_block (name = "adj_check_node" )
700- true_block = self .is_adjacent .append_basic_block (name = "return_true" )
701- adj_next_block = self .is_adjacent .append_basic_block (name = "adj_next" )
702-
703696 self .builder .branch (adj_loop_block )
704697
705698 self .builder .position_at_end (adj_loop_block )
706699 i_val = self .builder .load (i )
707700 loop_condition = self .builder .icmp_signed ('<' , i_val , adj_count )
708- self .builder .cbranch (loop_condition , adj_check_block , false_block )
701+ self .builder .cbranch (loop_condition , adj_check_block , adj_loop_end_block )
709702
710703 self .builder .position_at_end (adj_check_block )
711704 entry_ptr = self .builder .gep (adj_array_typed , [i_val ])
@@ -722,6 +715,9 @@ def _create_is_adjacent(self):
722715 self .builder .position_at_end (true_block )
723716 self .builder .ret (ir .Constant (self .bool_type , 1 ))
724717
718+ self .builder .position_at_end (adj_loop_end_block )
719+ self .builder .ret (ir .Constant (self .bool_type , 0 ))
720+
725721 self .builder .position_at_end (false_block )
726722 self .builder .ret (ir .Constant (self .bool_type , 0 ))
727723
@@ -1323,12 +1319,20 @@ def _remove_vertex_from_node_adjacency(self, node_ptr, vertex_name, vertex_name_
13231319
13241320 def _string_contains_substring (self , haystack , haystack_len , needle , needle_len ):
13251321
1326- too_long = self . builder . icmp_signed ( '>' , needle_len , haystack_len )
1327-
1322+ # Define all basic blocks upfront
1323+ entry_block = self . builder . block
13281324 false_block = self .builder .block .parent .append_basic_block (name = "substr_false" )
13291325 search_block = self .builder .block .parent .append_basic_block (name = "substr_search" )
1326+ outer_loop_block = self .builder .block .parent .append_basic_block (name = "outer_search_loop" )
1327+ inner_loop_start = self .builder .block .parent .append_basic_block (name = "inner_loop_start" )
1328+ check_char_block = self .builder .block .parent .append_basic_block (name = "check_char" )
1329+ char_match_block = self .builder .block .parent .append_basic_block (name = "char_match" )
1330+ continue_outer_block = self .builder .block .parent .append_basic_block (name = "continue_outer" )
13301331 true_block = self .builder .block .parent .append_basic_block (name = "substr_true" )
1332+ merge_block = self .builder .block .parent .append_basic_block (name = "merge" )
13311333
1334+ self .builder .position_at_end (entry_block )
1335+ too_long = self .builder .icmp_signed ('>' , needle_len , haystack_len )
13321336 self .builder .cbranch (too_long , false_block , search_block )
13331337
13341338 self .builder .position_at_end (search_block )
@@ -1337,70 +1341,55 @@ def _string_contains_substring(self, haystack, haystack_len, needle, needle_len)
13371341
13381342 i = self .builder .alloca (self .int_type , name = "search_i" )
13391343 self .builder .store (ir .Constant (self .int_type , 0 ), i )
1340-
1341- outer_loop_block = self .builder .block .parent .append_basic_block (name = "outer_search_loop" )
1342- inner_loop_block = self .builder .block .parent .append_basic_block (name = "inner_search_loop" )
1343- check_char_block = self .builder .block .parent .append_basic_block (name = "check_char" )
1344- match_found_block = self .builder .block .parent .append_basic_block (name = "match_found" )
1345- no_match_block = self .builder .block .parent .append_basic_block (name = "no_match" )
1346- continue_outer_block = self .builder .block .parent .append_basic_block (name = "continue_outer" )
1347-
13481344 self .builder .branch (outer_loop_block )
13491345
13501346 self .builder .position_at_end (outer_loop_block )
13511347 i_val = self .builder .load (i )
13521348 outer_condition = self .builder .icmp_signed ('<' , i_val , max_start )
1353- self .builder .cbranch (outer_condition , inner_loop_block , false_block )
1349+ self .builder .cbranch (outer_condition , inner_loop_start , false_block )
13541350
1355- self .builder .position_at_end (inner_loop_block )
1351+ self .builder .position_at_end (inner_loop_start )
13561352 j = self .builder .alloca (self .int_type , name = "search_j" )
13571353 self .builder .store (ir .Constant (self .int_type , 0 ), j )
13581354 self .builder .branch (check_char_block )
13591355
13601356 self .builder .position_at_end (check_char_block )
13611357 j_val = self .builder .load (j )
13621358 inner_condition = self .builder .icmp_signed ('<' , j_val , needle_len )
1363- self .builder .cbranch (inner_condition , no_match_block , match_found_block )
13641359
1365- self .builder .position_at_end (no_match_block )
1360+ match_or_mismatch = self .builder .block .parent .append_basic_block (name = "match_or_mismatch" )
1361+ self .builder .cbranch (inner_condition , match_or_mismatch , true_block )
1362+
1363+ self .builder .position_at_end (match_or_mismatch )
13661364 haystack_idx = self .builder .add (i_val , j_val )
13671365 haystack_char_ptr = self .builder .gep (haystack , [haystack_idx ])
13681366 needle_char_ptr = self .builder .gep (needle , [j_val ])
1369-
13701367 haystack_char = self .builder .load (haystack_char_ptr )
13711368 needle_char = self .builder .load (needle_char_ptr )
1372-
13731369 chars_match = self .builder .icmp_signed ('==' , haystack_char , needle_char )
13741370
1375- char_match_block = self .builder .block .parent .append_basic_block (name = "char_match" )
13761371 self .builder .cbranch (chars_match , char_match_block , continue_outer_block )
13771372
13781373 self .builder .position_at_end (char_match_block )
13791374 next_j = self .builder .add (j_val , ir .Constant (self .int_type , 1 ))
13801375 self .builder .store (next_j , j )
13811376 self .builder .branch (check_char_block )
13821377
1383- self .builder .position_at_end (match_found_block )
1384- self .builder .branch (true_block )
1385-
13861378 self .builder .position_at_end (continue_outer_block )
13871379 next_i = self .builder .add (i_val , ir .Constant (self .int_type , 1 ))
13881380 self .builder .store (next_i , i )
13891381 self .builder .branch (outer_loop_block )
13901382
13911383 self .builder .position_at_end (true_block )
1392- result_true = ir .Constant (self .bool_type , 1 )
1393- merge_block = self .builder .block .parent .append_basic_block (name = "merge" )
13941384 self .builder .branch (merge_block )
13951385
13961386 self .builder .position_at_end (false_block )
1397- result_false = ir .Constant (self .bool_type , 0 )
13981387 self .builder .branch (merge_block )
13991388
14001389 self .builder .position_at_end (merge_block )
14011390 phi = self .builder .phi (self .bool_type , name = "substr_result" )
1402- phi .add_incoming (result_true , true_block )
1403- phi .add_incoming (result_false , false_block )
1391+ phi .add_incoming (ir . Constant ( self . bool_type , 1 ) , true_block )
1392+ phi .add_incoming (ir . Constant ( self . bool_type , 0 ) , false_block )
14041393
14051394 return phi
14061395
0 commit comments