""" Branch instruction lowering Conditional branch based on condition value """ import llvmlite.ir as ir from typing import Dict def lower_branch( builder: ir.IRBuilder, cond_vid: int, then_bid: int, else_bid: int, vmap: Dict[int, ir.Value], bb_map: Dict[int, ir.Block], resolver=None, preds=None, block_end_values=None ) -> None: """ Lower MIR Branch instruction Args: builder: Current LLVM IR builder cond_vid: Condition value ID then_bid: Then block ID else_bid: Else block ID vmap: Value map bb_map: Block map """ # Get condition value if resolver is not None and preds is not None and block_end_values is not None: cond = resolver.resolve_i64(cond_vid, builder.block, preds, block_end_values, vmap, bb_map) else: cond = vmap.get(cond_vid) if not cond: # Default to false if missing cond = ir.Constant(ir.IntType(1), 0) # Convert to i1 if needed if hasattr(cond, 'type'): if cond.type == ir.IntType(64): # i64 to i1: compare != 0 zero = ir.Constant(ir.IntType(64), 0) cond = builder.icmp_unsigned('!=', cond, zero, name="cond_i1") elif cond.type == ir.IntType(8).as_pointer(): # Pointer to i1: compare != null null = ir.Constant(cond.type, None) cond = builder.icmp_unsigned('!=', cond, null, name="cond_p1") # Get target blocks then_bb = bb_map.get(then_bid) else_bb = bb_map.get(else_bid) if then_bb and else_bb: builder.cbranch(cond, then_bb, else_bb)