You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In 1.9, `--check-bounds=no` has started causing significant performance
regressions (e.g. #50110). This is because we switched a number of functions that
used to be `@pure` to new effects-based infrastructure, which very closely tracks
the the legality conditions for concrete evaluation. Unfortunately, disabling
bounds checking completely invalidates all prior legality analysis, so the only
realistic path we have is to completely disable it.
In general, we are learning that these kinds of global make-things-faster-but-unsafe
flags are highly problematic for a language for several reasons:
- Code is written with the assumption of a particular mode being chosen, so
it is in general not possible or unsafe to compose libraries (which in a language
like julia is a huge problem).
- Unsafe semantics are often harder for the compiler to reason about, causing
unexpected performance issues (although the 1.9 --check-bounds=no issues are
worse than just disabling concrete eval for things that use bounds checking)
In general, I'd like to remove the `--check-bounds=` option entirely (#48245),
but that proposal has encountered major opposition.
This PR implements an alternative proposal: We introduce a new function
`Core.should_check_bounds(boundscheck::Bool) = boundscheck`. This function is
passed the result of `Expr(:boundscheck)` (which is now purely determined by
the inliner based on `@inbounds`, without regard for the command line flag).
In this proposal, what the command line flag does is simply redefine this
function to either `true` or `false` (unconditionally) depending on the
value of the flag.
Of course, this causes massive amounts of recompilation, but I think this can
be addressed by adding logic to loading that loads a pkgimage with appropriate
definitions to cure the invalidations. The special logic we have now now
to take account of the --check-bounds flag in .ji selection, would be replaced
by automatically injecting the special pkgimage as a dependency to every
loaded image. This part isn't implemented in this PR, but I think it's reasonable
to do.
I think with that, the `--check-bounds` flag remains functional, while having
much more well defined behavior, as it relies on the standard world age
mechanisms.
A major benefit of this approach is that it can be scoped appropriately using
overlay tables. For exmaple:
```
julia> using CassetteOverlay
julia> @MethodTable AssumeInboundsTable;
julia> @overlay AssumeInboundsTable Core.should_check_bounds(b::Bool) = false;
julia> assume_inbounds = @overlaypass AssumeInboundsTable
julia> assume_inbounds(f, args...) # f(args...) with bounds checking disabled dynamically
```
Similar logic applies to GPUCompiler, which already supports overlay tables.
0 commit comments