From 63736c5b82bd17b5da1b12f227c1f78216e6f615 Mon Sep 17 00:00:00 2001 From: Jan Hoenig <hrominium@gmail.com> Date: Thu, 8 Dec 2016 14:29:21 +0100 Subject: [PATCH] Adding missing files --- llvm/control_flow.py | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 llvm/control_flow.py diff --git a/llvm/control_flow.py b/llvm/control_flow.py new file mode 100644 index 000000000..9090d3de0 --- /dev/null +++ b/llvm/control_flow.py @@ -0,0 +1,52 @@ +import llvmlite.ir as ir + + +class Loop: + def __init__(self, builder, start_val, stop_val, step_val=1, loop_name='loop', phi_name="_phi"): + self.builder = builder + self.start_val = start_val + self.stop_val = stop_val + self.step_val = step_val + self.loop_name = loop_name + self.phi_name = phi_name + + def __enter__(self): + self.loop_end, self.after, phi = self._for_loop(self.start_val, self.stop_val, self.step_val, self.loop_name, + self.phi_name) + return phi + + def _for_loop(self, start_val, stop_val, step_val, loop_name, phi_name): + # TODO size of int??? unisgned??? + integer = ir.IntType(64) + + # Loop block + pre_loop_bb = self.builder.block + loop_bb = self.builder.append_basic_block(name='loop_' + loop_name) + + self.builder.branch(loop_bb) + + # Insert an explicit fall through from the current block to loop_bb + self.builder.position_at_start(loop_bb) + + # Add phi + phi = self.builder.phi(integer, name=phi_name) + phi.add_incoming(start_val, pre_loop_bb) + + loop_end_bb = self.builder.append_basic_block(name=loop_name + "_end_bb") + self.builder.position_at_start(loop_end_bb) + + next_var = self.builder.add(phi, step_val, name=loop_name + '_next_it') + cond = self.builder.icmp_unsigned('<', next_var, stop_val, name=loop_name + "_cond") + + after_bb = self.builder.append_basic_block(name=loop_name + "_after_bb") + + self.builder.cbranch(cond, loop_bb, after_bb) + phi.add_incoming(next_var, loop_end_bb) + + self.builder.position_at_end(loop_bb) + + return loop_end_bb, after_bb, phi + + def __exit__(self, exc_type, exc, exc_tb): + self.builder.branch(self.loop_end) + self.builder.position_at_end(self.after) -- GitLab