Skip to content

Commit e44eae7

Browse files
Prerak SinghPrerak Singh
authored andcommitted
bug fix
1 parent cdf747d commit e44eae7

File tree

1 file changed

+36
-47
lines changed

1 file changed

+36
-47
lines changed

pydatastructs/graphs/_backend/cpp/llvm_adjacency_list.py

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)