Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Consolidate importer spilling code V3 (dotnet#73233)
* Consolidate importer spilling code V2 (dotnet#72744) * Consolidate importer spilling code (dotnet#72291) * Add tests * Fix losing GLOB_REF on the LHS The comment states we don't need it, which is incorrect. Diffs are improvements because we block forward substitution of calls into "ASG(BLK(ADDR(LCL_VAR<field>, ...)))", which allows morph to leave the "can be replaced with its field" local alone. * Prospective fix Spill "glob refs" on stores to "aliased" locals. * Delete now-not-necessary code * Fix up asserts * Clean out '(unsigned)CHECK_SPILL_ALL/NONE' casts * Don't manually spill for 'st[s]fld' * Revert 'Clean out '(unsigned)CHECK_SPILL_ALL/NONE' casts' * Fix assignments done via return buffers The mistake in logic was that the only trees which could modify unaliased locals are assignments, which is not true, calls can do that as well. One day we will move the return buffer handling out of importer, but until then, special handling is required. An alternative fix would have been to bring back the explicit "impSpillLclRefs" to "stloc/starg" code, but that would contradict the overall goal of consolidating the spilling logic. * Account for "implicit" GLOB_REFs Indirections off of "aliased" locals must be treated as global references even as they are not marked with GLOB_REF. Ideally, the importer would be designed such that this special-casing would not be necessary (i. e. all indirections are initially GLOB_REF and then morph "cleans" the flags once address-exposure info has been determined), but we're not there yet, and it is questionable whether we'll get to that point in any sort of near future.
- Loading branch information