-
Notifications
You must be signed in to change notification settings - Fork 4.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
typeof(T).IsValueType not completely unimpactful in some cases #48605
Comments
Well, it's still removed, it's just some extra |
Right, I meant its impact should be completely removed. But it still has an impact. |
This is likely another example highlighting the need for forward substitution in the JIT (#6973). The statement that gets removed also breaks up a tree and so inhibits tree-based optimizations like address mode building. We don't have anything that will try and glue broken trees back together. |
@AndyAyersMS so no solution until we implement forward substitution? |
Not that I know of, no. |
I don't expect us to get to this in .Net 6. So marking as future. |
Extend ref counting done by local morph so that we can determine single-def single-use locals. Add a phase that runs just after local morph that will attempt to forward single-def single-use local defs to uses when they are in adjacent statements. Fix or work around issues uncovered elsewhere: * `gtFoldExprCompare` might fold "identical" volatile subtrees * `fgGetStubAddrArg` cannot handle complex trees * some simd/hw operations can lose struct handles * some calls cannot handle struct local args Addresses dotnet#6973 and related issues. Still sorting through exactly which ones are fixed, so list below may need revising. Fixes dotnet#48605. Fixes dotnet#51599. Fixes dotnet#55472. Improves some but not all cases in dotnet#12280 and dotnet#62064. Does not fix dotnet#33002, dotnet#47082, or dotnet#63116; these require handling multiple uses or bypassing statements.
Extend ref counting done by local morph so that we can determine single-def single-use locals. Add a phase that runs just after local morph that will attempt to forward single-def single-use local defs to uses when they are in adjacent statements. Fix or work around issues uncovered elsewhere: * `gtFoldExprCompare` might fold "identical" volatile subtrees * `fgGetStubAddrArg` cannot handle complex trees * some simd/hw operations can lose struct handles * some calls cannot handle struct local args * morph expects args not to interfere * fix arm; don't forward sub no return calls * update debuginfo test (we may want to revisit this) * handle subbing past normalize on store assignment * clean up nullcheck of new helper Addresses #6973 and related issues. Still sorting through exactly which ones are fixed, so list below may need revising. Fixes #48605. Fixes #51599. Fixes #55472. Improves some but not all cases in #12280 and #62064. Does not fix #33002, #47082, or #63116; these require handling multiple uses or bypassing statements.
The JIT has an optimization to treat
typeof(T).IsValueType
as a const based on the T being specified, but in some cases the presence of the check is still having an impact on the generated asm.Non-sensical repro (derived from much more complicated real-world scenario in dotnet/roslyn#51383):
The non-value type branch in Get2 should in theory be removed completely, but using a recent .NET 6 nightly, this results in:
.NET 6.0.0 (6.0.21.11705), X64 RyuJIT
.NET 6.0.0 (6.0.21.11705), X64 RyuJIT
Note the difference between:
and
category:cq
theme:optimization
skill-level:expert
cost:large
impact:medium
The text was updated successfully, but these errors were encountered: