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

staticdata: Set min validation world to require world #57381

Merged
merged 1 commit into from
Feb 13, 2025
Merged

staticdata: Set min validation world to require world #57381

merged 1 commit into from
Feb 13, 2025

Conversation

Keno
Copy link
Member

@Keno Keno commented Feb 12, 2025

When we have implicit binding edges from literal GlobalRefs, these edges imply a implicit minimum world age of jl_require_age (which is what all bindings loaded from pkgimages get their definition age set to). In #57318, the cpuid_llvm minimum world age got set to 1 rather than jl_require_world, so codegen would refuse to perform the llvmcall special codegen, since it couldn't guarantee that the binding would actually resolve to llvmcall in all worlds. Fix that by adjusting staticdata.jl to set the appropriate minworld.

That said, there are a few complicating factors here:

  1. In general, most of our code doesn't handle world ranges with more than one partition. But for example, codegen could have checked the current world age and implicitly partitioned the binding at codegen time (in practice just adding an appropraite error check).

  2. The included test case uses a cached inference. However, in the original issue it appeared that inlining was also creating new references to this replaced binding, which should not have been permitted. I have not fully investigated this behavior yet and this might be another bug.

  3. In the original issue, the specialization had its max_world terminated a few ages past jl_require_world. I do not understand this behavior yet.

Still, fixes #57318.

When we have implicit binding edges from literal GlobalRefs, these edges
imply a implicit minimum world age of jl_require_age (which is what
all bindings loaded from pkgimages get their definition age set to).
In #57318, the `cpuid_llvm` minimum world age got set to `1` rather
than `jl_require_world`, so codegen would refuse to perform the llvmcall
special codegen, since it couldn't guarantee that the binding would
actually resolve to `llvmcall` in all worlds. Fix that by adjusting
staticdata.jl to set the appropriate minworld.

That said, there are a few complicating factors here:
1. In general, most of our code doesn't handle world ranges with more
   than one partition. But for example, codegen could have checked the
   current world age and implicitly partitioned the binding at codegen
   time (in practice just adding an appropraite error check).

2. The included test case uses a cached inference. However, in the
   original issue it appeared that inlining was also creating new
   references to this replaced binding, which should not have been
   permitted. I have not fully investigated this behavior yet and
   this might be another bug.

3. In the original issue, the specialization had its max_world terminated
   a few ages past jl_require_world. I do not understand this behavior
   yet.

Still, fixes #57318.
Keno added a commit that referenced this pull request Feb 12, 2025
Addresses mystery #3 in #57381 (and extends the test from that issue).
Keno added a commit that referenced this pull request Feb 12, 2025
Addresses mystery #3 in #57381 (and extends the test from that issue).
@Keno Keno merged commit c6805e2 into master Feb 13, 2025
5 of 7 checks passed
@Keno Keno deleted the kf/57318 branch February 13, 2025 05:38
Keno added a commit that referenced this pull request Feb 13, 2025
Addresses mystery #3 in #57381 (and extends the test from that issue).
vtjnash pushed a commit that referenced this pull request Feb 13, 2025
Addresses mystery #3 in #57381 (and extends the test from that issue).
@KristofferC KristofferC added the backport 1.12 Change should be backported to release-1.12 label Feb 14, 2025
KristofferC pushed a commit that referenced this pull request Feb 14, 2025
When we have implicit binding edges from literal GlobalRefs, these edges
imply a implicit minimum world age of jl_require_age (which is what all
bindings loaded from pkgimages get their definition age set to). In
#57318, the `cpuid_llvm` minimum world age got set to `1` rather than
`jl_require_world`, so codegen would refuse to perform the llvmcall
special codegen, since it couldn't guarantee that the binding would
actually resolve to `llvmcall` in all worlds. Fix that by adjusting
staticdata.jl to set the appropriate minworld.

That said, there are a few complicating factors here:
1. In general, most of our code doesn't handle world ranges with more
than one partition. But for example, codegen could have checked the
current world age and implicitly partitioned the binding at codegen time
(in practice just adding an appropraite error check).

2. The included test case uses a cached inference. However, in the
original issue it appeared that inlining was also creating new
references to this replaced binding, which should not have been
permitted. I have not fully investigated this behavior yet and this
might be another bug.

3. In the original issue, the specialization had its max_world
terminated a few ages past jl_require_world. I do not understand this
behavior yet.

Still, fixes #57318.

(cherry picked from commit c6805e2)
KristofferC pushed a commit that referenced this pull request Feb 14, 2025
Addresses mystery #3 in #57381 (and extends the test from that issue).

(cherry picked from commit cff8bd6)
@KristofferC KristofferC mentioned this pull request Feb 14, 2025
31 tasks
KristofferC added a commit that referenced this pull request Feb 17, 2025
Backported PRs:
- [x] #57346 <!-- lowering: Only try to define the method once -->
- [x] #57341 <!-- bpart: When backdating replace the entire bpart chain
-->
- [x] #57381 <!-- staticdata: Set min validation world to require world
-->
- [x] #57357 <!-- Only implicitly `using` Base, not Core -->
- [x] #57383 <!-- staticdata: Fix typo in recursive edge revalidation
-->
- [x] #57385 <!-- bpart: Move kind enum into its intended place -->
- [x] #57275 <!-- Compiler: fix unsoundness of getfield_tfunc on Tuple
Types -->
- [x] #57378 <!-- print admonition for auto-import only once per module
-->
- [x] #57392 <!-- [LateLowerGCFrame] fix PlaceGCFrameReset for
returns_twice -->
- [x] #57388 <!-- Bump JuliaSyntax to v1.0.2 -->
- [x] #57266 <!-- 🤖 [master] Bump the Statistics stdlib from d49c2bf to
77bd570 -->
- [x] #57395 <!-- lowering: fix has_fcall computation -->
- [x] #57204 <!-- Clarify mathematical definition of `gcd` -->
- [x] #56794 <!-- Make `Pairs` public -->
- [x] #57407 <!-- staticdata: corrected implementation of
jl_collect_new_roots -->
- [x] #57405 <!-- bpart: Also partition the export flag -->
- [x] #57420 <!-- Compiler: Fix check for IRShow definedness -->
- [x] #55875 <!-- fix `(-Inf)^-1` inconsistency -->
- [x] #57317 <!-- internals: add _defaultctor function for defining
ctors -->
- [x] #57406 <!-- bpart: Ignore guard bindings for ambiguity purposes
-->
- [x] #49933 <!-- Allow for :foreigncall to transition to GC safe
automatically -->
@KristofferC KristofferC removed the backport 1.12 Change should be backported to release-1.12 label Feb 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Regression with --pkgimages=no causing llvmcall to get interpreted
2 participants