Skip to content

Prohibit importing or using Main during incremental compilation #57426

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

Merged
merged 1 commit into from
Feb 16, 2025

Conversation

Keno
Copy link
Member

@Keno Keno commented Feb 16, 2025

An upcoming optimization will skip most binding validation if no binding replacement has taken place in (sysimage, pkgimage) modules. However, as a special case, we would like to treat Main as a non-sysimage module because the addition of new bindings in Main is common and we would like this to not ruin the optimization. To make this legal, we have to prohibit importing or using any Main bindings in pkgimages. I don't think anybody actually does this, particularly, since Main is not considered loading during precompile (so you have to use the main binding via (Core|Base|).Main), and I can't think of any good semantic reason to want to do this, but regardless, it does add additional restrictions to using/import, so I wanted to break it out into its own PR.

Base automatically changed from kfsafebindingreplacement to master February 16, 2025 19:34
An upcoming optimization will skip most binding validation if no binding
replacement has taken place in (sysimage, pkgimage) modules. However, as
a special case, we would like to treat `Main` as a non-sysimage module
because the addition of new bindings in `Main` is common and we would
like this to not ruin the optimization. To make this legal, we have to
prohibit `import`ing or `using` any `Main` bindings in pkgimages. I don't
think anybody actually does this, particularly, since `Main` is not considered
loading during precompile (so you have to use the main binding via (Core|Base|).Main),
and I can't think of any good semantic reason to want to do this, but
regardless, it does add additional restrictions to `using`/`import`, so
I wanted to break it out into its own PR.
@Keno Keno merged commit 726c816 into master Feb 16, 2025
5 of 7 checks passed
@Keno Keno deleted the kf/nomainimport branch February 16, 2025 23:57
Keno added a commit that referenced this pull request Feb 17, 2025
…dules

This implements the optimization proposed in #57426 by keeping track of whether
any bindings were replaced in image modules (excluding `Main` as facilitated by #57426).
In addition, we augment serialization to keep track of whether a method body contains
any GlobalRefs that point to a loaded (system or package) image. If both of these
flags are true, we can skip scanning the body of the method, since we know that we
neither need to add any additional backedges nor were any of the referenced bindings
invalidated. The performance impact on end-to-end load time is small, but measurable.
Overall `@time using ModelingToolkit` consistently improves about 5% using this PR.
However, I should note that using time is still about 40% slower than 1.11. This
is not necessarily an Apples-to-Apples comparison as there were substantial other
changes on 1.12 (as well as current load-time-tunings targeting older versions),
but I wanted to put the number context.
Keno added a commit that referenced this pull request Feb 17, 2025
…dules

This implements the optimization proposed in #57426 by keeping track of whether
any bindings were replaced in image modules (excluding `Main` as facilitated by #57426).
In addition, we augment serialization to keep track of whether a method body contains
any GlobalRefs that point to a loaded (system or package) image. If both of these
flags are true, we can skip scanning the body of the method, since we know that we
neither need to add any additional backedges nor were any of the referenced bindings
invalidated. The performance impact on end-to-end load time is small, but measurable.
Overall `@time using ModelingToolkit` consistently improves about 5% using this PR.
However, I should note that using time is still about 40% slower than 1.11. This
is not necessarily an Apples-to-Apples comparison as there were substantial other
changes on 1.12 (as well as current load-time-tunings targeting older versions),
but I wanted to put the number context.
Keno added a commit that referenced this pull request Feb 17, 2025
…dules (#57433)

This implements the optimization proposed in #57426 by keeping track of
whether any bindings were replaced in image modules (excluding `Main` as
facilitated by #57426). In addition, we augment serialization to keep
track of whether a method body contains any GlobalRefs that point to a
loaded (system or package) image. If both of these flags are true, we
can skip scanning the body of the method, since we know that we neither
need to add any additional backedges nor were any of the referenced
bindings invalidated. The performance impact on end-to-end load time is
small, but measurable. Overall `@time using ModelingToolkit`
consistently improves about 5% using this PR. However, I should note
that using time is still about 40% slower than 1.11. This is not
necessarily an Apples-to-Apples comparison as there were substantial
other changes on 1.12 (as well as current load-time-tunings targeting
older versions), but I wanted to put the number context.
@KristofferC KristofferC added the backport 1.12 Change should be backported to release-1.12 label Feb 17, 2025
KristofferC pushed a commit that referenced this pull request Feb 17, 2025
…57426)

An upcoming optimization will skip most binding validation if no binding
replacement has taken place in (sysimage, pkgimage) modules. However, as
a special case, we would like to treat `Main` as a non-sysimage module
because the addition of new bindings in `Main` is common and we would
like this to not ruin the optimization. To make this legal, we have to
prohibit `import`ing or `using` any `Main` bindings in pkgimages. I
don't think anybody actually does this, particularly, since `Main` is
not considered loading during precompile (so you have to use the main
binding via (Core|Base|).Main), and I can't think of any good semantic
reason to want to do this, but regardless, it does add additional
restrictions to `using`/`import`, so I wanted to break it out into its
own PR.

(cherry picked from commit 726c816)
KristofferC pushed a commit that referenced this pull request Feb 17, 2025
…dules (#57433)

This implements the optimization proposed in #57426 by keeping track of
whether any bindings were replaced in image modules (excluding `Main` as
facilitated by #57426). In addition, we augment serialization to keep
track of whether a method body contains any GlobalRefs that point to a
loaded (system or package) image. If both of these flags are true, we
can skip scanning the body of the method, since we know that we neither
need to add any additional backedges nor were any of the referenced
bindings invalidated. The performance impact on end-to-end load time is
small, but measurable. Overall `@time using ModelingToolkit`
consistently improves about 5% using this PR. However, I should note
that using time is still about 40% slower than 1.11. This is not
necessarily an Apples-to-Apples comparison as there were substantial
other changes on 1.12 (as well as current load-time-tunings targeting
older versions), but I wanted to put the number context.

(cherry picked from commit f6e2b98)
@KristofferC KristofferC mentioned this pull request Feb 17, 2025
24 tasks
KristofferC added a commit that referenced this pull request Feb 26, 2025
Backported PRs:
- [x] #57302 <!-- Add explicit imports for types and fix bugs -->
- [x] #57420 <!-- Compiler: Fix check for IRShow definedness -->
- [x] #57419 <!-- generated: Switch resolution module back to what it
was before -->
- [x] #57421 <!-- bpart: Skip implicit import reval if using'd export
set is unchanged -->
- [x] #57425 <!-- Prohibit binding replacement in closed modules during
precompile -->
- [x] #57426 <!-- Prohibit `import`ing or `using` Main during
incremental compilation -->
- [x] #57433 <!-- bpart: Track whether any binding replacement has
happened in image modules -->
- [x] #57445 <!-- Run all `--sysimage-native-code=no` cmdlineargs tests
single-threaded -->
- [x] #57386 <!-- Only strip invariant.load from special pointers -->
- [x] #57453 <!-- Revert "Make emitted egal code more loopy (#54121)"
-->
- [x] #57389 <!-- Change memory indexing to use the type as index
instead of i8 -->
- [x] #57447 <!-- Don't return null pointer when asking for the type of
a declared global -->
- [x] #57467 <!-- using/import: ensure world update after each
observable operation -->
- [x] #57471 <!-- staticdata: Don't use `newm` pointer after it has been
invalidated -->
- [x] #57416 <!-- lowering: Don't mutate lambda in `linearize` -->
@KristofferC KristofferC removed the backport 1.12 Change should be backported to release-1.12 label Feb 26, 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.

2 participants