Skip to content
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

subtyping: fast path for lhs union and rhs typevar #55413

Merged
merged 1 commit into from
Aug 14, 2024
Merged

Conversation

vtjnash
Copy link
Sponsor Member

@vtjnash vtjnash commented Aug 8, 2024

Fixes #55230

@vtjnash vtjnash added the types and dispatch Types, subtyping and method dispatch label Aug 8, 2024
@vtjnash vtjnash added the needs pkgeval Tests for all registered packages should be run with this change label Aug 8, 2024
@vtjnash
Copy link
Sponsor Member Author

vtjnash commented Aug 8, 2024

@nanosoldier runbenchmarks(!"scalar", vs=":master")

@oscardssmith oscardssmith added the performance Must go faster label Aug 8, 2024
@nanosoldier
Copy link
Collaborator

Your benchmark job has completed - possible performance regressions were detected. A full report can be found here.

@vtjnash
Copy link
Sponsor Member Author

vtjnash commented Aug 8, 2024

Looking closer into a test failure, I realized this instead needed to be guarded with jl_has_free_typevars(u) (to avoid the possibility of a union element becoming degenerate in simple_join but not being able to detect that without testing each element separately). The remaining check e->Runions.depth == 0 is still needed to avoid introducing this failure:

Error in testset subtype:
Test Failed at /home/vtjnash/julia/test/subtype.jl:1642
  Expression: U2 == V
   Evaluated: Union{Tuple{LT, R, Int64} where {R<:Tuple{Int64}, LT<:Int64}, Tuple{LT, R, Int64} where {R<:Tuple{Int64}, LT<:R}} == Tuple{Union{Int64, Tuple{Int64}}, Tuple{Int64}, Int64}

Which comes from this kind of union-tuple switch:

julia> Tuple{Union{Int64, Tuple{Int64}}} <: Union{Tuple{<:Integer}, Tuple{<:Tuple}}
false # should be true

@vtjnash
Copy link
Sponsor Member Author

vtjnash commented Aug 8, 2024

@nanosoldier runtests()

@vtjnash vtjnash force-pushed the jn/55230 branch 2 times, most recently from fc6047b to 3c075c9 Compare August 8, 2024 18:48
@nanosoldier
Copy link
Collaborator

The package evaluation job you requested has completed - possible new issues were detected.
The full report is available.

@vtjnash vtjnash removed the needs pkgeval Tests for all registered packages should be run with this change label Aug 9, 2024
@N5N3
Copy link
Member

N5N3 commented Aug 14, 2024

I haven't verified it locally, but this change seems to break Tuple{Union{Val{1},Val{2}}} <: Tuple{S} where {T, S<:Val{T}}?
(subtype_ccheck traverses all internal ∀ unions, so we need to ensure there's no free typevars in y's ub.)

@vtjnash
Copy link
Sponsor Member Author

vtjnash commented Aug 14, 2024

You are correct, that one would be broken by this fast path attempt, so I added that as a test and added your suggested fix. Do you think this is correct now? Or would it still become wrong if something was added to the stenv constraints?

@vtjnash vtjnash added the backport 1.11 Change should be backported to release-1.11 label Aug 14, 2024
@JeffBezanson JeffBezanson merged commit c7309d0 into master Aug 14, 2024
8 checks passed
@JeffBezanson JeffBezanson deleted the jn/55230 branch August 14, 2024 21:05
N5N3 added a commit to N5N3/julia that referenced this pull request Aug 16, 2024
This commit makes the check more focused on the related error pattern.
lazarusA pushed a commit to lazarusA/julia that referenced this pull request Aug 17, 2024
KristofferC pushed a commit that referenced this pull request Aug 19, 2024
@KristofferC KristofferC mentioned this pull request Aug 19, 2024
68 tasks
KristofferC added a commit that referenced this pull request Aug 26, 2024
Backported PRs:
- [x] #54962 <!-- Add timing to precompile trace compile -->
- [x] #55180 <!-- compress jit debuginfo for easy memory savings -->
- [x] #54919 <!-- Fix annotated join with non-concrete eltype iters -->
- [x] #55013 <!-- [docs] change docstring to match code -->
- [x] #55017 <!-- TOML: Make `Dates` a type parameter -->
- [x] #54033 <!-- Fix a bug in `stack`'s DimensionMismatch error message
-->
- [x] #55242 <!-- fix at-main docstring to not code quote a compat box
-->
- [x] #55261 <!-- Make `jl_*affinity` tests more portable -->
- [x] #54736 <!-- specificity: ensure fast-path in `sub/eq_msp` handle
missing `UnionAll` wrapper correctly. -->
- [x] #55299 <!-- typeintersect: fix bounds merging during inner
`intersect_all`. -->
- [x] #55302 <!-- Add `lbt_forwarded_funcs()` to debug LBT forwarding
issues -->
- [x] #55148 <!-- Random: Mark unexported public symbols as public -->
- [x] #55303 <!-- avoid overflowing show for OffsetArrays around typemax
-->
- [x] #55317 <!-- Restrict argument to `isleapyear(::Integer)` -->
- [x] #55327 <!-- Profile: Fix stdlib paths -->
- [x] #55330 <!-- [libblastrampoline] Bump to v5.11.0 -->
- [x] #55310 <!-- Preserve structure in scaling triangular matrices by
NaN -->
- [x] #55329 <!-- mapreduce: don't inbounds unknown functions -->
- [x] #55356 <!-- Profile: close files when assembling heap snapshot -->
- [x] #55371 <!-- Fix tr for block SymTridiagonal -->
- [x] #55307 <!-- Make REPL.TerminalMenus public -->
- [x] #55362 <!-- inference: fix missing LimitedAccuracy markers -->
- [x] #55306 <!-- AllocOpt: Fix stack lowering where alloca continas
boxed and unboxed data -->
- [x] #55395 <!-- fix #55389: type-unstable `join` -->
- [x] #55226 <!-- re-add `unsafe_convert` for Reinterpret and Reshaped
array -->
- [x] #55405 <!-- handle unbound vars in NTuple fields -->
- [x] #55365 <!-- ml-matches: ensure all methods are included -->
- [x] #55428 <!-- codegen: move undef freeze before promotion point -->
- [x] #55419 <!-- `stale_cachefile`: handle if the expected cache file
is missing -->
- [x] #55470 <!-- Add push! implementation for AbstractArray depending
only on resize! -->
- [x] #55483 <!-- fix hierarchy level of "API reference" in `Dates`
documentation -->
- [x] #55268 <!-- simplify complex atanh and remove singularity
perturbation -->
- [x] #55441 <!-- fix Event to use normal Condition variable -->
- [x] #55413 <!-- subtyping: fast path for lhs union and rhs typevar -->
- [x] #55492 <!-- build: add missing dependencies for expmap -->
- [x] #55507 <!-- Fix fast getptls ccall lowering. -->
- [x] #55424 <!-- add missing clamp function for IOBuffer -->
- [x] #55504 <!-- Update symmetric docstring to reflect the type of uplo
-->
- [x] #55107 <!-- Make the memory GEP an inbounds GEP since the bounds
check has happened somewhere else -->
- [x] #55411 <!-- Vendor the terminfo database for use with
base/terminfo.jl -->
- [x] #55452 <!-- Do not load `ScopedValues` with `using` -->
- [x] #55407 <!-- Remove deprecated non string API for LLVM pass
pipeline and parse all options -->
- [x] #55461 <!-- 🤖 [master] Bump the StyledStrings stdlib from d7496d2
to f6035eb -->
- [x] #55433 <!-- Backport #55407
to 1.11 -->
- [x] #55225 <!-- [1.11 backport] trace-compile: don't generate
`precompile` statements for OpaqueClosure methods (#55072) -->
- [x] #55212 <!-- Make `Base.depwarn()` public -->
- [x] #552
- [x] #55052 <!-- Fix `(l/r)mul!` with `Diagonal`/`Bidiagonal` -->
- [x] #55251 <!-- Restrict binary ops for Diagonal and Symmetric to
Number eltypes -->95 <!-- LAPACK: Aggressive constprop to concretely
infer syev!/syevd! -->
- [x] #55522 <!-- Fix tr for Symmetric/Hermitian block matrices -->

Need manual backport:
- [x] #55342 <!-- Ensure bidiagonal setindex! does not read indices in
error message -->

Contains multiple commits, manual intervention needed:

- [ ] #55336 <!-- codegen: take gc roots (and alloca alignment) more
seriously -->


Non-merged PRs with backport label:
- [ ] #55506 <!-- Fix indexing in _mapreducedim for OffsetArrays -->
- [ ] #55500 <!-- make jl_thread_suspend_and_get_state safe -->
- [ ] #55499 <!-- propagate the terminal's `displaysize` to the
`IOContext` used by the REPL -->
- [ ] #55458 <!-- Allow for generically extracting unannotated string
-->
- [ ] #55457 <!-- Make AnnotateChar equality consider annotations -->
- [ ] #55453 <!-- Privatise the annotations API, for StyledStrings -->
- [ ] #55443 <!-- Add test for upper/lower/titlecase and fix call -->
- [ ] #55355 <!-- relocation: account for trailing path separator in
depot paths -->
- [ ] #55220 <!-- `isfile_casesensitive` fixes on Windows -->
- [ ] #55169 <!-- `propertynames` for SVD respects private argument -->
- [ ] #54457 <!-- Make `String(::Memory)` copy -->
- [ ] #53957 <!-- tweak how filtering is done for what packages should
be precompiled -->
- [ ] #51479 <!-- prevent code loading from lookin in the versioned
environment when building Julia -->
- [ ] #50813 <!-- More doctests for Sockets and capitalization fix -->
- [ ] #50157 <!-- improve docs for `@inbounds` and
`Base.@propagate_inbounds` -->
- [ ] #41244 <!-- Fix shell `cd` error when working dir has been deleted
-->
@KristofferC KristofferC removed the backport 1.11 Change should be backported to release-1.11 label Aug 26, 2024
N5N3 added a commit to N5N3/julia that referenced this pull request Aug 28, 2024
This commit makes the check more focused on the related error pattern.
N5N3 added a commit to N5N3/julia that referenced this pull request Aug 31, 2024
This commit makes the check more focused on the related error pattern.
N5N3 added a commit to N5N3/julia that referenced this pull request Aug 31, 2024
This commit makes the check more focused on the related error pattern.
vtjnash pushed a commit that referenced this pull request Sep 4, 2024
…55645)

Follow up #55413.
The error pattern mentioned in
#55413 (comment)
care's `∃y`'s ub in env rather than its original ub.
So it seems more robust to check the bounds in env directly.
The equivalent typevar propagation is lifted from `subtype_var` for the
same reason.
KristofferC pushed a commit that referenced this pull request Sep 12, 2024
…55645)

Follow up #55413.
The error pattern mentioned in
#55413 (comment)
care's `∃y`'s ub in env rather than its original ub.
So it seems more robust to check the bounds in env directly.
The equivalent typevar propagation is lifted from `subtype_var` for the
same reason.
kshyatt pushed a commit that referenced this pull request Sep 12, 2024
…55645)

Follow up #55413.
The error pattern mentioned in
#55413 (comment)
care's `∃y`'s ub in env rather than its original ub.
So it seems more robust to check the bounds in env directly.
The equivalent typevar propagation is lifted from `subtype_var` for the
same reason.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
performance Must go faster types and dispatch Types, subtyping and method dispatch
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Inference regression in 1.11
6 participants