tiny.choir.Block
Defined in tiny.choir.
API (45)
Actions
Public operations.
OperationIterator.nextOperationList.initOperationList.isEmptyaddArgumentaddOperationdeinitdetachOperationdropAllDefinedValueUsesdropAllReferencesemptyformatgetArgumentgetArgumentLocationgetNumArgumentsgetNumPredecessorsgetOperationsgetParentOperationgetParentRegiongetPredecessorgetPredecessorsgetTerminatorhasNoDefinedValueUseshasNoPredecessorshasPredecessorinitinsertBeforeoperationPrecedesremoveOperationsealOperationOrdersetArgumentLocationwalkOperations
Types and contracts
Public types and contracts.
Fields and members
Public fields and members.
Source
Source: lib/choir/src/core/block.zig:7
zig
pub const Block = struct { allocator: std.mem.Allocator, /// Values keep their addresses until the block is deinitialized. arguments: std.ArrayList(*Value), argument_locations: std.ArrayList(Location), operations: OperationList, parent: ?*anyopaque, prev: ?*Block, next: ?*Block, id: u32, predecessors: std.ArrayList(*Block), op_order_valid: bool, pub const order_stride: u32 = 8; pub const order_query_scan_limit: u8 = 8; pub const OperationList = struct { head: ?*anyopaque, tail: ?*anyopaque, pub fn init() OperationList { return .{ .head = null, .tail = null, }; } pub fn isEmpty(self: OperationList) bool { return self.head == null; } }; pub const OperationIterator = struct { current: ?*anyopaque, pub fn next(self: *OperationIterator) ?*@import("operation/root.zig").Operation { const op_any = self.current orelse return null; const op: *@import("operation/root.zig").Operation = @ptrCast(@alignCast(op_any)); self.current = op.next_op; return op; } }; pub fn init(allocator: std.mem.Allocator) Block { return .{ .allocator = allocator, .arguments = .empty, .argument_locations = .empty, .operations = OperationList.init(), .parent = null, .prev = null, .next = null, .id = 0, .predecessors = .empty, .op_order_valid = true, }; } fn recomputeOpOrder(self: *Block) void { var next_order: u32 = 0; var current = self.operations.head; while (current) |node| { const op: *@import("operation/root.zig").Operation = @ptrCast(@alignCast(node)); op.order = next_order; next_order +|= order_stride; current = op.next_op; } self.op_order_valid = true; } pub fn sealOperationOrder(self: *Block) bool { if (self.op_order_valid) return false; self.recomputeOpOrder(); return true; } pub fn operationPrecedes( self: *Block, first: *const @import("operation/root.zig").Operation, second: *const @import("operation/root.zig").Operation, ) bool { std.debug.assert(first.parent_block == self); std.debug.assert(second.parent_block == self); if (self.op_order_valid) return first.order < second.order; var next = first.next_op; var previous = first.prev_op; var scanned: u8 = 0; while (scanned < order_query_scan_limit) : (scanned += 1) { if (next) |op| { if (op == second) return true; next = op.next_op; } if (previous) |op| { if (op == second) return false; previous = op.prev_op; } } _ = self.sealOperationOrder(); return first.order < second.order; } pub fn deinit(self: *Block) void { for (self.arguments.items) |argument| self.allocator.destroy(argument); self.arguments.deinit(self.allocator); self.argument_locations.deinit(self.allocator); self.predecessors.deinit(self.allocator); } pub fn addArgument(self: *Block, arg_type: Type, loc: Location) !*Value { const arg_num: u32 = @intCast(self.arguments.items.len); const value = try self.allocator.create(Value); errdefer self.allocator.destroy(value); value.* = .{ .kind = .{ .block_argument = .{ .owner = self, .arg_number = arg_num, } }, .type = arg_type, .id = 0, }; try self.argument_locations.append(self.allocator, loc); errdefer _ = self.argument_locations.pop(); try self.arguments.append(self.allocator, value); return self.arguments.items[self.arguments.items.len - 1]; } pub fn getArgumentLocation(self: *const Block, index: usize) ?Location { if (index >= self.argument_locations.items.len) return null; return self.argument_locations.items[index]; } pub fn setArgumentLocation(self: *Block, index: usize, loc: Location) void { std.debug.assert(index < self.argument_locations.items.len); self.argument_locations.items[index] = loc; } pub fn getNumArguments(self: Block) usize { return self.arguments.items.len; } pub fn getArgument(self: *Block, index: usize) ?*Value { if (index >= self.arguments.items.len) return null; return self.arguments.items[index]; } pub fn empty(self: Block) bool { return self.operations.isEmpty(); } pub fn dropAllReferences(self: *Block) void { var ops = self.getOperations(); while (ops.next()) |op| { op.dropAllReferences(); } } pub fn hasNoDefinedValueUses(self: *Block) bool { for (self.arguments.items) |argument| { if (!argument.hasNoUses()) return false; } var ops = self.getOperations(); while (ops.next()) |op| { if (!op.hasNoDefinedValueUses()) return false; } return true; } pub fn dropAllDefinedValueUses(self: *Block) void { for (self.arguments.items) |argument| { argument.dropAllUses(); } var ops = self.getOperations(); while (ops.next()) |op| { op.dropAllDefinedValueUses(); } } pub fn getOperations(self: *Block) OperationIterator { return .{ .current = self.operations.head }; } pub fn walkOperations( self: *Block, options: @import("operation/root.zig").Operation.WalkOptions, context: anytype, callback: anytype, ) anyerror!@import("operation/root.zig").Operation.WalkResult { var ops = self.getOperations(); while (ops.next()) |op| { const result = try op.walk(options, context, callback); if (result.wasInterrupted()) return .interrupt; } return .advance; } pub fn getParentRegion(self: *const Block) ?*@import("region.zig").Region { const parent = self.parent orelse return null; return @ptrCast(@alignCast(parent)); } pub fn getParentOperation(self: *const Block) ?*@import("operation/root.zig").Operation { const region = self.getParentRegion() orelse return null; return region.getParentOperation(); } pub fn hasNoPredecessors(self: Block) bool { return self.predecessors.items.len == 0; } pub fn getNumPredecessors(self: Block) usize { return self.predecessors.items.len; } pub fn getPredecessors(self: *const Block) []const *Block { return self.predecessors.items; } pub fn getPredecessor(self: Block, index: usize) ?*Block { if (index >= self.predecessors.items.len) return null; return self.predecessors.items[index]; } pub fn hasPredecessor(self: Block, pred: *Block) bool { for (self.predecessors.items) |existing| { if (existing == pred) return true; } return false; } pub fn getTerminator(self: Block) ?*anyopaque { return self.operations.tail; } pub fn addOperation(self: *Block, op: anytype) !void { const Operation = @import("operation/root.zig").Operation; const op_ptr: *Operation = @ptrCast(@alignCast(op)); if (op_ptr.parent_block != null or op_ptr.prev_op != null or op_ptr.next_op != null) { return error.OperationAlreadyInserted; } try cfg.attach(self, op_ptr); op_ptr.parent_block = self; if (self.operations.tail) |tail| { const tail_op: *Operation = @ptrCast(@alignCast(tail)); tail_op.next_op = op_ptr; op_ptr.prev_op = tail_op; if (self.op_order_valid) { if (tail_op.order <= std.math.maxInt(u32) - order_stride) { op_ptr.order = tail_op.order + order_stride; } else { self.op_order_valid = false; } } } else { self.operations.head = op_ptr; if (self.op_order_valid) op_ptr.order = 0; } self.operations.tail = op_ptr; } pub fn insertBefore(self: *Block, op: anytype, before: anytype) !void { const Operation = @import("operation/root.zig").Operation; const before_op: *Operation = @ptrCast(@alignCast(before)); const op_ptr: *Operation = @ptrCast(@alignCast(op)); if (before_op.parent_block != self) return error.OperationInsertBeforeDetached; if (op_ptr.parent_block != null or op_ptr.prev_op != null or op_ptr.next_op != null) { return error.OperationAlreadyInserted; } try cfg.attach(self, op_ptr); op_ptr.parent_block = self; const prev = before_op.prev_op; op_ptr.prev_op = prev; op_ptr.next_op = before_op; before_op.prev_op = op_ptr; if (prev) |prev_op| { prev_op.next_op = op_ptr; } else { self.operations.head = op_ptr; } if (self.op_order_valid) { const low: u64 = if (prev) |prev_op| @as(u64, prev_op.order) + 1 else 0; const high: u64 = before_op.order; if (high > low) { op_ptr.order = @intCast(low + (high - low) / 2); } else { self.op_order_valid = false; } } } fn unlinkOperation(self: *Block, op_ptr: *@import("operation/root.zig").Operation) bool { if (op_ptr.parent_block == null) return false; std.debug.assert(op_ptr.parent_block == self); cfg.detach(self, op_ptr); const prev = op_ptr.prev_op; const next = op_ptr.next_op; if (prev) |prev_op| { prev_op.next_op = next; } else { self.operations.head = next; } if (next) |next_op| { next_op.prev_op = prev; } else { self.operations.tail = prev; } op_ptr.prev_op = null; op_ptr.next_op = null; op_ptr.parent_block = null; return true; } pub fn detachOperation(self: *Block, op: anytype) void { const Operation = @import("operation/root.zig").Operation; const op_ptr: *Operation = @ptrCast(@alignCast(op)); _ = self.unlinkOperation(op_ptr); } pub fn removeOperation(self: *Block, op: anytype) void { const Operation = @import("operation/root.zig").Operation; const op_ptr: *Operation = @ptrCast(@alignCast(op)); if (self.unlinkOperation(op_ptr)) { op_ptr.dropAllReferences(); } } pub fn format(self: Block, writer: *std.Io.Writer) std.Io.Writer.Error!void { try writer.print("^bb{d}", .{self.id}); if (self.arguments.items.len > 0) { try writer.writeAll("("); for (self.arguments.items, 0..) |arg, i| { if (i > 0) try writer.writeAll(", "); try writer.print("{f}: {f}", .{ arg, arg.type }); } try writer.writeAll(")"); } }};Source: lib/choir/src/root.zig:44
zig
pub const Block = ir.Block;Also reachable as
backends.wasm.emission.module_encoding.common.ir.Block, ir.Block.
Complete caller list for Block.addOperation
31 direct callers.
lib.choir.src.core.block.test_block_arguments_keep_identity_across_nine_appends[function] — test source atlib/choir/src/core/block.zig:781in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_detach_operation_preserves_operand_uses[function] — test source atlib/choir/src/core/block.zig:682in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_insert_and_remove_operations[function] — test source atlib/choir/src/core/block.zig:413in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_insertion_rejects_already_parented_operations[function] — test source atlib/choir/src/core/block.zig:576in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_op_order_stays_coherent_through_append,_insert,_and_move[function] — test source atlib/choir/src/core/block.zig:496in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_order_queries_bound_local_scans_before_sealing[function] — test source atlib/choir/src/core/block.zig:548in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_deduplication[function] — test source atlib/choir/src/core/block.zig:721in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_removal[function] — test source atlib/choir/src/core/block.zig:744in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_tracking[function] — test source atlib/choir/src/core/block.zig:371in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_operation_movement_preserves_operands_and_repairs_successor_predecessors[function] — test source atlib/choir/src/core/block.zig:612in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_removing_one_of_two_block_edges_preserves_the_predecessor[function] — test source atlib/choir/src/core/block.zig:463in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.test.test_moveToEnd_preserves_placement_and_CFG_on_allocation_failure[function] — test source atlib/choir/src/core/test.zig:1985in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_dropAllReferences_clears_successor_predecessors[function] — test source atlib/choir/src/core/test.zig:588in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_successors_update_block_predecessors[function] — test source atlib/choir/src/core/test.zig:1823in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_accepts_an_overlapping_successor_slice[function] — test source atlib/choir/src/core/test.zig:1883in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_another_operation_edge[function] — test source atlib/choir/src/core/test.zig:1952in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_the_old_relation_on_allocation_failure[function] — test source atlib/choir/src/core/test.zig:1849in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_stabilizes_a_borrowed_predecessor_slice[function] — test source atlib/choir/src/core/test.zig:1911in nearest public ownerlib.choir.src.core.testlib.choir.src.core.verify.test_verify_MissingTerminator_error_when_require_terminators_enabled[function] — test source atlib/choir/src/core/verify.zig:1543in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_accepts_predecessors_justified_by_non-tail_operations[function] — test source atlib/choir/src/core/verify.zig:1292in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_accepts_same-block_use_after_definition[function] — test source atlib/choir/src/core/verify.zig:843in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_block_with_operations[function] — test source atlib/choir/src/core/verify.zig:767in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_bounds_corrupt_predecessor_operation_traversal[function] — test source atlib/choir/src/core/verify.zig:1262in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_can_skip_local_dominance_while_preserving_use-def_checks[function] — test source atlib/choir/src/core/verify.zig:898in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_detects_parent_block_mismatch[function] — test source atlib/choir/src/core/verify.zig:1396in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_detects_same-block_use_before_definition[function] — test source atlib/choir/src/core/verify.zig:870in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_operation_list_forward/backward_consistency[function] — test source atlib/choir/src/core/verify.zig:1510in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_rejects_duplicate_predecessor_entries[function] — test source atlib/choir/src/core/verify.zig:1204in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_rejects_predecessor_outside_the_target_region[function] — test source atlib/choir/src/core/verify.zig:1231in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_rejects_reverse-only_predecessor_entries[function] — test source atlib/choir/src/core/verify.zig:1178in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_successor/predecessor_consistency[function] — test source atlib/choir/src/core/verify.zig:1152in nearest public ownertiny.choir.ir.verify
Complete caller list for Block.deinit
11 direct callers.
lib.choir.src.core.block.test_block_arguments_keep_identity_across_nine_appends[function] — test source atlib/choir/src/core/block.zig:781in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_detach_operation_preserves_operand_uses[function] — test source atlib/choir/src/core/block.zig:682in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_insert_and_remove_operations[function] — test source atlib/choir/src/core/block.zig:413in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_insertion_rejects_already_parented_operations[function] — test source atlib/choir/src/core/block.zig:576in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_op_order_stays_coherent_through_append,_insert,_and_move[function] — test source atlib/choir/src/core/block.zig:496in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_order_queries_bound_local_scans_before_sealing[function] — test source atlib/choir/src/core/block.zig:548in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_deduplication[function] — test source atlib/choir/src/core/block.zig:721in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_removal[function] — test source atlib/choir/src/core/block.zig:744in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_tracking[function] — test source atlib/choir/src/core/block.zig:371in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_operation_movement_preserves_operands_and_repairs_successor_predecessors[function] — test source atlib/choir/src/core/block.zig:612in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_removing_one_of_two_block_edges_preserves_the_predecessor[function] — test source atlib/choir/src/core/block.zig:463in nearest public ownerlib.choir.src.core.block
Complete caller list for Block.hasNoPredecessors
8 direct callers.
lib.choir.src.core.block.test_block_predecessor_removal[function] — test source atlib/choir/src/core/block.zig:744in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_tracking[function] — test source atlib/choir/src/core/block.zig:371in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_removing_one_of_two_block_edges_preserves_the_predecessor[function] — test source atlib/choir/src/core/block.zig:463in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.test.test_setSuccessors_accepts_an_overlapping_successor_slice[function] — test source atlib/choir/src/core/test.zig:1883in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_another_operation_edge[function] — test source atlib/choir/src/core/test.zig:1952in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_the_old_relation_on_allocation_failure[function] — test source atlib/choir/src/core/test.zig:1849in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_stabilizes_a_borrowed_predecessor_slice[function] — test source atlib/choir/src/core/test.zig:1911in nearest public ownerlib.choir.src.core.testlib.choir.src.core.verify.test_verify_rejects_duplicate_predecessor_entries[function] — test source atlib/choir/src/core/verify.zig:1204in nearest public ownertiny.choir.ir.verify
Complete caller list for Block.hasPredecessor
12 direct callers.
lib.choir.src.core.block.test_block_insert_and_remove_operations[function] — test source atlib/choir/src/core/block.zig:413in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_removal[function] — test source atlib/choir/src/core/block.zig:744in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_tracking[function] — test source atlib/choir/src/core/block.zig:371in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_operation_movement_preserves_operands_and_repairs_successor_predecessors[function] — test source atlib/choir/src/core/block.zig:612in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_removing_one_of_two_block_edges_preserves_the_predecessor[function] — test source atlib/choir/src/core/block.zig:463in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.test.test_moveToEnd_preserves_placement_and_CFG_on_allocation_failure[function] — test source atlib/choir/src/core/test.zig:1985in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_dropAllReferences_clears_successor_predecessors[function] — test source atlib/choir/src/core/test.zig:588in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_successors_update_block_predecessors[function] — test source atlib/choir/src/core/test.zig:1823in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_accepts_an_overlapping_successor_slice[function] — test source atlib/choir/src/core/test.zig:1883in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_another_operation_edge[function] — test source atlib/choir/src/core/test.zig:1952in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_the_old_relation_on_allocation_failure[function] — test source atlib/choir/src/core/test.zig:1849in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_stabilizes_a_borrowed_predecessor_slice[function] — test source atlib/choir/src/core/test.zig:1911in nearest public ownerlib.choir.src.core.test
Complete caller list for Block.init
40 direct callers.
lib.choir.src.core.block.test_block_arguments_keep_identity_across_nine_appends[function] — test source atlib/choir/src/core/block.zig:781in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_detach_operation_preserves_operand_uses[function] — test source atlib/choir/src/core/block.zig:682in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_insert_and_remove_operations[function] — test source atlib/choir/src/core/block.zig:413in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_insertion_rejects_already_parented_operations[function] — test source atlib/choir/src/core/block.zig:576in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_op_order_stays_coherent_through_append,_insert,_and_move[function] — test source atlib/choir/src/core/block.zig:496in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_order_queries_bound_local_scans_before_sealing[function] — test source atlib/choir/src/core/block.zig:548in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_deduplication[function] — test source atlib/choir/src/core/block.zig:721in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_removal[function] — test source atlib/choir/src/core/block.zig:744in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_tracking[function] — test source atlib/choir/src/core/block.zig:371in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_operation_movement_preserves_operands_and_repairs_successor_predecessors[function] — test source atlib/choir/src/core/block.zig:612in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_removing_one_of_two_block_edges_preserves_the_predecessor[function] — test source atlib/choir/src/core/block.zig:463in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.builder.test_OperationBuilder_block_listener_failure_restores_its_insertion_point[function] — test source atlib/choir/src/core/builder.zig:362in nearest public ownerlib.choir.src.core.builderlib.choir.src.core.builder.test_OperationBuilder_insertion_guard_restores_saved_point[function] — test source atlib/choir/src/core/builder.zig:255in nearest public ownerlib.choir.src.core.builderlib.choir.src.core.builder.test_OperationBuilder_listener_failure_rolls_insertion_back_transactionally[function] — test source atlib/choir/src/core/builder.zig:329in nearest public ownerlib.choir.src.core.builderlib.choir.src.core.builder.test_OperationBuilder_save_restore_and_after_insertion_point[function] — test source atlib/choir/src/core/builder.zig:456in nearest public ownerlib.choir.src.core.builderlib.choir.src.core.mapping.test_mapping_stores_value_block_and_operation_remaps_with_identity_fallback[function] — test source atlib/choir/src/core/mapping.zig:62in nearest public ownerlib.choir.src.core.mappingtiny.choir.Region.addBlock[method] atlib/choir/src/core/region.zig:173lib.choir.src.core.test.test_moveToEnd_preserves_placement_and_CFG_on_allocation_failure[function] — test source atlib/choir/src/core/test.zig:1985in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_cloneWithoutRegions_copies_header_and_leaves_regions_empty[function] — test source atlib/choir/src/core/test.zig:1527in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_creation_consumes_only_Context-reserved_storage[function] — test source atlib/choir/src/core/test.zig:755in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_dropAllReferences_clears_successor_predecessors[function] — test source atlib/choir/src/core/test.zig:588in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_operation_successors_update_block_predecessors[function] — test source atlib/choir/src/core/test.zig:1823in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_region_eraseBlock_removes_predecessor-free_blocks_in_reverse_operation_order[function] — test source atlib/choir/src/core/test.zig:649in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_accepts_an_overlapping_successor_slice[function] — test source atlib/choir/src/core/test.zig:1883in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_another_operation_edge[function] — test source atlib/choir/src/core/test.zig:1952in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_preserves_the_old_relation_on_allocation_failure[function] — test source atlib/choir/src/core/test.zig:1849in nearest public ownerlib.choir.src.core.testlib.choir.src.core.test.test_setSuccessors_stabilizes_a_borrowed_predecessor_slice[function] — test source atlib/choir/src/core/test.zig:1911in nearest public ownerlib.choir.src.core.testlib.choir.src.core.verify.test_verify_MissingTerminator_error_when_require_terminators_enabled[function] — test source atlib/choir/src/core/verify.zig:1543in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_accepts_predecessors_justified_by_non-tail_operations[function] — test source atlib/choir/src/core/verify.zig:1292in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_accepts_same-block_use_after_definition[function] — test source atlib/choir/src/core/verify.zig:843in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_block_with_operations[function] — test source atlib/choir/src/core/verify.zig:767in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_bounds_corrupt_predecessor_operation_traversal[function] — test source atlib/choir/src/core/verify.zig:1262in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_can_skip_local_dominance_while_preserving_use-def_checks[function] — test source atlib/choir/src/core/verify.zig:898in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_detects_parent_block_mismatch[function] — test source atlib/choir/src/core/verify.zig:1396in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_detects_same-block_use_before_definition[function] — test source atlib/choir/src/core/verify.zig:870in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_operation_list_forward/backward_consistency[function] — test source atlib/choir/src/core/verify.zig:1510in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_rejects_duplicate_predecessor_entries[function] — test source atlib/choir/src/core/verify.zig:1204in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_rejects_predecessor_outside_the_target_region[function] — test source atlib/choir/src/core/verify.zig:1231in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_rejects_reverse-only_predecessor_entries[function] — test source atlib/choir/src/core/verify.zig:1178in nearest public ownertiny.choir.ir.verifylib.choir.src.core.verify.test_verify_successor/predecessor_consistency[function] — test source atlib/choir/src/core/verify.zig:1152in nearest public ownertiny.choir.ir.verify
Complete caller list for Block.removeOperation
7 direct callers.
lib.choir.src.core.block.test_block_detach_operation_preserves_operand_uses[function] — test source atlib/choir/src/core/block.zig:682in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_insert_and_remove_operations[function] — test source atlib/choir/src/core/block.zig:413in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_op_order_stays_coherent_through_append,_insert,_and_move[function] — test source atlib/choir/src/core/block.zig:496in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_block_predecessor_removal[function] — test source atlib/choir/src/core/block.zig:744in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.block.test_removing_one_of_two_block_edges_preserves_the_predecessor[function] — test source atlib/choir/src/core/block.zig:463in nearest public ownerlib.choir.src.core.blocklib.choir.src.core.test.test_setSuccessors_preserves_another_operation_edge[function] — test source atlib/choir/src/core/test.zig:1952in nearest public ownerlib.choir.src.core.testlib.choir.src.core.verify.test_verify_rejects_duplicate_predecessor_entries[function] — test source atlib/choir/src/core/verify.zig:1204in nearest public ownertiny.choir.ir.verify
Verification connections
choir.cfg.predecessor-mirror— CFG predecessor consistency
Audit
| Definitions | 36 |
|---|---|
| Public names | 108 |
| Members | 13 |
| Version | 26.7.0 |
| Revision | daab053ee433 |