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

irrationals: restrict assume effects annotations to known types #55886

Merged
merged 3 commits into from
Oct 10, 2024

Conversation

nsajko
Copy link
Contributor

@nsajko nsajko commented Sep 26, 2024

Other changes:

Other issues, related to BigFloat precision, are still present in irrationals.jl, to be fixed by followup PRs, including #55853.

Fixes #55874

Other changes:
* replace `:total` with the less powerful `:foldable`
* add an `<:Integer` dispatch constraint on the `rationalize` method,
  closes JuliaLang#55872
* replace `Rational{<:Integer}` with just `Rational`, they're equal

Other issues, related to `BigFloat` precision, are still present in
irrationals.jl, to be fixed by followup PRs, including JuliaLang#55853.

Fixes JuliaLang#55874
@nsajko nsajko added the bugfix This change fixes an existing bug label Sep 26, 2024
@nsajko nsajko added backport 1.10 Change should be backported to the 1.10 release backport 1.11 Change should be backported to release-1.11 labels Sep 26, 2024
base/mathconstants.jl Outdated Show resolved Hide resolved
@KristofferC KristofferC mentioned this pull request Sep 30, 2024
39 tasks
KristofferC added a commit that referenced this pull request Oct 1, 2024
Backported PRs:
- [x] #55849 <!-- Mmap: fix grow! for non file IOs -->
- [x] #55863 <!-- Update TaskLocalRNG docstring according to #49110 -->
- [x] #54433 <!-- Root globals in toplevel exprs -->
- [x] #55828 <!-- Fix some corner cases of `isapprox` with unsigned
integers -->
- [x] #55890 <!-- Profile: fix order of fields in heapsnapshot & improve
formatting -->
- [x] #55884 <!-- inference: add missing `TypeVar` handling for
`instanceof_tfunc` -->
- [x] #55881 <!-- Install terminfo data under /usr/share/julia -->
- [x] #55909 <!-- do not intentionally suppress errors in precompile
script from being reported or failing the result -->
- [x] #55355 <!-- relocation: account for trailing path separator in
depot paths -->
- [x] #55917 <!-- fix rawbigints OOB issues -->
- [x] #55892 <!-- TOML: Avoid type-pirating `Base.TOML.Parser` -->
- [x] #55798 <!-- Broadcast binary ops involving strided triangular -->
- [x] #55919 <!-- Limit `@inbounds` to indexing in the dual-iterator
branch in `copyto_unaliased!` -->

Contains multiple commits, manual intervention needed:
- [ ] #54009 <!-- allow extensions to trigger from packages in [deps]
-->
- [ ] #55509 <!-- Fix cong implementation to be properly random and not
just cycling. -->
- [ ] #55569 <!-- Add a docs section about loading/precomp/ttfx time
tuning -->
- [ ] #55824 <!-- Replace regex package module checks with actual code
checks -->

Non-merged PRs with backport label:
- [ ] #55932 <!-- REPL: make UndefVarError aware of imported modules -->
- [ ] #55910 <!-- Prevent extensions from blocking parallel
pre-compilation -->
- [ ] #55908 <!-- add logic to prefer loading modules that are already
loaded -->
- [ ] #55886 <!-- irrationals: restrict assume effects annotations to
known types -->
- [ ] #55871 <!-- lowering: don't reverse handler order in
`(pop-handler-list ...)` -->
- [ ] #55870 <!-- fix infinite recursion in `promote_type` for
`Irrational` -->
- [ ] #55867 <!-- update `hash` doc string: `widen` not required any
more -->
- [ ] #55851 <!-- [REPL] Fix #55850 by using `safe_realpath` instead of
`abspath` in `projname` -->
- [ ] #55813 <!-- Check for conflicting `@ccallable` name before JIT
registration -->
- [ ] #55743 <!-- doc: heap snapshot viewing -->
- [ ] #55741 <!-- Change annotations to use a NamedTuple -->
- [ ] #55534 <!-- Set stdlib sources as read-only during installation
-->
- [ ] #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 -->
- [ ] #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` -->
This was referenced Oct 7, 2024
@nsajko
Copy link
Contributor Author

nsajko commented Oct 10, 2024

bump

@vtjnash vtjnash merged commit d60837f into JuliaLang:master Oct 10, 2024
7 checks passed
@nsajko nsajko deleted the known_irrational branch October 10, 2024 14:25
KristofferC pushed a commit that referenced this pull request Oct 18, 2024
Other changes:
* replace `:total` with the less powerful `:foldable`
* add an `<:Integer` dispatch constraint on the `rationalize` method,
closes #55872
* replace `Rational{<:Integer}` with just `Rational`, they're equal

Other issues, related to `BigFloat` precision, are still present in
irrationals.jl, to be fixed by followup PRs, including #55853.

Fixes #55874

