Section 02: ARC IR InvokeIndirect & Short-Circuit
Status: Complete
Goal: Indirect closure calls inside catch(expr:) generate InvokeIndirect terminators (with unwind blocks) instead of ApplyIndirect instructions (no unwind). Logical &&/|| use branch-based lowering instead of eager evaluation.
Implementation summary: All items in this section have been implemented.
02.1 Add InvokeIndirect to ArcTerminator — COMPLETE
File(s): compiler/ori_arc/src/ir/mod.rs
Verified: InvokeIndirect variant exists at ir/mod.rs:276 with dst, ty, closure, args, normal, unwind. used_vars() includes closure + args (line 311-317). uses_var() checks both. substitute_var() handles both.
-
InvokeIndirectvariant added -
used_vars(),uses_var(),substitute_var()updated
02.2 Update all ArcTerminator match sites — COMPLETE
Verified across all crates:
-
ori_arc/src/aims/emit_rc/trampoline.rs— handlesInvokeIndirect -
ori_arc/src/aims/interprocedural/mod.rs— handlesInvokeIndirect -
ori_arc/src/aims/transfer/mod.rs— handlesInvokeIndirect -
ori_arc/src/block_merge/compact.rs— handlesInvokeIndirect -
ori_arc/src/borrow/update.rs— handlesInvokeIndirect -
ori_arc/src/graph/mod.rs— returns[normal, unwind]for successor blocks; collectsdstatnormal -
ori_repr/src/range/fixpoint/terminator.rs— handlesInvokeIndirect -
ori_llvm/src/codegen/arc_emitter/field_scan/mod.rs— marksclosure+argsas used/needs-load -
ori_llvm/src/codegen/arc_emitter/rpo.rs— DFS traversal handlesInvokeIndirect -
ori_llvm/src/codegen/arc_emitter/dead_unwind.rs— registers unwind block -
ori_llvm/src/codegen/function_compiler/nounwind/analyze.rs— returnsfalse(may unwind) -
oric/src/arc_dot/mod.rs— edge emission handlesInvokeIndirect -
oric/src/arc_dump/instr.rs— display handlesInvokeIndirect
02.3 Builder and lowering support ��� COMPLETE
File(s): compiler/ori_arc/src/lower/builder/mod.rs, compiler/ori_arc/src/lower/builder/emission.rs, compiler/ori_arc/src/lower/calls/mod.rs
Verified:
-
terminate_invoke_indirect()exists in builder/mod.rs:322 -
emit_invoke_indirect()exists in builder/emission.rs:205, usescatch_unwind_targetfor unwind routing -
lower/calls/mod.rs:121checkscatch_unwind_target.is_some()→ usesemit_invoke_indirect -
lower/calls/mod.rs:186same check for catch-all indirect call path -
terminate_invoke_indirectin builder -
emit_invoke_indirectin emission -
Indirect calls inside
catch(expr:)useInvokeIndirect
02.4 Short-circuit &&/|| lowering �� COMPLETE
File(s): compiler/ori_arc/src/lower/expr/mod.rs
Verified:
-
Short-circuit intercept at line 419-423 for
BinaryOp::AndandBinaryOp::Or -
lower_short_circuit_andat line 522: evaluates LHS → branch → RHS or false -
lower_short_circuit_orat line 573: evaluates LHS → branch → true or RHS -
Short-circuit intercept before eager path
-
lower_short_circuit_andimplemented -
lower_short_circuit_orimplemented
02.R Third Party Review Findings
- None (section complete before plan creation).
02.N Completion Checklist
-
InvokeIndirectvariant inArcTerminatorwith all match sites updated -
terminate_invoke_indirectandemit_invoke_indirectin builder - Indirect calls inside
catch(expr:)useInvokeIndirect -
&&/||use branch-based short-circuit lowering
Exit Criteria: Met. All match sites handle InvokeIndirect. Short-circuit lowering is implemented.