Skip to content

Commit dde575e

Browse files
Prerak SinghPrerak Singh
authored andcommitted
bug fix
1 parent 49d7f9e commit dde575e

File tree

3 files changed

+42
-56
lines changed

3 files changed

+42
-56
lines changed

pydatastructs/graphs/_backend/cpp/llvm_adjacency_list.py

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -528,10 +528,12 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
528528
self.builder.mul(current_capacity, ir.Constant(self.int_type, 2))
529529
)
530530

531-
ptr_size = ir.Constant(self.int64_type, 8)
532-
new_adj_size_64 = self.builder.mul(self.builder.zext(new_capacity, self.int64_type), ptr_size)
533-
new_adj_mem = self.builder.call(self.malloc_func, [new_adj_size_64])
534-
new_adj_array = self.builder.bitcast(new_adj_mem, self.void_ptr)
531+
node_ptr_type = self.node_type.as_pointer()
532+
ptr_size_bytes = ir.Constant(self.int64_type, 8)
533+
new_size_bytes = self.builder.mul(self.builder.zext(new_capacity, self.int64_type), ptr_size_bytes)
534+
535+
new_array_mem = self.builder.call(self.malloc_func, [new_size_bytes])
536+
new_array = self.builder.bitcast(new_array_mem, node_ptr_type.as_pointer())
535537

536538
copy_adj_block = self.builder.block.parent.append_basic_block(name="copy_adj")
537539
no_copy_adj_block = self.builder.block.parent.append_basic_block(name="no_copy_adj")
@@ -540,26 +542,31 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
540542
self.builder.cbranch(has_existing_adj, copy_adj_block, no_copy_adj_block)
541543

542544
self.builder.position_at_end(copy_adj_block)
543-
old_adj_array = self.builder.load(adj_list_ptr)
544-
old_adj_size_64 = self.builder.mul(self.builder.zext(current_count, self.int64_type), ptr_size)
545-
self.builder.call(self.memcpy_func, [new_adj_array, old_adj_array, old_adj_size_64])
545+
old_adj_array_void = self.builder.load(adj_list_ptr)
546+
old_size_bytes = self.builder.mul(self.builder.zext(current_count, self.int64_type), ptr_size_bytes)
546547

547-
self.builder.call(self.free_func, [old_adj_array])
548+
new_array_void = self.builder.bitcast(new_array, self.void_ptr)
549+
self.builder.call(self.memcpy_func, [new_array_void, old_adj_array_void, old_size_bytes])
550+
551+
self.builder.call(self.free_func, [old_adj_array_void])
548552
self.builder.branch(no_copy_adj_block)
549553

550554
self.builder.position_at_end(no_copy_adj_block)
551-
self.builder.store(new_adj_array, adj_list_ptr)
555+
new_array_void = self.builder.bitcast(new_array, self.void_ptr)
556+
self.builder.store(new_array_void, adj_list_ptr)
552557
self.builder.store(new_capacity, adj_cap_ptr)
553558
self.builder.branch(add_adj_block)
554559

555560
self.builder.position_at_end(add_adj_block)
556-
adj_array = self.builder.load(adj_list_ptr)
561+
562+
adj_array_void = self.builder.load(adj_list_ptr)
563+
adj_array_typed = self.builder.bitcast(adj_array_void, node_ptr_type.as_pointer())
564+
557565
current_count_final = self.builder.load(adj_count_ptr)
558566

559-
offset_64 = self.builder.mul(self.builder.zext(current_count_final, self.int64_type), ptr_size)
560-
tgt_slot_ptr = self.builder.gep(adj_array, [offset_64])
561-
tgt_slot_typed = self.builder.bitcast(tgt_slot_ptr, self.node_type.as_pointer().as_pointer())
562-
self.builder.store(tgt_node_ptr, tgt_slot_typed)
567+
tgt_slot_ptr = self.builder.gep(adj_array_typed, [current_count_final])
568+
569+
self.builder.store(tgt_node_ptr, tgt_slot_ptr)
563570