(cherry picked from commit d60837f)
@KristofferC KristofferC mentioned this pull request Oct 18, 2024
43 tasks
@giordano giordano removed the backport 1.11 Change should be backported to release-1.11 label Oct 19, 2024
udesou added a commit to mmtk/julia that referenced this pull request Oct 22, 2024
* Add filesystem func to transform a path to a URI (#55454)

In a few places across Base and the stdlib, we emit paths that we like
people to be able to click on in their terminal and editor. Up to this
point, we have relied on auto-filepath detection, but this does not
allow for alternative link text, such as contracted paths.

Doing so (via OSC 8 terminal links for example) requires filepath URI
encoding.

This functionality was previously part of a PR modifying stacktrace
printing (#51816), but after that became held up for unrelated reasons
and another PR appeared that would benefit from this utility (#55335),
I've split out this functionality so it can be used before the
stacktrace printing PR is resolved.

* constrain the path argument of `include` functions to `AbstractString` (#55466)

Each `Module` defined with `module` automatically gets an `include`
function with two methods. Each of those two methods takes a file path
as its last argument. Even though the path argument is unconstrained by
dispatch, it's documented as constrained with `::AbstractString`:

https://docs.julialang.org/en/v1.11-dev/base/base/#include

Furthermore, I think that any invocation of `include` with a
non-`AbstractString` path will necessarily throw a `MethodError`
eventually. Thus this change should be harmless.

Adding the type constraint to the path argument is an improvement
because any possible exception would be thrown earlier than before.

Apart from modules defined with `module`, the same issue is present with
the anonymous modules created by `evalfile`, which is also addressed.

Sidenote: `evalfile` seems to be completely untested apart from the test
added here.

Co-authored-by: Florian <florian.atteneder@gmail.com>

* Mmap: fix grow! for non file IOs (#55849)

Fixes https://github.com/JuliaLang/julia/issues/54203
Requires #55641

Based on
https://github.com/JuliaLang/julia/pull/55641#issuecomment-2334162489
cc. @JakeZw @ronisbr

---------

Co-authored-by: Jameson Nash <vtjnash@gmail.com>

* codegen: split gc roots from other bits on stack (#55767)

In order to help avoid memory provenance issues, and better utilize
stack space (somewhat), and use FCA less, change the preferred
representation of an immutable object to be a pair of
`<packed-data,roots>` values. This packing requires some care at the
boundaries and if the expected field alignment exceeds that of a
pointer. The change is expected to eventually make codegen more flexible
at representing unions of values with both bits and pointer regions.

Eventually we can also have someone improve the late-gc-lowering pass to
take advantage of this increased information accuracy, but currently it
will not be any better than before at laying out the frame.

* Refactoring to be considered before adding MMTk

* Removing jl_gc_notify_image_load, since it's a new function and not part of the refactoring

* Moving gc_enable code to gc-common.c

* Addressing PR comments

* Push resolution of merge conflict

* Removing jl_gc_mark_queue_obj_explicit extern definition from scheduler.c

* Don't need the getter function since it's possible to use jl_small_typeof directly

* WIP: Adding support for MMTk/Immix

* Refactoring to be considered before adding MMTk

* Adding fastpath allocation

* Fixing removed newlines

* Refactoring to be considered before adding MMTk

* Adding a few comments; Moving some functions to be closer together

* Fixing merge conflicts

* Applying changes from refactoring before adding MMTk

* Update TaskLocalRNG docstring according to #49110 (#55863)

Since #49110, which is included in 1.10 and 1.11, spawning a task no
longer advances the parent task's RNG state, so this statement in the
docs was incorrect.

* Root globals in toplevel exprs (#54433)

This fixes #54422, the code here assumes that top level exprs are always
rooted, but I don't see that referenced anywhere else, or guaranteed, so
conservatively always root objects that show up in code.

* codegen: fix alignment typos (#55880)

So easy to type jl_datatype_align to get the natural alignment instead
of julia_alignment to get the actual alignment. This should fix the
Revise workload.

Change is visible with
```
julia> code_llvm(Random.XoshiroSimd.forkRand, (Random.TaskLocalRNG, Base.Val{8}))
```

* Fix some corner cases of `isapprox` with unsigned integers (#55828)

* 🤖 [master] Bump the Pkg stdlib from ef9f76c17 to 51d4910c1 (#55896)

* Profile: fix order of fields in heapsnapshot & improve formatting (#55890)

* Profile: Improve generation of clickable terminal links (#55857)

* inference: add missing `TypeVar` handling for `instanceof_tfunc` (#55884)

I thought these sort of problems had been addressed by d60f92c, but it
seems some were missed. Specifically, `t.a` and `t.b` from `t::Union`
could be `TypeVar`, and if they are passed to a subroutine or recursed
without being unwrapped or rewrapped, errors like JuliaLang/julia#55882
could occur.

This commit resolves the issue by calling `unwraptv` in the `Union`
handling within `instanceof_tfunc`. I also found a similar issue inside
`nfields_tfunc`, so that has also been fixed, and test cases have been
added. While I haven't been able to make up a test case specifically for
the fix in `instanceof_tfunc`, I have confirmed that this commit
certainly fixes the issue reported in JuliaLang/julia#55882.

- fixes JuliaLang/julia#55882

* Install terminfo data under /usr/share/julia (#55881)

Just like all other libraries, we don't want internal Julia files to
mess with system files.

Introduced by https://github.com/JuliaLang/julia/pull/55411.

* expose metric to report reasons why full GCs were triggered (#55826)

Additional GC observability tool.

This will help us to diagnose why some of our servers are triggering so
many full GCs in certain circumstances.

* Revert "Improve printing of several arguments" (#55894)

Reverts JuliaLang/julia#55754 as it overrode some performance heuristics
which appeared to be giving a significant gain/loss in performance:
Closes https://github.com/JuliaLang/julia/issues/55893

* Do not trigger deprecation warnings in `Test.detect_ambiguities` and `Test.detect_unbound_args` (#55869)

#55868

* do not intentionally suppress errors in precompile script from being reported or failing the result (#55909)

I was slightly annoying that the build was set up to succeed if this
step failed, so I removed the error suppression and fixed up the script
slightly

* Remove eigvecs method for SymTridiagonal (#55903)

The fallback method does the same, so this specialized method isn't
necessary

* add --trim option for generating smaller binaries (#55047)

This adds a command line option `--trim` that builds images where code
is only included if it is statically reachable from methods marked using
the new function `entrypoint`. Compile-time errors are given for call
sites that are too dynamic to allow trimming the call graph (however
there is an `unsafe` option if you want to try building anyway to see
what happens).

The PR has two other components. One is changes to Base that generally
allow more code to be compiled in this mode. These changes will either
be merged in separate PRs or moved to a separate part of the workflow
(where we will build a custom system image for this purpose). The branch
is set up this way to make it easy to check out and try the
functionality.

The other component is everything in the `juliac/` directory, which
implements a compiler driver script based on this new option, along with
some examples and tests. This will eventually become a package "app"
that depends on PackageCompiler and provides a CLI for all of this
stuff, so it will not be merged here. To try an example:

```
julia contrib/juliac.jl --output-exe hello --trim test/trimming/hello.jl
```

When stripped the resulting executable is currently about 900kb on my
machine.

Also includes a lot of work by @topolarity

---------

Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
Co-authored-by: Tim Holy <tim.holy@gmail.com>
Co-authored-by: Cody Tapscott <topolarity@tapscott.me>

* fix rawbigints OOB issues (#55917)

Fixes issues introduced in #50691 and found in #55906:
* use `@inbounds` and `@boundscheck` macros in rawbigints, for catching
OOB with `--check-bounds=yes`
* fix OOB in `truncate`

* prevent loading other extensions when precompiling an extension (#55589)

The current way of loading extensions when precompiling an extension
very easily leads to cycles. For example, if you have more than one
extension and you happen to transitively depend on the triggers of one
of your extensions you will immediately hit a cycle where the extensions
will try to load each other indefinitely. This is an issue because you
cannot directly influence your transitive dependency graph so from this
p.o.v the current system of loading extension is "unsound".

The test added here checks this scenario and we can now precompile and
load it without any warnings or issues.

Would have made https://github.com/JuliaLang/julia/issues/55517 a non
issue.

Fixes https://github.com/JuliaLang/julia/issues/55557

---------

Co-authored-by: KristofferC <kristoffer.carlsson@juliacomputing.com>

* TOML: Avoid type-pirating `Base.TOML.Parser` (#55892)

Since stdlibs can be duplicated but Base never is, `Base.require_stdlib`
makes type piracy even more complicated than it normally would be.

To adapt, this changes `TOML.Parser` to be a type defined by the TOML
stdlib, so that we can define methods on it without committing
type-piracy and avoid problems like Pkg.jl#4017

Resolves
https://github.com/JuliaLang/Pkg.jl/issues/4017#issuecomment-2377589989

* [FileWatching] fix PollingFileWatcher design and add workaround for a stat bug

What started as an innocent fix for a stat bug on Apple (#48667) turned
into a full blown investigation into the design problems with the libuv
backend for PollingFileWatcher, and writing my own implementation of it
instead which could avoid those singled-threaded concurrency bugs.

* [FileWatching] fix FileMonitor similarly and improve pidfile reliability

Previously pidfile used the same poll_interval as sleep to detect if
this code made any concurrency mistakes, but we do not really need to do
that once FileMonitor is fixed to be reliable in the presence of
parallel concurrency (instead of using watch_file).

* [FileWatching] reorganize file and add docs

* Add `--trace-dispatch` (#55848)

* relocation: account for trailing path separator in depot paths (#55355)

Fixes #55340

* change compiler to be stackless (#55575)

This change ensures the compiler uses very little stack, making it
compatible with running on any arbitrary system stack size and depths
much more reliably. It also could be further modified now to easily add
various forms of pause-able/resumable inference, since there is no
implicit state on the stack--everything is local and explicit now.

Whereas before, less than 900 frames would crash in less than a second:
```
$ time ./julia -e 'f(::Val{N}) where {N} = N <= 0 ? 0 : f(Val(N - 1)); f(Val(1000))'
Warning: detected a stack overflow; program state may be corrupted, so further execution might be unreliable.
Internal error: during type inference of
f(Base.Val{1000})
Encountered stack overflow.
This might be caused by recursion over very long tuples or argument lists.

[23763] signal 6: Abort trap: 6
in expression starting at none:1
__pthread_kill at /usr/lib/system/libsystem_kernel.dylib (unknown line)
Allocations: 1 (Pool: 1; Big: 0); GC: 0
Abort trap: 6

real	0m0.233s
user	0m0.165s
sys	0m0.049s
````

Now: it is effectively unlimited, as long as you are willing to wait for
it:
```
$ time ./julia -e 'f(::Val{N}) where {N} = N <= 0 ? 0 : f(Val(N - 1)); f(Val(50000))'
info: inference of f(Base.Val{50000}) from f(Base.Val{N}) where {N} exceeding 2500 frames (may be slow).
info: inference of f(Base.Val{50000}) from f(Base.Val{N}) where {N} exceeding 5000 frames (may be slow).
info: inference of f(Base.Val{50000}) from f(Base.Val{N}) where {N} exceeding 10000 frames (may be slow).
info: inference of f(Base.Val{50000}) from f(Base.Val{N}) where {N} exceeding 20000 frames (may be slow).
info: inference of f(Base.Val{50000}) from f(Base.Val{N}) where {N} exceeding 40000 frames (may be slow).
real	7m4.988s

$ time ./julia -e 'f(::Val{N}) where {N} = N <= 0 ? 0 : f(Val(N - 1)); f(Val(1000))'
real	0m0.214s
user	0m0.164s
sys	0m0.044s

$ time ./julia -e '@noinline f(::Val{N}) where {N} = N <= 0 ? GC.safepoint() : f(Val(N - 1)); f(Val(5000))'
info: inference of f(Base.Val{5000}) from f(Base.Val{N}) where {N} exceeding 2500 frames (may be slow).
info: inference of f(Base.Val{5000}) from f(Base.Val{N}) where {N} exceeding 5000 frames (may be slow).
real	0m8.609s
user	0m8.358s
sys	0m0.240s
```

* optimizer: simplify the finalizer inlining pass a bit (#55934)

Minor adjustments have been made to the algorithm of the finalizer
inlining pass. Previously, it required that the finalizer registration
dominate all uses, but this is not always necessary as far as the
finalizer inlining point dominates all the uses. So the check has been
relaxed. Other minor fixes have been made as well, but their importance
is low.

* Limit `@inbounds` to indexing in the dual-iterator branch in `copyto_unaliased!` (#55919)

This simplifies the `copyto_unalised!` implementation where the source
and destination have different `IndexStyle`s, and limits the `@inbounds`
to only the indexing operation. In particular, the iteration over
`eachindex(dest)` is not marked as `@inbounds` anymore. This seems to
help with performance when the destination uses Cartesian indexing.
Reduced implementation of the branch:
```julia
function copyto_proposed!(dest, src)
    axes(dest) == axes(src) || throw(ArgumentError("incompatible sizes"))
    iterdest, itersrc = eachindex(dest), eachindex(src)
    for (destind, srcind) in zip(iterdest, itersrc)
        @inbounds dest[destind] = src[srcind]
    end
    dest
end

function copyto_current!(dest, src)
    axes(dest) == axes(src) || throw(ArgumentError("incompatible sizes"))
    iterdest, itersrc = eachindex(dest), eachindex(src)
    ret = iterate(iterdest)
    @inbounds for a in src
        idx, state = ret::NTuple{2,Any}
        dest[idx] = a
        ret = iterate(iterdest, state)
    end
    dest
end

function copyto_current_limitinbounds!(dest, src)
    axes(dest) == axes(src) || throw(ArgumentError("incompatible sizes"))
    iterdest, itersrc = eachindex(dest), eachindex(src)
    ret = iterate(iterdest)
    for isrc in itersrc
        idx, state = ret::NTuple{2,Any}
        @inbounds dest[idx] = src[isrc]
        ret = iterate(iterdest, state)
    end
    dest
end
```
```julia
julia> a = zeros(40000,4000); b = rand(size(a)...);

julia> av = view(a, UnitRange.(axes(a))...);

julia> @btime copyto_current!($av, $b);
  617.704 ms (0 allocations: 0 bytes)

julia> @btime copyto_current_limitinbounds!($av, $b);
  304.146 ms (0 allocations: 0 bytes)

julia> @btime copyto_proposed!($av, $b);
  240.217 ms (0 allocations: 0 bytes)

julia> versioninfo()
Julia Version 1.12.0-DEV.1260
Commit 4a4ca9c8152 (2024-09-28 01:49 UTC)
Build Info:
  Official https://julialang.org release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 8 × Intel(R) Core(TM) i5-10310U CPU @ 1.70GHz
  WORD_SIZE: 64
  LLVM: libLLVM-18.1.7 (ORCJIT, skylake)
Threads: 1 default, 0 interactive, 1 GC (on 8 virtual cores)
Environment:
  JULIA_EDITOR = subl
```
I'm not quite certain why the proposed implementation here
(`copyto_proposed!`) is even faster than
`copyto_current_limitinbounds!`. In any case, `copyto_proposed!` is
easier to read, so I'm not complaining.

This fixes https://github.com/JuliaLang/julia/issues/53158

* Strong zero in Diagonal triple multiplication (#55927)

Currently, triple multiplication with a `LinearAlgebra.BandedMatrix`
sandwiched between two `Diagonal`s isn't associative, as this is
implemented using broadcasting, which doesn't assume a strong zero,
whereas the two-term matrix multiplication does.
```julia
julia> D = Diagonal(StepRangeLen(NaN, 0, 3));

julia> B = Bidiagonal(1:3, 1:2, :U);

julia> D * B * D
3×3 Matrix{Float64}:
 NaN  NaN  NaN
 NaN  NaN  NaN
 NaN  NaN  NaN

julia> (D * B) * D
3×3 Bidiagonal{Float64, Vector{Float64}}:
 NaN    NaN       ⋅ 
    ⋅   NaN    NaN
    ⋅      ⋅   NaN

julia> D * (B * D)
3×3 Bidiagonal{Float64, Vector{Float64}}:
 NaN    NaN       ⋅ 
    ⋅   NaN    NaN
    ⋅      ⋅   NaN
```
This PR ensures that the 3-term multiplication is evaluated as a
sequence of two-term multiplications, which fixes this issue. This also
improves performance, as only the bands need to be evaluated now.
```julia
julia> D = Diagonal(1:1000); B = Bidiagonal(1:1000, 1:999, :U);

julia> @btime $D * $B * $D;
  656.364 μs (11 allocations: 7.63 MiB) # v"1.12.0-DEV.1262"
  2.483 μs (12 allocations: 31.50 KiB) # This PR
```

* Fix dispatch on `alg` in Float16 Hermitian eigen (#55928)

Currently,
```julia
julia> using LinearAlgebra

julia> A = Hermitian(reshape(Float16[1:16;], 4, 4));

julia> eigen(A).values |> typeof
Vector{Float16} (alias for Array{Float16, 1})

julia> eigen(A, LinearAlgebra.QRIteration()).values |> typeof
Vector{Float32} (alias for Array{Float32, 1})
```
This PR moves the specialization on the `eltype` to an internal method,
so that firstly all `alg`s dispatch to that method, and secondly, there
are no ambiguities introduce by specializing the top-level `eigen`. The
latter currently causes test failures in `StaticArrays`
(https://github.com/JuliaArrays/StaticArrays.jl/actions/runs/11092206012/job/30816955210?pr=1279),
and should be fixed by this PR.

* Remove specialized `ishermitian` method for `Diagonal{<:Real}` (#55948)

The fallback method for `Diagonal{<:Number}` handles this already by
checking that the `diag` is real, so we don't need this additional
specialization.

* Fix logic in `?` docstring example (#55945)

* fix `unwrap_macrocalls` (#55950)

The implementation of `unwrap_macrocalls` has assumed that what
`:macrocall` wraps is always an `Expr` object, but that is not
necessarily correct:
```julia
julia> Base.@assume_effects :nothrow @show 42
ERROR: LoadError: TypeError: in typeassert, expected Expr, got a value of type Int64
Stacktrace:
 [1] unwrap_macrocalls(ex::Expr)
   @ Base ./expr.jl:906
 [2] var"@assume_effects"(__source__::LineNumberNode, __module__::Module, args::Vararg{Any})
   @ Base ./expr.jl:756
in expression starting at REPL[1]:1
```
This commit addresses this issue.

* make faster BigFloats (#55906)

We can coalesce the two required allocations for the MFPR BigFloat API
design into one allocation, hopefully giving a easy performance boost.
It would have been slightly easier and more efficient if MPFR BigFloat
was already a VLA instead of containing a pointer here, but that does
not prevent the optimization.

* Add propagate_inbounds_meta to atomic genericmemory ops (#55902)

`memoryref(mem, i)` will otherwise emit a boundscheck.

```
; │ @ /home/vchuravy/WorkstealingQueues/src/CLL.jl:53 within `setindex_atomic!` @ genericmemory.jl:329
; │┌ @ boot.jl:545 within `memoryref`
    %ptls_field = getelementptr inbounds i8, ptr %tls_pgcstack, i64 16
    %ptls_load = load ptr, ptr %ptls_field, align 8
    %"box::GenericMemoryRef" = call noalias nonnull align 8 dereferenceable(32) ptr @ijl_gc_small_alloc(ptr %ptls_load, i32 552, i32 32, i64 23456076646928) #9
    %"box::GenericMemoryRef.tag_addr" = getelementptr inbounds i64, ptr %"box::GenericMemoryRef", i64 -1
    store atomic i64 23456076646928, ptr %"box::GenericMemoryRef.tag_addr" unordered, align 8
    store ptr %memoryref_data, ptr %"box::GenericMemoryRef", align 8
    %.repack8 = getelementptr inbounds { ptr, ptr }, ptr %"box::GenericMemoryRef", i64 0, i32 1
    store ptr %memoryref_mem, ptr %.repack8, align 8
    call void @ijl_bounds_error_int(ptr nonnull %"box::GenericMemoryRef", i64 %7)
    unreachable
```

For the Julia code:

```julia
function Base.setindex_atomic!(buf::WSBuffer{T}, order::Symbol, val::T, idx::Int64) where T
    @inbounds Base.setindex_atomic!(buf.buffer, order, val,((idx - 1) & buf.mask) + 1)
end
```

from
https://github.com/gbaraldi/WorkstealingQueues.jl/blob/0ebc57237cf0c90feedf99e4338577d04b67805b/src/CLL.jl#L41

* fix rounding mode in construction of `BigFloat` from pi (#55911)

The default argument of the method was outdated, reading the global
default rounding directly, bypassing the `ScopedValue` stuff.

* fix `nonsetable_type_hint_handler` (#55962)

The current implementation is wrong, causing it to display inappropriate
hints like the following:
```julia
julia> s = Some("foo");

julia> s[] = "bar"
ERROR: MethodError: no method matching setindex!(::Some{String}, ::String)
The function `setindex!` exists, but no method is defined for this combination of argument types.
You attempted to index the type String, rather than an instance of the type. Make sure you create the type using its constructor: d = String([...]) rather than d = String
Stacktrace:
 [1] top-level scope
   @ REPL[2]:1
```

* REPL: make UndefVarError aware of imported modules (#55932)

* fix test/staged.jl (#55967)

In particular, the implementation of `overdub_generator54341` was
dangerous. This fixes it up.

* Explicitly store a module's location (#55963)

Revise wants to know what file a module's `module` definition is in.
Currently it does this by looking at the source location for the
implicitly generated `eval` method. This is terrible for two reasons:

1. The method may not exist if the module is a baremodule (which is not
particularly common, which is probably why we haven't seen it).
2. The fact that the implicitly generated `eval` method has this
location information is an implementation detail that I'd like to get
rid of (#55949).

This PR adds explicit file/line info to `Module`, so that Revise doesn't
have to use the hack anymore.

* mergewith: add single argument example to docstring (#55964)

I ran into this edge case. I though it should be documented.
---------

Co-authored-by: Lilith Orion Hafner <lilithhafner@gmail.com>

* [build] avoid libedit linkage and align libccalllazy* SONAMEs (#55968)

While building the 1.11.0-rc4 in Homebrew[^1] in preparation for 1.11.0
release (and to confirm Sequoia successfully builds) I noticed some odd
linkage for our Linux builds, which included of:

1. LLVM libraries were linking to `libedit.so`, e.g.
    ```
    Dynamic Section:
      NEEDED       libedit.so.0
      NEEDED       libz.so.1
      NEEDED       libzstd.so.1
      NEEDED       libstdc++.so.6
      NEEDED       libm.so.6
      NEEDED       libgcc_s.so.1
      NEEDED       libc.so.6
      NEEDED       ld-linux-x86-64.so.2
      SONAME       libLLVM-16jl.so
    ```
    CMakeCache.txt showed
    ```
    //Use libedit if available.
    LLVM_ENABLE_LIBEDIT:BOOL=ON
    ```
Which might be overriding `HAVE_LIBEDIT` at
https://github.com/JuliaLang/llvm-project/blob/julia-release/16.x/llvm/cmake/config-ix.cmake#L222-L225.
So just added `LLVM_ENABLE_LIBEDIT`

2. Wasn't sure if there was a reason for this but `libccalllazy*` had
mismatched SONAME:
    ```console
    ❯ objdump -p lib/julia/libccalllazy* | rg '\.so'
    lib/julia/libccalllazybar.so:	file format elf64-x86-64
      NEEDED       ccalllazyfoo.so
      SONAME       ccalllazybar.so
    lib/julia/libccalllazyfoo.so:	file format elf64-x86-64
      SONAME       ccalllazyfoo.so
    ```
    Modifying this, but can drop if intentional.

---

[^1]: https://github.com/Homebrew/homebrew-core/pull/192116

* Add missing `copy!(::AbstractMatrix, ::UniformScaling)` method (#55970)

Hi everyone! First PR to Julia here.

It was noticed in a Slack thread yesterday
that `copy!(A, I)` doesn't work, but `copyto!(A, I)` does. This PR adds
the missing method for `copy!(::AbstractMatrix, ::UniformScaling)`,
which simply defers to `copyto!`, and corresponding tests.

I added a `compat` notice for Julia 1.12.

---------

Co-authored-by: Lilith Orion Hafner <lilithhafner@gmail.com>

* Add forward progress update to NEWS.md (#54089)

Closes #40009 which was left open because of the needs news tag.

---------

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>

* Fix an intermittent test failure in `core` test (#55973)

The test wants to assert that `Module` is not resolved in `Main`, but
other tests do resolve this identifier, so the test can fail depending
on test order (and I've been seeing such failures on CI recently). Fix
that by running the test in a fresh subprocess.

* fix comma logic in time_print (#55977)

Minor formatting fix

* optimizer: fix up the inlining algorithm to use correct `nargs`/`isva` (#55976)

It appears that inlining.jl was not updated in JuliaLang/julia#54341.
Specifically, using `nargs`/`isva` from `mi.def::Method` in
`ir_prepare_inlining!` causes the following error to occur:
```julia
function generate_lambda_ex(world::UInt, source::LineNumberNode,
                            argnames, spnames, @nospecialize body)
    stub = Core.GeneratedFunctionStub(identity, Core.svec(argnames...), Core.svec(spnames...))
    return stub(world, source, body)
end
function overdubbee54341(a, b)
    return a + b
end
const overdubee_codeinfo54341 = code_lowered(overdubbee54341, Tuple{Any, Any})[1]
function overdub_generator54341(world::UInt, source::LineNumberNode, selftype, fargtypes)
    if length(fargtypes) != 2
        return generate_lambda_ex(world, source,
            (:overdub54341, :args), (), :(error("Wrong number of arguments")))
    else
        return copy(overdubee_codeinfo54341)
    end
end
@eval function overdub54341(args...)
    $(Expr(:meta, :generated, overdub_generator54341))
    $(Expr(:meta, :generated_only))
end
topfunc(x) = overdub54341(x, 2)
```
```julia
julia> topfunc(1)
Internal error: during type inference of
topfunc(Int64)
Encountered unexpected error in runtime:
BoundsError(a=Array{Any, 1}(dims=(2,), mem=Memory{Any}(8, 0x10632e780)[SSAValue(2), SSAValue(3), #<null>, #<null>, #<null>, #<null>, #<null>, #<null>]), i=(3,))
throw_boundserror at ./essentials.jl:14
getindex at ./essentials.jl:909 [inlined]
ssa_substitute_op! at ./compiler/ssair/inlining.jl:1798
ssa_substitute_op! at ./compiler/ssair/inlining.jl:1852
ir_inline_item! at ./compiler/ssair/inlining.jl:386
...
```

This commit updates the abstract interpretation and inlining algorithm
to use the `nargs`/`isva` values held by `CodeInfo`. Similar
modifications have also been made to EscapeAnalysis.jl.

@nanosoldier `runbenchmarks("inference", vs=":master")`

* Add `.zed` directory to `.gitignore` (#55974)

Similar to the `vscode` config directory, we may ignore the `zed`
directory as well.

* typeintersect: reduce unneeded allocations from `merge_env`

`merge_env` and `final_merge_env` could be skipped
for emptiness test or if we know there's only 1 valid Union state.

* typeintersect: trunc env before nested `intersect_all` if valid.

This only covers the simplest cases. We might want a full dependence analysis and keep env length minimum in the future.

* `@time` actually fix time report commas & add tests (#55982)

https://github.com/JuliaLang/julia/pull/55977 looked simple but wasn't
quite right because of a bad pattern in the lock conflicts report
section.

So fix and add tests.

* adjust EA to JuliaLang/julia#52527 (#55986)

`EnterNode.catch_dest` can now be `0` after the `try`/`catch` elision
feature implemented in JuliaLang/julia#52527, and we actually need to
adjust `EscapeAnalysis.compute_frameinfo` too.

* Improvements to JITLink

Seeing what this will look like, since it has a number of features
(delayed compilation, concurrent compilation) that are starting to
become important, so it would be nice to switch to only supporting one
common implementation of memory management.

Refs #50248

I am expecting https://github.com/llvm/llvm-project/issues/63236 may
cause some problems, since we reconfigured some CI machines to minimize
that issue, but it is still likely relevant.

* rewrite catchjmp asm to use normal relocations instead of manual editing

* add logic to prefer loading modules that are already loaded (#55908)

Iterate over the list of existing loaded modules for PkgId whenever
loading a new module for PkgId, so that we will use that existing
build_id content if it otherwise passes the other stale_checks.

* Apple: fix bus error on smaller readonly file in unix (#55859)

Enables the fix for #28245 in #44354 for Apple now that the Julia bugs are
fixed by #55641 and #55877.

Closes #28245

* Add `Float16` to `Base.HWReal` (#55929)

* docs: make mod an operator (#55988)

* InteractiveUtils: add `@trace_compile` and `@trace_dispatch` (#55915)

* Profile: document heap snapshot viewing tools (#55743)

* [REPL] Fix #55850 by using `safe_realpath` instead of `abspath` in `projname` (#55851)

* optimizer: enable load forwarding with the `finalizer` elision (#55991)

When the finalizer elision pass is used, load forwarding is not
performed currently, regardless of whether the pass succeeds or not. But
this is not necessary, and by keeping the `setfield!` call, we can
safely forward `getfield` even if finalizer elision is tried.

* Avoid `stat`-ing stdlib path if it's unreadable (#55992)

* doc: manual: cmd: fix Markdown in table entry for `--trim` (#55979)

* Avoid conversions to `Float64` in non-literal powers of `Float16` (#55994)

Co-authored-by: Alex Arslan <ararslan@comcast.net>

* Remove unreachable error branch in memset calls (and in repeat) (#55985)

Some places use the pattern memset(A, v, length(A)), which requires a
conversion UInt(length(A)). This is technically fallible, but can't
actually fail when A is a Memory or Array.
Remove the dead error branch by casting to UInt instead.

Similarly, in repeat(x, r), r is first checked to be nonnegative, then
converted to UInt, then used in multiple calls where it is converted to
UInt each time. Here, only do it once.

* fix up docstring of `mod` (#56000)

* fix typos (#56008)

these are all in markdown files

Co-authored-by: spaette <spaette@users.noreply.github.com>

* Vectorise random vectors of `Float16` (#55997)

* Clarify `div` docstring for floating-point input (#55918)

Closes #55837

This is a variant of the warning found in the `fld` docstring clarifying
floating-point behaviour.

* improve getproperty(Pairs) warnings (#55989)

- Only call `depwarn` if the field is `itr` or `data`; otherwise let the field error happen as normal
- Give a more specific deprecation warning.

* Document type-piracy / type-leakage restrictions for `require_stdlib` (#56005)

I was a recent offender in
https://github.com/JuliaLang/Pkg.jl/issues/4017#issuecomment-2377589989

This PR tries to lay down some guidelines for the behavior that stdlibs
and the callers of `require_stdlib` must adhere to to avoid "duplicate
stdlib" bugs

These bugs are particularly nasty because they are experienced
semi-rarely and under pretty specific circumstances (they only occur
when `require_stdlib` loads another copy of a stdlib, often in a
particular order and/or with a particular state of your pre-compile /
loading cache) so they may make it a long way through a pre-release
cycle without an actionable bug report.

* [LinearAlgebra] Remove unreliable doctests (#56011)

The exact textual representation of the output of these doctests depend
on the specific kernel used by the BLAS backend, and can vary between
versions of OpenBLAS (as it did in #41973), or between different CPUs,
which makes these doctests unreliable.

Fix #55998.

* cleanup functions of Hermitian matrices (#55951)

The functions of Hermitian matrices are a bit of a mess. For example, if
we have a Hermitian matrix `a` with negative eigenvalues, `a^0.5`
doesn't produce the `Symmetric` wrapper, but `sqrt(a)` does. On the
other hand, if we have a positive definite `b`, `b^0.5` will be
`Hermitian`, but `sqrt(b)` will be `Symmetric`:
```julia
using LinearAlgebra
a = Hermitian([1.0 2.0;2.0 1.0])
a^0.5
sqrt(a)
b = Hermitian([2.0 1.0; 1.0 2.0])
b^0.5
sqrt(b)
```
This sort of arbitrary assignment of wrappers happens with pretty much
all functions defined there. There's also some oddities, such as `cis`
being the only function defined for `SymTridiagonal`, even though all
`eigen`-based functions work, and `cbrt` being the only function not
defined for complex Hermitian matrices.

I did a cleanup: I defined all functions for `SymTridiagonal` and
`Hermitian{<:Complex}`, and always assigned the appropriate wrapper,
preserving the input one when possible.

There's an inconsistency remaining that I didn't fix, that only `sqrt`
and `log` accept a tolerance argument, as changing that is probably
breaking.

There were also hardly any tests that I could find (only `exp`, `log`,
`cis`, and `sqrt`). I'm happy to add them if it's desired.

* Fix no-arg `ScopedValues.@with` within a scope (#56019)

Fixes https://github.com/JuliaLang/julia/issues/56017

* LinearAlgebra: make matprod_dest public (#55537)

Currently, in a matrix multiplication `A * B`, we use `B` to construct
the destination. However, this may not produce the optimal destination
type, and is essentially single-dispatch. Letting packages specialize
`matprod_dest` would help us obtain the optimal type by dispatching on
both the arguments. This may significantly improve performance in the
matrix multiplication. As an example:
```julia
julia> using LinearAlgebra, FillArrays, SparseArrays

julia> F = Fill(3, 10, 10);

julia> s = sprand(10, 10, 0.1);

julia> @btime $F * $s;
  15.225 μs (10 allocations: 4.14 KiB)

julia> typeof(F * s)
SparseMatrixCSC{Float64, Int64}

julia> nnz(F * s)
80

julia> VERSION
v"1.12.0-DEV.1074"
```
In this case, the destination is a sparse matrix with 80% of its
elements filled and being set one-by-one, which is terrible for
performance. Instead, if we specialize `matprod_dest` to return a dense
destination, we may obtain
```julia
julia> LinearAlgebra.matprod_dest(F::FillArrays.AbstractFill, S::SparseMatrixCSC, ::Type{T}) where {T} = Matrix{T}(undef, size(F,1), size(S,2))

julia> @btime $F * $s;
  754.632 ns (2 allocations: 944 bytes)

julia> typeof(F * s)
Matrix{Float64}
```
Potentially, this may be improved further by specializing `mul!`, but
this is a 20x improvement just by choosing the right destination.

Since this is being made public, we may want to bikeshed on an
appropriate name for the function.

* Sockets: Warn when local network access not granted. (#56023)

Works around https://github.com/JuliaLang/julia/issues/56022

* Update test due to switch to intel syntax by default in #48103 (#55993)

* add require_lock call to maybe_loaded_precompile (#56027)

If we expect this to be a public API
(https://github.com/timholy/Revise.jl for some reason is trying to
access this state), we should lock around it for consistency with the
other similar functions.

Needed for https://github.com/timholy/Revise.jl/pull/856

* fix `power_by_squaring`: use `promote` instead of type inference (#55634)

Fixes #53504

Fixes #55633

* Don't show keymap `@error` for hints (#56041)

It's too disruptive to show errors for hints. The error will still be
shown if tab is pressed.

Helps issues like https://github.com/JuliaLang/julia/issues/56037

* Refactoring to be considered before adding MMTk

* Removing jl_gc_notify_image_load, since it's a new function and not part of the refactoring

* Moving gc_enable code to gc-common.c

* Addressing PR comments

* Push resolution of merge conflict

* Removing jl_gc_mark_queue_obj_explicit extern definition from scheduler.c

* Don't need the getter function since it's possible to use jl_small_typeof directly

* Remove extern from free_stack declaration in julia_internal.h

* Putting everything that is common GC tls into gc-tls-common.h

* Typo

* Adding gc-tls-common.h to Makefile as a public header

* Removing gc-tls-common fields from gc-tls-mmtk.h

* Fix typo in sockets tests. (#56038)

* EA: use `is_mutation_free_argtype` for the escapability check (#56028)

EA has been using `isbitstype` for type-level escapability checks, but a
better criterion (`is_mutation_free`) is available these days, so we
would like to use that instead.

* effects: fix `Base.@_noub_meta` (#56061)

This had the incorrect number of arguments to `Expr(:purity, ...)`
causing it to be silently ignored.

* effects: improve `:noub_if_noinbounds` documentation (#56060)

Just a small touch-up

* Disallow assigning asymmetric values to SymTridiagonal (#56068)

Currently, we can assign an asymmetric value to a `SymTridiagonal`,
which goes against what `setindex!` is expected to do. This is because
`SymTridiagonal` symmetrizes the values along the diagonal, so setting a
diagonal entry to an asymmetric value would lead to a subsequent
`getindex` producing a different result.
```julia
julia> s = SMatrix{2,2}(1:4);

julia> S = SymTridiagonal(fill(s,4), fill(s,3))
4×4 SymTridiagonal{SMatrix{2, 2, Int64, 4}, Vector{SMatrix{2, 2, Int64, 4}}}:
 [1 3; 3 4]  [1 3; 2 4]      ⋅           ⋅     
 [1 2; 3 4]  [1 3; 3 4]  [1 3; 2 4]      ⋅     
     ⋅       [1 2; 3 4]  [1 3; 3 4]  [1 3; 2 4]
     ⋅           ⋅       [1 2; 3 4]  [1 3; 3 4]

julia> S[1,1] = s
2×2 SMatrix{2, 2, Int64, 4} with indices SOneTo(2)×SOneTo(2):
 1  3
 2  4

julia> S[1,1] == s
false

julia> S[1,1]
2×2 Symmetric{Int64, SMatrix{2, 2, Int64, 4}} with indices SOneTo(2)×SOneTo(2):
 1  3
 3  4
```
After this PR,
```julia
julia> S[1,1] = s
ERROR: ArgumentError: cannot set a diagonal entry of a SymTridiagonal to an asymmetric value
```

* Remove unused matrix type params in diag methods (#56048)

These parameters are not used in the method, and are unnecessary for
dispatch.

* LinearAlgebra: diagzero for non-OneTo axes (#55252)

Currently, the off-diagonal zeros for a block-`Diagonal` matrix is
computed using `diagzero`, which calls `zeros` for the sizes of the
elements. This returns an `Array`, unless one specializes `diagzero` for
the custom `Diagonal` matrix type.

This PR defines a `zeroslike` function that dispatches on the axes of
the elements, which lets packages specialize on the axes to return
custom `AbstractArray`s. Choosing to specialize on the `eltype` avoids
the need to specialize on the container, and allows packages to return
appropriate types for custom axis types.

With this,
```julia
julia> LinearAlgebra.zeroslike(::Type{S}, ax::Tuple{SOneTo, Vararg{SOneTo}}) where {S<:SMatrix} = SMatrix{map(length, ax)...}(ntuple(_->zero(eltype(S)), prod(length, ax)))

julia> D = Diagonal(fill(SMatrix{2,3}(1:6), 2))
2×2 Diagonal{SMatrix{2, 3, Int64, 6}, Vector{SMatrix{2, 3, Int64, 6}}}:
 [1 3 5; 2 4 6]        ⋅       
       ⋅         [1 3 5; 2 4 6]

julia> D[1,2] # now an SMatrix
2×3 SMatrix{2, 3, Int64, 6} with indices SOneTo(2)×SOneTo(3):
 0  0  0
 0  0  0

julia> LinearAlgebra.zeroslike(::Type{S}, ax::Tuple{SOneTo, Vararg{SOneTo}}) where {S<:MMatrix} = MMatrix{map(length, ax)...}(ntuple(_->zero(eltype(S)), prod(length, ax)))

julia> D = Diagonal(fill(MMatrix{2,3}(1:6), 2))
2×2 Diagonal{MMatrix{2, 3, Int64, 6}, Vector{MMatrix{2, 3, Int64, 6}}}:
 [1 3 5; 2 4 6]        ⋅       
       ⋅         [1 3 5; 2 4 6]

julia> D[1,2] # now an MMatrix
2×3 MMatrix{2, 3, Int64, 6} with indices SOneTo(2)×SOneTo(3):
 0  0  0
 0  0  0
```
The reason this can't be the default behavior is that we are not
guaranteed that there exists a `similar` method that accepts the
combination of axes. This is why we have to fall back to using the
sizes, unless a specialized method is provided by a package.

One positive outcome of this is that indexing into such a block-diagonal
matrix will now usually be type-stable, which mitigates
https://github.com/JuliaLang/julia/issues/45535 to some extent (although
it doesn't resolve the issue).

I've also updated the `getindex` for `Bidiagonal` to use `diagzero`,
instead of the similarly defined `bidiagzero` function that it was
using. Structured block matrices may now use `diagzero` uniformly to
generate the zero elements.

* Multi-argument `gcdx(a, b, c...)` (#55935)

Previously, `gcdx` only worked for two arguments - but the underlying
idea extends to any (nonzero) number of arguments. Similarly, `gcd`
already works for 1, 2, 3+ arguments.

This PR implements the 1 and 3+ argument versions of `gcdx`, following
the [wiki
page](https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#The_case_of_more_than_two_numbers)
for the Extended Euclidean algorithm.

* Refactoring to be considered before adding MMTk

* Removing jl_gc_notify_image_load, since it's a new function and not part of the refactoring

* Moving gc_enable code to gc-common.c

* Addressing PR comments

* Push resolution of merge conflict

* Removing jl_gc_mark_queue_obj_explicit extern definition from scheduler.c

* Don't need the getter function since it's possible to use jl_small_typeof directly

* Remove extern from free_stack declaration in julia_internal.h

* Putting everything that is common GC tls into gc-tls-common.h

* Typo

* Adding gc-tls-common.h to Makefile as a public header

* Adding jl_full_sweep_reasons since timing.jl depends on it

* Fixing issue with jl_full_sweep_reasons (missing constants)

* fix `_growbeg!` unncessary resizing (#56029)

This was very explicitly designed such that if there was a bunch of
extra space at the end of the array, we would copy rather than
allocating, but by making `newmemlen` be at least
`overallocation(memlen)` rather than `overallocation(len)`, this branch
was never hit. found by https://github.com/JuliaLang/julia/issues/56026

* REPL: hide any prints to stdio during `complete_line` (#55959)

* teach llvm-alloc-helpers about `gc_loaded` (#56030)

combined with https://github.com/JuliaLang/julia/pull/55913, the
compiler is smart enough to fully remove
```
function f()
    m = Memory{Int}(undef, 3)
    @inbounds m[1] = 2
    @inbounds m[2] = 2
    @inbounds m[3] = 4
    @inbounds return m[1] + m[2] + m[3]
end
```

* mpfr: prevent changing precision (#56049)

Changing precision requires reallocating the data field, which is better
done by making a new BigFloat (since they are conceptually immutable
anyways). Also do a bit a cleanup while here.

Closes #56044

* stackwalk: fix jl_thread_suspend_and_get_state race (#56047)

There was a missing re-assignment of old = -1; at the end of that loop
which means in the ABA case, we accidentally actually acquire the lock
on the thread despite not actually having stopped the thread; or in the
counter-case, we try to run through this logic with old==-1 on the next
iteration, and that isn't valid either (jl_thread_suspend_and_get_state
should return failure and the loop will abort too early).

Fix #56046

* irrationals: restrict assume effects annotations to known types (#55886)

Other changes:
* replace `:total` with the less powerful `:foldable`
* add an `<:Integer` dispatch constraint on the `rationalize` method,
closes #55872
* replace `Rational{<:Integer}` with just `Rational`, they're equal

Other issues, related to `BigFloat` precision, are still present in
irrationals.jl, to be fixed by followup PRs, including #55853.

Fixes #55874

* update `hash` doc string: `widen` not required any more (#55867)

Implementing `widen` isn't a requirement any more, since #26022.

* Merge `diag` methods for triangular matrices (#56086)

* slightly improve inference in precompilation code (#56084)

Avoids the

```
11: signature Tuple{typeof(convert), Type{String}, Any} triggered MethodInstance for Base.Precompilation.ExplicitEnv(::String) (84 children)
```

shown in
https://github.com/JuliaLang/julia/issues/56080#issuecomment-2404765120

Co-authored-by: KristofferC <kristoffer.carlsson@juliacomputing.com>

* avoid defining `convert(Vector{String}, ...)` in LibGit2 (#56082)

This is a weird conversion function to define. Seems cleaner to use the
iteration interface for this. Also avoids some invalidations
(https://github.com/JuliaLang/julia/issues/56080#issuecomment-2404765120)

Co-authored-by: KristofferC <kristoffer.carlsson@juliacomputing.com>

* array: inline `convert` where possible (#56034)

This improves a common scenario, where someone wants to `push!` a
poorly-typed object onto a well-typed Vector.

For example:
```julia
const NT = @NamedTuple{x::Int,y::Any}
foo(v::Vector{NT}, x::Int, @nospecialize(y)) = push!(v, (; x, y))
```

The `(; x, y)` is slightly poorly-typed here. It could have any type for
its `.y` field before it is converted inside the `push!` to a NamedTuple
with `y::Any`

Without this PR, the dispatch for this `push!` cannot be inferred:
```julia
julia> code_typed(foo, (Vector{NT}, Int, Any))[1]
 CodeInfo(
1 ─ ...
│   %4 = %new(%3, x, y)::NamedTuple{(:x, :y), <:Tuple{Int64, Any}}
│   %5 = Main.push!(v, %4)::Vector{@NamedTuple{x::Int64, y}}
└──      return %5
) => Vector{@NamedTuple{x::Int64, y}}
```

With this PR, the above dynamic call is fully statically resolved and
inlined (and therefore `--trim` compatible)

* Remove some unnecessary `real` specializations for structured matrices (#56083)

The `real(::AbstractArray{<:Rea})` fallback method should handle these
cases correctly.

* Combine `diag` methods for `SymTridiagonal` (#56014)

Currently, there are two branches, one for an `eltype` that is a
`Number`, and the other that deals with generic `eltype`s. They do
similar things, so we may combine these, and use branches wherever
necessary to retain the performance. We also may replace explicit
materialized arrays by generators in `copyto!`. Overall, this improves
performance in `diag` for matrices of matrices, whereas the performance
in the common case of matrices of numbers remains unchanged.
```julia
julia> using StaticArrays, LinearAlgebra

julia> s = SMatrix{2,2}(1:4);

julia> S = SymTridiagonal(fill(s,100), fill(s,99));

julia> @btime diag($S);
  1.292 μs (5 allocations: 7.16 KiB) # nightly, v"1.12.0-DEV.1317"
  685.012 ns (3 allocations: 3.19 KiB) # This PR
```
This PR also allows computing the `diag` for more values of the band
index `n`:
```julia
julia> diag(S,99)
1-element Vector{SMatrix{2, 2, Int64, 4}}:
 [0 0; 0 0]
```
This would work as long as `getindex` works for the `SymTridiagonal` for
that band, and the zero element may be converted to the `eltype`.

* fix `Vararg{T,T} where T` crashing `code_typed` (#56081)

Not sure this is the right place to fix this error, perhaps
`match.spec_types` should always be a tuple of valid types?

fixes #55916

---------

Co-authored-by: Jameson Nash <vtjnash@gmail.com>

* [libblastrampoline_jll] Upgrade to v5.11.1 (#56094)

v5.11.1 is a patch release with a couple of RISC-V fixes.

* Revert "REPL: hide any prints to stdio during `complete_line`" (#56102)

* Remove warning from c when binding is ambiguous (#56103)

* make `Base.ANSIIterator` have a concrete field (#56088)

Avoids the invalidation

```
   backedges: 1: superseding sizeof(s::AbstractString) @ Base strings/basic.jl:177 with MethodInstance for sizeof(::AbstractString) (75 children)
```

shown in
https://github.com/JuliaLang/julia/issues/56080#issuecomment-2404765120.

Co-authored-by: KristofferC <kristoffer.carlsson@juliacomputing.com>

* Subtype: some performance tuning. (#56007)

The main motivation of this PR is to fix #55807.
dc689fe8700f70f4a4e2dbaaf270f26b87e79e04 tries to remove the slow
`may_contain_union_decision` check by re-organizing the code path. Now
the fast path has been removed and most of its optimization has been
integrated into the preserved slow path.
Since the slow path stores all inner ∃ decisions on the outer most R
stack, there might be overflow risk.
aee69a41441b4306ba3ee5e845bc96cb45d9b327 should fix that concern.

The reported MWE now becomes
```julia
  0.000002 seconds
  0.000040 seconds (105 allocations: 4.828 KiB, 52.00% compilation time)
  0.000023 seconds (105 allocations: 4.828 KiB, 49.36% compilation time)
  0.000026 seconds (105 allocations: 4.828 KiB, 50.38% compilation time)
  0.000027 seconds (105 allocations: 4.828 KiB, 54.95% compilation time)
  0.000019 seconds (106 allocations: 4.922 KiB, 49.73% compilation time)
  0.000024 seconds (105 allocations: 4.828 KiB, 52.24% compilation time)
```

Local bench also shows that 72855cd slightly accelerates
`OmniPackage.jl`'s loading
```julia
julia> @time using OmniPackage
# v1.11rc4
 20.525278 seconds (25.36 M allocations: 1.606 GiB, 8.48% gc time, 12.89% compilation time: 77% of which was recompilation)
# v1.11rc4+aee69a4+72855cd 
 19.527871 seconds (24.92 M allocations: 1.593 GiB, 8.88% gc time, 15.13% compilation time: 82% of which was recompilation)
```

* rearrange jl_delete_thread to be thread-safe (#56097)

Prior to this, especially on macOS, the gc-safepoint here would cause
the process to segfault as we had already freed the current_task state.
Rearrange this code so that the GC interactions (except for the atomic
store to current_task) are all handled before entering GC safe, and then
signaling the thread is deleted (via setting current_task = NULL,
published by jl_unlock_profile_wr to other threads) is last.

```
ERROR: Exception handler triggered on unmanaged thread.
Process 53827 stopped
* thread #5, stop reason = EXC_BAD_ACCESS (code=2, address=0x100018008)
    frame #0: 0x0000000100b74344 libjulia-internal.1.12.0.dylib`jl_delete_thread [inlined] jl_gc_state_set(ptls=0x000000011f8b3200, state='\x02', old_state=<unavailable>) at julia_threads.h:272:9 [opt]
   269 	    assert(old_state != JL_GC_CONCURRENT_COLLECTOR_THREAD);
   270 	    jl_atomic_store_release(&ptls->gc_state, state);
   271 	    if (state == JL_GC_STATE_UNSAFE || old_state == JL_GC_STATE_UNSAFE)
-> 272 	        jl_gc_safepoint_(ptls);
   273 	    return old_state;
   274 	}
   275 	STATIC_INLINE int8_t jl_gc_state_save_and_set(jl_ptls_t ptls,
Target 0: (julia) stopped.
(lldb) up
frame #1: 0x0000000100b74320 libjulia-internal.1.12.0.dylib`jl_delete_thread [inlined] jl_gc_state_save_and_set(ptls=0x000000011f8b3200, state='\x02') at julia_threads.h:278:12 [opt]
   275 	STATIC_INLINE int8_t jl_gc_state_save_and_set(jl_ptls_t ptls,
   276 	                                              int8_t state)
   277 	{
-> 278 	    return jl_gc_state_set(ptls, state, jl_atomic_load_relaxed(&ptls->gc_state));
   279 	}
   280 	#ifdef __clang_gcanalyzer__
   281 	// these might not be a safepoint (if they are no-op safe=>safe transitions), but we have to assume it could be (statically)
(lldb)
frame #2: 0x0000000100b7431c libjulia-internal.1.12.0.dylib`jl_delete_thread(value=0x000000011f8b3200) at threading.c:537:11 [opt]
   534 	    ptls->root_task = NULL;
   535 	    jl_free_thread_gc_state(ptls);
   536 	    // then park in safe-region
-> 537 	    (void)jl_gc_safe_enter(ptls);
   538 	}
```

(test incorporated into https://github.com/JuliaLang/julia/pull/55793)

* OpenBLAS: Use dynamic architecture support on AArch64. (#56107)

We already do so on Yggdrasil, so this just makes both source and binary
builds behave similarly.

Closes https://github.com/JuliaLang/julia/issues/56075

* IRShow: label builtin / intrinsic / dynamic calls in `code_typed` (#56036)

This makes it much easier to spot dynamic dispatches

* 🤖 [master] Bump the Pkg stdlib from 51d4910c1 to fbaa2e337 (#56124)

* Fix type instability of closures capturing types (2) (#40985)

Instead of closures lowering to `typeof` for the types of captured
fields, this introduces a new function `_typeof_captured_variable` that
returns `Type{T}` if `T` is a type (w/o free typevars).

- replaces/closes #35970
- fixes #23618

---------

Co-authored-by: Takafumi Arakaki <aka.tkf@gmail.com>
Co-authored-by: Shuhei Kadowaki <aviatesk@gmail.com>

* Remove debug error statement from Makefile. (#56127)

* align markdown table (#56122)

@<!-- -->gbaraldi `#51197`
@<!-- -->spaette `#56008`

fix innocuous malalignment of table after those pulls were merged

* Improve IOBuffer docs (#56024)

Based on the discussion in #55978, I have tried to clarify the
documentation of `IOBuffer`.

* Comment out url and fix typo in stackwalk.c (#56131)

Introduced in #55623

* libgit2: Always use the bundled PCRE library. (#56129)

This is how Yggdrasil builds the library.

* Update JLL build versions (#56133)

This commit encompasses the following changes:
- Updating the JLL build version for Clang, dSFMT, GMP, LibUV,
LibUnwind, LLD, LLVM, libLLVM, MbedTLS, MPFR, OpenBLAS, OpenLibm, p7zip,
PCRE2, SuiteSparse, and Zlib.
- Updating CompilerSupportLibraries to v1.2.0. The library versions
contained in this release of CSL don't differ from v1.1.1, the only
difference is that v1.2.0 includes FreeBSD AArch64.
- Updating nghttp2 from 1.60.0 to 1.63.0. See
[here](https://github.com/nghttp2/nghttp2/releases) for changes between
these versions.
- Adding `aarch64-unknown-freebsd` to the list of triplets to check when
refreshing checksums.

Note that dependencies that link to MbedTLS (Curl, LibSSH2, LibGit2) are
excluded here. They'll be updated once a resolution is reached for the
OpenSSL switching saga. Once that happens, FreeBSD AArch64 should be
able to be built without any dependency source builds.

* typo in `Compiler.Effects` doc string: `checkbounds` -> `boundscheck` (#56140)

Follows up on #56060

* HISTORY: fix missing links (#56137)

* OpenBLAS: Fix cross-compilation detection for source build. (#56139)

We may be cross-compiling Linux-to-Linux, in which case `BUILD_OS` ==
`OS`, so look at `XC_HOST` to determine whether we're cross compiling.

* `diag` for `BandedMatrix`es for off-limit bands (#56065)

Currently, one can only obtain the `diag` for a `BandedMatrix` (such as
a `Diagonal`) when the band index is bounded by the size of the matrix.
This PR relaxes this requirement to match the behavior for arrays, where
`diag` returns an empty vector for a large band index instead of
throwing an error.
```julia
julia> D = Diagonal(ones(4))
4×4 Diagonal{Float64, Vector{Float64}}:
 1.0   ⋅    ⋅    ⋅ 
  ⋅   1.0   ⋅    ⋅ 
  ⋅    ⋅   1.0   ⋅ 
  ⋅    ⋅    ⋅   1.0

julia> diag(D, 10)
Float64[]

julia> diag(Array(D), 10)
Float64[]
```
Something similar for `SymTridiagonal` is being done in
https://github.com/JuliaLang/julia/pull/56014

* Port progress bar improvements from Pkg (#56125)

Includes changes from https://github.com/JuliaLang/Pkg.jl/pull/4038 and
https://github.com/JuliaLang/Pkg.jl/pull/4044.

Co-authored-by: Kristoffer Carlsson <kcarlsson89@gmail.com>

* Add support for LLVM 19 (#55650)

Co-authored-by: Zentrik <Zentrik@users.noreply.github.com>

* 🤖 [master] Bump the Pkg stdlib from fbaa2e337 to 27c1b1ee5 (#56146)

* HISTORY entry for deletion of `length(::Stateful)` (#55861)

xref #47790

xref #51747

xref #54953

xref #55858

* ntuple: ensure eltype is always `Int` (#55901)

Fixes #55790

* Improve remarks of the alloc opt pass slightly. (#55995)

The Value printer LLVM uses just prints the kind of instruction so it
just shows call.

---------

Co-authored-by: Oscar Smith <oscardssmith@gmail.com>

* Implement Base.fd() for TCPSocket, UDPSocket, and TCPServer (#53721)

This is quite handy if you want to pass off the file descriptor to a C
library. I also added a warning to the `fd()` docstring to warn folks
about duplicating the file descriptor first.

* Fix `JULIA_CPU_TARGET` being propagated to workers precompiling stdlib pkgimages (#54093)

Apparently (thanks ChatGPT) each line in a makefile is executed in a
separate shell so adding an `export` line on one line does not propagate
to the next line.

* Merge tr methods for triangular matrices (#56154)

Since the methods do identical things, we don't need multiple of these.

* Reduce duplication in triangular indexing methods (#56152)

This uses an orthogonal design to reduce code duplication in the
indexing methods for triangular matrices.

* update LLVM docs (#56162)

dump with raw=true so you don't get random erorrs, and show how to run
single modules.

---------

Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
Co-authored-by: Mosè Giordano <765740+giordano@users.noreply.github.com>
Co-authored-by: Jameson Nash <vtjnash@gmail.com>

* Fix zero elements for block-matrix kron involving Diagonal (#55941)

Currently, it's assumed that the zero element is identical for the
matrix, but this is not necessary if the elements are matrices
themselves and have different sizes. This PR ensures that `kron` for a
`Diagonal` has the correct zero elements.
Current:
```julia
julia> D = Diagonal(1:2)
2×2 Diagonal{Int64, UnitRange{Int64}}:
 1  ⋅
 ⋅  2

julia> B = reshape([ones(2,2), ones(3,2), ones(2,3), ones(3,3)], 2, 2);

julia> size.(kron(D, B))
4×4 Matrix{Tuple{Int64, Int64}}:
 (2, 2)  (2, 3)  (2, 2)  (2, 2)
 (3, 2)  (3, 3)  (2, 2)  (2, 2)
 (2, 2)  (2, 2)  (2, 2)  (2, 3)
 (2, 2)  (2, 2)  (3, 2)  (3, 3)
``` 
This PR
```julia
julia> size.(kron(D, B))
4×4 Matrix{Tuple{Int64, Int64}}:
 (2, 2)  (2, 3)  (2, 2)  (2, 3)
 (3, 2)  (3, 3)  (3, 2)  (3, 3)
 (2, 2)  (2, 3)  (2, 2)  (2, 3)
 (3, 2)  (3, 3)  (3, 2)  (3, 3)
```
Note the differences e.g. in the `CartesianIndex(4,1)`,
`CartesianIndex(3,2)` and `CartesianIndex(3,3)` elements.

* Call `MulAddMul` instead of multiplication in _generic_matmatmul! (#56089)

Fix https://github.com/JuliaLang/julia/issues/56085 by calling a newly
created `MulAddMul` object that only wraps the `alpha` (with `beta` set
to `false`). This avoids the explicit multiplication if `alpha` is known
to be `isone`.

* improve `allunique`'s type stability (#56161)

Caught by https://github.com/aviatesk/JET.jl/issues/667.

* Add invalidation barriers for `displaysize` and `implicit_typeinfo` (#56159)

These are invalidated by our own stdlibs (Dates and REPL) unfortunately
so we need to put this barrier in.

This fix is _very_ un-satisfying, because it doesn't do anything to
solve this problem for downstream libraries that use e.g. `displaysize`.
To fix that, I think we need a way to make sure callers get these
invalidation barriers by default...

* Fix markdown list in installation.md (#56165)

Documenter.jl requires all trailing list content to follow the same
indentation as the header. So, in the current view
(https://docs.julialang.org/en/v1/manual/installation/#Command-line-arguments)
the list appears broken.

* [Random] Add more comments and a helper function in Xoshiro code (#56144)

Follow up to #55994 and #55997. This should basically be a
non-functional change and I see no performance difference, but the
comments and the definition of a helper function should make the code
easier to follow (I initially struggled in #55997) and extend to other
types.

* add objects to concisely specify initialization

PerProcess: once per process
PerThread: once per thread id
PerTask: once per task object

* add precompile support for recording fields to change

Somewhat generalizes our support for changing Ptr to C_NULL. Not
particularly fast, since it is just using the builtins implementation of
setfield, and delaying the actual stores, but it should suffice.

* improve OncePer implementation

Address reviewer feedback, add more fixes and more tests,
rename to add Once prefix.

* fix use-after-free in test (detected in win32 CI)

* Make loading work when stdlib deps are missing in the manifest (#56148)

Closes https://github.com/JuliaLang/julia/issues/56109 

Simulating a bad manifest by having `LibGit2_jll` missing as a dep of
`LibGit2` in my default env, say because the manifest was generated by a
different julia version or different master julia commit.

## This PR, it just works
```
julia> using Revise

julia>
```
i.e.
```
% JULIA_DEBUG=loading ./julia --startup-file=no
julia> using Revise
...
┌ Debug: Stdlib LibGit2 [76f85450-5226-5b5a-8eaa-529ad045b433] is trying to load `LibGit2_jll`
│ which is not listed as a dep in the load path manifests, so resorting to search
│ in the stdlib Project.tomls for true deps
└ @ Base loading.jl:387
┌ Debug: LibGit2 [76f85450-5226-5b5a-8eaa-529ad045b433] indeed depends on LibGit2_jll in project /Users/ian/Documents/GitHub/julia/usr/share/julia/stdlib/v1.12/LibGit2/Project.toml
└ @ Base loading.jl:395
...

julia>
```

## Master
```
julia> using Revise
Info Given Revise was explicitly requested, output will be shown live
ERROR: LoadError: ArgumentError: Package LibGit2 does not have LibGit2_jll in its dependencies:
- Note that the following manifests in the load path were resolved with a potentially
  different DEV version of the current version, which may be the cause of the error.
  Try to re-resolve them in the current version, or consider deleting them if that fails:
    /Users/ian/.julia/environments/v1.12/Manifest.toml
- You may have a partially installed environment. Try `Pkg.instantiate()`
  to ensure all packages in the environment are installed.
- Or, if you have LibGit2 checked out for development and have
  added LibGit2_jll as a dependency but haven't updated your primary
  environment's manifest file, try `Pkg.resolve()`.
- Otherwise you may need to report an issue with LibGit2
...
```

* Remove llvm-muladd pass and move it's functionality to to llvm-simdloop (#55802)

Closes https://github.com/JuliaLang/julia/issues/55785

I'm not sure if we want to backport this like this. Because that removes
some functionality (the pass itself). So LLVM.jl and friends might need
annoying version code. We can maybe keep the code there and just not run
the pass in a backport.

* Fix implicit `convert(String, ...)` in several places (#56174)

This removes several `convert(String, ...)` from this code, which really
shouldn't be something we invalidate on in the first place (see
https://github.com/JuliaLang/julia/issues/56173) but this is still an
improvement in code quality so let's take it.

* Change annotations to use a NamedTuple (#55741)

Due to popular demand, the type of annotations is to be changed from a
`Tuple{UnitRange{Int}, Pair{Symbol, Any}}` to a `NamedTuple{(:region,
:label, :value), Tuple{UnitRange{Int}, Symbol,
Any}}`.

This requires the expected code churn to `strings/annotated.jl`, and
some changes to the StyledStrings and JuliaSyntaxHighlighting libraries.

Closes #55249 and closes #55245.

* Getting rid of mmtk_julia.c in the binding and moving it to gc-mmtk.c

* Trying to organize and label the code in gc-mmtk.c

* Remove redundant `convert` in `_setindex!` (#56178)

Follow up to #56034, ref:
https://github.com/JuliaLang/julia/pull/56034#discussion_r1798573573.

---------

Co-authored-by: Cody Tapscott <84105208+topolarity@users.noreply.github.com>

* Improve type inference of Artifacts.jl (#56118)

This also has some changes that move platform selection to compile time
together with
https://github.com/JuliaPackaging/JLLWrappers.jl/commit/45cc04963f3c99d4eb902f97528fe16fc37002cc,
move the platform selection to compile time.

(this helps juliac a ton)

* Initial support for RISC-V (#56105)

Rebase and extension of @alexfanqi's initial work on porting Julia to
RISC-V. Requires LLVM 19.

Tested on a VisionFive2, built with:

```make
MARCH := rv64gc_zba_zbb
MCPU := sifive-u74

USE_BINARYBUILDER:=0

DEPS_GIT = llvm
override LLVM_VER=19.1.1
override LLVM_BRANCH=julia-release/19.x
override LLVM_SHA1=julia-release/19.x
```

```julia-repl
❯ ./julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.12.0-DEV.1374 (2024-10-14)
 _/ |\__'_|_|_|\__'_|  |  riscv/25092a3982* (fork: 1 commits, 0 days)
|__/                   |

julia> versioninfo(; verbose=true)
Julia Version 1.12.0-DEV.1374
Commit 25092a3982* (2024-10-14 09:57 UTC)
Platform Info:
  OS: Linux (riscv64-unknown-linux-gnu)
  uname: Linux 6.11.3-1-riscv64 #1 SMP Debian 6.11.3-1 (2024-10-10) riscv64 unknown
  CPU: …
Comment on lines +19 to +37
const _KnownIrrational = Union{
typeof(π), typeof(ℯ), typeof(γ), typeof(φ), typeof(catalan)
}

function Rational{BigInt}(::_KnownIrrational)
Base._throw_argument_error_irrational_to_rational_bigint()
end
Base.@assume_effects :foldable function Rational{T}(x::_KnownIrrational) where {T<:Integer}
Base._irrational_to_rational(T, x)
end
Base.@assume_effects :foldable function (::Type{T})(x::_KnownIrrational, r::RoundingMode) where {T<:Union{Float32,Float64}}
Base._irrational_to_float(T, x, r)
end
Base.@assume_effects :foldable function rationalize(::Type{T}, x::_KnownIrrational; tol::Real=0) where {T<:Integer}
Base._rationalize_irrational(T, x, tol)
end
Base.@assume_effects :foldable function Base.lessrational(rx::Rational, x::_KnownIrrational)
Base._lessrational(rx, x)
end
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this be added to the @irrational macro to avoid hard to debug surprises when adding more @irrationals in Base (users and packages outside of Base are not supposed to define Irrationals and use @irrational anyway, so it's mainly about more @irrationals in Base)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

users and packages outside of Base are not supposed to define Irrationals

Perhaps this was the intent, but there's nothing stopping users from doing this. Wrong effects may have catastrophic consequences like crashes or silently wrong results, or other hard-to-debug issues (undefined behavior, in short), so they're extremely undesirable.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. My only point was that maybe my suggestion is not worth it since it is supposed to be only relevant for uses in Base anyway. But even then it might be nice not to have to remember to update the union if a new @irrational is added.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps this was the intent

This intent is documented (but of course that doesn't prevent definitions outside of Base):

  │ Warning
  │
  │  This macro should not be used outside of Base Julia.
  │
  │  The macro creates a new type Irrational{:sym} regardless of where
  │  it's invoked. This can lead to conflicting definitions if two
  │  packages define an irrational number with the same name but
  │  different values.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The macro is irrelevant to the question of safety here. As shown in the fixed issue, it's not required to add new subtypes of Irrational.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it might be nice not to have to remember to update the union

I think there's no other way to achieve safety here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think there's a misunderstanding here, I'll try to clarify my initial comment:

  1. The custom union only contains constants that are defined with the @irrational macro.
  2. Instead of defining a custom union, it seems these definitions could have been added to

    julia/base/irrationals.jl

    Lines 247 to 257 in cb757c4

    quote
    const $esym = Irrational{$qsym}()
    $bigconvert
    let v = $val, v64 = Float64(v), v32 = Float32(v)
    Base.Float64(::Irrational{$qsym}) = v64
    Base.Float32(::Irrational{$qsym}) = v32
    end
    @assert isa(big($esym), BigFloat)
    @assert Float64($esym) == Float64(big($esym))
    @assert Float32($esym) == Float32(big($esym))
    end
    .

This wouldn't reduce the amount of code here but would ensure that for Irrational types defined with the @irrational macro (with known value etc.) these effects would be defined automatically. So if at some point an @irrational in Base is added, removed, or modified, it is not necessary to update the union.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, you mean to add the methods with effect annotations using the macro instead of like in this PR. Yeah, I guess that would be correct, but it'd also unfortunately increase the number of methods.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was wondering whether the increased number of methods would be problematic. My gut feeling was that it might be fine given that it's only five Irrationals currently but on the other hand I don't know the compiler internals and why/when this could be problematic (or, on the other hand, if the compiler has problems with Unions if they contain too many elements).

KristofferC pushed a commit that referenced this pull request Oct 29, 2024
Other changes:
* replace `:total` with the less powerful `:foldable`
* add an `<:Integer` dispatch constraint on the `rationalize` method,
closes #55872
* replace `Rational{<:Integer}` with just `Rational`, they're equal

Other issues, related to `BigFloat` precision, are still present in
irrationals.jl, to be fixed by followup PRs, including #55853.

Fixes #55874

(cherry picked from commit d60837f)
@KristofferC KristofferC mentioned this pull request Oct 29, 2024
47 tasks
KristofferC added a commit that referenced this pull request Nov 12, 2024
Backported PRs:
- [x] #50832 <!-- Subtype: bug fix for bounds with deeper covariant var
-->
- [x] #51782 <!-- Fix remove-addrspaces pass in the presence of globals
with addrspaces -->
- [x] #55720 <!-- Fix `pkgdir` for extensions -->
- [x] #55773 <!-- Add compat entry for `Base.donotdelete` -->
- [x] #55886 <!-- irrationals: restrict assume effects annotations to
known types -->
- [x] #55867 <!-- update `hash` doc string: `widen` not required any
more -->
- [x] #56148 <!-- Make loading work when stdlib deps are missing in the
manifest -->
- [x] #55870 <!-- fix infinite recursion in `promote_type` for
`Irrational` -->
- [x] #56252 <!-- REPL: fix brace detection when ' is used for transpose
-->
- [x] #56264 <!-- inference: fix inference error from constructing
invalid `TypeVar` -->
- [x] #56276 <!-- move time_imports and trace_* macros to Base but
remain owned by InteractiveUtils -->
- [x] #56254 <!-- REPL: don't complete str and cmd macros when the input
matches the internal name like `r_` to `r"` -->
- [x] #56280 <!-- Fix trampoline warning on x86 as well -->
- [x] #56304 <!-- typeintersect: more fastpath to skip intersect under
circular env -->
- [x] #56306 <!-- InteractiveUtils.jl: fixes issue where subtypes
resolves bindings and causes deprecation warnings -->
- [x] #42080 <!-- recommend explicit `using Foo: Foo, ...` in package
code (was: "using considered harmful") -->
- [x] #56441 <!-- Profile: mention `kill -s SIGUSR1 julia_pid` for Linux
-->
- [x] #56511 <!-- The `info` in LAPACK calls should be a Ref instead of
a Ptr -->
- [x] #55052 <!-- Fix `(l/r)mul!` with `Diagonal`/`Bidiagonal` -->
- [x] #52694 <!-- Reinstate similar for AbstractQ for backward
compatibility -->
KristofferC added a commit that referenced this pull request Nov 21, 2024
Backported PRs:
- [x] #55886 <!-- irrationals: restrict assume effects annotations to
known types -->
- [x] #55867 <!-- update `hash` doc string: `widen` not required any
more -->
- [x] #56084 <!-- slightly improve inference in precompilation code -->
- [x] #56088 <!-- make `Base.ANSIIterator` have a concrete field -->
- [x] #54093 <!-- Fix `JULIA_CPU_TARGET` being propagated to workers
precompiling stdlib pkgimages -->
- [x] #56165 <!-- Fix markdown list in installation.md -->
- [x] #56148 <!-- Make loading work when stdlib deps are missing in the
manifest -->
- [x] #56174 <!-- Fix implicit `convert(String, ...)` in several places
-->
- [x] #56159 <!-- Add invalidation barriers for `displaysize` and
`implicit_typeinfo` -->
- [x] #56089 <!-- Call `MulAddMul` instead of multiplication in
_generic_matmatmul! -->
- [x] #56195 <!-- Include default user depot when JULIA_DEPOT_PATH has
leading empty entry -->
- [x] #56215 <!-- [REPL] fix lock ordering mistake in load_pkg -->
- [x] #56251 <!-- REPL: run repl hint generation for modeswitch chars
when not switching -->
- [x] #56092 <!-- stream: fix reading LibuvStream into array -->
- [x] #55870 <!-- fix infinite recursion in `promote_type` for
`Irrational` -->
- [x] #56227 <!-- Do not call `rand` during sysimage precompilation -->
- [x] #55741 <!-- Change annotations to use a NamedTuple -->
- [x] #56149 <!-- Specialize adding/subtracting mixed
Upper/LowerTriangular -->
- [x] #56214 <!-- fix precompile process flags -->
- [x] #54471
- [x] #55622
- [x] #55704
- [x] #55764
@KristofferC KristofferC mentioned this pull request Nov 22, 2024
36 tasks
Base.@assume_effects :foldable function (::Type{T})(x::_KnownIrrational, r::RoundingMode) where {T<:Union{Float32,Float64}}
Base._irrational_to_float(T, x, r)
end
Base.@assume_effects :foldable function rationalize(::Type{T}, x::_KnownIrrational; tol::Real=0) where {T<:Integer}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be Base.rationalize. Right now it creates a new function Base.MathConstants.rationalize. Consequently, Base.rationalize(Int, π) isn’t constant-folded in Julia 1.10 and 1.11:

julia> @btime rationalize(Int,π);
  1.837 ns (0 allocations: 0 bytes)      # v1.9: constant-folded
  88.416 μs (412 allocations: 15.00 KiB) # v1.10: not constant-folded

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A comment easily gets lost so I think it is preferable to create a new issue where it can be given a milestone for example.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I opened a PR: #56793

@KristofferC KristofferC removed the backport 1.10 Change should be backported to the 1.10 release label Dec 13, 2024
inkydragon pushed a commit that referenced this pull request Dec 19, 2024
#55886 accidentally created a new function
`Base.MathConstants.rationalize` instead of extending
`Base.rationalize`, which is the reason why `Base.rationalize(Int, π)`
isn’t constant-folded in Julia 1.10 and 1.11:

```
julia> @Btime rationalize(Int,π);
  1.837 ns (0 allocations: 0 bytes)      # v1.9: constant-folded
  88.416 μs (412 allocations: 15.00 KiB) # v1.10: not constant-folded
```

This PR fixes that. It should probably be backported to 1.10 and 1.11.
KristofferC pushed a commit that referenced this pull request Jan 2, 2025
#55886 accidentally created a new function
`Base.MathConstants.rationalize` instead of extending
`Base.rationalize`, which is the reason why `Base.rationalize(Int, π)`
isn’t constant-folded in Julia 1.10 and 1.11:

```
julia> @Btime rationalize(Int,π);
  1.837 ns (0 allocations: 0 bytes)      # v1.9: constant-folded
  88.416 μs (412 allocations: 15.00 KiB) # v1.10: not constant-folded
```

This PR fixes that. It should probably be backported to 1.10 and 1.11.

(cherry picked from commit d3c26b7)
KristofferC pushed a commit that referenced this pull request Jan 2, 2025
#55886 accidentally created a new function
`Base.MathConstants.rationalize` instead of extending
`Base.rationalize`, which is the reason why `Base.rationalize(Int, π)`
isn’t constant-folded in Julia 1.10 and 1.11:

```
julia> @Btime rationalize(Int,π);
  1.837 ns (0 allocations: 0 bytes)      # v1.9: constant-folded
  88.416 μs (412 allocations: 15.00 KiB) # v1.10: not constant-folded
```

This PR fixes that. It should probably be backported to 1.10 and 1.11.

(cherry picked from commit d3c26b7)
stevengj pushed a commit that referenced this pull request Jan 2, 2025
#55886 accidentally created a new function
`Base.MathConstants.rationalize` instead of extending
`Base.rationalize`, which is the reason why `Base.rationalize(Int, π)`
isn’t constant-folded in Julia 1.10 and 1.11:

```
julia> @Btime rationalize(Int,π);
  1.837 ns (0 allocations: 0 bytes)      # v1.9: constant-folded
  88.416 μs (412 allocations: 15.00 KiB) # v1.10: not constant-folded
```

This PR fixes that. It should probably be backported to 1.10 and 1.11.
KristofferC pushed a commit that referenced this pull request Jan 13, 2025
#55886 accidentally created a new function
`Base.MathConstants.rationalize` instead of extending
`Base.rationalize`, which is the reason why `Base.rationalize(Int, π)`
isn’t constant-folded in Julia 1.10 and 1.11:

```
julia> @Btime rationalize(Int,π);
  1.837 ns (0 allocations: 0 bytes)      # v1.9: constant-folded
  88.416 μs (412 allocations: 15.00 KiB) # v1.10: not constant-folded
```

This PR fixes that. It should probably be backported to 1.10 and 1.11.

(cherry picked from commit d3c26b7)
nsajko added a commit to nsajko/julia that referenced this pull request Jan 23, 2025
Relying on `ScopedValues`, set `BigFloat` precision without mutating
the global default, while constructing `Rational` from
`AbstractIrrational`.

Also helps avoid reading the global defaults for the precision and
rounding mode, together with JuliaLang#56095.

What does this fix:
* in the case of the `Irrational` constants defined in `MathConstants`:
  relevant methods have `@assume_effects :foldable` applied, which
  includes `:effect_free`, which requires that no globals be mutated
  (followup on JuliaLang#55886)
* in the case of `AbstractIrrational` values in general, this PR
  prevents data races on the global `BigFloat` precision
nsajko added a commit to nsajko/julia that referenced this pull request Jan 23, 2025
Relying on `ScopedValues`, set `BigFloat` precision without mutating
the global default, while constructing `Rational` from
`AbstractIrrational`.

Also helps avoid reading the global defaults for the precision and
rounding mode, together with JuliaLang#56095.

What does this fix:
* in the case of the `Irrational` constants defined in `MathConstants`:
  relevant methods have `@assume_effects :foldable` applied, which
  includes `:effect_free`, which requires that no globals be mutated
  (followup on JuliaLang#55886)
* in the case of `AbstractIrrational` values in general, this PR
  prevents data races on the global `BigFloat` precision
nsajko added a commit to nsajko/julia that referenced this pull request Jan 23, 2025
Relying on `ScopedValues`, set `BigFloat` precision without mutating
the global default, while constructing `Rational` from
`AbstractIrrational`.

Also helps avoid reading the global defaults for the precision and
rounding mode, together with JuliaLang#56095.

What does this fix:
* in the case of the `Irrational` constants defined in `MathConstants`:
  relevant methods have `@assume_effects :foldable` applied, which
  includes `:effect_free`, which requires that no globals be mutated
  (followup on JuliaLang#55886)
* in the case of `AbstractIrrational` values in general, this PR
  prevents data races on the global `BigFloat` precision
nsajko added a commit to nsajko/julia that referenced this pull request Jan 24, 2025
Relying on `ScopedValues`, set `BigFloat` precision without mutating
the global default, while constructing `Rational` from
`AbstractIrrational`.

Also helps avoid reading the global defaults for the precision and
rounding mode, together with JuliaLang#56095.

What does this fix:
* in the case of the `Irrational` constants defined in `MathConstants`:
  relevant methods have `@assume_effects :foldable` applied, which
  includes `:effect_free`, which requires that no globals be mutated
  (followup on JuliaLang#55886)
* in the case of `AbstractIrrational` values in general, this PR
  prevents data races on the global `BigFloat` precision
nsajko added a commit to nsajko/julia that referenced this pull request Jan 26, 2025
Relying on `ScopedValues`, set `BigFloat` precision without mutating
the global default, while constructing `Rational` from
`AbstractIrrational`.

Also helps avoid reading the global defaults for the precision and
rounding mode, together with JuliaLang#56095.

What does this fix:
* in the case of the `Irrational` constants defined in `MathConstants`:
  relevant methods have `@assume_effects :foldable` applied, which
  includes `:effect_free`, which requires that no globals be mutated
  (followup on JuliaLang#55886)
* in the case of `AbstractIrrational` values in general, this PR
  prevents data races on the global `BigFloat` precision
nsajko added a commit to nsajko/julia that referenced this pull request Jan 29, 2025
Relying on `ScopedValues`, set `BigFloat` precision without mutating
the global default, while constructing `Rational` from
`AbstractIrrational`.

Also helps avoid reading the global defaults for the precision and
rounding mode, together with JuliaLang#56095.

What does this fix:
* in the case of the `Irrational` constants defined in `MathConstants`:
  relevant methods have `@assume_effects :foldable` applied, which
  includes `:effect_free`, which requires that no globals be mutated
  (followup on JuliaLang#55886)
* in the case of `AbstractIrrational` values in general, this PR
  prevents data races on the global `BigFloat` precision
nsajko added a commit to nsajko/julia that referenced this pull request Jan 30, 2025
Relying on `ScopedValues`, set `BigFloat` precision without mutating
the global default, while constructing `Rational` from
`AbstractIrrational`.

Also helps avoid reading the global defaults for the precision and
rounding mode, together with JuliaLang#56095.

What does this fix:
* in the case of the `Irrational` constants defined in `MathConstants`:
  relevant methods have `@assume_effects :foldable` applied, which
  includes `:effect_free`, which requires that no globals be mutated
  (followup on JuliaLang#55886)
* in the case of `AbstractIrrational` values in general, this PR
  prevents data races on the global `BigFloat` precision
udesou added a commit to mmtk/julia that referenced this pull request Jan 31, 2025
* Make a failed extension load throw an error during pre-compilation (#56668)

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>

* Remove arraylist_t from external native code APIs. (#56693)

This makes them usable for external consumers like GPUCompiler.jl.

* fix world_age_at_entry in codegen (#56700)

* Fix typo in `@cmd` docstring (#56664)

I'm not sure what `` `cmd` `` could refer to, but it would make sense to
refer to `` `str` `` in this case. I'm assuming it's a typo.

* deps/pcre: Update to version 10.44 (#56704)

* compile: make more efficient by discarding internal names (#56702)

These are not user-visible, so this makes the compiler faster and more
efficient with no effort on our part, and avoids duplicating the
debug_level parameter.

* Automatically enable JITPROFILING with ITTAPI (#55598)

This helps when profiling remotely since VTunes doesn't support
setting environment variables on remote systems.

Will still respect `ENABLE_JITPROFILING=0`.

* Fix string handling in jlchecksum (#56720)

A `TAGGED_RELEASE_BANNER` with spaces such as `Official
https://julialang.org release` produces the error
`/cache/build/builder-amdci4-5/julialang/julia-master/deps/tools/jlchecksum:
66: [: Official: unexpected operator`.

* Clarifying ispunct behavior difference between Julia and C in documentation (#56727)

Fixes #56680. This PR updates the documentation for the ispunct function
in Julia to explicitly note its differing behavior from the similarly
named function in C.

---------

Co-authored-by: Lilith Orion Hafner <lilithhafner@gmail.com>

* [NEWS.md] Add PR numbers and remove some 1.11 changes that accidentally came back. (#56722)

* ircode: cleanup code crud

 - support gc running
 - don't duplicate field 4
 - remove some unused code only previously needed for handling cycles
   (which are not valid in IR)

* ircode: small optimization for nearby ssavalue

Since most ssavalue are used just after their def, this gives a small
memory savings on compressed IR (a fraction of a percent).

* Fix scope of hoisted signature-local variables (#56712)

When we declare inner methods, e.g. the `f` in

```
function fs()
   f(lhs::Integer) = 1
   f(lhs::Integer, rhs::(local x=Integer; x)) = 2
   return f
end
```

we must hoist the definition of the (appropriately mangled) generic
function `f` to top-level, including all variables that were used in the
signature definition of `f`. This situation is a bit unique in the
language because it uses inner function scope, but gets executed in
toplevel scope. For example, you're not allowed to use a local of the
inner function in the signature definition:

```
julia> function fs()
          local x=Integer
          f(lhs::Integer, rhs::x) = 2
          return f
       end
ERROR: syntax: local variable x cannot be used in closure declaration
Stacktrace:
 [1] top-level scope
   @ REPL[3]:1
```

In particular, the restriction is signature-local:
```
julia> function fs()
          f(rhs::(local x=Integer; x)) = 1
          f(lhs::Integer, rhs::x) = 2
          return f
       end
ERROR: syntax: local variable x cannot be used in closure declaration
Stacktrace:
 [1] top-level scope
   @ REPL[4]:1
```

There's a special intermediate form `moved-local` that gets generated
for this definition. In c6c3d72d1cbddb3d27e0df0e739bb27dd709a413, this
form stopped getting generated for certain inner methods. I suspect this
happened because of the incorrect assumption that the set of moved
locals is being computed over all signatures, rather than being a
per-signature property.

The result of all of this was that this is one of the few places where
lowering still generated a symbol as the lhs of an assignment for a
global (instead of globalref), because the code that generates the
assignment assumes it's a local, but the later pass doesn't know this.
Because we still retain the code for this from before we started using
globalref consistently, this wasn't generally causing a problems, except
possibly leaking a global (or potentially assigning to a global when
this wasn't intended). However, in follow on work, I want to make use of
knowing whether the LHS is a global or local in lowering, so this was
causing me trouble.

Fix all of this by putting back the `moved-local` where it was dropped.

Fixes #56711

* ircode: avoid serializing ssaflags in the common case when they are all zero

When not all-zero, run-length encoding would also probably be great
here for lowered code (before inference).

* Extend `invoke` to accept CodeInstance (#56660)

This is an alternative mechanism to #56650 that largely achieves the
same result, but by hooking into `invoke` rather than a generated
function. They are orthogonal mechanisms, and its possible we want both.
However, in #56650, both Jameson and Valentin were skeptical of the
generated function signature bottleneck. This PR is sort of a hybrid of
mechanism in #52964 and what I proposed in
https://github.com/JuliaLang/julia/pull/56650#issuecomment-2493800877.

In particular, this PR:

1. Extends `invoke` to support a CodeInstance in place of its usual
`types` argument.

2. Adds a new `typeinf` optimized generic. The semantics of this
optimized generic allow the compiler to instead call a companion
`typeinf_edge` function, allowing a mid-inference interpreter switch
(like #52964), without being forced through a concrete signature
bottleneck. However, if calling `typeinf_edge` does not work (e.g.
because the compiler version is mismatched), this still has well defined
semantics, you just don't get inference support.

The additional benefit of the `typeinf` optimized generic is that it
lets custom cache owners tell the runtime how to "cure" code instances
that have lost their native code. Currently the runtime only knows how
to do that for `owner == nothing` CodeInstances (by re-running
inference). This extension is not implemented, but the idea is that the
runtime would be permitted to call the `typeinf` optimized generic on
the dead CodeInstance's `owner` and `def` fields to obtain a cured
CodeInstance (or a user-actionable error from the plugin).

This PR includes an implementation of `with_new_compiler` from #56650.
This PR includes just enough compiler support to make the compiler
optimize this to the same code that #56650 produced:

```
julia> @code_typed with_new_compiler(sin, 1.0)
CodeInfo(
1 ─      $(Expr(:foreigncall, :(:jl_get_tls_world_age), UInt64, svec(), 0, :(:ccall)))::UInt64
│   %2 =   builtin Core.getfield(args, 1)::Float64
│   %3 =    invoke sin(%2::Float64)::Float64
└──      return %3
) => Float64
```

However, the implementation here is extremely incomplete. I'm putting it
up only as a directional sketch to see if people prefer it over #56650.
If so, I would prepare a cleaned up version of this PR that has the
optimized generics as well as the curing support, but not the full
inference integration (which needs a fair bit more work).

* Update references to LTS from v1.6 to v1.10 (#56729)

* lowering: Canonicalize to builtins for global assignment (#56713)

This adjusts lowering to emit `setglobal!` for assignment to globals,
thus making the `=` expr head used only for slots in `CodeInfo` and
entirely absent in `IRCode`. The primary reason for this is just to
reduce the number of special cases that compiler passes have to reason
about. In IRCode, `=` was already essentially equivalent to
`setglobal!`, so there's no good reason not to canonicalize.

Finally, the `=` syntax form for globals already gets recognized
specially to insert `convert` calls to their declared binding type, so
this doesn't impose any additional requirements on lowering to
distinguish local from global assignments. In general, I'd also like to
separate syntax and intermediate forms as much as possible where their
semantics differ, which this accomplises by just using the builtin.

This change is mostly semantically invisible, except that spliced-in
GlobalRefs now declare their binding because they are indistinguishable
from ordinary assignments at the stage where I inserted the lowering. If
we want to, we can preserve the difference, but it'd be a bit more
annoying for not much benefit, because:
1. The spliced in version was only recently made to work anyway, and
2. The semantics of when exactly bindings are declared is still messy on
master anyway and will get tweaked shortly in further binding partitions
work.

* Actually show glyphs for latex or emoji shortcodes being suggested in the REPL (#54800)

When a user requests a completion for a backslash shortcode, this PR
adds the glyphs for all the suggestions to the output. This makes it
much easier to find the result one is looking for, especially if the
user doesn't know all latex and emoji specifiers by heart.

Before:

<img width="813" alt="image"
src="https://github.com/JuliaLang/julia/assets/22495855/bf651399-85a6-4677-abdc-c66a104e3b89">

After:

<img width="977" alt="image"
src="https://github.com/JuliaLang/julia/assets/22495855/04c53ea2-318f-4888-96eb-0215b49c10f3">

---------

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Update annotated.jl docstrings according to #55741 (#56736)

Annotations now use a NamedTuple

* effects: pack bits better (#56737)

There is no reason to preserve duplicates of the bits for the value
before and after inference, and many of the numbers in the comments had
gotten incorrect. Now we are able to pack all 16 bits of currently
defined bitflags into 20 bits, instead of 25 bits (although either case
still rounds up to 32).

There was also no reason for InferenceState to be mutating of CodeInfo
during execution, so remove that mutation.

* 🤖 [master] Bump the Pkg stdlib from 7b759d7f0 to d84a1a38b (#56743)

Stdlib: Pkg
URL: https://github.com/JuliaLang/Pkg.jl.git
Stdlib branch: master
Julia branch: master
Old commit: 7b759d7f0
New commit: d84a1a38b
Julia version: 1.12.0-DEV
Pkg version: 1.12.0
Bump invoked by: @KristofferC
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaLang/Pkg.jl/compare/7b759d7f0af56c5ad01f2289bbad71284a556970...d84a1a38b6466fa7400e9ad2874a0ef963a10456

```
$ git log --oneline 7b759d7f0..d84a1a38b
d84a1a38b Allow use of a url and subdir in [sources] (#4039)
cd75456a8 Fix heading (#4102)
b61066120 rename FORMER_STDLIBS -> UPGRADABLE_STDLIBS (#4070)
814949ed2 Increase version of `StaticArrays` in `why` tests (#4077)
83e13631e Run CI on backport branch too (#4094)
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Hide IRShow include from Revise (#56756)

Revise in theory wants to re-evaluate this include, but it fails at
doing so, because the include call no longer works after bootstrap. It
happens to work right now on master, because the lowering of
`Compiler.include` happens to hide the include call from Revise, but
that's a Revise bug I'm about to fix. Address this by moving the include
call into the package and using an absolute include if necessary.

* fixup!: JuliaLang/julia#56756 (#56758)

We need to quote it, otherwise it would result in `UnderVarError`.

* Accept more general Integer sizes in reshape (#55521)

This PR generalizes the `reshape` methods to accept `Integer`s instead
of `Int`s, and adds a `_reshape_uncolon` method for `Integer` arguments.
The current `_reshape_uncolon` method that accepts `Int`s is left
unchanged to ensure that the inferred types are not impacted. I've also
tried to ensure that most `Integer` subtypes in `Base` that may be
safely converted to `Int`s pass through that method.

The call sequence would now go like this:
```julia
reshape(A, ::Tuple{Vararg{Union{Integer, Colon}}}) -> reshape(A, ::Tuple{Vararg{Integer}}) -> reshape(A, ::Tuple{Vararg{Int}}) (fallback)
```
This lets packages define `reshape(A::CustomArray, ::Tuple{Integer,
Vararg{Integer}})` without having to implement `_reshape_uncolon` by
themselves (or having to call internal `Base` functions, as in
https://github.com/JuliaArrays/FillArrays.jl/issues/373). `reshape`
calls involving a `Colon` would convert this to an `Integer` in `Base`,
and then pass the `Integer` sizes to the custom method defined in the
package.

This PR does not resolve issues like
https://github.com/JuliaLang/julia/issues/40076 because this still
converts `Integer`s to `Int`s in the actual reshaping step. However,
`BigInt` sizes that may be converted to `Int`s will work now:
```julia
julia> reshape(1:4, big(2), big(2))
2×2 reshape(::UnitRange{Int64}, 2, 2) with eltype Int64:
 1  3
 2  4

julia> reshape(1:4, big(1), :)
1×4 reshape(::UnitRange{Int64}, 1, 4) with eltype Int64:
 1  2  3  4
```

Note that the reshape method with `Integer` sizes explicitly converts
these to `Int`s to avoid self-recursion (as opposed to calling
`to_shape` to carry out the conversion implicitly). In the future, we
may want to decide what to do with types or values that can't be
converted to an `Int`.

---------

Co-authored-by: Neven Sajko <s@purelymail.com>

* drop llvm 16 support (#56751)

Co-authored-by: Valentin Churavy <v.churavy@gmail.com>

* Address some post-commit review from #56660 (#56747)

Some more questions still to be answered, but this should address the
immediate actionable review items.

* Add per-task metrics (#56320)

Close https://github.com/JuliaLang/julia/issues/47351 (builds on top of
https://github.com/JuliaLang/julia/pull/48416)

Adds two per-task metrics:
- running time = amount of time the task was actually running (according
to our scheduler). Note: currently inclusive of GC time, but would be
good to be able to separate that out (in a future PR)
- wall time = amount of time between the scheduler becoming aware of
this task and the task entering a terminal state (i.e. done or failed).

We record running time in `wait()`, where the scheduler stops running
the task as well as in `yield(t)`, `yieldto(t)` and `throwto(t)`, which
bypass the scheduler. Other places where a task stops running (for
`Channel`, `ReentrantLock`, `Event`, `Timer` and `Semaphore` are all
implemented in terms of `wait(Condition)`, which in turn calls `wait()`.
`LibuvStream` similarly calls `wait()`.

This should capture everything (albeit, slightly over-counting task CPU
time by including any enqueuing work done before we hit `wait()`).

The various metrics counters could be a separate inlined struct if we
think that's a useful abstraction, but for now i've just put them
directly in `jl_task_t`. They are all atomic, except the
`metrics_enabled` flag itself (which we now have to check on task
start/switch/done even if metrics are not enabled) which is set on task
construction and marked `const` on the julia side.

In future PRs we could add more per-task metrics, e.g. compilation time,
GC time, allocations, potentially a wait-time breakdown (time waiting on
locks, channels, in the scheduler run queue, etc.), potentially the
number of yields.

Perhaps in future there could be ways to enable this on a per-thread and
per-task basis. And potentially in future these same timings could be
used by `@time` (e.g. writing this same timing data to a ScopedValue
like in https://github.com/JuliaLang/julia/pull/55103 but only for tasks
lexically scoped to inside the `@time` block).

Timings are off by default but can be turned on globally via starting
Julia with `--task-metrics=yes` or calling
`Base.Experimental.task_metrics(true)`. Metrics are collected for all
tasks created when metrics are enabled. In other words,
enabling/disabling timings via `Base.Experimental.task_metrics` does not
affect existing `Task`s, only new `Task`s.

The other new APIs are `Base.Experimental.task_running_time_ns(::Task)`
and `Base.Experimental.task_wall_time_ns(::Task)` for retrieving the new
metrics. These are safe to call on any task (including the current task,
or a task running on another thread). All these are in
`Base.Experimental` to give us room to change up the APIs as we add more
metrics in future PRs (without worrying about release timelines).

cc @NHDaly @kpamnany @d-netto

---------

Co-authored-by: Pete Vilter <pete.vilter@gmail.com>
Co-authored-by: K Pamnany <kpamnany@users.noreply.github.com>
Co-authored-by: Nathan Daly <nathan.daly@relational.ai>
Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>

* Fully outline all GlobalRefs (#56746)

This is an alternative to #56714 that goes in the opposite direction -
just outline all GlobalRefs during lowering. It is a lot simpler that
#56714 at the cost of some size increase. Numbers:

sys.so .ldata size:
This PR: 159.8 MB
Master: 158.9 MB

I don't have numbers of #56714, because it's not fully complete.
Additionally, it's possible that restricting GlobalRefs from arguments
position would let us use a more efficient encoding in the future.

* Add #54800 to NEWS (#56774)

Show glyphs for latex or emoji shortcodes being suggested in the REPL

* Add the actual datatype to the heapsnapshot. This groups objects of the same type together (#56596)

* Fix typos in docstring, comments, and news (#56778)

* Add sort for NTuples (#54494)

This is partially a reland of #46104, but without the controversial `sort(x) = sort!(copymutable(x))` and with some extensibility improvements. Implements #54489.

* precompile: don't waste memory on useless inferred code (#56749)

We never have a reason to reference this data again since we already
have native code generated for it, so it is simply wasting memory and
download space.

$ du -sh {old,new}/usr/share/julia/compiled
256M old
227M new

* various globals cleanups (#56750)

While doing some work on analyzing what code runs at toplevel, I found a
few things to simplify or fix:

- simplify float.jl loop not to call functions just defined to get back
the value just stored there
- add method to the correct checkbounds function (instead of a local)
- missing world push/pop around jl_interpret_toplevel_thunk after #56509
- jl_lineno use maybe missed in #53799
- add some debugging dump for scm_to_julia_ mistakes

* Fix test report alignment (#56789)

* 🤖 [master] Bump the Pkg stdlib from d84a1a38b to e7c37f342 (#56786)

* Bump JuliaSyntax to 0.4.10 (#56110)

* libgit2: update enums from v1.8.0 (#56764)

* fix `exp(weirdNaN)` (#56784)

Fixes https://github.com/JuliaLang/julia/issues/56782
Fix `exp(reinterpret(Float64, 0x7ffbb14880000000))` returning non-NaN
value. This should have minimal performance impact since it's already in
the fallback branch.

* Add note to Vararg/UnionAll warning about making it an error (#56662)

This warning message
```
WARNING: Wrapping `Vararg` directly in UnionAll is deprecated (wrap the tuple instead).
You may need to write `f(x::Vararg{T})` rather than `f(x::Vararg{<:T})` or `f(x::Vararg{T}) where T` instead of `f(x::Vararg{T} where T)`.
```
(last extended in #49558) seems clear enough if you wrote the code. But
if it's coming from 10 packages deep, there's no information to track
down the origin.

Turns out you can do this with `--depwarn=error`. But the message
doesn't tell you that, and doesn't call itself a deprecation warning at
all.

* Add a note clearifying option parsing (#56285)

To help with #56274

* Fix undefined symbol error in version script (#55363)

lld 17 and above by default error if symbols listed in the version
script are undefined. Julia has a few of these, as some symbols are
defined conditionally in Julia (e.g. based on OS), others perhaps have
been removed from Julia and other seem to be defined in other libraries.
Further the version script is used in linking three times, each time
linking together different objects and so having different symbols
defined.

Adding `-Wl,--undefined-version` is not a great solution as passing that
to ld < 2.40 errors and there doesn't seem to be a great way to check if
a linker supports this flag.
I don't know how to get around these errors for symbols like
`_IO_stdin_used` which Julia doesn't define and it seems to matter
whether or not they are exported, see
https://libc-alpha.sourceware.narkive.com/SevIQmU3/io-stdin-used-stripped-by-version-scripts.
So I've converted all undefined symbols into wildcards to work around
the error.

Fixes #50414, fixes #54533 and replaces #55319.

---------

Co-authored-by: Zentrik <Zentrik@users.noreply.github.com>

* Update repr docstring to hint what it stands for. (#56761)

- Change `repr` docstring from "Create a string from any
value ..." to "Create a string representation of any value ...".
- Document that it typically emits parseable Julia code

---------

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>

* Fix generate_precompile statement grouping & avoid defining new func (#56317)

* remove LinearAlgebra specific bitarray tests since they have moved to the external LinearAlgebra.jl repo (#56800)

Moved in https://github.com/JuliaLang/LinearAlgebra.jl/pull/1148.

* Fix partially_inline for unreachable (#56787)

* codegen: reduce recursion in cfunction generation (#56806)

The regular code-path for this was only missing the age_ok handling, so
add in that handling so we can delete the custom path here for the test
and some of the brokenness that implied.

* gc: simplify sweep_weak_refs logic (#56816)

[NFCI]

* gc: improve mallocarrays locality (#56801)

* Fix codegen not handling invoke exprs with Codeinstances  iwith jl_fptr_sparam_addr invoke types. (#56817)

fixes https://github.com/JuliaLang/julia/issues/56739
I didn't succeed in making a test for this. The sole trigger seems to be
```julia
using HMMGradients
T = Float32
A = T[0.0 1.0 0.0; 0.0 0.5 0.5; 1.0 0.0 0.0]
t2tr = Dict{Int,Vector{Int}}[Dict(1 => [2]),]
t2IJ= HMMGradients.t2tr2t2IJ(t2tr)

Nt = length(t2tr)+1
Ns = size(A,1)
y = rand(T,Nt,Ns)

c = rand(Float32, Nt)
beta = backward(Nt,A,c,t2IJ,y)
gamma = posterior(Nt,t2IJ,A,y)
```
in @oscardssmith memorynew PR

One other option is to have the builtin handle receiving a CI. That
might make the code cleaner and does handle the case where we receive a
dynamic CI (is that even a thing)

* 🤖 [master] Bump the SparseArrays stdlib from 1b4933c to 4fd3aad (#56830)

Stdlib: SparseArrays
URL: https://github.com/JuliaSparse/SparseArrays.jl.git
Stdlib branch: main
Julia branch: master
Old commit: 1b4933c
New commit: 4fd3aad
Julia version: 1.12.0-DEV
SparseArrays version: 1.12.0
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaSparse/SparseArrays.jl/compare/1b4933ccc7b1f97427ff88bd7ba58950021f2c60...4fd3aad5735e3b80eefe7b068f3407d7dd0c0924

```
$ git log --oneline 1b4933c..4fd3aad
4fd3aad Generalize `istriu`/`istril` to accept a band index (#590)
780c4de Bump codecov/codecov-action from 4 to 5 (#589)
1beb0e4 Update LICENSE.md (#587)
268d390 QR: handle xtype/dtype returned from LibSuiteSparse that don't match matrix element type (#586)
9731aef get rid of UUID changing stuff (#582)
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Missing tests for IdSet (#56258)

Co-authored-by: CY Han <git@wo-class.cn>

* Fix eltype of flatten of tuple with non-2 length (#56802)

In 4c076c80af, eltype of flatten of tuple was improved by computing a
refined eltype at compile time. However, this implementation only worked
for length-2 tuples, and errored for all others.
Generalize this to all tuples.

Closes #56783

---------

Co-authored-by: Neven Sajko <s@purelymail.com>

* Skip or loosen two `errorshow` tests on 32-bit Windows (#56837)

Ref #55900.

* Adding tests for AbstractArrayMath.jl (#56773)

added tests for lines 7, 137-154 (insertdims function) from
base/abstractarraymath.jl

---------

Co-authored-by: Lilith Orion Hafner <lilithhafner@gmail.com>
Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* 🤖 [master] Bump the Downloads stdlib from 89d3c7d to afd04be (#56826)

Stdlib: Downloads
URL: https://github.com/JuliaLang/Downloads.jl.git
Stdlib branch: master
Julia branch: master
Old commit: 89d3c7d
New commit: afd04be
Julia version: 1.12.0-DEV
Downloads version: 1.6.0(It's okay that it doesn't match)
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaLang/Downloads.jl/compare/89d3c7dded535a77551e763a437a6d31e4d9bf84...afd04be8aa94204c075c8aec83fca040ebb4ff98

```
$ git log --oneline 89d3c7d..afd04be
afd04be Bump codecov/codecov-action from 4 to 5 (#264)
39036e1 CI: Use Dependabot to automatically update external GitHub Actions (#263)
78e7c7c Bump CI actions versions (#252)
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* 🤖 [master] Bump the SHA stdlib from aaf2df6 to 8fa221d (#56834)

Stdlib: SHA
URL: https://github.com/JuliaCrypto/SHA.jl.git
Stdlib branch: master
Julia branch: master
Old commit: aaf2df6
New commit: 8fa221d
Julia version: 1.12.0-DEV
SHA version: 0.7.0(Does not match)
Bump invoked by: @inkydragon
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaCrypto/SHA.jl/compare/aaf2df61ff8c3898196587a375d3cf213bd40b41...8fa221ddc8f3b418d9929084f1644f4c32c9a27e

```
$ git log --oneline aaf2df6..8fa221d
8fa221d ci: update doctest config (#120)
346b359 ci: Update ci config (#115)
aba9014 Fix type mismatch for `shake/digest!` and setup x86 ci (#117)
0b76d04 Merge pull request #114 from JuliaCrypto/dependabot/github_actions/codecov/codecov-action-5
5094d9d Update .github/workflows/CI.yml
45596b1 Bump codecov/codecov-action from 4 to 5
230ab51 test: remove outdate tests (#113)
7f25aa8 rm: Duplicated const alias (#111)
aa72f73 [SHA3] Fix padding special-case (#108)
3a01401 Delete Manifest.toml (#109)
da351bb Remvoe all getproperty funcs (#99)
4eee84f Bump codecov/codecov-action from 3 to 4 (#104)
15f7dbc Bump codecov/codecov-action from 1 to 3 (#102)
860e6b9 Bump actions/checkout from 2 to 4 (#103)
8e5f0ea Add dependabot to auto update github actions (#100)
4ab324c Merge pull request #98 from fork4jl/sha512-t
a658829 SHA-512: add ref to NIST standard
11a4c73 Apply suggestions from code review
969f867 Merge pull request #97 from fingolfin/mh/Vector
b1401fb SHA-512: add NIST test
4d7091b SHA-512: add to docs
09fef9a SHA-512: test SHA-512/224, SHA-512/256
7201b74 SHA-512: impl SHA-512/224, SHA-512/256
4ab85ad Array -> Vector
8ef91b6 fixed bug in padding for shake, addes testcases for full code coverage (#95)
88e1c83 Remove non-existent property (#75)
068f85d shake128,shake256: fixed typo in export declarations (#93)
176baaa SHA3 xof shake128 and shake256  (#92)
e1af7dd Hardcode doc edit backlink
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* 🤖 [master] Bump the StyledStrings stdlib from 056e843 to 8985a37 (#56832)

Stdlib: StyledStrings
URL: https://github.com/JuliaLang/StyledStrings.jl.git
Stdlib branch: main
Julia branch: master
Old commit: 056e843
New commit: 8985a37
Julia version: 1.12.0-DEV
StyledStrings version: 1.11.0(Does not match)
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaLang/StyledStrings.jl/compare/056e843b2d428bb9735b03af0cff97e738ac7e14...8985a37ac054c37d084a03ad2837208244824877

```
$ git log --oneline 056e843..8985a37
8985a37 Fix interpolation edge case dropping annotations
729f56c Add typeasserts to `convert(::Type{Face}, ::Dict)`
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* xref `UnionAll` in the doc string of `where` (#56411)

* 🤖 [master] Bump the ArgTools stdlib from 997089b to 1314758 (#56839)

Stdlib: ArgTools
URL: https://github.com/JuliaIO/ArgTools.jl.git
Stdlib branch: master
Julia branch: master
Old commit: 997089b
New commit: 1314758
Julia version: 1.12.0-DEV
ArgTools version: 1.1.2(Does not match)
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaIO/ArgTools.jl/compare/997089b9cd56404b40ff766759662e16dc1aab4b...1314758ad02ff5e9e5ca718920c6c633b467a84a

```
$ git log --oneline 997089b..1314758
1314758 build(deps): bump codecov/codecov-action from 4 to 5; also, use CODECOV_TOKEN (#40)
68bb888 Fix typo in `arg_write` docstring (#39)
5d56027 build(deps): bump julia-actions/setup-julia from 1 to 2 (#38)
b6189c7 build(deps): bump codecov/codecov-action from 3 to 4 (#37)
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* 🤖 [master] Bump the Statistics stdlib from 68869af to d49c2bf (#56831)

Stdlib: Statistics
URL: https://github.com/JuliaStats/Statistics.jl.git
Stdlib branch: master
Julia branch: master
Old commit: 68869af
New commit: d49c2bf
Julia version: 1.12.0-DEV
Statistics version: 1.11.2(Does not match)
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaStats/Statistics.jl/compare/68869af06e8cdeb7aba1d5259de602da7328057f...d49c2bf4f81e1efb4980a35fe39c815ef8396297

```
$ git log --oneline 68869af..d49c2bf
d49c2bf Merge pull request #178 from JuliaStats/dw/ci
d10d6a3 Update Project.toml
1b67c17 Merge pull request #168 from JuliaStats/andreasnoack-patch-2
c3721ed Add a coverage badge
8086523 Test earliest supported Julia version and prereleases
12a1976 Update codecov in ci.yml
2caf0eb Merge pull request #177 from JuliaStats/ViralBShah-patch-1
33e6e8b Update ci.yml to use julia-actions/cache
a399c19 Merge pull request #176 from JuliaStats/dependabot/github_actions/julia-actions/setup-julia-2
6b8d58a Merge branch 'master' into dependabot/github_actions/julia-actions/setup-julia-2
c2fb201 Merge pull request #175 from JuliaStats/dependabot/github_actions/actions/cache-4
8f808e4 Merge pull request #174 from JuliaStats/dependabot/github_actions/codecov/codecov-action-4
7f82133 Merge pull request #173 from JuliaStats/dependabot/github_actions/actions/checkout-4
046fb6f Update ci.yml
c0fc336 Bump julia-actions/setup-julia from 1 to 2
a95a57a Bump actions/cache from 1 to 4
b675501 Bump codecov/codecov-action from 1 to 4
0088c49 Bump actions/checkout from 2 to 4
ad95c08 Create dependabot.yml
40275e2 Merge pull request #167 from JuliaStats/andreasnoack-patch-1
fa5592a Merge pull request #170 from mbauman/patch-1
cf57562 Add more tests of mean and median of ranges
128dc11 Merge pull request #169 from stevengj/patch-1
48d7a02 docfix: abs2, not ^2
2ac5bec correct std docs: sqrt is elementwise
39f6332 Merge pull request #96 from josemanuel22/mean_may_return_incorrect_results
db3682b Merge branch 'master' into mean_may_return_incorrect_results
9e96507 Update src/Statistics.jl
58e5986 Test prereleases
6e76739 Implement one-argument cov2cor!
b8fee00 Stop testing on nightly
9addbb8 Merge pull request #162 from caleb-allen/patch-1
6e3d223 Merge pull request #164 from aplavin/patch-1
71ebe28 Merge pull request #166 from JuliaStats/dw/cov_cor_optimization
517afa6 add tests
aa0f549 Optimize `cov` and `cor` with identical arguments
cc11ea9 propagate NaN value in median
cf7040f Use non-mobile Wikipedia urls
547bf4d adding docu to mean! explain target should not alias with the source
296650a adding docu to mean! explain target should not alias with the source
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* inference: don't allocate `TryCatchFrame` for `compute_trycatch(::IRCode)` (#56835)

`TryCatchFrame` is only required for the abstract interpretation and is
not necessary in `compute_trycatch` within slot2ssa.jl.

@nanosoldier `runbenchmarks("inference", vs=":master")`

* 🤖 [master] Bump the LazyArtifacts stdlib from e9a3633 to a719c0e (#56827)

Stdlib: LazyArtifacts
URL: https://github.com/JuliaPackaging/LazyArtifacts.jl.git
Stdlib branch: main
Julia branch: master
Old commit: e9a3633
New commit: a719c0e
Julia version: 1.12.0-DEV
LazyArtifacts version: 1.11.0(Does not match)
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaPackaging/LazyArtifacts.jl/compare/e9a36338d5d0dfa4b222f4e11b446cbb7ea5836c...a719c0e3d68a95c6f3dc9571459428ca8761fa2c

```
$ git log --oneline e9a3633..a719c0e
a719c0e Add compat for LazyArtifacts
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* make `memorynew` intrinsic (#56803)

Attempt to split up https://github.com/JuliaLang/julia/pull/55913 into 2
pieces. This piece now only adds the `memorynew` intrinsic without any
of the optimizations enabled by
https://github.com/JuliaLang/julia/pull/55913. As such, this PR should
be ready to merge now. (and will make
https://github.com/JuliaLang/julia/pull/55913 smaller and simpler)

---------

Co-authored-by: gbaraldi <baraldigabriel@gmail.com>

* fix `compute_trycatch` for `IRCode` /w `EnterNode` with `catch_dest==0` (#56846)

* EA: general cleanup (#56848)

The handling of `Array` in EA was implemented before `Memory` was
introduced and has now become stale. Analysis for `Array` should be
reintroduced after the upcoming overhaul is completed. For now, I will
remove the existing stale code.

* 🤖 [master] Bump the Distributed stdlib from 6c7cdb5 to c613685 (#56825)

Stdlib: Distributed
URL: https://github.com/JuliaLang/Distributed.jl
Stdlib branch: master
Julia branch: master
Old commit: 6c7cdb5
New commit: c613685
Julia version: 1.12.0-DEV
Distributed version: 1.11.0(Does not match)
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaLang/Distributed.jl/compare/6c7cdb5860fa5cb9ca191ce9c52a3d25a9ab3781...c6136853451677f1957bec20ecce13419cde3a12

```
$ git log --oneline 6c7cdb5..c613685
c613685 Merge pull request #116 from JuliaLang/ci-caching
20e2ce7 Use julia-actions/cache in CI
9c5d73a Merge pull request #112 from JuliaLang/dependabot/github_actions/codecov/codecov-action-5
ed12496 Merge pull request #107 from JamesWrigley/remotechannel-empty
010828a Update .github/workflows/ci.yml
11451a8 Bump codecov/codecov-action from 4 to 5
8b5983b Merge branch 'master' into remotechannel-empty
729ba6a Fix docstring of `@everywhere` (#110)
af89e6c Adding better docs to exeflags kwarg (#108)
8537424 Implement Base.isempty(::RemoteChannel)
6a0383b Add a wait(::[Abstract]WorkerPool) (#106)
1cd2677 Bump codecov/codecov-action from 1 to 4 (#96)
cde4078 Bump actions/cache from 1 to 4 (#98)
6c8245a Bump julia-actions/setup-julia from 1 to 2 (#97)
1ffaac8 Bump actions/checkout from 2 to 4 (#99)
8e3f849 Fix RemoteChannel iterator interface (#100)
f4aaf1b Fix markdown errors in README.md (#95)
2017da9 Merge pull request #103 from JuliaLang/sf/sigquit_instead
07389dd Use `SIGQUIT` instead of `SIGTERM`
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* inference: handle cases where `:the_exception` is used independently (#56836)

`Expr(:the_exception)` is handled by the interpreter in all cases,
however, inference assumes it is only used within frames containing
`try/catch`. This commit corrects that assumption.

* precompileplkgs: release parallel limiter when waiting for another process (#56844)

* Tests for two AbstractString methods (#56247)

Co-authored-by: Chengyu Han <cyhan.dev@outlook.com>

* Tests for annotated string/char c-tors (#56513)

Co-authored-by: Chengyu Han <cyhan.dev@outlook.com>

* docs: fix example for `sort` and add new doctest (#56843)

* jitlayers: re-delete deregisterEHFrames impl (#56854)

Fixes https://github.com/maleadt/LLVM.jl/issues/496

* docs: fix edge case in rational number conversion `float(a//b)` (#56772)

Fixes #56726 added the changes that were suggested. fixing the mistake.

---------

Co-authored-by: Max Horn <max@quendi.de>
Co-authored-by: Chengyu Han <git@wo-class.cn>

* docs: fix scope type of a `struct` to hard (#56755)

Is struct not a hard scope?

```jl
julia> b = 1
       struct Tester
           tester
           Tester(tester) = new(tester)
           b = 2
           Tester() = new(b)
       end
       b
1
```

* dict docs: document that ordering of keys/values/pairs match iterate (#56842)

Fix #56841.

Currently the documentation states that keys(dict) and values(dict)
iterate in the same order. But it is not stated whether this is the same
order as that used by pairs(dict), or when looping, for (k,v) in dict.

This PR makes this guarantee explicit.

* fix abstract_eval_cfunction mistakes (#56856)

Noticed in code reading, that 35e4a1f9689f4b98f301884e0683e4f07db7514b
simplified this incorrectly resulting in all arguments being assigned to
the function type, and then 7f8635f11cae5f3f592afcc7b55c8e0e23589c3d
further broke the return type expected for the failure case.

Co-authored-by: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com>

* inference: use `ssa_def_slot` for `typeassert` refinement (#56859)

Allows type refinement in the following kind of case:
```julia
julia> @test Base.infer_return_type((Vector{Any},)) do args
           codeinst = first(args)
           if codeinst isa Core.MethodInstance
               mi = codeinst
           else
               codeinst::Core.CodeInstance
               mi = codeinst.def
           end
           return mi
       end == Core.MethodInstance
Test Passed
```

* EA: use embedded `CodeInstance` directly for escape cache lookup (#56860)

* Compiler.jl: use `Base.[all|any]` instead of `Compiler`'s own versions (#56851)

The current `Compiler` defines its own versions of `all` and `any`,
which are separate generic functions from `Base.[all|any]`:
https://github.com/JuliaLang/julia/blob/2ed1a411e0a080f3107e75bb65105a15a0533a90/Compiler/src/utilities.jl#L15-L32

On the other hand, at the point where `Base.Compiler` is bootstrapped,
only a subset of `Base.[all|any]` are defined, specifically those
related to `Tuple`:

https://github.com/JuliaLang/julia/blob/2ed1a411e0a080f3107e75bb65105a15a0533a90/base/tuple.jl#L657-L668.
Consequently, in the type inference world, functions like
`Base.all(::Generator)` are unavailable. If `Base.Compiler` attempts to
perform operations such as `::BitSet ⊆ ::BitSet` (which internally uses
`Base.[all|any]`), a world age error occurs (while `Compiler.[all|any]`
can handle these operations, `::BitSet ⊆ ::BitSet` uses
`Base.[all|any]`, leading to this issue)

To resolve this problem, this commit removes the custom `Compiler`
versions of `[all|any]` and switches to using the Base versions.

One concern is that the previous `Compiler` versions of `[all|any]`
utilized `@nospecialize`. That annotation was introduced a long time ago
to prevent over-specialization, but it is questionable whether it is
still effective with the current compiler implementation. The results of
the nanosoldier benchmarks conducted below also seem to confirm that
the `@nospecialize`s are no longer necessary for those functions.

* Extend `Base.rationalize` instead of defining new function (#56793)

#55886 accidentally created a new function
`Base.MathConstants.rationalize` instead of extending
`Base.rationalize`, which is the reason why `Base.rationalize(Int, π)`
isn’t constant-folded in Julia 1.10 and 1.11:

```
julia> @btime rationalize(Int,π);
  1.837 ns (0 allocations: 0 bytes)      # v1.9: constant-folded
  88.416 μs (412 allocations: 15.00 KiB) # v1.10: not constant-folded
```

This PR fixes that. It should probably be backported to 1.10 and 1.11.

* 🤖 [master] Bump the LinearAlgebra stdlib from 56d561c to 1137b4c (#56828)

Stdlib: LinearAlgebra
URL: https://github.com/JuliaLang/LinearAlgebra.jl.git
Stdlib branch: master
Julia branch: master
Old commit: 56d561c
New commit: 1137b4c
Julia version: 1.12.0-DEV
LinearAlgebra version: 1.11.0(Does not match)
Bump invoked by: @DilumAluthge
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaLang/LinearAlgebra.jl/compare/56d561c22e1ab8e0421160edbdd42f3f194ecfa8...1137b4c7fa8297cef17c4ae0982d7d89d4ab7dd8

```
$ git log --oneline 56d561c..1137b4c
1137b4c Port structured opnorm changes from main julia PR (#1138)
ade3654 port bitarray tests to LinearAlgebra.jl (#1148)
130b94a Fix documentation bug in QR docstring (#1145)
128518e setup coverage (#1144)
15f7e32 ci: add linux-i686 (#1142)
b6f87af Fallback `newindex` method with a `BandIndex` (#1143)
d1e267f bring back [l/r]mul! shortcuts for (kn)own triangular types (#1137)
5cdeb46 don't refer to internal variable names in gemv exceptions (#1141)
4a3dbf8 un-revert "Simplify some views of Adjoint matrices" (#1122)
7b34d81 [CI] Install DependaBot (#1115)
f567112 Port structured opnorm changes from main julia PR Originally written by mcognetta
d406524 implements a `rank(::SVD)` method and adds unit tests. fixes #1126 (#1127)
f13f940 faster implementation of rank(::QRPivoted) fixes #1128 (#1129)
8ab7e09 Merge pull request #1132 from JuliaLang/jishnub/qr_ldiv_R_cache
85919e6 Merge pull request #1108 from JuliaLang/jishnub/tri_muldiv_stride
195e678 Cache and reuse `R` in adjoint `QR` `ldiv!`
cd0da66 Update comments LAPACK -> BLAS
b3ec55f Fix argument name in stride
d3a9a3e Non-contiguous matrices in triangular mul and div
aecb714 Reduce number of test combinations in test/triangular.jl (#1123)
62e45d1 Update .github/dependabot.yml
ff78c38 use an explicit file extension when creating sysimage (#1119)
43b541e try use updated windows compilers in PackageCompiler (#1120)
c00cb77 [CI] Install DependaBot
b285b1c Update LICENSE (#1113)
7efc3ba remove REPL from custom sysimage (#1112)
b7f82ec add a README
```

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Add ABIOverride type for def field (#56555)

Together with #54899, this PR is intending to replicate the
functionality of #54373, which allowed particular specializations to
have a different ABI signature than what would be suggested by the
MethodInstance's `specTypes` field. This PR handles that by adding a
special `ABIOverwrite` type, which, when placed in the `owner` field of
a `CodeInstance` instructs the system to use the given signature
instead.

* EAUtils: perform `code_escapes` with a global cache by default (#56868)

In JuliaLang/julia#56860, `EAUtils.EscapeAnalyzer` was updated to create
a new cache for each invocation of `code_escapes`, similar to how
Cthulhu.jl behaves. However, `code_escapes` is often used for
performance analysis like `@benchmark code_escapes(...)`, and in such
cases, a large number of `CodeInstance`s can be generated for each
invocation. This could potentially impact native code execution.

So this commit changes the default behavior so that `code_escapes` uses
the same pre-existing cache by default. We can still opt-in to perform a
fresh analysis by specifying
`cache_token=EAUtils.EscapeAnalyzerCacheToken()`.

* Small ABIOverride follow up and add basic test (#56877)

Just a basic `invoke` test for now. There's various other code paths
that should also be tested with ABI overwrites, but this gives us the
basic framework and more tests can be added as needed.

* Package docstring: more peaceful README introduction (#56798)

Hello! 👋

#39093 is great! This PR styles the banner ("Displaying contents of
readme found at ...") differently:

Before:

```
help?> DifferentialEquations
search: DifferentialEquations

  No docstring found for module DifferentialEquations.

  Exported names
  ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

  @derivatives, @ode_def, @ode_def_all, @ode_def_bare, 
  ... (manually truncated)

  Displaying contents of readme found at /Users/ian/.julia/packages/DifferentialEquations/HSWeG/README.md
  ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

  DifferentialEquations.jl
  ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

  (Image: Join the chat at https://gitter.im/JuliaDiffEq/Lobby) (https://gitter.im/JuliaDiffEq/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) (Image:
  Build Status) (https://github.com/SciML/DifferentialEquations.jl/actions?query=workflow%3ACI) (Image: Stable) (http://diffeq.sciml.ai/stable/) (Image: Dev) (http://diffeq.sciml.ai/dev/)
  (Image: DOI) (https://zenodo.org/badge/latestdoi/58516043)

  This is a suite for numerically solving differential equations written in Julia and available for use in Julia, Python, and R. The purpose of this package is to supply efficient Julia
  implementations of solvers for various differential equations. Equations within the realm of this package include:

    •  Discrete equations (function maps, discrete stochastic (Gillespie/Markov) simulations)

    •  Ordinary differential equations (ODEs)
```

After:

```
help?> DifferentialEquations
search: DifferentialEquations

  No docstring found for module DifferentialEquations.

  Exported names
  ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

  @derivatives, @ode_def, @ode_def_all, @ode_def_bare, 
  ... (manually truncated)

  ────────────────────────────────────────────────────────────────────────────

  Package description from README.md:

  DifferentialEquations.jl
  ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

  (Image: Join the chat at https://gitter.im/JuliaDiffEq/Lobby) (https://gitter.im/JuliaDiffEq/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) (Image:
  Build Status) (https://github.com/SciML/DifferentialEquations.jl/actions?query=workflow%3ACI) (Image: Stable) (http://diffeq.sciml.ai/stable/) (Image: Dev) (http://diffeq.sciml.ai/dev/)
  (Image: DOI) (https://zenodo.org/badge/latestdoi/58516043)

  This is a suite for numerically solving differential equations written in Julia and available for use in Julia, Python, and R. The purpose of this package is to supply efficient Julia
  implementations of solvers for various differential equations. Equations within the realm of this package include:

    •  Discrete equations (function maps, discrete stochastic (Gillespie/Markov) simulations)

    •  Ordinary differential equations (ODEs)
```



I think this makes it a bit less technical (the word "Displaying" and
the long filename), and it improves the reading flow.

* Support indexing `Broadcasted` objects using `Integer`s (#56470)

This adds support for `IndexLinear` `eachindex`, as well as
bounds-checking and `getindex` for a `Broadcasted` with an `Integer`
index.

Instead of using the number of dimensions in `eachindex` to determine
whether to use `CartesianIndices`, we may use the `IndexStyle`. This
should not change anything currently, but this adds the possibility of
`nD` broadcasting using linear indexing if the `IndexStyle` of the
`Broadcasted` object is `IndexLinear`.

After this,
```julia
julia> bc = Broadcast.broadcasted(+, reshape(1:4, 2, 2), 1:2)
Base.Broadcast.Broadcasted(+, ([1 3; 2 4], 1:2))

julia> eachindex(bc)
CartesianIndices((2, 2))

julia> eachindex(IndexLinear(), bc)
Base.OneTo(4)

julia> [bc[I] for I in eachindex(IndexLinear(), bc)]
4-element Vector{Int64}:
 2
 4
 4
 6

julia> vec(collect(bc))
4-element Vector{Int64}:
 2
 4
 4
 6
```

This PR doesn't add true linear indexing support for `IndexCartesian`
`Broadcasted` objects. In such cases, an `Integer` index is converted to
a `CartesianIndex` before it is used in indexing.

* Limit the scope of `@inbounds` in `searchsorted*` (#56882)

This removes bounds-checking only in the indexing operation, instead of
for the entire block.

* Remove trailing comma in 0-dim `reshape` summary (#56853)

Currently, there is an extra comma in displaying the summary for a 0-dim
`ReshapedArray`:
```julia
julia> reshape(1:1)
0-dimensional reshape(::UnitRange{Int64}, ) with eltype Int64:
1
```
This PR only prints the comma if `dims` isn't empty, so that we now
obtain
```julia
julia> reshape(1:1)
0-dimensional reshape(::UnitRange{Int64}) with eltype Int64:
1
```

* Switch debug registry mapping to `CodeInstance` (#56878)

Currently our debugging code maps from pointers to `MethodInstance`.
However, I think it makes more sense to map to `CodeInstance` instead,
since that's what we're actually compiling and as we're starting to make
more use of external owners and custom specializations, we'll want to be
able to annotate that in backtraces. This only adjusts the internal data
structures - any actual printing changes for those sorts of use cases
will have to come separately.

* binaryplatforms.jl: Remove duplicated riscv64 entry (#56888)

* Minor documentation updates (#56883)

- Array/Vector/Matrix output showing
- Syntax highlighting for fenced code block examples

---------

Co-authored-by: Chengyu Han <cyhan.dev@outlook.com>
Co-authored-by: Lilith Orion Hafner <lilithhafner@gmail.com>

* Remove `similar` specialization with `Integer`s (#56881)

This method seems unnecessary, as the method on line 830 does the same
thing. Having this method in `Base` requires packages to disambiguate
against this by adding redundant methods.

* simplify  and slightly improve memorynew inference (#56857)

while investigating some missed optimizations in
https://github.com/JuliaLang/julia/pull/56847, @gbaraldi and I realized
that `copy(::Array)` was using `jl_genericmemory_copy_slice` rather than
the `memmove`/`jl_genericmemory_copyto` that `copyto!` lowers to. This
version lets us use the faster LLVM based Memory initialization, and the
memove can theoretically be further optimized by LLVM (e.g. not copying
elements that get over-written without ever being read).

```
julia> @btime copy($[1,2,3])
  15.521 ns (2 allocations: 80 bytes) # before
  12.116 ns (2 allocations: 80 bytes) #after

julia> m = Memory{Int}(undef, 3);
julia> m.=[1,2,3];
julia> @btime copy($m)
  11.013 ns (1 allocation: 48 bytes) #before
  9.042 ns (1 allocation: 48 bytes)   #after
```

We also optimize the `memorynew` type inference to make it so that
getting the length of a memory with known length will propagate that
length information (which is important for cases like `similar`/`copy`
etc).

* Update the OffsetArrays test helper (#56892)

This updates the test helper to match v1.15.0 of `OffsetArrays.jl`. The
current version was copied over from v1.11.2, which was released on May
20, 2022, so this bump fetches the intermediate updates to the package.

The main changes are updates to `unsafe_wrap` and `reshape`. In the
latter, several redundant methods are now removed, whereas, in the
former, methods are added to wrap a `Ptr` in an `OffsetArray`
(https://github.com/JuliaArrays/OffsetArrays.jl/issues/275#issue-1222585268).
A third major change is that an `OffsetArray` now shares its parent's
`eltype` and `ndims` in the struct definition, whereas previously this
was ensured through the constructor. Other miscellaneous changes are
included, such as performance-related ones.

* fix: Base.GMP.MPZ.invert yielding return code instead of return value (#56894)

There is a bug in `Base.GMP.MPZ.invert` it returned GMP return code,
instead of the actual value. This commit fixes it.

Before:
```
julia> Base.GMP.MPZ.invert(big"3", big"7")
1
```

After:
```
julia> Base.GMP.MPZ.invert(big"3", big"7")
5
```

* fix precompilation error printing if `CI` is set (#56905)

Co-authored-by: Ian Butterworth <i.r.butterworth@gmail.com>

* Add #53664, public&export error to news (#56911)

Suggested by @simeonschaub
[here](https://github.com/JuliaLang/julia/pull/53664#issuecomment-2562408676)

* restrict `optimize_until` argument type correctly (#56912)

The object types that `optimize_until` can accept are restricted by
`matchpass`, so this restriction should also be reflected in functions
like `typeinf_ircode` too.

* doc: manual: give the Performance Tips a table of contents (#56917)

The page is quite long, and now it also has a more intricate structure
than before, IMO it deserves a TOC.

* ReentrantLock: wakeup a single task on unlock and add a short spin (#56814)

I propose a change in the implementation of the `ReentrantLock` to
improve its overall throughput for short critical sections and fix the
quadratic wake-up behavior where each unlock schedules **all** waiting
tasks on the lock's wait queue.

This implementation follows the same principles of the `Mutex` in the
[parking_lot](https://github.com/Amanieu/parking_lot/tree/master) Rust
crate which is based on the Webkit
[WTF::ParkingLot](https://webkit.org/blog/6161/locking-in-webkit/)
class. Only the basic working principle is implemented here, further
improvements such as eventual fairness will be proposed separately.

The gist of the change is that we add one extra state to the lock,
essentially going from:
```
0x0 => The lock is not locked
0x1 => The lock is locked by exactly one task. No other task is waiting for it.
0x2 => The lock is locked and some other task tried to lock but failed (conflict)
```
To:
```
# PARKED_BIT | LOCKED_BIT | Description
#     0      |     0      | The lock is not locked, nor is anyone waiting for it.
# -----------+------------+------------------------------------------------------------------
#     0      |     1      | The lock is locked by exactly one task. No other task is
#            |            | waiting for it.
# -----------+------------+------------------------------------------------------------------
#     1      |     0      | The lock is not locked. One or more tasks are parked.
# -----------+------------+------------------------------------------------------------------
#     1      |     1      | The lock is locked by exactly one task. One or more tasks are
#            |            | parked waiting for the lock to become available.
#            |            | In this state, PARKED_BIT is only ever cleared when the cond_wait lock
#            |            | is held (i.e. on unlock). This ensures that
#            |            | we never end up in a situation where there are parked tasks but
#            |            | PARKED_BIT is not set (which would result in those tasks
#            |            | potentially never getting woken up).
```

In the current implementation we must schedule all tasks to cause a
conflict (state 0x2) because on unlock we only notify any task if the
lock is in the conflict state. This behavior means that with high
contention and a short critical section the tasks will be effectively
spinning in the scheduler queue.

With the extra state the proposed implementation has enough information
to know if there are other tasks to be notified or not, which means we
can always notify one task at a time while preserving the optimized path
of not notifying if there are no tasks waiting. To improve throughput
for short critical sections we also introduce a bounded amount of
spinning before attempting to park.

### Results

Not spinning on the scheduler queue greatly reduces the CPU utilization
of the following example:

```julia
function example()
    lock = ReentrantLock()
    @sync begin
        for i in 1:10000
            Threads.@spawn begin
                @lock lock begin
                    sleep(0.001)
                end
            end
        end
    end
end


@time example()
```

Current:
```
28.890623 seconds (101.65 k allocations: 7.646 MiB, 0.25% compilation time)
```

![image](https://github.com/user-attachments/assets/dbd6ce57-c760-4f5a-b68a-27df6a97a46e)

Proposed:
```
22.806669 seconds (101.65 k allocations: 7.814 MiB, 0.35% compilation time)
```

![image](https://github.com/user-attachments/assets/b0254180-658d-4493-86d3-dea4c500b5ac)

In a micro-benchmark where 8 threads contend for a single lock with a
very short critical section we see a ~2x improvement.

Current:
```
8-element Vector{Int64}:
 6258688
 5373952
 6651904
 6389760
 6586368
 3899392
 5177344
 5505024
Total iterations: 45842432
```

Proposed:
```
8-element Vector{Int64}:
 12320768
 12976128
 10354688
 12845056
  7503872
 13598720
 13860864
 11993088
Total iterations: 95453184
```

~~In the uncontended scenario the extra bookkeeping causes a 10%
throughput reduction:~~
EDIT: I reverted _trylock to the simple case to recover the uncontended
throughput and now both implementations are on the same ballpark
(without hurting the above numbers).

In the uncontended scenario:

Current:
```
Total iterations: 236748800
```

Proposed:
```
Total iterations: 237699072
```

Closes #56182

* 🤖 [master] Bump the Pkg stdlib from e7c37f342 to c7e611bc8 (#56918)

* Don't report only-inferred methods as recompiles (#56914)

* precompilepkgs: respect loaded dependencies when precompiling for load (#56901)

* Add julia-repl in destructuring docs (#56866)

* doc: manual: Command-line Interface: tiny Markdown code formatting fix (#56919)

* Make threadpoolsize(), threadpooltids(), and ngcthreads() public (#55701)

* [Test] Print RNG of a failed testset and add option to set it (#56260)

Also, add a keyword option to `@testset` to let users override the seed
used there, to make testsets more replicable.

To give you a taster of what this PR
enables:
```
julia> using Random, Test

julia> @testset begin
           @test rand() == 0
       end;
test set: Test Failed at REPL[2]:2
  Expression: rand() == 0
   Evaluated: 0.559472630416976 == 0

Stacktrace:
 [1] top-level scope
   @ REPL[2]:2
 [2] macro expansion
   @ ~/repo/julia/usr/share/julia/stdlib/v1.12/Test/src/Test.jl:1713 [inlined]
 [3] macro expansion
   @ REPL[2]:2 [inlined]
 [4] macro expansion
   @ ~/repo/julia/usr/share/julia/stdlib/v1.12/Test/src/Test.jl:679 [inlined]
Test Summary: | Fail  Total  Time
test set      |    1      1  0.9s
ERROR: Some tests did not pass: 0 passed, 1 failed, 0 errored, 0 broken.
Random seed for this testset: Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850)

julia> @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin
           @test rand() == 0.559472630416976
       end;
Test Summary: | Pass  Total  Time
test set      |    1      1  0.0s
```
This also works with nested testsets, and testsets on for loops:
```
julia> @testset rng=Xoshiro(0xc380f460355639ee, 0xb39bc754b7d63bbf, 0x1551dbcfb5ed5668, 0x71ab5a18fec21a25, 0x649d0c1be1ca5436) "Outer" begin
           @test rand() == 0.0004120194925605336
           @testset rng=Xoshiro(0xee97f5b53f7cdc49, 0x480ac387b0527d3d, 0x614b416502a9e0f5, 0x5250cb36e4a4ceb1, 0xed6615c59e475fa0) "Inner: $(i)" for i in 1:10
               @test rand() == 0.39321938407066637
           end
       end;
Test Summary: | Pass  Total  Time
Outer         |   11     11  0.0s
```

Being able to see what was the seed inside a testset and being able to
set it afterwards should make replicating test failures which only
depend on the state of the RNG much easier to debug.

* 🤖 [master] Bump the Pkg stdlib from c7e611bc8 to 739a64a0b (#56927)

* 🤖 [master] Bump the Pkg stdlib from 739a64a0b to 8d3cf02e5 (#56930)

* doc: summary of output functions: cross-ref println and printstyled (#55860)

Slight tweak to #54547 to add cross-referenes to `println` and
`printstyled`.

Co-authored-by: Dilum Aluthge <dilum@aluthge.com>

* Make `Markdown.parse` public and add a docstring (#56818)

* precompilepkgs: color the "is currently loaded" text to make meaning clearer (#56926)

* Remove unused variable from `endswith` (#56934)

This is a trivial code cleanup suggestion. The `cub` variable was unused
in `endswith(::Union{String, SubString{String}}, ::Union{String,
SubString{String}})`.

I ran the tests with `make test`, there were some failures but they did
not appear to be related to the change.

* deps: support Unicode 16 via utf8proc 2.10.0 (#56925)

Similar to #51799, support [Unicode
16](https://www.unicode.org/versions/Unicode16.0.0/) by bumping utf8proc
to 2.10.0 (thanks to https://github.com/JuliaStrings/utf8proc/pull/277
by @eschnett).

This allows us to use [7 exciting new emoji
characters](https://www.unicode.org/emoji/charts-16.0/emoji-released.html)
as identifiers, including "face with bags under eyes"

![image](https://github.com/user-attachments/assets/4959b7ca-100e-4efc-af58-b03184ae2dca)
`"\U1fae9"` (but still no superscript "q").

Closes #56035.

* teach jitlayers to use equivalent edges

Sometimes an edge (especially from precompile file, but sometimes from
inference) will specify a CodeInstance that does not need to be compiled
for its ABI and simply needs to be cloned to point to the existing copy
of it.

* opaque_closure: fix data-race mistakes with reading fields by using standard helper function

* opaque_closure: fix world-age mistake in fallback path

This was failing the h_world_age test sometimes.

* inference,codegen: connect source directly to jit

This avoids unnecessary compression when running (not generating code).
While generating code, we continue the legacy behavior of storing
compressed code, since restarting from a ji without that is quite slow.
Eventually, we should also remove that code also once we have generated
the object file from it.

This replaces the defective SOURCE_MODE_FORCE_SOURCE option with a new
`typeinf_ext_toplevel` batch-mode interface for compilation which
returns all required source code. Only two options remain now:
SOURCE_MODE_NOT_REQUIRED :
    Require only that the IPO information (e.g. rettype and friends) is
    present.
SOURCE_MODE_FORCE_ABI :
    Require that the IPO information is present (for ABI computation)
    and that the returned CodeInstance can be invoked on the host target
    (preferably after inference, called directly, but perfectly
    acceptable for Base.Compiler to instead force the runtime to use a
    stub there or call into it with the interpreter instead by having
    failed to provide any code).

This replaces the awkward `jl_create_native` interface (which is now
just a shim for calling the new batch-mode `typeinf_ext_toplevel`) with
a simpler `jl_emit_native` API, which does not do any inference or other
callbacks, but simply is a batch-mode call to `jl_emit_codeinfo` and
the work to build the external wrapper around them for linkage.

* delete unused code, so the jit no longer uses the inferred field at all

* Make sure we don't promise alignments that are larger than the heap alignment to LLVM (#56938)

Fixes https://github.com/JuliaLang/julia/issues/56937

---------

Co-authored-by: Oscar Smith <oscardssmith@gmail.com>

* 🤖 [master] Bump the NetworkOptions stdlib from 8eec5cb to c090626 (#56949)

Stdlib: NetworkOptions
URL: https://github.com/JuliaLang/NetworkOptions.jl.git
Stdlib branch: master
Julia branch: master
Old commit: 8eec5cb
New commit: c090626
Julia version: 1.12.0-DEV
NetworkOptions version: 1.3.0(Does not match)
Bump invoked by: @giordano
Powered by:
[BumpStdlibs.jl](https://github.com/JuliaLang/BumpStdlibs.jl)

Diff:
https://github.com/JuliaLang/NetworkOptions.jl/compare/8eec5cb0acec4591e6db3c017f7499426cd8e352...c090626d3feee6d6a5c476346d22d6147c9c6d2d

```
$ git log --oneline 8eec5cb..c090626
c090626 Enable OpenSSL certificates (#36)
```

* [build] Fix value of `CMAKE_C{,XX}_ARG` when `CC_ARG` doesn't have args (#56920)

The problem was that `cut` by default prints the entire line if the
delimiter doesn't appear, unless the option `-s` is used, which means
that if `CC_ARG` contains only `gcc` then `CMAKE_CC_ARG` also contains
`gcc` instead of being empty.

Before the PR:
```console
$ make -C deps/ print-CC_ARG print-CMAKE_CC_ARG print-CMAKE_COMMON USECCACHE=1
make: Entering directory '/home/mose/repo/julia/deps'
CC_ARG=gcc
CMAKE_CC_ARG=gcc
CMAKE_COMMON=-DCMAKE_INSTALL_PREFIX:PATH=/home/mose/repo/julia/usr -DCMAKE_PREFIX_PATH=/home/mose/repo/julia/usr -DLIB_INSTALL_DIR=/home/mose/repo/julia/usr/lib -DCMAKE_INSTALL_LIBDIR=/home/mose/repo/julia/usr/lib -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER="$(which gcc)" -DCMAKE_C_COMPILER_ARG1="gcc " -DCMAKE_CXX_COMPILER="$(which g++)" -DCMAKE_CXX_COMPILER_ARG1="g++ " -DCMAKE_LINKER="$(which ld)" -DCMAKE_AR="$(which ar)" -DCMAKE_RANLIB="$(which ranlib)"
make: Leaving directory '/home/mose/repo/julia/deps'
```
After the PR
```console
$ make -C deps/ print-CC_ARG print-CMAKE_CC_ARG print-CMAKE_COMMON USECCACHE=1
make: Entering directory '/…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugfix This change fixes an existing bug
Projects
None yet
Development

Successfully merging this pull request may close these issues.

invalid usage of @assume_effects in base/irrationals.jl
6 participants