Skip to content

Commit 8b5983b

Browse files
aviateskvtjnash
authored andcommitted
inlining: allow non-compileable result when handling ConcreteResult (JuliaLang#49074)
* inlining: allow non-compileable result when handling `ConcreteResult` In rare cases, the system might decide to widen the signature of a call that is determined to throw by concrete-evaluation. We should remove this unnecessary assertion here. closes JuliaLang#49050 * Update test/compiler/inline.jl Co-authored-by: Jameson Nash <[email protected]> --------- Co-authored-by: Jameson Nash <[email protected]>
1 parent 5545713 commit 8b5983b

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

base/compiler/ssair/inlining.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,7 @@ end
14941494

14951495
function handle_concrete_result!(cases::Vector{InliningCase}, result::ConcreteResult, @nospecialize(info::CallInfo), state::InliningState)
14961496
case = concrete_result_item(result, info, state)
1497+
case === nothing && return false
14971498
push!(cases, InliningCase(result.mi.specTypes, case))
14981499
return true
14991500
end
@@ -1505,10 +1506,8 @@ function concrete_result_item(result::ConcreteResult, @nospecialize(info::CallIn
15051506
invokesig::Union{Nothing,Vector{Any}}=nothing)
15061507
if !may_inline_concrete_result(result)
15071508
et = InliningEdgeTracker(state.et, invokesig)
1508-
case = compileable_specialization(result.mi, result.effects, et, info;
1509+
return compileable_specialization(result.mi, result.effects, et, info;
15091510
compilesig_invokes=OptimizationParams(state.interp).compilesig_invokes)
1510-
@assert case !== nothing "concrete evaluation should never happen for uncompileable callsite"
1511-
return case
15121511
end
15131512
@assert result.effects === EFFECTS_TOTAL
15141513
return ConstantCase(quoted(result.result))

test/compiler/inline.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,3 +1921,22 @@ let res = @test_throws MethodError let
19211921
err = res.value
19221922
@test err.f === convert && err.args === (Union{Bool,Tuple{String,String}}, g48397)
19231923
end
1924+
1925+
# https://github.com/JuliaLang/julia/issues/49050
1926+
abstract type Issue49050AbsTop{T,N} end
1927+
abstract type Issue49050Abs1{T, N} <: Issue49050AbsTop{T,N} end
1928+
abstract type Issue49050Abs2{T} <: Issue49050Abs1{T,3} end
1929+
struct Issue49050Concrete{T} <: Issue49050Abs2{T}
1930+
x::T
1931+
end
1932+
issue49074(::Type{Issue49050AbsTop{T,N}}) where {T,N} = Issue49050AbsTop{T,N}
1933+
Base.@assume_effects :foldable issue49074(::Type{C}) where {C<:Issue49050AbsTop} = issue49074(supertype(C))
1934+
let src = code_typed1() do
1935+
issue49074(Issue49050Concrete)
1936+
end
1937+
@test any(isinvoke(:issue49074), src.code)
1938+
end
1939+
let result = @test_throws MethodError issue49074(Issue49050Concrete)
1940+
@test result.value.f === issue49074
1941+
@test result.value.args === (Any,)
1942+
end

0 commit comments

Comments
 (0)