564571
new_adj_count = self.builder.add(current_count_final, ir.Constant(self.int_type, 1))
565572
self.builder.store(new_adj_count, adj_count_ptr)
@@ -922,13 +929,15 @@ def _remove_from_all_adjacency_lists(self, graph_ptr, vertex_name, vertex_name_l
922929
self.builder.position_at_end(done_adj_cleanup)
923930

924931
def _remove_from_adjacency_list(self, src_node_ptr, tgt_node_ptr):
925-
926932
adj_list_ptr = self.builder.gep(src_node_ptr, [ir.Constant(self.int_type, 0), ir.Constant(self.int_type, 3)])
927933
adj_count_ptr = self.builder.gep(src_node_ptr, [ir.Constant(self.int_type, 0), ir.Constant(self.int_type, 4)])
928934

929-
adj_list = self.builder.load(adj_list_ptr)
935+
adj_list_void = self.builder.load(adj_list_ptr)
930936
adj_count = self.builder.load(adj_count_ptr)
931937

938+
node_ptr_type = self.node_type.as_pointer()
939+
adj_list_typed = self.builder.bitcast(adj_list_void, node_ptr_type.as_pointer())
940+
932941
i = self.builder.alloca(self.int_type, name="adj_i")
933942
self.builder.store(ir.Constant(self.int_type, 0), i)
934943

@@ -947,11 +956,9 @@ def _remove_from_adjacency_list(self, src_node_ptr, tgt_node_ptr):
947956
self.builder.cbranch(loop_condition, adj_check_block, adj_done_block)
948957

949958
self.builder.position_at_end(adj_check_block)
950-
ptr_size = ir.Constant(self.int64_type, 8)
951-
offset_64 = self.builder.mul(self.builder.zext(i_val, self.int64_type), ptr_size)
952-
adj_entry_ptr = self.builder.gep(adj_list, [offset_64])
953-
adj_entry_typed = self.builder.bitcast(adj_entry_ptr, self.node_type.as_pointer().as_pointer())
954-
adj_node = self.builder.load(adj_entry_typed)
959+
960+
adj_entry_ptr = self.builder.gep(adj_list_typed, [i_val])
961+
adj_node = self.builder.load(adj_entry_ptr)
955962

956963
is_target = self.builder.icmp_signed('==', adj_node, tgt_node_ptr)
957964
self.builder.cbranch(is_target, adj_found_block, adj_next_block)
@@ -972,17 +979,12 @@ def _remove_from_adjacency_list(self, src_node_ptr, tgt_node_ptr):
972979
self.builder.cbranch(shift_condition, do_adj_shift_block, finish_adj_shift_block)
973980

974981
self.builder.position_at_end(do_adj_shift_block)
975-
src_offset_64 = self.builder.mul(self.builder.zext(next_shift_idx, self.int64_type), ptr_size)
976-
dst_offset_64 = self.builder.mul(self.builder.zext(shift_i_val, self.int64_type), ptr_size)
977-
978-
src_adj_ptr = self.builder.gep(adj_list, [src_offset_64])
979-
dst_adj_ptr = self.builder.gep(adj_list, [dst_offset_64])
980982

981-
src_adj_typed = self.builder.bitcast(src_adj_ptr, self.node_type.as_pointer().as_pointer())
982-
dst_adj_typed = self.builder.bitcast(dst_adj_ptr, self.node_type.as_pointer().as_pointer())
983+
src_adj_ptr = self.builder.gep(adj_list_typed, [next_shift_idx])
984+
dst_adj_ptr = self.builder.gep(adj_list_typed, [shift_i_val])
983985

984-
node_to_shift = self.builder.load(src_adj_typed)
985-
self.builder.store(node_to_shift, dst_adj_typed)
986+
node_to_shift = self.builder.load(src_adj_ptr)
987+
self.builder.store(node_to_shift, dst_adj_ptr)
986988

987989
self.builder.store(next_shift_idx, shift_i)
988990
self.builder.branch(adj_shift_block)

pydatastructs/graphs/adjacency_list.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def initialize_llvm_graph_backend():
4040
if _llvm_backend is not None:
4141
return _llvm_backend
4242

43-
from pydatastructs.graphs._backend.cpp.llvm_adjacency_list import LLVMAdjacencyListGraph # Import your LLVM IR class
43+
from pydatastructs.graphs._backend.cpp.llvm_adjacency_list import LLVMAdjacencyListGraph
4444

4545
llvm_graph = LLVMAdjacencyListGraph()
4646

pydatastructs/linear_data_structures/_backend/cpp/algorithms/llvm_algorithms.py

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -145,31 +145,15 @@ def _materialize(dtype: str) -> int:
145145
mod = binding.parse_assembly(llvm_ir)
146146
mod.verify()
147147

148-
pmb = binding.PassManagerBuilder()
149-
pmb.opt_level = 3
150-
pmb.loop_vectorize = True
151-
pmb.slp_vectorize = True
152-
153-
fpm = binding.create_function_pass_manager(mod)
154-
pm = binding.create_module_pass_manager()
155-
156-
pm.add_basic_alias_analysis_pass()
157-
pm.add_type_based_alias_analysis_pass()
158-
pm.add_instruction_combining_pass()
159-
pm.add_gvn_pass()
160-
pm.add_cfg_simplification_pass()
161-
pm.add_loop_unroll_pass()
162-
pm.add_loop_unswitch_pass()
163-
164-
pmb.populate(fpm)
165-
pmb.populate(pm)
166-
167-
fpm.initialize()
168-
for func in mod.functions:
169-
fpm.run(func)
170-
fpm.finalize()
171-
172-
pm.run(mod)
148+
try:
149+
pm = binding.ModulePassManager()
150+
pm.add_instruction_combining_pass()
151+
pm.add_reassociate_pass()
152+
pm.add_gvn_pass()
153+
pm.add_cfg_simplification_pass()
154+
pm.run(mod)
155+
except AttributeError:
156+
pass
173157

174158
engine = binding.create_mcjit_compiler(mod, _target_machine)
175159
engine.finalize_object()

0 commit comments

Comments
 (0)