Linearscan's live intervals are linear-position [start, end] ranges,
which can't represent the true CFG-aware live set for vregs that
receive values via parallel-copy at every predecessor (block params,
post-phi placeholders). When a call block is lexically wedged
between a phi-vreg's def edge and its use block, the position-based
range straddles the call point but no actual control-flow path
through the vreg traverses it. The splitter then thought the vreg
crossed a call, picked a pre/post split, and assigned the post-half
a different physreg — every predecessor's parallel-copy landed in
pre_phys but every use inside the loop read post_phys.
Track each vreg's set of defining blocks while building
vreg_actual_range; if it has more than one, force real_crosses
false (no splitting). The unit test exercising splitting still
fires because its synthetic vregs have single defs.
Removes:
- ARMFORTAS_SPLIT_INTERVALS env gate (no longer needed)
- detect_partial_unroll_loop's acc_param + store guard (the
underlying regalloc bug it worked around is now fixed)
Verified at all opt levels:
- realworld_seed_overwrite.f90: 4 19 23 (was infinite loop at -O2+)
- realworld_affine_shift.f90: 14 16 (was 14 7 at -O2+)
Trunk (PR #22 from compiler-edges) added 78 commits since the common
ancestor, with substantive edits to src/ir/lower.rs (4525 changed lines
across 134 functions) and src/sema/resolve.rs (~700 lines). Refactor-afs
had split lower.rs into 12 sub-modules under src/ir/lower/ and resolve.rs
into 4 under src/sema/resolve/, so git's rename detection redirected
trunk's edits to lower/core.rs and resolve/core.rs but they need
manual routing into the post-extraction sub-modules.
Resolved cleanly in this commit:
- All auto-merged files (codegen/*, parser/*, runtime/*, sema/{amod,
symtab,type_layout,types}.rs, tests/cli_driver.rs, .gitignore, afs-ld
submodule)
- HiddenResultAbi::ComplexBuffer variant ported into lower/ctx.rs
- complex_result_kind helper ported into lower/core.rs
- ComplexBuffer match arms in lower/core.rs and lower/unit.rs
- UseAssociation gained from_bare_use field; all sites in
resolve/{core,use_resolution}.rs now pass it correctly per trunk's
bare-USE vs USE-ONLY semantics
Deferred to follow-up commits (trunk's lower.rs and resolve.rs edits
that need routing into sub-modules):
- 22 cli_driver tests fail post-merge — each fails because the trunk
feature it exercises lives in a function trunk edited in lower.rs
but whose sub-module copy is unchanged. Per-feature ports follow.
Lib tests: 1144/1144 pass. cli_driver: 553/575 pass.