Skip to content

[WIP] Fix missing cases in GenTree::Compare function#7

Draft
Copilot wants to merge 2516 commits intomainfrom
copilot/tasteless-mosquito
Draft

[WIP] Fix missing cases in GenTree::Compare function#7
Copilot wants to merge 2516 commits intomainfrom
copilot/tasteless-mosquito

Conversation

Copy link

Copilot AI commented Mar 10, 2026

Thanks for asking me to work on this. I will get started on it and keep this PR's description up to date as I form a plan and make progress.

Original prompt **Chronological Review:** 1. User asked to review `GenTree::Compare` in the .NET runtime JIT codebase for missing cases/checks 2. I searched for and found the function in `gentree.cpp` (lines 2595-3010) 3. Spawned two background exploration agents to analyze completeness 4. Compiled a comprehensive review identifying HIGH, MEDIUM, and LOW issues 5. User asked where Compare is called in lower.cpp — I found 5 callsites + 1 in lower.h 6. User asked for a reminder of what we were doing — I summarized findings 7. User asked to fix HIGH issues on a new branch `CleanupGenTreeCompare` — done, committed 8. User asked to fix MEDIUM issues in a new commit — done, committed 9. User asked to fix remaining (LOW) issues in a new commit — done, committed 10. User asked what `/delegate` does — I checked CLI docs (not found in help) 11. User asked again via `/research` — I performed web search and fetched official docs, saved report

Intent Mapping:

  • Review GenTree::Compare for missing cases
  • Fix HIGH issues (branch CleanupGenTreeCompare)
  • Fix MEDIUM issues (separate commit)
  • Fix LOW/remaining issues (separate commit)
  • What does /delegate do in copilot-cli

Technical Inventory:

  • .NET runtime JIT compiler, C++
  • GenTree node types, GTK_LEAF/GTK_UNOP/GTK_BINOP/GTK_SPECIAL/GTK_EXOP
  • gentree.cpp, gentree.h, gtlist.h, gtstructs.h
  • Various GenTree subclasses and their fields

Code Archaeology:

  • Single file modified: src/coreclr/jit/gentree.cpp
  • Three commits on branch CleanupGenTreeCompare

Progress Assessment:

  • All review items (HIGH, MEDIUM, LOW) have been fixed and committed
  • Research on /delegate completed and saved

Recent Commands Analysis:

  • Last operations were the /research task about /delegate
  • web_search, web_fetch of GitHub blog and docs, search_issues on copilot-cli repo
  • Created research report markdown file
  • All work is complete — no pending tasks
