1
0
mirror of synced 2025-12-19 18:06:02 -05:00
Files
James Montemagno 2981881154 .NET 10 Preview 6 (#9830)
* .NET 10 Preview 6

* .NET 10 P6 - FSharp (#9946)

* Update fsharp preview6 release notes with manual changes.

* udpate for release

* .NET 10 P6 - CSharp (#9943)

* Add period to last sentence in csharp preview6 release notes.

* update C#

* .NET 10 P6 - EFCore (#9945)

* Add period to last sentence in efcore preview6 release notes.

* EF 10.0-preview.6 release notes

* Added small improvements

---------

Co-authored-by: Shay Rojansky <roji@roji.org>

* .NET 10 P6 - WPF (#9952)

* Add period to last sentence in aspnetcore preview6 release notes.

* Add period to last sentence in containers preview6 release notes.

* Add period to last sentence in csharp preview6 release notes.

* Add period to last sentence in dotnetmaui preview6 release notes.

* Add period to last sentence in efcore preview6 release notes.

* Add period to last sentence in libraries preview6 release notes.

* Add period to last sentence in runtime preview6 release notes.

* Add period to last sentence in sdk preview6 release notes.

* Add period to last sentence in visualbasic preview6 release notes.

* Add period to last sentence in winforms preview6 release notes.

* Add period to last sentence in wpf preview6 release notes.

* Revert all changes except wpf.md in dotnet10-p6-wpf branch.

* Add WPF info

* update feature list

---------

Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com>

* .NET 10 P6 - WinForms (#9951)

* Add period to last sentence in winforms preview6 release notes.

* Update WinForms for Preview 6

* Apply suggestions from code review

Co-authored-by: Klaus Löffelmann <9663150+KlausLoeffelmann@users.noreply.github.com>

---------

Co-authored-by: Merrie McGaw <mmcgaw@microsoft.com>
Co-authored-by: Klaus Löffelmann <9663150+KlausLoeffelmann@users.noreply.github.com>

* .NET 10 P6 - SDK (#9949)

* Add period to last sentence in sdk preview6 release notes.

* CLI notes around tools and such

* Add release notes for preview.6 run-file changes

---------

Co-authored-by: Chet Husk <baronfel@users.noreply.github.com>
Co-authored-by: Damian Edwards <damian@damianedwards.com>

* .NET 10 P6 - Containers (#9942)

* Add period to last sentence in containers preview6 release notes.

* update to none udpates.

* .NET 10 P6 - Runtime (#9948)

* Add period to last sentence in runtime preview6 release notes.

* Add JIT notes

---------

Co-authored-by: Aman Khalid (from Dev Box) <amankhalid@microsoft.com>

* .NET 10 P6 - .NET MAUI (#9944)

* Add period to last sentence in dotnetmaui preview6 release notes.

* Update dotnetmaui.md

* adding more details for android

* minor updates to iOS note

* Update release-notes/10.0/preview/preview6/dotnetmaui.md

Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>

* Update release-notes/10.0/preview/preview6/dotnetmaui.md

Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>

* Update release-notes/10.0/preview/preview6/dotnetmaui.md

Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>

* added contributors from android and iOS repos

---------

Co-authored-by: David Ortinau <david.ortinau@microsoft.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>

* .NET 10 P6 - Libraries (#9947)

* Add period to last sentence in libraries preview6 release notes.

* Update libraries.md

* Update libraries.md

Co-authored-by: Weihan Li <weihanli@outlook.com>

* Update libraries.md

fix link

---------

Co-authored-by: Pranav Senthilnathan <pranas@microsoft.com>
Co-authored-by: Weihan Li <weihanli@outlook.com>

* Add ASP.NET Core release notes for .NET 10 Preview 6 (#9965)

* update linter

* revert

* Fix link to installers and binaries for .NET 10 Preview 6 in README.md

* update permissions?

* Update release notes for .NET 10 Preview 6: enhance dark mode support in Windows Forms, improve JSON property handling in libraries, and refine CLI tool execution options in SDK.

* Enhance release notes for .NET 10 Preview 6: update dark mode support in Windows Forms, improve formatting in EF Core and SDK documentation, and clean up whitespace in various markdown files.

* cleanup

* add p6

* lint

* try this

* Update releases.md

* Update README.md

* Update release-notes/README.md

* Update releases-index.json

* Update install-linux.md

* Update install-macos.md

* Update install-windows.md

* Update releases.json

* Update 10.0.0-preview.6.md

* Added release.json

* Mix lint errors in release.json for preview 6 release

* Fix jsonlint errors

* Fix jsonlint errors

---------

Co-authored-by: Shay Rojansky <roji@roji.org>
Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com>
Co-authored-by: Merrie McGaw <mmcgaw@microsoft.com>
Co-authored-by: Klaus Löffelmann <9663150+KlausLoeffelmann@users.noreply.github.com>
Co-authored-by: Chet Husk <baronfel@users.noreply.github.com>
Co-authored-by: Damian Edwards <damian@damianedwards.com>
Co-authored-by: Aman Khalid (from Dev Box) <amankhalid@microsoft.com>
Co-authored-by: David Ortinau <david.ortinau@microsoft.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Co-authored-by: Pranav Senthilnathan <pranas@microsoft.com>
Co-authored-by: Weihan Li <weihanli@outlook.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: victorisr <victorisr@microsoft.com>
Co-authored-by: Jon Galloway <jongalloway@gmail.com>
2025-07-15 10:08:38 -07:00

4.0 KiB

.NET Runtime in .NET 10 Preview 6 - Release Notes

Here's a summary of what's new in the .NET Runtime in this preview release:

.NET Runtime updates in .NET 10:

Improved Code Generation for Struct Arguments

.NET's JIT compiler is capable of an optimization called physical promotion, where the members of a struct are placed in registers rather than on the stack, eliminating memory accesses. This optimization is particularly useful when passing a struct to a method, and the calling convention requires the struct members to be passed in registers. Consider the following example:

struct Point
{
    public long X;
    public long Y;

    public Point(long x, long y)
    {
        X = x;
        Y = y;
    }
}

[MethodImpl(MethodImplOptions.NoInlining)]
private static void Consume(Point p)
{
    Console.WriteLine(p.X + p.Y);
}

private static void Main()
{
    Point p = new Point(10, 20);
    Consume(p);
}

On x64, we pass the members of Point to Consume in separate registers, and since physical promotion kicked in for the local p, we don't allocate anything on the stack first:

Program:Main() (FullOpts):
       mov      edi, 10
       mov      esi, 20
       tail.jmp [Program:Consume(Program+Point)]

Now, suppose we changed the members of Point to be ints instead of longs. Because ints are four bytes wide, and registers are eight bytes wide on x64, the calling convention requires us to pass the members of Point in one register. However, the JIT compiler's internal representation of struct members previously wasn't flexible enough to represent values that share a register. Thus, the JIT compiler would first store the values to memory, and then load the eight-byte chunk into a register, like so:

Program:Main() (FullOpts):
       push     rax
       mov      dword ptr [rsp], 10
       mov      dword ptr [rsp+0x04], 20
       mov      rdi, qword ptr [rsp]
       call     [Program:Consume(Program+Point)]
       nop
       add      rsp, 8
       ret

The need to load the struct argument from memory defeats the benefits of physical promotion, in this case. Thanks to dotnet/runtime #115977, the JIT compiler can now place the promoted members of struct arguments into shared registers. The assembly for the above example now looks like this:

Program:Main() (FullOpts):
       mov      rdi, 0x140000000A
       tail.jmp [Program:Consume(Program+Point)]

Improved Loop Inversion

The JIT compiler can hoist the condition of a while loop, and transform the loop body into a do-while loop, producing the final shape:

if (loopCondition)
{
    do
    {
        // loop body
    } while (loopCondition);
}

This transformation is called loop inversion. By moving the condition to the bottom of the loop, the JIT removes the need to branch to the top of the loop to test the condition, improving code layout. Numerous optimizations (like loop cloning, loop unrolling, and induction variable optimizations) also depend on loop inversion to produce this shape to aid analysis.

.NET 9 enhanced code quality for loops by switching over numerous optimizations to use a graph-based loop recognition implementation, bringing improved precision over the lexical analysis it replaced. Preview 6 switches over loop inversion, the only loop optimization still using the lexical implementation, to the graph-based implementation. Thanks to dotnet/runtime #116017, loop inversion now considers all natural loops -- loops with a single entry point -- and ignores the false positives previously considered by the lexical implementation. This translates into higher optimization potential for .NET programs with for and while statements.