Skip to content

Commit eef21ca

Browse files
update implementation
1 parent 0de6836 commit eef21ca

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

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

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,10 @@ def _build_insertion_sort_ir(dtype: str) -> str:
151151

152152
fn_ty = ir.FunctionType(ir.VoidType(), [T.as_pointer(), i32])
153153
fn = ir.Function(mod, fn_ty, name=fn_name)
154-
155154
arr, n = fn.args
156155
arr.name, n.name = "arr", "n"
157156

158-
# Basic blocks
157+
# --- Basic blocks ---
159158
b_entry = fn.append_basic_block("entry")
160159
b_outer = fn.append_basic_block("outer")
161160
b_inner_cond = fn.append_basic_block("inner.cond")
@@ -165,27 +164,32 @@ def _build_insertion_sort_ir(dtype: str) -> str:
165164
b_exit = fn.append_basic_block("exit")
166165

167166
b = ir.IRBuilder(b_entry)
168-
169167
cond_trivial = b.icmp_signed("<=", n, ir.Constant(i32, 1))
170168
b.cbranch(cond_trivial, b_exit, b_outer)
171169

170+
# --- Outer loop ---
172171
b.position_at_end(b_outer)
173172
i_phi = b.phi(i32, name="i")
174-
i_phi.add_incoming(ir.Constant(i32, 1), b_entry) # start from 1 for insertion sort
173+
i_phi.add_incoming(ir.Constant(i32, 1), b_entry)
175174

176175
cond_outer = b.icmp_signed("<", i_phi, n)
177176
b.cbranch(cond_outer, b_inner_cond, b_exit)
178177

178+
# --- Inner loop condition ---
179179
b.position_at_end(b_inner_cond)
180+
# PHI first
181+
j_phi = b.phi(i32, name="j")
182+
j_phi.add_incoming(i_phi, b_outer)
183+
# Note: add incoming from inner.latch later after defining b_inner_latch
184+
185+
# Load key after PHI
180186
key_ptr = b.gep(arr, [i_phi])
181187
key_val = b.load(key_ptr, name="key_val")
182188

183-
j_phi = b.phi(i32, name="j")
184-
j_phi.add_incoming(i_phi, b_outer) # j = i
185-
186-
inner_cond = b.icmp_signed(">", j_phi, ir.Constant(i32, 0))
187-
b.cbranch(inner_cond, b_inner_body, b_outer_latch)
189+
cond_inner = b.icmp_signed(">", j_phi, ir.Constant(i32, 0))
190+
b.cbranch(cond_inner, b_inner_body, b_outer_latch)
188191

192+
# --- Inner loop body ---
189193
b.position_at_end(b_inner_body)
190194
j_minus_1 = b.sub(j_phi, ir.Constant(i32, 1))
191195
ptr_j_minus_1 = b.gep(arr, [j_minus_1])
@@ -194,14 +198,16 @@ def _build_insertion_sort_ir(dtype: str) -> str:
194198
cmp = b.icmp_signed(">", val_j_minus_1, key_val) if isinstance(T, ir.IntType) else b.fcmp_ordered(">", val_j_minus_1, key_val)
195199
b.cbranch(cmp, b_inner_latch, b_outer_latch)
196200

201+
# --- Inner loop latch (shift element left) ---
197202
b.position_at_end(b_inner_latch)
198203
ptr_j = b.gep(arr, [j_phi])
199204
b.store(val_j_minus_1, ptr_j)
200205

201206
j_next = b.sub(j_phi, ir.Constant(i32, 1))
202-
j_phi.add_incoming(j_next, b_inner_latch)
207+
j_phi.add_incoming(j_next, b_inner_latch) # now PHI incoming from latch
203208
b.branch(b_inner_cond)
204209

210+
# --- Outer latch (store key and increment i) ---
205211
b.position_at_end(b_outer_latch)
206212
ptr_j = b.gep(arr, [j_phi])
207213
b.store(key_val, ptr_j)
@@ -210,12 +216,13 @@ def _build_insertion_sort_ir(dtype: str) -> str:
210216
i_phi.add_incoming(i_next, b_outer_latch)
211217
b.branch(b_outer)
212218

213-
# Exit
219+
# --- Exit ---
214220
b.position_at_end(b_exit)
215221
b.ret_void()
216222

217223
return str(mod)
218224

225+
219226
def _materialize(dtype: str, algo: str) -> int:
220227
_ensure_target_machine()
221228

0 commit comments

Comments
 (0)