Skip to content

Commit 23a138a

Browse files
Prerak SinghPrerak Singh
authored andcommitted
bug fix
1 parent e7086e4 commit 23a138a

File tree

2 files changed

+14
-24
lines changed

2 files changed

+14
-24
lines changed

pydatastructs/graphs/_backend/cpp/llvm_adjacency_list.py

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
528528
current_capacity = self.builder.load(adj_cap_ptr)
529529

530530
needs_resize = self.builder.icmp_signed('>=', current_count, current_capacity)
531-
531+
532532
resize_adj_block = self.builder.block.parent.append_basic_block(name="resize_adj")
533533
add_adj_block = self.builder.block.parent.append_basic_block(name="add_adj")
534534

@@ -547,33 +547,30 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
547547

548548
old_adj_list = self.builder.load(adj_list_ptr)
549549
copy_needed = self.builder.icmp_signed('>', current_count, ir.Constant(self.int_type, 0))
550-
550+
551551
copy_block = self.builder.block.parent.append_basic_block(name="copy_existing")
552552
store_block = self.builder.block.parent.append_basic_block(name="store_new_array")
553-
553+
554554
self.builder.cbranch(copy_needed, copy_block, store_block)
555-
555+
556556
self.builder.position_at_end(copy_block)
557557
old_size_bytes = self.builder.mul(self.builder.zext(current_count, self.int64_type), ptr_size)
558558
self.builder.call(self.memcpy_func, [new_array_mem, old_adj_list, old_size_bytes])
559559
self.builder.call(self.free_func, [old_adj_list])
560560
self.builder.branch(store_block)
561-
561+
562562
self.builder.position_at_end(store_block)
563563
self.builder.store(new_array_mem, adj_list_ptr)
564564
self.builder.store(new_capacity, adj_cap_ptr)
565565
self.builder.branch(add_adj_block)
566566

567567
self.builder.position_at_end(add_adj_block)
568568
adj_array = self.builder.load(adj_list_ptr)
569+
adj_array_typed = self.builder.bitcast(adj_array, self.node_type.as_pointer().as_pointer())
569570

570571
current_count_final = self.builder.load(adj_count_ptr)
571-
offset_bytes = self.builder.mul(self.builder.zext(current_count_final, self.int64_type), ptr_size)
572-
target_addr = self.builder.gep(adj_array, [offset_bytes])
573-
574-
node_as_int = self.builder.ptrtoint(tgt_node_ptr, self.int64_type)
575-
node_bytes = self.builder.bitcast(target_addr, self.int64_type.as_pointer())
576-
self.builder.store(node_as_int, node_bytes)
572+
target_addr = self.builder.gep(adj_array_typed, [current_count_final])
573+
self.builder.store(tgt_node_ptr, target_addr)
577574

578575
new_count = self.builder.add(current_count_final, ir.Constant(self.int_type, 1))
579576
self.builder.store(new_count, adj_count_ptr)
@@ -655,6 +652,8 @@ def _create_is_adjacent(self):
655652
self.builder.cbranch(should_search, search_adj_block, false_block)
656653

657654
self.builder.position_at_end(search_adj_block)
655+
adj_array_typed = self.builder.bitcast(adj_list_void, self.node_type.as_pointer().as_pointer())
656+
658657
i = self.builder.alloca(self.int_type, name="adj_search_i")
659658
self.builder.store(ir.Constant(self.int_type, 0), i)
660659

@@ -671,15 +670,8 @@ def _create_is_adjacent(self):
671670
self.builder.cbranch(loop_condition, adj_check_block, false_block)
672671

673672
self.builder.position_at_end(adj_check_block)
674-
adj_array = self.builder.load(adj_list_ptr)
675-
676-
ptr_size = ir.Constant(self.int64_type, 8)
677-
offset_bytes = self.builder.mul(self.builder.zext(i_val, self.int64_type), ptr_size)
678-
entry_addr = self.builder.gep(adj_array, [offset_bytes])
679-
680-
entry_as_int_ptr = self.builder.bitcast(entry_addr, self.int64_type.as_pointer())
681-
entry_as_int = self.builder.load(entry_as_int_ptr)
682-
adj_node = self.builder.inttoptr(entry_as_int, self.node_type.as_pointer())
673+
entry_ptr = self.builder.gep(adj_array_typed, [i_val])
674+
adj_node = self.builder.load(entry_ptr)
683675

684676
nodes_match = self.builder.icmp_signed('==', adj_node, node2_ptr)
685677
self.builder.cbranch(nodes_match, true_block, adj_next_block)
@@ -967,7 +959,6 @@ def _remove_from_adjacency_list(self, src_node_ptr, tgt_node_ptr):
967959
self.builder.cbranch(loop_condition, adj_check_block, adj_done_block)
968960

969961
self.builder.position_at_end(adj_check_block)
970-
971962
adj_entry_ptr = self.builder.gep(adj_list_typed, [i_val])
972963
adj_node = self.builder.load(adj_entry_ptr)
973964

@@ -990,7 +981,6 @@ def _remove_from_adjacency_list(self, src_node_ptr, tgt_node_ptr):
990981
self.builder.cbranch(shift_condition, do_adj_shift_block, finish_adj_shift_block)
991982

992983
self.builder.position_at_end(do_adj_shift_block)
993-
994984
src_adj_ptr = self.builder.gep(adj_list_typed, [next_shift_idx])
995985
dst_adj_ptr = self.builder.gep(adj_list_typed, [shift_i_val])
996986

@@ -1217,6 +1207,7 @@ def _remove_vertex_from_node_adjacency(self, node_ptr, vertex_name, vertex_name_
12171207
self.builder.cbranch(adj_exists, process_adj_block, skip_adj_block)
12181208

12191209
self.builder.position_at_end(process_adj_block)
1210+
adj_list_typed = self.builder.bitcast(adj_list, self.node_type.as_pointer().as_pointer())
12201211

12211212
write_index = self.builder.alloca(self.int_type, name="write_idx")
12221213
self.builder.store(ir.Constant(self.int_type, 0), write_index)
@@ -1238,7 +1229,6 @@ def _remove_vertex_from_node_adjacency(self, node_ptr, vertex_name, vertex_name_
12381229
self.builder.cbranch(loop_condition, check_vertex_block, update_count_block)
12391230

12401231
self.builder.position_at_end(check_vertex_block)
1241-
adj_list_typed = self.builder.bitcast(adj_list, self.node_type.as_pointer().as_pointer())
12421232
read_entry_ptr = self.builder.gep(adj_list_typed, [i_val])
12431233
adj_node = self.builder.load(read_entry_ptr)
12441234

pydatastructs/graphs/tests/test_adjacency_list.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def test_adjacency_list():
8383
assert raises(ValueError, lambda: g2.add_edge('v_4', 'v'))
8484

8585
g3 = Graph('a','b',implementation = 'adjacency_list', backend = Backend.LLVM)
86-
g3.add_edge('a', 'b',10)
86+
g3.add_edge('a', 'b')
8787
assert g3.is_adjacent('a','b') is True
8888
g3.add_vertex('c')
8989
g3.add_edge('a','c')

0 commit comments

Comments
 (0)