* .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>
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:
- What's new in .NET 10 documentation
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.