Commit 344c302
Add
Alternative to JuliaLang#58146.
We want to compile a subset of the possible specializations of a
function. To this end, we have a number of manually written `precompile`
statements. Creating this list is, unfortunately, error-prone, and the
list is also liable to going stale. Thus we'd like to validate each
`precompile` statement in the list.
The simple answer is, of course, to actually run the `precompile`s, and
we naturally do so, but this takes time.
We would like a relatively quick way to check the validity of a
`precompile` statement.
This is a dev-loop optimization, to allow us to check "is-precompilable"
in unit tests.
We can't use `hasmethod` as it has both false positives (too loose):
```julia
julia> hasmethod(sum, (AbstractVector,))
true
julia> precompile(sum, (AbstractVector,))
false
julia> Base.isprecompilable(sum, (AbstractVector,)) # <- this PR
false
```
and also false negatives (too strict):
```julia
julia> bar(@nospecialize(x::AbstractVector{Int})) = 42
bar (generic function with 1 method)
julia> hasmethod(bar, (AbstractVector,))
false
julia> precompile(bar, (AbstractVector,))
true
julia> Base.isprecompilable(bar, (AbstractVector,)) # <- this PR
true
```
We can't use `hasmethod && isconcretetype` as it has false negatives
(too strict):
```julia
julia> has_concrete_method(f, argtypes) = all(isconcretetype, argtypes) && hasmethod(f, argtypes)
has_concrete_method (generic function with 1 method)
julia> has_concrete_method(bar, (AbstractVector,))
false
julia> has_concrete_method(convert, (Type{Int}, Int32))
false
julia> precompile(convert, (Type{Int}, Int32))
true
julia> Base.isprecompilable(convert, (Type{Int}, Int32)) # <- this PR
true
```
`Base.isprecompilable` is essentially `precompile` without the actual
compilation.Base.isprecompilable (JuliaLang#58805)1 parent 7bf549d commit 344c302
3 files changed
+24
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4184 | 4184 | | |
4185 | 4185 | | |
4186 | 4186 | | |
| 4187 | + | |
| 4188 | + | |
| 4189 | + | |
| 4190 | + | |
| 4191 | + | |
| 4192 | + | |
| 4193 | + | |
| 4194 | + | |
| 4195 | + | |
| 4196 | + | |
| 4197 | + | |
| 4198 | + | |
| 4199 | + | |
| 4200 | + | |
4187 | 4201 | | |
4188 | 4202 | | |
4189 | 4203 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3886 | 3886 | | |
3887 | 3887 | | |
3888 | 3888 | | |
| 3889 | + | |
| 3890 | + | |
| 3891 | + | |
| 3892 | + | |
| 3893 | + | |
| 3894 | + | |
| 3895 | + | |
| 3896 | + | |
| 3897 | + | |
3889 | 3898 | | |
3890 | 3899 | | |
3891 | 3900 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
271 | 271 | | |
272 | 272 | | |
273 | 273 | | |
| 274 | + | |
274 | 275 | | |
275 | 276 | | |
276 | 277 | | |
| |||
0 commit comments