1. Conversation Overview: - Primary Objectives: (1) "review the code for GenTree::Compare and see if it is missing any cases or checks" in the .NET runtime JIT compiler; (2) Fix all identified issues across three priority tiers (HIGH, MEDIUM, LOW) in separate commits on a new branch; (3) Research what `/delegate` does in copilot-cli. - Session Context: Started with a comprehensive code review of `GenTree::Compare` in the .NET runtime JIT, identified issues at three severity levels, then methodically fixed all of them across three commits on branch `CleanupGenTreeCompare`. Ended with a research query about the `/delegate` command. - User Intent Evolution: Review → Fix HIGH → Fix MEDIUM → Fix remaining LOW → Research question about copilot-cli.
  1. Technical Foundation:

    • .NET Runtime JIT Compiler: C++ codebase at C:\repos\runtime4\src\coreclr\jit\
    • GenTree Node System: Tree-based IR with node kinds GTK_LEAF, GTK_UNOP, GTK_BINOP, GTK_SPECIAL, and GTK_EXOP for extended fields
    • Build System: .\build.cmd clr.jit -c debug for JIT-only builds (~12-20s incremental)
    • Branch: CleanupGenTreeCompare (created from main)
  2. Codebase Status:

    • src/coreclr/jit/gentree.cpp:
      • Purpose: Core JIT file containing GenTree::Compare (structural tree equality) and gtHashValue
      • Current State: Modified with 3 commits, all building cleanly (0 warnings, 0 errors)
      • Key Changes (Commit 1 - HIGH fixes):
        • GT_CNS_INT (line ~2661): Added GetIconHandleFlag() and gtFieldSeq comparison alongside gtIconVal
        • GT_ALLOCOBJ (line ~2852): Added to unary ExOp switch with gtNewHelper and gtAllocObjClsHnd checks
        • GT_ARR_ELEM (line ~2990): Added gtArrElemSize comparison, removed TODO comment
        • GT_SELECT (line ~3019): Added to special-node switch comparing gtCond, gtOp1, gtOp2
      • Key Changes (Commit 2 - MEDIUM fixes):
        • GT_INDEX_ADDR: Extended to compare gtElemType, gtLenOffset, gtElemOffset in addition to gtElemSize
        • GT_FTN_ADDR: Added leaf case comparing gtFptrMethod
        • GT_PHI_ARG: Added leaf case comparing local number, gtPredBB, and SSA number
      • Key Changes (Commit 3 - LOW fixes):
        • GT_JCC/GT_SETCC: Added leaf cases comparing gtCondition.GetCode()
        • GT_PHYSREG: Added leaf case comparing gtSrcReg
        • GT_JCMP/GT_JTEST/GT_SELECTCC: Added binary condition code comparison
        • GT_SELECT_INCCC/GT_SELECT_INVCC/GT_SELECT_NEGCC: ARM64-specific CC comparison (under #ifdef TARGET_ARM64)
        • GT_CCMP: Condition + gtFlagsVal comparison (under #if defined(TARGET_ARM64) || defined(TARGET_AMD64))
  3. Problem Resolution:

    • Issues Encountered: GenTree::Compare had multiple gaps — missing node types in switches, incomplete field comparisons for constants and index addresses, no handling for LIR-only condition code nodes
    • Solutions Implemented: Three incremental commits adding proper comparisons for all identified gaps
    • Debugging Context: All builds passed with 0...

Created from Copilot CLI via the copilot delegate command.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

lewing and others added 30 commits February 23, 2026 11:51
…p signals (dotnet#124734)

## Summary

Improve the jit-regression-test skill with structured description, stop
signals, and consolidated tips.

### Changes

1. **Structured description** — Added USE FOR / DO NOT USE FOR routing
keywords for better skill activation. Trigger phrases include: creating
JIT regression tests, extracting repro code, "write a test for this JIT
bug", "create a regression test for issue #NNNNN". Anti-triggers:
non-JIT tests, debugging without repro, performance benchmarks.

2. **Stop signal blockquote** — Added explicit guidance on when NOT to
create a test (no reproducible code, duplicate of existing test, bug is
in libraries not JIT). This prevents the skill from being misapplied on
invalid inputs.

3. **Consolidated tips** — Reduced from 4 verbose items to 2 concise
items. Removed tips that duplicate the conventions section (NoInlining,
minimize repro).

### Validation

Multi-model eval results (5 questions testing trigger routing, stop
compliance, structural output, convention compliance, negative routing):

| Model | Before | After |
|-------|--------|-------|
| Claude Sonnet | 25/25 | 25/25 |
| Claude Haiku | 22/25 | 25/25 |

Key improvement: Haiku stop-signal compliance went from 2/5 to 5/5. The
blockquote pattern causes weaker models to correctly refuse when stop
conditions are met, rather than inferring from general knowledge.

### Context

These patterns (structured descriptions, blockquote stop signals) are
documented in the [Copilot Skills
Guidance](https://aka.ms/skills/guidance) and have been validated across
multiple skills (ci-analysis, flow-analysis, flow-tracing).
Partial implementation of block stores for wasm - handles copies and zeroing of structs via refs and pointers, but not fields or locals yet. Does not handle nonzero init values yet.

---------

Co-authored-by: SingleAccretion <62474226+SingleAccretion@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Fix comment and spelling issues, fix an incorrect jitdump arg, simplify
a Boolean expression, consolidate a pair of visitors into one.
This PR includes a few additions to the runtime-async handling loop to
facilitate inspection by a debugger - specifically, Visual Studio.

1. Timestamp tracking for continuations. In VS there is a feature that
lets you see, while F5 debugging, the relative start times and durations
of different tasks. There is only one actual Task at the root of an
await chain, but we intend to replicate the outward behavior in
runtime-async by treating Continuations as "virtual Tasks". As such, we
populate a dictionary to track the start times for each logical
invocation.

2. TPL events. In Concord in asyncv1 we are notified of Task status
changes via TPL events; specifically, we use these events to detect
which Tasks are currently active and which thread each Task runs on.
There are ways to do this without TPL in Concord; however, I believe a
change to this would be across different (non-runtime async) Tasks and
beyond the scope of this PR.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Co-authored-by: Steve Pfister <stpfiste@microsoft.com>
> [!NOTE]
> This is a codeflow update. It may contain both source code changes
from
> [the VMR](https://github.com/dotnet/dotnet)
> as well as dependency updates. Learn more
[here](https://github.com/dotnet/dotnet/tree/main/docs/Codeflow-PRs.md).

This pull request brings the following source code changes

[marker]: <> (Begin:f7901f87-9f24-40d6-9bc1-564863937237)

## From https://github.com/dotnet/dotnet
- **Subscription**:
[f7901f87-9f24-40d6-9bc1-564863937237](https://maestro.dot.net/subscriptions?search=f7901f87-9f24-40d6-9bc1-564863937237)
- **Build**:
[20260217.1](https://dev.azure.com/dnceng/internal/_build/results?buildId=2906108)
([302104](https://maestro.dot.net/channel/8298/github:dotnet:dotnet/build/302104))
- **Date Produced**: February 17, 2026 1:11:00 PM UTC
- **Commit**:
[6699c7330bf73b37beb5b19c59b57cbcb4dcafac](dotnet/dotnet@6699c73)
- **Commit Diff**:
[ba0812f...6699c73](dotnet/dotnet@ba0812f...6699c73)
- **Branch**: [main](https://github.com/dotnet/dotnet/tree/main)

**Updated Dependencies**
- From [5.5.0-2.26116.109 to 5.5.0-2.26117.101][1]
  - Microsoft.CodeAnalysis
  - Microsoft.CodeAnalysis.Analyzers
  - Microsoft.CodeAnalysis.CSharp
  - Microsoft.Net.Compilers.Toolset
- From [11.0.100-preview.2.26116.109 to 11.0.100-preview.2.26117.101][1]
  - Microsoft.CodeAnalysis.NetAnalyzers
  - Microsoft.DotNet.ApiCompat.Task
- Microsoft.NET.Workload.Emscripten.Current.Manifest-11.0.100.Transport
- From [11.0.0-beta.26116.109 to 11.0.0-beta.26117.101][1]
  - Microsoft.DotNet.Arcade.Sdk
  - Microsoft.DotNet.Build.Tasks.Archives
  - Microsoft.DotNet.Build.Tasks.Feed
  - Microsoft.DotNet.Build.Tasks.Installers
  - Microsoft.DotNet.Build.Tasks.Packaging
  - Microsoft.DotNet.Build.Tasks.TargetFramework
  - Microsoft.DotNet.Build.Tasks.Templating
  - Microsoft.DotNet.Build.Tasks.Workloads
  - Microsoft.DotNet.CodeAnalysis
  - Microsoft.DotNet.GenAPI
  - Microsoft.DotNet.GenFacades
  - Microsoft.DotNet.Helix.Sdk
  - Microsoft.DotNet.PackageTesting
  - Microsoft.DotNet.RemoteExecutor
  - Microsoft.DotNet.SharedFramework.Sdk
  - Microsoft.DotNet.XliffTasks
  - Microsoft.DotNet.XUnitExtensions
- From [0.11.5-preview.26116.109 to 0.11.5-preview.26117.101][1]
  - Microsoft.DotNet.Cecil
- From [2.9.3-beta.26116.109 to 2.9.3-beta.26117.101][1]
  - Microsoft.DotNet.XUnitAssert
  - Microsoft.DotNet.XUnitConsoleRunner
- From [11.0.0-preview.2.26116.109 to 11.0.0-preview.2.26117.101][1]
  - Microsoft.NET.Sdk.IL
  - Microsoft.NETCore.App.Ref
  - Microsoft.NETCore.ILAsm
  - runtime.native.System.IO.Ports
  - System.Reflection.Metadata
  - System.Reflection.MetadataLoadContext
  - System.Text.Json
- From [7.5.0-rc.11709 to 7.5.0-rc.11801][1]
  - NuGet.Frameworks
  - NuGet.Packaging
  - NuGet.ProjectModel
  - NuGet.Versioning
- From [3.0.0-preview.2.26116.109 to 3.0.0-preview.2.26117.101][1]
  - System.CommandLine

[marker]: <> (End:f7901f87-9f24-40d6-9bc1-564863937237)

[1]: dotnet/dotnet@ba0812f...6699c73
[marker]: <> (Start:Footer:CodeFlow PR)

## Associated changes in source repos
-
dotnet/msbuild@fb68c81...81815e5

<details>
<summary>Diff the source with this PR branch</summary>

```bash
darc vmr diff --name-only https://github.com/dotnet/dotnet:6699c7330bf73b37beb5b19c59b57cbcb4dcafac..https://github.com/dotnet/runtime:darc-main-1c9ad051-1d09-419c-a55b-6ac1569f5a2c
```
</details>

[marker]: <> (End:Footer:CodeFlow PR)

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
…tnet#124564)

# [cDAC] Add infrastructure to run cDAC tests using ClrMD and dumps

## Summary

Adds dump-based integration tests for the cDAC (contract-based Data
Access Component)
reader. Purpose-built debuggee apps crash via `FailFast` to produce
dumps, which are
then loaded through ClrMD to validate that cDAC contracts can correctly
read real
runtime data structures.

## What's Being Tested

Each test class exercises a specific cDAC contract against a real crash
dump:

| Contract | What's Validated |
|----------|-----------------|
| **Thread** | Thread store enumeration, thread count, thread data
fields |
| **RuntimeInfo** | Runtime version, target OS detection |
| **GCHeap** | Server GC heap structures and segment enumeration |
| **StackWalk** | Stack frame enumeration, MethodDesc resolution,
register contexts |
| **RuntimeTypeSystem** | Type handles, method tables, free object
detection |
| **Loader** | Module enumeration, assembly resolution across multiple
modules |
| **EcmaMetadata** | Cross-module metadata token resolution |

## Debuggees

Auto-discovered from `Debuggees/`.

| Debuggee | Scenario | Dump Type |
|----------|----------|-----------|
| **BasicThreads** | Multiple managed threads | Heap |
| **ExceptionState** | Nested exception chain via FailFast | Heap |
| **GCRoots** | GC object graph with pinned handles | Heap |
| **ServerGC** | Server GC mode | Heap |
| **StackWalk** | Deterministic call stack (Main→A→B→C→FailFast) | Heap
|
| **MultiModule** | Multi-assembly app for metadata/loader tests | Full
|
| **TypeHierarchy** | Class inheritance hierarchy | Full |

## Infrastructure

- **`DumpTests.targets`** — MSBuild logic that builds debuggees, runs
them with
`DOTNET_DbgEnableMiniDump` to collect crash dumps, and organizes output
by
`{version}/{dumptype}/{debuggee}/`. Supports heap (type 2) and full
(type 4) dumps
  with per-debuggee configuration via the `DumpTypes` MSBuild property.

- **`RunDumpTests.ps1`** — Windows helper script for local development.
Orchestrates
dump generation and test execution with options for filtering, forcing
regeneration,
  and testing against CI dump archives.

- **`DumpTestBase.cs`** — Test base class that loads a dump via ClrMD,
creates a
`ContractDescriptorTarget`, and provides version/OS-aware test skipping.

- **`ClrMdDumpHost.cs`** — Wraps ClrMD's `DataTarget` to provide memory
read and
symbol lookup callbacks. Handles PE, ELF, and Mach-O module formats via
ClrMD's
  built-in export resolution.

## CI Pipeline

Defined in `eng/pipelines/runtime-diagnostics.yml`. Runs nightly and on
PRs touching
`src/native/managed/cdac/**`.

| Stage | Purpose |
|-------|---------|
| **Build** | Builds runtime, runs standard diagnostics tests (with and
without cDAC) |
| **DumpCreation** | Generates local-version crash dumps on each
platform, publishes as artifacts |
| **DumpTest** | Downloads dumps from all platforms, runs cross-platform
dump analysis |

Currently generates **local dumps only** on CI. The net10.0
self-contained publish
requires a separate SDK not available on CI agents. Heap dump tests for
net10.0 are
skipped (cDAC was not supported in net10.0 heap dumps).

## Future plan

* Move dump test execution to Helix for broader platform coverage.
* Consider only doing x-plat build as an outerloop.
* Run with previous version dump in CI.
Changeset
dotnet@1fa1745
introduced a stack walking regression where we will crash trying to
unwind/report registers. The real fix here is in
cgenamd64.cpp/excep.cpp, which will point the context to a local copy
before we try to use it.

I've also added some changes in gcinfodecoder.cpp that aren't strictly
necessary but would have avoided the problem to begin with.

Fixes dotnet#124401.
Fix some issues that I noticed while trying to crossgen debug/release
System.Private.Corelib
* need to be more careful fetching layout when rewriting local stores
* handle degenerate BBJ_COND during wasm flow graph reordering
* pinvoke prolog can likely be empty
* fix VN assert for the extra PE arg we pass at end of arglist
* make sure Wasm special call args have names in dumps
* handle struct arg passed as field during reg alloc
* fix logic for marking `this` as address-exposed
…narios (dotnet#124772)

Modifies how MethodDesc sizes are computed. Instead of using the runtime
`s_ClassificationSizeTable` which is not present in heap dumps,
RuntimeTypeSystem now computes the MethodDesc size from datadescriptors.

Modified DumpTests to run on heap dumps for verification.
This PR is a follow-up to dotnet#124161.
Change `Requires.Argument(index - count + 1 >= 0)` to
`Requires.Range(index - count + 1 >= 0, nameof(count))` in
`ImmutableList<T>.Node.LastIndexOf` to align with the validation used in
`ImmutableArray<T>.LastIndexOf`.

Changes:
- Use `Requires.Range` in `ImmutableList<T>.Node.LastIndexOf` for
validating the `index` and `count` parameters.
- Add a test case to verify that an `ArgumentOutOfRangeException` is
thrown when validation of the `index` and `count` parameters in
`LastIndexOf` and `FindLastIndex` fails.
- Fix test case to also validate the parameter name.
- Rename `ImmutableList<T>.Node.LastIndexOf` index param to startIndex
…em (dotnet#124709)

Android's scudo heap allocator uses ARM64 Top-Byte Ignore (TBI) to tag
heap pointers with a non-zero top byte (e.g., 0xB4). While the CPU
ignores this byte during memory access, pread on /proc/<pid>/mem treats
the offset as a file position where TBI does not apply, causing EINVAL.

Strip the top byte before pread in PAL_ReadProcessMemory and
createdump's ReadProcessMemory. This is a no-op on non-Android ARM64
Linux today, but guards against future TBI/MTE adoption on other
distributions.

See
https://www.kernel.org/doc/html/latest/arch/arm64/tagged-address-abi.html
…net#124599)

When checking a element of TBase size, ensure that no other bits other
than the first bit are set
….Compression (dotnet#124634)

There is no real benefit from having the APIs in separate assembly
because:
- the Managed code size is rather small
- it P/Invokes System.IO.Compression.Native just like
System.IO.Compression managed assembly does
- It would lead to circular dependency if we decide to implement
dotnet#123532

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…#124486)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MihaZupan <25307628+MihaZupan@users.noreply.github.com>
Co-authored-by: Miha Zupan <mihazupan.zupan1@gmail.com>
…h "file:" relative URI (dotnet#124660)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MihaZupan <25307628+MihaZupan@users.noreply.github.com>
Based on [the calendar](https://apireview.net/schedule), Thursday
reviews aren't happening since May 2025.
Set `__NumProc` on OpenBSD.
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MihaZupan <25307628+MihaZupan@users.noreply.github.com>
Co-authored-by: MihaZupan <mihazupan.zupan1@gmail.com>
Fixes dotnet#123858.

This PR improves JIT codegen for multi-target `switch`-style tests by
converting eligible cases into branchless checks. The goal is to produce
optimal codegen that matches the intent of C# pattern matching with `or`
(e.g., `x is A or B or C`).

When a switch has exactly 2 unique successors (all non-default cases
target one block, default targets another), convert it from Switch to an
unsigned range comparison (In `fgOptimizeSwitchBranches`).
When both targets are simple return blocks, `fgFoldCondToReturnBlock`
further folds this into branchless return.

## Example
```csharp
        private static bool IsLetterCategory(UnicodeCategory uc)
        {
            return uc == UnicodeCategory.UppercaseLetter
                 || uc == UnicodeCategory.LowercaseLetter
                 || uc == UnicodeCategory.TitlecaseLetter
                 || uc == UnicodeCategory.ModifierLetter
                 || uc == UnicodeCategory.OtherLetter;
        }
```

## Before
```asm
cmp      ecx, 4
ja       SHORT G_M22758_IG05
mov      eax, 1
ret
G_M22758_IG05:
xor      eax, eax
ret
```

## After
```asm
cmp      ecx, 4
setbe    al
movzx    rax, al
ret
```


## Details

- The comparison direction is chosen to GT_LT. 
- Edge dup counts are fixed up after conversion.
- Added tests for zero-based and non-zero-based consecutive ranges.

## ASMDiffs

- SPMI asmdiffs show code size improvements of 83 bytes.

---------

Co-authored-by: Egor Bogatov <egorbo@gmail.com>
Code needing to check for class init would be skipped for R2R
compilation, probably because at runtime we would be likely to detect
the check as redundant. On iOS this means that the entire method would
be interpreted which is way more expensive than a small check for class
initialization. This commit adds a r2r helper for this, which will end
up as a call to the standard jit helper:
System.Runtime.CompilerServices.Helpers.InitClass/InitInstantiatedClass.
In the example below, G<>.Touch was skipped in R2R.

```
public class G<T>
{
    static Type theType;
    static G()
    {
        theType = typeof(T);
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static Type Touch()
    {
        return theType;
    }
}

G<string>.Touch();
```
When a test run crashes, the msbuild build would still succeed, and
run.py would read stale testRun.xml files from a previous run, reporting
old (potentiall passing) results instead of an error. Instead use
`ContinueOnError="ErrorAndContinue"` to allow subsequent test runs to
continue but still fail the build.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…h small destination buffers (dotnet#124655)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MihaZupan <25307628+MihaZupan@users.noreply.github.com>
Loading an empty assembly (0-length byte array or stream) throws
`BadImageFormatException` with the generic message "Bad IL format." This
is a common scenario with bugs in dynamically generated assemblies and
provides no actionable information.

**Before:**
```csharp
Assembly.Load(new byte[0]);  
// BadImageFormatException: Bad IL format.
```

**After:**
```csharp
Assembly.Load(new byte[0]);
// BadImageFormatException: Assembly image is empty. The stream or byte array must contain a valid PE file.
```
…nt (dotnet#124300)

## Description

`NRange.GetOffsetAndLength` casts its `nint` parameters to `uint` for
range validation. On 64-bit platforms, this truncates values larger than
`uint.MaxValue`, allowing invalid ranges to pass validation silently.

```csharp
// Before: truncates upper 32 bits on 64-bit platforms
if ((uint)end > (uint)length || (uint)start > (uint)end)

// After: correct comparison for all nint values
if ((nuint)end > (nuint)length || (nuint)start > (nuint)end)
```

For example, `start = 0x1_0000_0001` and `end = 2` with `length =
0x1_0000_0003`: the `(uint)` cast truncates start to `1`, making `1 > 2`
false and incorrectly passing validation.

**Note:** Other `(uint)` conversion issues in `NRange` (e.g.,
`ToString`) are intentionally not addressed here — those are covered by
dotnet#124294.

### Tests

- Converted existing `GetOffsetAndLengthTest` `[Fact]` to `[Theory]`
with `[InlineData]`
- Split success and exception cases into separate theory methods
- Added `[ConditionalTheory(Is64BitProcess)]` tests exercising values
above `uint.MaxValue`, including a case that directly catches the
truncation bug

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: vcsjones <361677+vcsjones@users.noreply.github.com>
barosiak and others added 25 commits March 5, 2026 12:15
Unity was the last reason to keep this around. We used mcs as a source
of different IL for testing code we have that makes changes to method
bodies. The time has come that the added test coverage we use it for
isn't worth the maintenance costs anymore. I'm going to remove mcs from
our test setup which means there's no reason to keep this code around
anymore.
Unity is still verifying the ILLink tests mostly pass when ran through
an old version of UnityLinker that still supports .NET Framework. We
also have tests that will root types in `test.exe`. Both of these
scenarios lead to compiler generated polyfills that survive and mess up
asserting.

`AssemblyChecker` had some logic to deal with compiler generated
attributes. These specific attributes no longer appear to require
special handling during the illink tests so I've removed them.

In order to help Unity deal with it's tests I've exposed a new method
`PrepareToVerifyAssembly` that we can hook into and do the same sort of
thing that was happening for attributes such as `EmbeddedAttribute` but
also do it for other types such as `NullableAttribute`.

I've exposed a helper method `IgnoreTypeAndItsMembers` that makes it
easier to ignore a type and it's members.
dotnet#120477 removed the virtual on
`MarkAssembly`. Unity needs to override this method. Adding back the
`virtual`
…mplementation of LIFO policy." (dotnet#125193)

Reverts dotnet#123921

This change appears to have caused a large regression in NuGet restore
performance. Reverting is confirmed to produce a significant improvement
(10-15%).
We could end up calling GetAsyncOtherVariant for explicitly-async
methods like AsyncHelpers.Await, which do not have other variants.
This was happening under `EnableExtraSuperPmiQueries` mode that queries
both variants proactively. Also simplify SPMI implementation of the
recording of this function.
…terface allocation apis (dotnet#125091)

This makes all allocation of memory for the interpreter which are
long-lived be allocated in the one big allocation. This should fix any
issues where we have memory leaking from collectible assemblies.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
## Summary

Fix CMake build failure when building `clr.runtime` from a clean build
(instead of `clr.native`).

## Problem

When building `clr.runtime` from clean, the install step fails with:

```
CMake Error at _deps/zstd-build/lib/cmake_install.cmake:53 (file):
    file INSTALL cannot find
    ".../_deps/zstd-build/lib/zstd_static.lib"
```

This happens because zstd's own `install()` rules are included in the
build's install step. When the `runtime` component install runs, it
tries to install `zstd_static.lib` — but that file was never built
because `libzstd_static` is only built as a dependency of
`System.IO.Compression.Native`, which is not part of the `runtime` build
target.

## Fix

Replace `FetchContent` with a direct `add_subdirectory()` call using
`EXCLUDE_FROM_ALL`, which reliably prevents zstd's own `install()` rules
from being included in the component install. The `EXCLUDE_FROM_ALL`
parameter on `add_subdirectory()` has properly suppressed install rules
since CMake 3.14, making it compatible with the project's CMake 3.26
minimum.

The explicit `install()` calls in
`System.IO.Compression.Native/CMakeLists.txt` that install
`libzstd_static` to the correct destinations continue to work as before
since they target the `libzstd_static` target directly (not via zstd's
own install rules).

Fixes dotnet#124234

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
## Description

Windows 7 is no longer a supported OS. Remove Win7-specific code paths,
dead branches, and outdated comments from System.Net.Security.

### Product code
- **`SslCertificateTrust.cs`**: Replace `IsWindowsVersionAtLeast(6, 2)`
guard with `IsWindows()` — the version check only excluded Win7, which
is no longer reachable. Remove unused `System.Runtime.Versioning` using.
- **`SslAuthenticationOptions.cs`**: Remove comment about SSL2+TLS1.2
incompatibility on pre-Win10 (code stays, it's still correct).
- **`ExtendedProtectionPolicy.cs`**: Update comment to clarify
ExtendedProtection is supported on all Windows versions supported by
current .NET version.
- **`SslStreamPal.Windows.cs`**: Clarify legacy `SCHANNEL_CRED` comment
— it's for older Windows versions, not specific to Win7.

### Test code
- **`TestConfiguration.cs`**: Remove dead
`!PlatformDetection.IsWindows10OrLater` branch in null encryption
detection.
- **`SslStreamSystemDefaultsTest.cs`**: Simplify `IsWindows &&
WindowsVersion >= 10` to `IsWindows`.
- **`SslStreamCredentialCacheTest.cs`**: Update comment referencing Win8
behavioral change from Win7.

Note: The `SCHANNEL_CRED` / `UseNewCryptoApi` dual-path remains — it
serves Win10 builds before 18836 (pre-TLS 1.3), not Win7.

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for
you](https://github.com/dotnet/runtime/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rzikm <32671551+rzikm@users.noreply.github.com>
Co-authored-by: Stephen Toub <stoub@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
… Windows (dotnet#124720)

This PR adds an opt-in `AppContext` switch to enable kernel response
buffering in HttpListener (Windows implementation only). When enabled,
the flag `HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA` is set on all calls to
`HttpSendHttpResponse` and `HttpSendResponseEntityBody` (consistent with
[Win32
docs](https://learn.microsoft.com/en-us/windows/win32/api/http/nf-http-httpsendresponseentitybody#:~:text=HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA)).
This mirrors the behavior for setting the
`HttpSysOptions.EnableKernelResponseBuffering` flag in [ASP.NET HTTP.sys
code](https://github.com/dotnet/aspnetcore/blob/2a88012113497bac5056548f16d810738b069198/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs#L499).

Motivation in [issue
dotnet#123425](dotnet#123425).

Sample usage:
```csharp
AppContext.SetSwitch("System.Net.HttpListener.EnableKernelResponseBuffering", true);

using var listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();

Console.WriteLine("Listening...");
while (true)
{
    var context = await listener.GetContextAsync().ConfigureAwait(false);
    _ = Task.Run(() => HandleRequestAsync(context));
}
```

Notes:
- No public API changes
- Default behavior remains unchanged
- Since API is internal, tests use reflection to validate flag behavior.
- Added dedicated Windows-only test classes for `HttpListener` and
`HttpResponseStream`, and consolidated existing Windows-only tests there
for consistency.

# Repro and validation

Setup:
- Client: Azure VM in West US 2
- Server: Azure VM in Australia East

Client uses HttpClient to send requests to the server and measures total
latency. Server is running HttpListener and returns 7MB responses while
varying the server-side response buffer size (from 32KB to 7MB). Server
also records avg timing per individual response Write() call.

## Benchmark

### Kernel Buffering Disabled (Existing Behavior)

| Buffer Size (bytes) | Latency (ms) | Write Time (µs) |
|---------------------|--------------|-----------------|
| 32768               | 33911        | 158414          |
| 65536               | 16923        | 158108          |
| 131072              | 8609         | 159346          |
| 262144              | 4323         | 159938          |
| 524288              | 2296         | 163629          |
| 1048576             | 1181         | 168004          |
| 2097152             | 701          | 173846          |
| 4194304             | 468          | 206004          |
| 7000000             | 492          | 384459          |

### Kernel Buffering Enabled (New Behavior)

| Buffer Size (bytes) | Latency (ms) | Write Time (µs) |
|---------------------|--------------|-----------------|
| 32768               | 1154         | 4589            |
| 65536               | 1149         | 9211            |
| 131072              | 1142         | 18205           |
| 262144              | 1107         | 35590           |
| 524288              | 1137         | 69975           |
| 1048576             | 686          | 75492           |
| 2097152             | 386          | 92539           |
| 4194304             | 451          | 109173          |
| 7000000             | 490          | 2356            |

- Enabling HttpListener kernel buffering reduces E2E latency by up to
30x (34s → 1s for 32KB buffers)
- Average `Write()` time drops significantly (158,414 µs → 4,589 µs at
32 KB).

These results confirm that without kernel buffering, small writes cause
RTT amplification. Enabling kernel buffering eliminates small-write
fragmentation over the wire and dramatically reduces latency.

## Packet Capture

### Packet analysis

Without kernel buffering, when the server sends a 7MB response using a
32KB buffer, packet capture shows that each server Write() results in a
32KB TCP segment (Length=32768, [PSH, ACK]). Each segment is transmitted
approx. 1 RTT apart (~0.158s matching Azure-advertised RTT b/w the two
regions). Transmission is effectively ACK-gated.

<img width="1965" height="702" alt="image"
src="https://github.com/user-attachments/assets/5f5eb251-8d79-423a-8c1b-54f139e9f907"
/>

E2E the request takes ~34s:

<img width="1689" height="146" alt="image"
src="https://github.com/user-attachments/assets/47080e30-4f84-49bf-be98-36ee50ee59d2"
/>

With kernel buffering enabled, the TCP stack transmits large bursts of
packets rather than one per RTT.

<img width="2399" height="1307" alt="image"
src="https://github.com/user-attachments/assets/a8d62e17-534c-4b1b-b3f8-a8536e9f9a03"
/>

E2E latency dropped from ~34s to ~1s (first request ~1.9s due to TCP
slow start, subsequent requests stabilize at ~0.95s).

<img width="2158" height="360" alt="image"
src="https://github.com/user-attachments/assets/9cdfd2df-167a-4917-a354-faef86b033f0"
/>

### TCP stream graph
The diff in behavior is best visualized using the Stevens TCP stream
graph:

Without kernel buffering, the graph shows each ~32 KB increment in
response transmission is separated by approx. one RTT. The slope is
shallow (slow rate of growth) and evenly spaced.

<img width="3792" height="1788" alt="image"
src="https://github.com/user-attachments/assets/dcc98a89-a2e1-4385-af9a-41fb9e8bb9f9"
/>

With kernel buffering enabled, the slope becomes significantly steeper.
Multiple segments are transmitted back-to-back before the next RTT
boundary.

<img width="3786" height="1857" alt="image"
src="https://github.com/user-attachments/assets/b439ea87-3fea-4b6a-aeb8-5d6ea981c77e"
/>

This visualizes the core issue: without buffering, small writes are
RTT-amplified. With buffering, HTTP.sys aggregates response data in
kernel space and transmits in large bursts, eliminating per-write RTT
pacing.

### Repro code

#### Init HttpListener with EnableKernelResponseBuffering switch

```c#

var listener = new HttpListener();
if (enableBuffering)
{
    AppContext.SetSwitch(
        "System.Net.HttpListener.EnableKernelResponseBuffering",
        true);
}

listener.Prefixes.Add("http://+:80/");
listener.Start();

while (true)
{
    var context = await listener.GetContextAsync();

    try
    {
        long responseSize = long.Parse(context.Request.QueryString["size"]);
        int bufferSize = int.Parse(context.Request.QueryString["buffer"]);

        context.Response.StatusCode = 200;
        await SendListenerResponse(context, responseSize, bufferSize);
    }
    finally
    {
        context.Response.Close();
    }
}
```

#### Server multi-write response routine
```c#
var buf = new byte[bufferSize];

long totalWriteUs = 0;
int writeCount = 0;

long totalSent = 0;
while (totalSent < size)
{
    int writeSize = (int)Math.Min(size - totalSent, bufferSize);

    long start = Stopwatch.GetTimestamp();

    await stream.WriteAsync(buf.AsMemory(0, writeSize));

    long end = Stopwatch.GetTimestamp();
    totalWriteUs += (end - start) / 10;
    writeCount++;

    totalSent += writeSize;
}

long avgWriteUs = totalWriteUs / writeCount;
```

Thanks @ManickaP for all the help!

---------

Co-authored-by: Marie Píchová <11718369+ManickaP@users.noreply.github.com>
… entries (dotnet#125201)

`ProcessTargetInfo` in managed NTLM returns trailing zeros instead of
actual target info data when the server challenge includes `TargetName`
or `ChannelBindings` AV pairs (which are skipped and replaced). The
early-exit path was correct; the fallback return was off-by-one in the
wrong direction.

## Changes

- **Bug fix** (`NegotiateAuthenticationPal.ManagedNtlm.cs`):
One-character fix — `AsSpan(targetInfoOffset)` → `AsSpan(0,
targetInfoOffset)`. The old code returned the unused trailing portion of
the pre-allocated buffer; the fix returns the written portion.

- **Test infrastructure** (`FakeNtlmServer.cs`): Added
`SendPreExistingTargetName` and `SendPreExistingChannelBindings`
properties (default `false`). When set, the server challenge includes
dummy `TargetName`/`ChannelBindings` AV pairs that the client must skip
and replace, forcing `targetInfoOffset < targetInfoBuffer.Length` and
hitting the previously dead code path.

- **Regression test** (`NegotiateAuthenticationTests.cs`):
`NtlmWithPreExistingTargetInfoEntriesTest` — `[ConditionalTheory]` gated
on `UseManagedNtlm`, exercises all non-trivial flag combinations
`(true,false)`, `(false,true)`, `(true,true)` and verifies full
authentication succeeds. The test is scoped to managed NTLM platforms
(Ubuntu 24/26, OpenSUSE 16) because the bug lives in the managed
implementation; platforms using the system gss-ntlmssp library may not
handle pre-existing AV pairs in the server challenge consistently across
versions.

# Customer Impact

NTLM authentication fails when the server includes `TargetName` or
`ChannelBindings` entries in the challenge's target info. The corrupted
target info causes HMAC verification to fail on the server side,
breaking authentication entirely for those server configurations.

# Regression

Not a regression introduced in the most recent release — this is a
pre-existing latent bug in the managed NTLM implementation. It was
masked because `FakeNtlmServer` never emitted those AV pair types in
tests.

# Testing

Full NTLM exchange tested with each combination of pre-existing
`TargetName`/`ChannelBindings` entries in the challenge. All 122
existing unit tests continue to pass.

# Risk

Low. The fix is a single character change to a slice argument. The
affected code path was previously unreachable in tests; the new tests
confirm correctness. No protocol logic changed.

# Package authoring no longer needed in .NET 9

IMPORTANT: Starting with .NET 9, you no longer need to edit a NuGet
package's csproj to enable building and bump the version.
Keep in mind that we still need package authoring in .NET 8 and older
versions.

<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> ## Bug Description
> 
> In
`src/libraries/System.Net.Security/src/System/Net/NegotiateAuthenticationPal.ManagedNtlm.cs`,
the `ProcessTargetInfo` method has a bug on line 563:
> 
> ```csharp
> return targetInfoBuffer.AsSpan(targetInfoOffset).ToArray();
> ```
> 
> This returns the **unused trailing portion** of `targetInfoBuffer`
(from `targetInfoOffset` to the end), when it should return the **used
portion** (from 0 to `targetInfoOffset`). The fix is:
> 
> ```csharp
> return targetInfoBuffer.AsSpan(0, targetInfoOffset).ToArray();
> ```
> 
> ### Context of the bug
> 
> The `ProcessTargetInfo` method:
> 1. Allocates `targetInfoBuffer` with size: `targetInfo.Length + 20 + 4
+ spnSize + 8`
> 2. Copies AV pairs from the input `targetInfo` into
`targetInfoBuffer`, **skipping** any existing `TargetName` or
`ChannelBindings` entries
> 3. Appends its own `TargetName`, `ChannelBindings`, `Flags`, and `EOL`
entries
> 4. Uses `targetInfoOffset` as the write cursor tracking how many bytes
were written
> 
> At the end:
> - Line 558: `if (targetInfoOffset == targetInfoBuffer.Length) return
targetInfoBuffer;` — this is the happy path when no entries were skipped
> - Line 563: `return
targetInfoBuffer.AsSpan(targetInfoOffset).ToArray();` — **BUG**: returns
trailing zeros instead of the actual data
> 
> ### Why existing tests don't catch this
> 
> The `FakeNtlmServer.GenerateChallenge()` in
`src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs` never
includes `TargetName` or `ChannelBindings` AV pairs in its challenge
message. Therefore, `ProcessTargetInfo` never skips any entries,
`targetInfoOffset` always equals `targetInfoBuffer.Length`, and the
early return on line 558 always fires. The buggy line 563 is never
reached.
> 
> ### Required changes
> 
> 1. **Fix the bug** in `NegotiateAuthenticationPal.ManagedNtlm.cs` line
563:
> Change `targetInfoBuffer.AsSpan(targetInfoOffset).ToArray()` to
`targetInfoBuffer.AsSpan(0, targetInfoOffset).ToArray()`
> 
> 2. **Add test coverage** by modifying `FakeNtlmServer` in
`src/libraries/Common/tests/System/Net/Security/FakeNtlmServer.cs` to
support optionally including pre-existing `TargetName` and/or
`ChannelBindings` AV pairs in the challenge message's target info. Add a
property like `bool SendPreExistingTargetName { get; set; }` and/or
`bool SendPreExistingChannelBindings { get; set; }` that, when set to
true, inserts dummy `TargetName`/`ChannelBindings` AV pairs into the
challenge's target info before the EOL. This will exercise the code path
where `ProcessTargetInfo` skips entries, causing `targetInfoOffset <
targetInfoBuffer.Length` and reaching the previously-buggy line 563.
> 
> 3. **Add new test(s)** in
`src/libraries/System.Net.Security/tests/UnitTests/NegotiateAuthenticationTests.cs`
that:
> - Create a `FakeNtlmServer` with the pre-existing
TargetName/ChannelBindings feature enabled
>    - Perform a full NTLM exchange and verify authentication succeeds
> - This ensures the trimmed target info buffer is correct when entries
are filtered out
> 
> The tests should be `[ConditionalFact]` or `[ConditionalTheory]` gated
on `IsNtlmAvailable`, consistent with the existing test patterns in the
file.


</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

*This pull request was created from Copilot chat.*
>

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for
you](https://github.com/dotnet/runtime/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
Co-authored-by: rzikm <32671551+rzikm@users.noreply.github.com>
Address @AndyAyersMS concerns regarding assertion sets
(dotnet#125093 (review))

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closes dotnet#123085


[Diffs](https://dev.azure.com/dnceng-public/public/_build/results?buildId=1322668&view=ms.vss-build-web.run-extensions-tab)

given `(X + negativeConst) u< Y` for int32 vars
where `u<` is unsigned less than
`Y` is a proven never negative bound
`negativeConst` is a negative constant (`> INT32_MIN`)

We deduce `X >= -negativeConst`
…net#125236)

## Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC
and legacy DAC using exact equality (`Debug.Assert(hrLocal == hr)`).
This causes the debugger process to crash when the cDAC and native DAC
return different failure HRESULTs for the same invalid input.

For example, when `GetMethodTableData` is called with a garbage method
table pointer, the cDAC may throw `InvalidOperationException`
(`0x80131C49`) while the native DAC returns `E_INVALIDARG`
(`0x80070057`). Both correctly reject the input, but the exact HRESULT
comparison fires a fatal `Debug.Assert` that terminates the debugger
mid-command — causing flaky CI failures like
`SOS.VarargPInvokeInteropMD` in the `cDAC_windows_x64_release` job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure
codes from these APIs — they only check success vs failure.

## Changes

**New file: `DebugExtensions.cs`** — adds `Debug.ValidateHResult()` as a
C# 14 static extension method on `System.Diagnostics.Debug`:

```csharp
Debug.ValidateHResult(hr, hrLocal);
```

With two validation modes via `HResultValidationMode`:
- **`Exact`** — HRESULTs must match exactly (available for APIs where
the specific code matters)
- **`AllowDivergentFailures`** (default) — success HRESULTs (`S_OK`,
`S_FALSE`) must match exactly, but any two failing HRESULTs (negative
values) are considered equivalent

**Converted all 113 call sites** across 5 files from:

```csharp
Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}");
```

to:

```csharp
Debug.ValidateHResult(hr, hrLocal);
```
* use gtOverflowEx instead of gtOverflow
* not all block stores need null checks
* more cases where we don't have putarg stacks
* add lowering was bypassing Wasm overflow checking
* tolerate nullchecks that can't throw (see dotnet#125203)
* storeind nullchecks

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: SingleAccretion <62474226+SingleAccretion@users.noreply.github.com>
Fixes dotnet#123442

The tracee hit the 5s timeout on the jitstress lane. Given that
jitstress lanes are known to be slow, I'm expecting non-jitstress lanes
to still complete quickly despite the longer timeout. Also added logs to
1) indicate whether the Tracee's EventSource was enabled and 2) reveal
which .NET processes record-trace detected and sent an IPC command.

Below is an example output with these in effect
record-trace emits `Enabled .NET events for process: pid=13803`
Tracee EventSource enabled, emitting events.

```bash
Starting record-trace: sudo -n /home/mihw/repo/runtime/artifacts/tests/coreclr/linux.x64.Debug/tracing/userevents/common/userevents_common/record-trace --script-file /home/mihw/repo/runtime/artifacts/tests/coreclr/linux.x64.Debug/tracing/userevents/custommetadata/custommetadata/custommetadata.script --out /tmp/tmpBl0cAg.nettrace --log-filter one_collect::helpers::exporting=warn,one_collect::perf_event=warn,one_collect::tracefs=warn,one_collect::scripting=warn,ruwind=warn,engine=warn --log-mode console
record-trace started with PID: 13789
Delaying tracee startup 300ms for record-trace setup...
[record-trace][stdout] 2026-03-05T18:20:38.062008Z  INFO one_collect::helpers::dotnet::os::linux: Enabled .NET events for process: pid=4998
[record-trace][stdout] Recording started.  Press CTRL+C to stop.
[record-trace][stdout] 2026-03-05T18:20:38.068201Z  INFO one_collect::helpers::dotnet::os::linux: Enabled .NET events for process: pid=13767
Starting tracee process: /home/mihw/repo/runtime/artifacts/tests/coreclr/linux.x64.Debug/Tests/Core_Root/corerun /home/mihw/repo/runtime/artifacts/tests/coreclr/linux.x64.Debug/tracing/userevents/custommetadata/custommetadata/custommetadata.dll tracee
Tracee process started with PID: 13803
Waiting for tracee process to exit...
[record-trace][stdout] 2026-03-05T18:20:38.369549Z  INFO one_collect::helpers::dotnet::os::linux: Enabled .NET events for process: pid=13803
[tracee][stdout] Tracee waiting for EventSource to be enabled via IPC...
[tracee][stdout] Tracee EventSource enabled, emitting events.
Stopping record-trace with SIGINT.
Waiting for record-trace to exit...
[record-trace][stdout] 2026-03-05T18:20:38.509142Z  WARN one_collect::helpers::dotnet::os::linux: Failed to open diagnostic socket: pid=13803, nspid=13803
[record-trace][stdout] Recording stopped.
[record-trace][stdout] Resolving symbols.
[record-trace][stdout] Finished recording trace.
[record-trace][stdout] Trace written to /tmp/tmpBl0cAg.nettrace
[record-trace][stdout] 2026-03-05T18:20:38.666852Z  INFO record_trace: record-trace exiting: exit_code=0
CustomMetadata event: Id=1, Name=Item1
Ignored 4441 events from processes other than tracee (PID 13803).
Expected: 100
Actual: 100
END EXECUTION - PASSED
```

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
`gtDirectCallAddress` is already always set for all these kinds of calls
in lowering.
…tnet#125242)

This change removes the unused ILLink dependency analyzer under
`src/tools/illink/src/analyzer` and eliminates all repository wiring
that still referenced it. The ILLink toolset surface now reflects only
actively maintained components.

- **Build graph cleanup**
- Removed analyzer from `eng/Subsets.props` (`tools.illink` subset no
longer builds `src/analyzer/analyzer.csproj`).

- **Solution cleanup**
  - Removed `src/analyzer/analyzer.csproj` from:
    - `src/tools/illink/illink.slnx`
    - `src/tools/illink/trimming.slnx`

- **Source removal**
- Deleted `src/tools/illink/src/analyzer/` (project file, core
implementation, and analyzer-specific README).

- **Docs alignment**
- Updated `src/tools/illink/README.md` to remove the “Dependencies
Analyzer” section/link to the removed component.

```xml
<!-- removed from eng/Subsets.props -->
<ProjectToBuild Include="$(ToolsProjectRoot)illink\src\analyzer\analyzer.csproj" Category="tools" />
```

<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sbomer <787361+sbomer@users.noreply.github.com>
- GT_CNS_INT: Compare icon handle flags and field sequences, not just
  the integer value. Two constants with the same value but different
  handle types or field sequences are not equivalent.

- GT_ALLOCOBJ: Add missing case in the unary ExOp switch. Previously
  hit the default assert in debug builds.

- GT_ARR_ELEM: Compare gtArrElemSize. Resolves existing TODO comment.

- GT_SELECT: Add missing case in the special-node switch. Compare
  all three operands (condition, true value, false value).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- GT_INDEX_ADDR: Compare gtElemType, gtLenOffset, and gtElemOffset
  in addition to gtElemSize.

- GT_FTN_ADDR: Add leaf case comparing gtFptrMethod. Previously
  returned false for equal function address nodes.

- GT_PHI_ARG: Add leaf case comparing local number, predecessor
  block, and SSA number. Previously returned false for equal
  phi arg nodes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- GT_JCC/GT_SETCC: Add leaf cases comparing gtCondition.

- GT_PHYSREG: Add leaf case comparing gtSrcReg.

- GT_JCMP/GT_JTEST/GT_SELECTCC: Compare gtCondition for binary
  nodes that carry a condition code but are not ExOp.

- GT_SELECT_INCCC/GT_SELECT_INVCC/GT_SELECT_NEGCC (ARM64): Compare
  gtCondition for ARM64-specific conditional select variants.

- GT_CCMP (ARM64/AMD64): Compare gtCondition and gtFlagsVal.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot stopped work on behalf of AndyAyersMS due to an error March 10, 2026 01:34
AndyAyersMS pushed a commit that referenced this pull request Mar 24, 2026
i.e. Fold: (-(x)) == 0  ->  x == 0

arm64 asmdiffs
Diffs are based on <span style="color:#1460aa">436,095</span> contexts
(<span style="color:#1460aa">26,618</span> MinOpts, <span
style="color:#1460aa">409,477</span> FullOpts).


<details>
<summary>Overall (<span style="color:green">-40</span> bytes)</summary>
<div style="margin-left:1em">

|Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs
|---|--:|--:|--:|

|libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|183,146,276|<span
style="color:green">-40</span>|<span style="color:green">-0.09%</span>|
|benchmarks.run.linux.arm64.checked.mch|21,285,888|+0|0.00%|
|smoke_tests.nativeaot.linux.arm64.checked.mch|3,003,400|+0|0.00%|


</div></details>

<details>
<summary>FullOpts (<span style="color:green">-40</span> bytes)</summary>
<div style="margin-left:1em">

|Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs
|---|--:|--:|--:|

|libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|168,630,412|<span
style="color:green">-40</span>|<span style="color:green">-0.09%</span>|
|benchmarks.run.linux.arm64.checked.mch|20,953,436|+0|0.00%|
|smoke_tests.nativeaot.linux.arm64.checked.mch|3,001,776|+0|0.00%|


</div></details>

<details>
<summary>Example diffs</summary>
<div style="margin-left:1em">


<details>

<summary>libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch</summary>
<div style="margin-left:1em">


<details>
<summary><span style="color:green">-4</span> (<span
style="color:green">-1.27%</span>) : 142473.dasm -
System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]]
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -53,8 +53,7 @@ G_M13215_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0001 {x0}, byre
 G_M13215_IG03:        ; bbWeight=0.50, gcrefRegs=80002 {x1 x19}, byrefRegs=0000 {}, byref, isz
             asr     w2, w2, dotnet#31
             lsl     w2, w2, #1
-            add     w0, w2, w0,  ASR dotnet#31
-            negs    w0, w0
+            adds    w0, w2, w0,  ASR dotnet#31
             bne     G_M13215_IG04
             movz    x0, #0xD1FFAB1E
             movk    x0, #0xD1FFAB1E LSL dotnet#16
@@ -76,7 +75,7 @@ G_M13215_IG03:        ; bbWeight=0.50, gcrefRegs=80002 {x1 x19}, byrefRegs=0000
             mov     x19, x0
             ; gcrRegs +[x19]
             b       G_M13215_IG05
-						;; size=68 bbWeight=0.50 PerfScore 6.00
+						;; size=64 bbWeight=0.50 PerfScore 5.75
 G_M13215_IG04:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
             ; gcrRegs -[x0 x19-x20]
             mov     x20, xzr
@@ -179,7 +178,7 @@ G_M13215_IG13:        ; bbWeight=0, gcrefRegs=580000 {x19 x20 x22}, byrefRegs=00
             b       G_M13215_IG06
 						;; size=12 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 316, prolog size 16, PerfScore 140.93, instruction count 79, allocated bytes for code 316 (MethodHash=c6bccc60) for method System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts)
+; Total bytes of code 312, prolog size 16, PerfScore 140.68, instruction count 78, allocated bytes for code 312 (MethodHash=c6bccc60) for method System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts)
 ; ============================================================
 
 Unwind Info:
@@ -190,7 +189,7 @@ Unwind Info:
   E bit             : 0
   X bit             : 0
   Vers              : 0
-  Function Length   : 79 (0x0004f) Actual length = 316 (0x00013c)
+  Function Length   : 78 (0x0004e) Actual length = 312 (0x000138)
   ---- Epilog scopes ----
   ---- Scope 0
   Epilog Start Offset        : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e)
```

</div></details>

<details>
<summary><span style="color:green">-4</span> (<span
style="color:green">-0.27%</span>) : 162917.dasm -
System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -531,10 +531,9 @@ G_M17523_IG25:        ; bbWeight=1, gcrefRegs=400002 {x1 x22}, byrefRegs=0000 {}
 G_M17523_IG26:        ; bbWeight=0.50, gcrefRegs=80002 {x1 x19}, byrefRegs=0000 {}, byref, isz
             asr     w0, w0, dotnet#31
             lsl     w0, w0, #1
-            add     w0, w0, w2,  ASR dotnet#31
-            negs    w0, w0
+            adds    w0, w0, w2,  ASR dotnet#31
             beq     G_M17523_IG29
-						;; size=20 bbWeight=0.50 PerfScore 2.25
+						;; size=16 bbWeight=0.50 PerfScore 2.00
 G_M17523_IG27:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
             ; gcrRegs -[x1 x19]
             mov     w19, wzr
@@ -733,7 +732,7 @@ G_M17523_IG43:        ; bbWeight=0.00, gcrefRegs=0001 {x0}, byrefRegs=0000 {}, b
             brk     #0
 						;; size=32 bbWeight=0.00 PerfScore 0.00
 
-; Total bytes of code 1488, prolog size 36, PerfScore 200.96, instruction count 372, allocated bytes for code 1488 (MethodHash=abb9bb8c) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts)
+; Total bytes of code 1484, prolog size 36, PerfScore 200.71, instruction count 371, allocated bytes for code 1484 (MethodHash=abb9bb8c) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts)
 ; ============================================================
 
 Unwind Info:
@@ -744,7 +743,7 @@ Unwind Info:
   E bit             : 0
   X bit             : 0
   Vers              : 0
-  Function Length   : 372 (0x00174) Actual length = 1488 (0x0005d0)
+  Function Length   : 371 (0x00173) Actual length = 1484 (0x0005cc)
   ---- Epilog scopes ----
   ---- Scope 0
   Epilog Start Offset        : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e)
```

</div></details>

<details>
<summary><span style="color:green">-4</span> (<span
style="color:green">-0.26%</span>) : 162915.dasm -
System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -208,7 +208,7 @@
 ;  V197 cse1        [V197,T40] (  2,  1   )     ref  ->   x0         "CSE #7: moderate"
 ;  V198 cse2        [V198,T44] (  2,  1   )     int  ->  x23         "CSE #4: moderate"
 ;  V199 cse3        [V199,T45] (  2,  1   )    long  ->   x1         "CSE #5: moderate"
-;  V200 cse4        [V200,T33] (  3,  1.50)     int  ->   x1         "CSE dotnet#17: moderate"
+;  V200 cse4        [V200,T33] (  3,  1.50)     int  ->   x1         "CSE dotnet#16: moderate"
 ;  V201 rat0        [V201,T01] (  3,  5.62)   byref  ->   x1         "fgMakeTemp is creating a new local variable"
 ;  V202 rat1        [V202,T07] (  5,  3.75)     ref  ->   x0         "replacement local"
 ;  V203 rat2        [V203,T37] (  3,  1.25)    long  ->   x2         "CSE for expectedClsNode"
@@ -623,8 +623,7 @@ G_M55449_IG30:        ; bbWeight=1, gcrefRegs=4180002 {x1 x19 x20 x26}, byrefReg
 G_M55449_IG31:        ; bbWeight=0.50, gcrefRegs=180000 {x19 x20}, byrefRegs=0000 {}, byref, isz
             asr     w1, w21, dotnet#31
             lsl     w1, w1, #1
-            add     w1, w1, w22,  ASR dotnet#31
-            negs    w1, w1
+            adds    w1, w1, w22,  ASR dotnet#31
             bne     G_M55449_IG32
             mov     x1, x19
             ; gcrRegs +[x1]
@@ -642,7 +641,7 @@ G_M55449_IG31:        ; bbWeight=0.50, gcrefRegs=180000 {x19 x20}, byrefRegs=000
             ; gcrRegs -[x1 x20]
             mov     w20, #1
             b       G_M55449_IG33
-						;; size=68 bbWeight=0.50 PerfScore 6.00
+						;; size=64 bbWeight=0.50 PerfScore 5.75
 G_M55449_IG32:        ; bbWeight=0.50, gcrefRegs=80000 {x19}, byrefRegs=0000 {}, byref
             mov     w20, wzr
 						;; size=4 bbWeight=0.50 PerfScore 0.25
@@ -776,7 +775,7 @@ G_M55449_IG46:        ; bbWeight=0, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
             brk     #0
 						;; size=40 bbWeight=0 PerfScore 0.00
 
-; Total bytes of code 1516, prolog size 48, PerfScore 174.78, instruction count 379, allocated bytes for code 1516 (MethodHash=a4562766) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts)
+; Total bytes of code 1512, prolog size 48, PerfScore 174.53, instruction count 378, allocated bytes for code 1512 (MethodHash=a4562766) for method System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts)
 ; ============================================================
 
 Unwind Info:
@@ -787,7 +786,7 @@ Unwind Info:
   E bit             : 0
   X bit             : 0
   Vers              : 0
-  Function Length   : 379 (0x0017b) Actual length = 1516 (0x0005ec)
+  Function Length   : 378 (0x0017a) Actual length = 1512 (0x0005e8)
   ---- Epilog scopes ----
   ---- Scope 0
   Epilog Start Offset        : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e)
```

</div></details>

<details>
<summary>+0 (0.00%) : 223365.dasm -
System.Resources.Extensions.DeserializingResourceReader:CompareStringEqualsName(System.String):bool:this
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -106,7 +106,7 @@ G_M52056_IG05:        ; bbWeight=0.50, gcrefRegs=500000 {x20 x22}, byrefRegs=000
             ldr     x3, [x3]
             blr     x3
             ; gcrRegs -[x0-x1 x20 x22]
-            negs    w0, w0
+            cmp     w0, #0
             cset    x0, eq
 						;; size=40 bbWeight=0.50 PerfScore 4.25
 G_M52056_IG06:        ; bbWeight=0.50, epilog, nogc, extend
```

</div></details>

<details>
<summary><span style="color:green">-4</span> (<span
style="color:green">-0.02%</span>) : 106573.dasm -
System.Data.Tests.DataTableTest2:Select_ByFilter():this
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -3678,8 +3678,7 @@ G_M43941_IG97:        ; bbWeight=1, gcVars=0000000000000000000000000000000000000
 G_M43941_IG98:        ; bbWeight=4, gcrefRegs=4780004 {x2 x19 x20 x21 x22 x26}, byrefRegs=0000 {}, byref, isz
             ldr     w1, [x2, #0x08]
             ldr     w0, [fp, #0xD1FFAB1E]	// [V74 tmp49]
-            sub     w1, w0, w1
-            negs    w1, w1
+            subs    w1, w0, w1
             beq     G_M43941_IG90
             ldp     w0, w1, [x22, #0x10]
             add     w1, w1, #1
@@ -3688,7 +3687,7 @@ G_M43941_IG98:        ; bbWeight=4, gcrefRegs=4780004 {x2 x19 x20 x21 x22 x26},
             ldr     w1, [x2, #0x08]
             cmp     w1, w0
             bls     G_M43941_IG100
-						;; size=48 bbWeight=4 PerfScore 76.00
+						;; size=44 bbWeight=4 PerfScore 74.00
 G_M43941_IG99:        ; bbWeight=3.03, gcVars=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 {V06}, gcrefRegs=4780004 {x2 x19 x20 x21 x22 x26}, byrefRegs=0000 {}, gcvars, byref
             ; GC ptr vars -{V75}
             add     w1, w0, #1
@@ -7803,7 +7802,7 @@ RWD00  	dq	00740053002D0031h, 0067006E00690072h
 RWD16  	dq	007200740053002Dh, 00310067006E0069h
 
 
-; Total bytes of code 18184, prolog size 44, PerfScore 10435.99, instruction count 4546, allocated bytes for code 18184 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)
+; Total bytes of code 18180, prolog size 44, PerfScore 10433.99, instruction count 4545, allocated bytes for code 18180 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)
 ; ============================================================
 
 Unwind Info:
@@ -7814,7 +7813,7 @@ Unwind Info:
   E bit             : 0
   X bit             : 0
   Vers              : 0
-  Function Length   : 4130 (0x01022) Actual length = 16520 (0x004088)
+  Function Length   : 4129 (0x01021) Actual length = 16516 (0x004084)
   ---- Epilog scopes ----
   ---- Scope 0
   Epilog Start Offset        : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e)
```

</div></details>

<details>
<summary><span style="color:green">-4</span> (<span
style="color:green">-0.16%</span>) : 141855.dasm -
System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -595,8 +595,7 @@ G_M36412_IG24:        ; bbWeight=1, gcrefRegs=B80000 {x19 x20 x21 x23}, byrefReg
 G_M36412_IG25:        ; bbWeight=0.50, gcrefRegs=B80000 {x19 x20 x21 x23}, byrefRegs=0000 {}, byref, isz
             asr     w1, w24, dotnet#31
             lsl     w1, w1, #1
-            add     w1, w1, w25,  ASR dotnet#31
-            negs    w1, w1
+            adds    w1, w1, w25,  ASR dotnet#31
             bne     G_M36412_IG26
             mov     x1, x20
             ; gcrRegs +[x1]
@@ -618,7 +617,7 @@ G_M36412_IG25:        ; bbWeight=0.50, gcrefRegs=B80000 {x19 x20 x21 x23}, byref
             ; gcrRegs -[x1] +[x0]
             ; gcr arg pop 0
             b       G_M36412_IG27
-						;; size=68 bbWeight=0.50 PerfScore 6.00
+						;; size=64 bbWeight=0.50 PerfScore 5.75
 G_M36412_IG26:        ; bbWeight=0.50, gcrefRegs=A80000 {x19 x21 x23}, byrefRegs=0000 {}, byref
             ; gcrRegs -[x0 x20]
             mov     x20, xzr
@@ -1232,7 +1231,7 @@ RWD16  	dq	<unknown method>
 	dq	G_M36412_IG51
 
 
-; Total bytes of code 2528, prolog size 48, PerfScore 347.37, instruction count 632, allocated bytes for code 2528 (MethodHash=f7d471c3) for method System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts)
+; Total bytes of code 2524, prolog size 48, PerfScore 347.12, instruction count 631, allocated bytes for code 2524 (MethodHash=f7d471c3) for method System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts)
 ; ============================================================
 
 Unwind Info:
@@ -1243,7 +1242,7 @@ Unwind Info:
   E bit             : 0
   X bit             : 0
   Vers              : 0
-  Function Length   : 591 (0x0024f) Actual length = 2364 (0x00093c)
+  Function Length   : 590 (0x0024e) Actual length = 2360 (0x000938)
   ---- Epilog scopes ----
   ---- Scope 0
   Epilog Start Offset        : 3523193630 (0xd1ffab1e) Actual offset = 3523193630 (0xd1ffab1e) Offset from main function begin = 3523193630 (0xd1ffab1e)
```

</div></details>


</div></details>

<details>
<summary>benchmarks.run.linux.arm64.checked.mch</summary>
<div style="margin-left:1em">


<details>
<summary>+0 (0.00%) : 3177.dasm -
System.Resources.ResourceReader:CompareStringEqualsName(System.String):bool:this
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -106,7 +106,7 @@ G_M1070_IG05:        ; bbWeight=0.50, gcrefRegs=500000 {x20 x22}, byrefRegs=0000
             ldr     x3, [x3]
             blr     x3
             ; gcrRegs -[x0-x1 x20 x22]
-            negs    w0, w0
+            cmp     w0, #0
             cset    x0, eq
 						;; size=40 bbWeight=0.50 PerfScore 4.25
 G_M1070_IG06:        ; bbWeight=0.50, epilog, nogc, extend
```

</div></details>


</div></details>

<details>
<summary>smoke_tests.nativeaot.linux.arm64.checked.mch</summary>
<div style="margin-left:1em">


<details>
<summary>+0 (0.00%) : 18583.dasm -
Generics+TestAsyncGVMScenarios:RunAsync() (FullOpts)</summary>
<div style="margin-left:1em">

No diffs found?

</div></details>

<details>
<summary>+0 (0.00%) : 18730.dasm -
Generics+TestAsyncGVMScenarios:AsyncGvm1[System.__Canon]():this
(FullOpts)</summary>
<div style="margin-left:1em">

No diffs found?

</div></details>

<details>
<summary>+0 (0.00%) : 18865.dasm -
Generics+TestAsyncGVMScenarios:AsyncGvm2[System.__Canon]():this
(FullOpts)</summary>
<div style="margin-left:1em">

No diffs found?

</div></details>

<details>
<summary>+0 (0.00%) : 18873.dasm -
System.Threading.Tasks.Task:get_CompletedTask() (FullOpts)</summary>
<div style="margin-left:1em">

No diffs found?

</div></details>


</div></details>


</div></details>

<details>
<summary>Details</summary>
<div style="margin-left:1em">

#### Size improvements/regressions per collection

|Collection|Contexts with diffs|Improvements|Regressions|Same
size|Improvements (bytes)|Regressions (bytes)|
|---|--:|--:|--:|--:|--:|--:|

|libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|11|<span
style="color:green">10</span>|<span style="color:red">0</span>|<span
style="color:blue">1</span>|<span style="color:green">-40</span>|<span
style="color:red">+0</span>|
|benchmarks.run.linux.arm64.checked.mch|1|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">1</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
|smoke_tests.nativeaot.linux.arm64.checked.mch|4|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">4</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
||16|<span style="color:green">10</span>|<span
style="color:red">0</span>|<span style="color:blue">6</span>|<span
style="color:green">-40</span>|<span style="color:red">+0</span>|

---

#### PerfScore improvements/regressions per collection

|Collection|Contexts with diffs|Improvements|Regressions|Same
PerfScore|Improvements (PerfScore)|Regressions (PerfScore)|PerfScore
Overall in FullOpts|
|---|--:|--:|--:|--:|--:|--:|--:|

|libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|11|<span
style="color:green">10</span>|<span style="color:red">0</span>|<span
style="color:blue">1</span>|<span
style="color:green">-0.10%</span>|0.00%|<span
style="color:green">-0.0000%</span>|
|benchmarks.run.linux.arm64.checked.mch|1|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">1</span>|0.00%|0.00%|0.0000%|
|smoke_tests.nativeaot.linux.arm64.checked.mch|4|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">4</span>|0.00%|0.00%|0.0000%|

---

#### Context information

|Collection|Diffed contexts|MinOpts|FullOpts|Missed, base|Missed, diff|
|---|--:|--:|--:|--:|--:|

|libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch|354,001|23,273|330,728|0
(0.00%)|0 (0.00%)|
|benchmarks.run.linux.arm64.checked.mch|63,204|3,337|59,867|0 (0.00%)|0
(0.00%)|
|smoke_tests.nativeaot.linux.arm64.checked.mch|18,890|8|18,882|0
(0.00%)|0 (0.00%)|
||436,095|26,618|409,477|0 (0.00%)|0 (0.00%)|


---

#### jit-analyze output

<details>

<summary>libraries_tests_no_tiered_compilation.run.linux.arm64.Release.mch</summary>
<div style="margin-left:1em">

```

Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 183146276 (overridden on cmd)
Total bytes of diff: 183146236 (overridden on cmd)
Total bytes of delta: -40 (-0.00 % of base)
    diff is an improvement.
    relative diff is an improvement.
```
<details>

<summary>Detail diffs</summary>

```


Top file improvements (bytes):
          -4 : 162916.dasm (-0.242% of base)
          -4 : 141852.dasm (-0.162% of base)
          -4 : 141855.dasm (-0.158% of base)
          -4 : 141861.dasm (-0.201% of base)
          -4 : 162917.dasm (-0.269% of base)
          -4 : 142473.dasm (-1.266% of base)
          -4 : 142389.dasm (-0.182% of base)
          -4 : 162915.dasm (-0.264% of base)
          -4 : 162918.dasm (-0.185% of base)
          -4 : 106573.dasm (-0.022% of base)

10 total files with Code Size differences (10 improved, 0 regressed), 1 unchanged.

Top method improvements (bytes):
          -4 (-0.022% of base) : 106573.dasm - System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)
          -4 (-1.266% of base) : 142473.dasm - System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts)
          -4 (-0.182% of base) : 142389.dasm - System.IO.Pipelines.Tests.PipelineReaderWriterFacts:ResetAfterCompleteReaderAndWriterWithoutAdvancingClearsEverything():this (FullOpts)
          -4 (-0.162% of base) : 141852.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryAtMaxPoolSizeAllocatesFromPool():this (FullOpts)
          -4 (-0.158% of base) : 141855.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts)
          -4 (-0.201% of base) : 141861.dasm - System.IO.Pipelines.Tests.PipePoolTests:WritesToArrayPoolByDefault():this (FullOpts)
          -4 (-0.242% of base) : 162916.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_MultiBlock():this (FullOpts)
          -4 (-0.185% of base) : 162918.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_SingleBlock():this (FullOpts)
          -4 (-0.264% of base) : 162915.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts)
          -4 (-0.269% of base) : 162917.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts)

Top method improvements (percentages):
          -4 (-1.266% of base) : 142473.dasm - System.IO.Pipelines.Tests.BufferSegmentPoolTest:GetSegments(System.IO.Pipelines.ReadResult):System.Collections.Generic.List`1[System.Buffers.ReadOnlySequenceSegment`1[byte]] (FullOpts)
          -4 (-0.269% of base) : 162917.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory():this (FullOpts)
          -4 (-0.264% of base) : 162915.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_Memory_String():this (FullOpts)
          -4 (-0.242% of base) : 162916.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_MultiBlock():this (FullOpts)
          -4 (-0.201% of base) : 141861.dasm - System.IO.Pipelines.Tests.PipePoolTests:WritesToArrayPoolByDefault():this (FullOpts)
          -4 (-0.185% of base) : 162918.dasm - System.Memory.Tests.ReadOnlySequenceTryGetTests:Ctor_IMemoryList_SingleBlock():this (FullOpts)
          -4 (-0.182% of base) : 142389.dasm - System.IO.Pipelines.Tests.PipelineReaderWriterFacts:ResetAfterCompleteReaderAndWriterWithoutAdvancingClearsEverything():this (FullOpts)
          -4 (-0.162% of base) : 141852.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryAtMaxPoolSizeAllocatesFromPool():this (FullOpts)
          -4 (-0.158% of base) : 141855.dasm - System.IO.Pipelines.Tests.PipePoolTests:GetMemoryOverMaxPoolSizeAllocatesArray():this (FullOpts)
          -4 (-0.022% of base) : 106573.dasm - System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)

10 total methods with Code Size differences (10 improved, 0 regressed).

```

</details>


--------------------------------------------------------------------------------



</div></details>

<details>
<summary>benchmarks.run.linux.arm64.checked.mch</summary>
<div style="margin-left:1em">

```

Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 21285888 (overridden on cmd)
Total bytes of diff: 21285888 (overridden on cmd)
Total bytes of delta: 0 (0.00 % of base)
```
<details>

<summary>Detail diffs</summary>

```


0 total files with Code Size differences (0 improved, 0 regressed), 1 unchanged.

0 total methods with Code Size differences (0 improved, 0 regressed).

```

</details>


--------------------------------------------------------------------------------



</div></details>


</div></details>

x64 asmdiffs
Diffs are based on <span style="color:#1460aa">2,787,549</span> contexts
(<span style="color:#1460aa">1,078,277</span> MinOpts, <span
style="color:#1460aa">1,709,272</span> FullOpts).


<details>
<summary>Overall (<span style="color:green">-116</span> bytes)</summary>
<div style="margin-left:1em">

|Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs
|---|--:|--:|--:|
|coreclr_tests.run.linux.x64.checked.mch|305,501,642|<span
style="color:green">-110</span>|<span
style="color:green">-14.87%</span>|

|libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|157,729,192|<span
style="color:green">-2</span>|<span style="color:green">-0.01%</span>|
|libraries_tests.run.linux.x64.Release.mch|392,784,680|<span
style="color:green">-4</span>|<span style="color:green">-0.01%</span>|


</div></details>

<details>
<summary>MinOpts (<span style="color:green">-14</span> bytes)</summary>
<div style="margin-left:1em">

|Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs
|---|--:|--:|--:|
|coreclr_tests.run.linux.x64.checked.mch|197,469,852|<span
style="color:green">-10</span>|<span style="color:green">-1.28%</span>|
|libraries_tests.run.linux.x64.Release.mch|215,792,030|<span
style="color:green">-4</span>|<span style="color:green">-0.01%</span>|


</div></details>

<details>
<summary>FullOpts (<span style="color:green">-102</span>
bytes)</summary>
<div style="margin-left:1em">

|Collection|Base size (bytes)|Diff size (bytes)|PerfScore in Diffs
|---|--:|--:|--:|
|coreclr_tests.run.linux.x64.checked.mch|108,031,790|<span
style="color:green">-100</span>|<span
style="color:green">-16.74%</span>|

|libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|146,383,976|<span
style="color:green">-2</span>|<span style="color:green">-0.01%</span>|


</div></details>

<details>
<summary>Example diffs</summary>
<div style="margin-left:1em">


<details>
<summary>coreclr_tests.run.linux.x64.checked.mch</summary>
<div style="margin-left:1em">


<details>
<summary><span style="color:green">-8</span> (<span
style="color:green">-29.63%</span>) : 199901.dasm -
TestNeg.Program:NegsBinOpSingleLine(int,int):bool (FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -18,23 +18,19 @@ G_M18888_IG01:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
 						;; size=0 bbWeight=1 PerfScore 0.00
 G_M18888_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        sar      edi, 1
-       mov      eax, edi
-       neg      eax
        setne    al
        movzx    rax, al
-       add      esi, esi
-       mov      ecx, esi
-       neg      ecx
+       shl      esi, 1
        setne    cl
        movzx    rcx, cl
        or       eax, ecx
-						;; size=26 bbWeight=1 PerfScore 4.50
+						;; size=18 bbWeight=1 PerfScore 3.75
 G_M18888_IG03:        ; bbWeight=1, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=1 PerfScore 1.00
 ; END METHOD TestNeg.Program:NegsBinOpSingleLine(int,int):bool
 
-; Total bytes of code 27, prolog size 0, PerfScore 5.50, instruction count 12, allocated bytes for code 27 (MethodHash=d08ab637) for method TestNeg.Program:NegsBinOpSingleLine(int,int):bool (FullOpts)
+; Total bytes of code 19, prolog size 0, PerfScore 4.75, instruction count 8, allocated bytes for code 19 (MethodHash=d08ab637) for method TestNeg.Program:NegsBinOpSingleLine(int,int):bool (FullOpts)
 ; ============================================================
 
 Unwind Info:
```

</div></details>

<details>
<summary><span style="color:green">-7</span> (<span
style="color:green">-29.17%</span>) : 199894.dasm -
TestNeg.Program:NegsLSR(uint):int (FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -16,20 +16,17 @@
 G_M6300_IG01:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, nogc <-- Prolog IG
 						;; size=0 bbWeight=0.50 PerfScore 0.00
 G_M6300_IG02:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
+       mov      eax, -1
+       mov      ecx, 1
        shr      edi, 3
-       mov      eax, edi
-       mov      ecx, -1
-       mov      edx, 1
-       neg      rax
-       mov      eax, edx
-       cmove    eax, ecx
-						;; size=23 bbWeight=0.50 PerfScore 1.00
+       cmovne   eax, ecx
+						;; size=16 bbWeight=0.50 PerfScore 0.62
 G_M6300_IG03:        ; bbWeight=0.50, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=0.50 PerfScore 0.50
 ; END METHOD TestNeg.Program:NegsLSR(uint):int
 
-; Total bytes of code 24, prolog size 0, PerfScore 1.50, instruction count 8, allocated bytes for code 24 (MethodHash=2a8ee763) for method TestNeg.Program:NegsLSR(uint):int (FullOpts)
+; Total bytes of code 17, prolog size 0, PerfScore 1.12, instruction count 5, allocated bytes for code 17 (MethodHash=2a8ee763) for method TestNeg.Program:NegsLSR(uint):int (FullOpts)
 ; ============================================================
 
 Unwind Info:
```

</div></details>

<details>
<summary><span style="color:green">-7</span> (<span
style="color:green">-29.17%</span>) : 199896.dasm -
TestNeg.Program:NegsLargeShift(uint):int (FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -16,20 +16,17 @@
 G_M11276_IG01:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, nogc <-- Prolog IG
 						;; size=0 bbWeight=0.50 PerfScore 0.00
 G_M11276_IG02:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
+       mov      eax, -1
+       mov      ecx, 1
        shl      edi, 4
-       mov      eax, edi
-       mov      ecx, -1
-       mov      edx, 1
-       neg      rax
-       mov      eax, edx
-       cmove    eax, ecx
-						;; size=23 bbWeight=0.50 PerfScore 1.00
+       cmovne   eax, ecx
+						;; size=16 bbWeight=0.50 PerfScore 0.62
 G_M11276_IG03:        ; bbWeight=0.50, epilog, nogc, extend
        ret      
 						;; size=1 bbWeight=0.50 PerfScore 0.50
 ; END METHOD TestNeg.Program:NegsLargeShift(uint):int
 
-; Total bytes of code 24, prolog size 0, PerfScore 1.50, instruction count 8, allocated bytes for code 24 (MethodHash=43eed3f3) for method TestNeg.Program:NegsLargeShift(uint):int (FullOpts)
+; Total bytes of code 17, prolog size 0, PerfScore 1.12, instruction count 5, allocated bytes for code 17 (MethodHash=43eed3f3) for method TestNeg.Program:NegsLargeShift(uint):int (FullOpts)
 ; ============================================================
 
 Unwind Info:
```

</div></details>

<details>
<summary><span style="color:green">-5</span> (<span
style="color:green">-1.71%</span>) : 531325.dasm -
ILGEN_CLASS:ILGEN_METHOD(bool,char,short,int):char (Tier0)</summary>
<div style="margin-left:1em">

```diff
@@ -74,16 +74,14 @@ G_M28265_IG02:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref,
        mov      qword ptr [rbp-0x40], rdx
        mov      rax, qword ptr [rbp-0x40]
        mov      qword ptr [rbp-0x48], rax
-       mov      eax, dword ptr [rbp-0x28]
-       neg      rax
-       test     rax, rax
+       cmp      dword ptr [rbp-0x28], 0
        jne      SHORT G_M28265_IG03
        mov      eax, dword ptr [rbp-0x18]
        cmp      eax, 255
        ja       SHORT G_M28265_IG06
        mov      eax, eax
        mov      byte  ptr [rbp-0x04], al
-						;; size=182 bbWeight=1 PerfScore 117.08
+						;; size=177 bbWeight=1 PerfScore 117.58
 G_M28265_IG03:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz
        mov      eax, dword ptr [rbp-0x10]
        cmp      rax, qword ptr [rbp-0x48]
@@ -116,7 +114,7 @@ RWD16  	dq	8000000000000000h	;           -0
 RWD24  	dd	4F0BD98Fh		; 2.34629e+09
 
 
-; Total bytes of code 293, prolog size 31, PerfScore 147.42, instruction count 75, allocated bytes for code 293 (MethodHash=d26f9196) for method ILGEN_CLASS:ILGEN_METHOD(bool,char,short,int):char (Tier0)
+; Total bytes of code 288, prolog size 31, PerfScore 147.92, instruction count 73, allocated bytes for code 288 (MethodHash=d26f9196) for method ILGEN_CLASS:ILGEN_METHOD(bool,char,short,int):char (Tier0)
 ; ============================================================
 
 Unwind Info:
```

</div></details>

<details>
<summary><span style="color:green">-2</span> (<span
style="color:green">-4.17%</span>) : 181410.dasm -
ldc_neg_i4._neg:i4_3(int,int):int (MinOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -30,18 +30,17 @@ G_M1458_IG03:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byre
 						;; size=5 bbWeight=0.50 PerfScore 0.50
 G_M1458_IG04:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        xor      eax, eax
-       neg      eax
        test     eax, eax
        sete     al
        movzx    rax, al
-						;; size=12 bbWeight=1 PerfScore 2.00
+						;; size=10 bbWeight=1 PerfScore 1.75
 G_M1458_IG05:        ; bbWeight=1, epilog, nogc, extend
        add      rsp, 16
        pop      rbp
        ret      
 						;; size=6 bbWeight=1 PerfScore 1.75
 
-; Total bytes of code 48, prolog size 16, PerfScore 12.00, instruction count 16, allocated bytes for code 48 (MethodHash=0125fa4d) for method ldc_neg_i4._neg:i4_3(int,int):int (MinOpts)
+; Total bytes of code 46, prolog size 16, PerfScore 11.75, instruction count 15, allocated bytes for code 46 (MethodHash=0125fa4d) for method ldc_neg_i4._neg:i4_3(int,int):int (MinOpts)
 ; ============================================================
 
 Unwind Info:
```

</div></details>

<details>
<summary><span style="color:green">-3</span> (<span
style="color:green">-5.77%</span>) : 181421.dasm -
ldc_neg_i8._neg:i8_3(long,long):int (MinOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -30,18 +30,17 @@ G_M18290_IG03:        ; bbWeight=0.50, gcrefRegs=0000 {}, byrefRegs=0000 {}, byr
 						;; size=5 bbWeight=0.50 PerfScore 0.50
 G_M18290_IG04:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        xor      eax, eax
-       neg      rax
        test     rax, rax
        sete     al
        movzx    rax, al
-						;; size=14 bbWeight=1 PerfScore 2.00
+						;; size=11 bbWeight=1 PerfScore 1.75
 G_M18290_IG05:        ; bbWeight=1, epilog, nogc, extend
        add      rsp, 16
        pop      rbp
        ret      
 						;; size=6 bbWeight=1 PerfScore 1.75
 
-; Total bytes of code 52, prolog size 18, PerfScore 12.00, instruction count 16, allocated bytes for code 52 (MethodHash=ff46b88d) for method ldc_neg_i8._neg:i8_3(long,long):int (MinOpts)
+; Total bytes of code 49, prolog size 18, PerfScore 11.75, instruction count 15, allocated bytes for code 49 (MethodHash=ff46b88d) for method ldc_neg_i8._neg:i8_3(long,long):int (MinOpts)
 ; ============================================================
 
 Unwind Info:
```

</div></details>


</div></details>

<details>

<summary>libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch</summary>
<div style="margin-left:1em">


<details>
<summary><span style="color:green">-2</span> (<span
style="color:green">-0.01%</span>) : 124444.dasm -
System.Data.Tests.DataTableTest2:Select_ByFilter():this
(FullOpts)</summary>
<div style="margin-left:1em">

```diff
@@ -3246,7 +3246,6 @@ G_M43941_IG102:        ; bbWeight=1, gcVars=000000000000000000000000000000000000
 G_M43941_IG103:        ; bbWeight=4, gcrefRegs=F009 {rax rbx r12 r13 r14 r15}, byrefRegs=0000 {}, byref, isz
        mov      esi, dword ptr [rbp-0x30]
        sub      esi, dword ptr [rax+0x08]
-       neg      esi
        je       G_M43941_IG96
        inc      dword ptr [r13+0x14]
        mov      rdi, gword ptr [r13+0x08]
@@ -3254,7 +3253,7 @@ G_M43941_IG103:        ; bbWeight=4, gcrefRegs=F009 {rax rbx r12 r13 r14 r15}, b
        mov      esi, dword ptr [r13+0x10]
        cmp      dword ptr [rdi+0x08], esi
        jbe      SHORT G_M43941_IG106
-						;; size=31 bbWeight=4 PerfScore 65.00
+						;; size=29 bbWeight=4 PerfScore 64.00
 G_M43941_IG104:        ; bbWeight=3.05, gcVars=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 {V06}, gcrefRegs=F088 {rbx rdi r12 r13 r14 r15}, byrefRegs=0000 {}, gcvars, byref
        ; gcrRegs -[rax]
        ; GC ptr vars -{V75}
@@ -6658,7 +6657,7 @@ RWD40  	dq	4034000000000000h	;           20
 RWD48  	dq	4039000000000000h	;           25
 
 
-; Total bytes of code 14316, prolog size 28, PerfScore 7866.28, instruction count 3034, allocated bytes for code 14316 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)
+; Total bytes of code 14314, prolog size 28, PerfScore 7865.28, instruction count 3033, allocated bytes for code 14314 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (FullOpts)
 ; ============================================================
 
 Unwind Info:
```

</div></details>


</div></details>

<details>
<summary>libraries_tests.run.linux.x64.Release.mch</summary>
<div style="margin-left:1em">


<details>
<summary><span style="color:green">-4</span> (<span
style="color:green">-0.03%</span>) : 314396.dasm -
System.Data.Tests.DataTableTest2:Select_ByFilter():this (Instrumented
Tier0)</summary>
<div style="margin-left:1em">

```diff
@@ -2199,13 +2199,11 @@ G_M43941_IG57:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        ; gcr arg pop 0
        mov      ecx, dword ptr [rbp-0x240]
        sub      ecx, dword ptr [rax]
-       mov      eax, ecx
-       ; byrRegs -[rax]
-       neg      eax
-       test     eax, eax
+       test     ecx, ecx
        je       G_M43941_IG56
        mov      rdi, 0xD1FFAB1E
        call     CORINFO_HELP_COUNTPROFILE32
+       ; byrRegs -[rax]
        ; gcr arg pop 0
        mov      rdi, gword ptr [rbp-0x50]
        ; gcrRegs +[rdi]
@@ -2215,7 +2213,7 @@ G_M43941_IG57:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref
        call     [<unknown method>]
        ; gcrRegs -[rsi rdi]
        ; gcr arg pop 0
-						;; size=309 bbWeight=1 PerfScore 58.00
+						;; size=305 bbWeight=1 PerfScore 57.50
 G_M43941_IG58:        ; bbWeight=1, gcrefRegs=0000 {}, byrefRegs=0000 {}, byref, isz
        mov      eax, dword ptr [rbp-0x5E0]
        dec      eax
@@ -5412,7 +5410,7 @@ RWD08  	dq	4034000000000000h	;           20
 RWD16  	dq	4039000000000000h	;           25
 
 
-; Total bytes of code 15982, prolog size 67, PerfScore 3425.70, instruction count 2755, allocated bytes for code 15982 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (Instrumented Tier0)
+; Total bytes of code 15978, prolog size 67, PerfScore 3425.20, instruction count 2753, allocated bytes for code 15978 (MethodHash=c958545a) for method System.Data.Tests.DataTableTest2:Select_ByFilter():this (Instrumented Tier0)
 ; ============================================================
 
 Unwind Info:
```

</div></details>


</div></details>


</div></details>

<details>
<summary>Details</summary>
<div style="margin-left:1em">

#### Size improvements/regressions per collection

|Collection|Contexts with diffs|Improvements|Regressions|Same
size|Improvements (bytes)|Regressions (bytes)|
|---|--:|--:|--:|--:|--:|--:|
|benchmarks.run.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
|benchmarks.run_pgo.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
|benchmarks.run_pgo_optrepeat.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
|coreclr_tests.run.linux.x64.checked.mch|23|<span
style="color:green">23</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-110</span>|<span
style="color:red">+0</span>|
|libraries.crossgen2.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
|libraries.pmi.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|

|libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|1|<span
style="color:green">1</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-2</span>|<span
style="color:red">+0</span>|
|libraries_tests.run.linux.x64.Release.mch|1|<span
style="color:green">1</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-4</span>|<span
style="color:red">+0</span>|
|realworld.run.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
|smoke_tests.nativeaot.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span style="color:green">-0</span>|<span
style="color:red">+0</span>|
||25|<span style="color:green">25</span>|<span
style="color:red">0</span>|<span style="color:blue">0</span>|<span
style="color:green">-116</span>|<span style="color:red">+0</span>|

---

#### PerfScore improvements/regressions per collection

|Collection|Contexts with diffs|Improvements|Regressions|Same
PerfScore|Improvements (PerfScore)|Regressions (PerfScore)|PerfScore
Overall in FullOpts|
|---|--:|--:|--:|--:|--:|--:|--:|
|benchmarks.run.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|0.00%|0.00%|0.0000%|
|benchmarks.run_pgo.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|0.00%|0.00%|0.0000%|
|benchmarks.run_pgo_optrepeat.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|0.00%|0.00%|0.0000%|
|coreclr_tests.run.linux.x64.checked.mch|23|<span
style="color:green">22</span>|<span style="color:red">1</span>|<span
style="color:blue">0</span>|<span
style="color:green">-15.50%</span>|<span
style="color:red">+0.34%</span>|<span
style="color:green">-0.0017%</span>|
|libraries.crossgen2.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|0.00%|0.00%|0.0000%|
|libraries.pmi.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|0.00%|0.00%|0.0000%|

|libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|1|<span
style="color:green">1</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span
style="color:green">-0.01%</span>|0.00%|<span
style="color:green">-0.0000%</span>|
|libraries_tests.run.linux.x64.Release.mch|1|<span
style="color:green">1</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|<span
style="color:green">-0.01%</span>|0.00%|0.0000%|
|realworld.run.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|0.00%|0.00%|0.0000%|
|smoke_tests.nativeaot.linux.x64.checked.mch|0|<span
style="color:green">0</span>|<span style="color:red">0</span>|<span
style="color:blue">0</span>|0.00%|0.00%|0.0000%|

---

#### Context information

|Collection|Diffed contexts|MinOpts|FullOpts|Missed, base|Missed, diff|
|---|--:|--:|--:|--:|--:|
|benchmarks.run.linux.x64.checked.mch|75,913|2,972|72,941|0 (0.00%)|0
(0.00%)|
|benchmarks.run_pgo.linux.x64.checked.mch|122,785|86,206|36,579|0
(0.00%)|0 (0.00%)|

|benchmarks.run_pgo_optrepeat.linux.x64.checked.mch|76,998|2,939|74,059|0
(0.00%)|0 (0.00%)|
|coreclr_tests.run.linux.x64.checked.mch|577,098|358,595|218,503|0
(0.00%)|0 (0.00%)|
|libraries.crossgen2.linux.x64.checked.mch|269,385|20|269,365|0
(0.00%)|0 (0.00%)|
|libraries.pmi.linux.x64.checked.mch|354,706|8|354,698|0 (0.00%)|0
(0.00%)|

|libraries_tests_no_tiered_compilation.run.linux.x64.Release.mch|387,764|23,607|364,157|0
(0.00%)|0 (0.00%)|
|libraries_tests.run.linux.x64.Release.mch|862,114|603,896|258,218|0
(0.00%)|0 (0.00%)|
|realworld.run.linux.x64.checked.mch|29,264|21|29,243|0 (0.00%)|0
(0.00%)|
|smoke_tests.nativeaot.linux.x64.checked.mch|31,522|13|31,509|0
(0.00%)|0 (0.00%)|
||2,787,549|1,078,277|1,709,272|0 (0.00%)|0 (0.00%)|


---

#### jit-analyze output


</div></details>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.