Skip to content

Inference/constant propagation regression in Julia 1.7 #43368

Closed
@mateuszbaran

Description

@mateuszbaran

I've run into a problem that affects Interpolations.jl. Type inference (or more likely constant propagation?) in Julia 1.7.0 gives up earlier than in previous versions of Julia.
Fairly minimal example:

using Interpolations
nx = 10
f1(x) = sin((x-3)*2pi/(nx-1) - 1)
A = Float64[f1(x) for x in 1:nx]
itp = interpolate(A, BSpline(Constant()))
etp = extrapolate(itp, 0.0)
@code_warntype ndims(etp)

With the result:

julia> @code_warntype ndims(etp)
MethodInstance for ndims(::Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64})
  from ndims(itp::AbstractInterpolation) in Interpolations at /home/mateusz/.julia/dev/Interpolations/src/Interpolations.jl:158
Arguments
  #self#::Core.Const(ndims)
  itp::Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64}
Body::Any
1%1 = Interpolations.typeof(itp)::Core.Const(Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64})
│   %2 = Interpolations.ndims(%1)::Any
└──      return %2

While for example using Julia 1.6.1:

julia> @code_warntype ndims(etp)
Variables
  #self#::Core.Const(ndims)
  itp::Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64}

Body::Int64
1%1 = Interpolations.typeof(itp)::Core.Const(Interpolations.FilledExtrapolation{Float64, 1, Interpolations.BSplineInterpolation{Float64, 1, Vector{Float64}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Tuple{Base.OneTo{Int64}}}, BSpline{Constant{Nearest, Throw{OnGrid}}}, Float64})
│   %2 = Interpolations.ndims(%1)::Core.Const(1)
└──      return %2

Forcing specialization for one more method of ndims solves the problem but I don't know if this is the right solution.

Versioninfo for reference:

julia> versioninfo()
Julia Version 1.7.0
Commit 3bf9d17731 (2021-11-30 12:12 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-12.0.1 (ORCJIT, haswell)
Environment:
  JULIA_EDITOR = code
  JULIA_NUM_THREADS = 

ref: JuliaMath/Interpolations.jl#468

Metadata

Metadata

Assignees

Labels

compiler:inferenceType inferenceregressionRegression in behavior compared to a previous version

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions