Skip to content

Commit 237e81c

Browse files
authored
Backports for 1.10.9 (#57182)
2 parents 4c16ff4 + 92f03a4 commit 237e81c

File tree

33 files changed

+522
-293
lines changed

33 files changed

+522
-293
lines changed

base/compiler/abstractinterpretation.jl

+37-22
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ function find_matching_methods(𝕃::AbstractLattice,
243243
for i in 1:length(split_argtypes)
244244
arg_n = split_argtypes[i]::Vector{Any}
245245
sig_n = argtypes_to_type(arg_n)
246+
sig_n === Bottom && continue
246247
mt = ccall(:jl_method_table_for, Any, (Any,), sig_n)
247248
mt === nothing && return FailedMethodMatch("Could not identify method table for call")
248249
mt = mt::MethodTable
@@ -506,7 +507,10 @@ function abstract_call_method(interp::AbstractInterpreter,
506507
return MethodCallResult(Any, false, false, nothing, Effects())
507508
end
508509
sigtuple = unwrap_unionall(sig)
509-
sigtuple isa DataType || return MethodCallResult(Any, false, false, nothing, Effects())
510+
sigtuple isa DataType ||
511+
return MethodCallResult(Any, false, false, nothing, Effects())
512+
all(@nospecialize(x) -> isvarargtype(x) || valid_as_lattice(x, true), sigtuple.parameters) ||
513+
return MethodCallResult(Union{}, false, false, nothing, EFFECTS_THROWS) # catch bad type intersections early
510514

511515
if is_nospecializeinfer(method)
512516
sig = get_nospecializeinfer_sig(method, sig, sparams)
@@ -1385,25 +1389,35 @@ function precise_container_type(interp::AbstractInterpreter, @nospecialize(itft)
13851389
end
13861390
if isa(tti, Union)
13871391
utis = uniontypes(tti)
1388-
if any(@nospecialize(t) -> !isa(t, DataType) || !(t <: Tuple) || !isknownlength(t), utis)
1389-
return AbstractIterationResult(Any[Vararg{Any}], nothing, Effects())
1390-
end
1391-
ltp = length((utis[1]::DataType).parameters)
1392-
for t in utis
1393-
if length((t::DataType).parameters) != ltp
1394-
return AbstractIterationResult(Any[Vararg{Any}], nothing)
1392+
# refine the Union to remove elements that are not valid tags for objects
1393+
filter!(@nospecialize(x) -> valid_as_lattice(x, true), utis)
1394+
if length(utis) == 0
1395+
return AbstractIterationResult(Any[], nothing) # oops, this statement was actually unreachable
1396+
elseif length(utis) == 1
1397+
tti = utis[1]
1398+
tti0 = rewrap_unionall(tti, tti0)
1399+
else
1400+
if any(@nospecialize(t) -> !isa(t, DataType) || !(t <: Tuple) || !isknownlength(t), utis)
1401+
return AbstractIterationResult(Any[Vararg{Any}], nothing, Effects())
13951402
end
1396-
end
1397-
result = Any[ Union{} for _ in 1:ltp ]
1398-
for t in utis
1399-
tps = (t::DataType).parameters
1400-
_all(valid_as_lattice, tps) || continue
1401-
for j in 1:ltp
1402-
result[j] = tmerge(result[j], rewrap_unionall(tps[j], tti0))
1403+
ltp = length((utis[1]::DataType).parameters)
1404+
for t in utis
1405+
if length((t::DataType).parameters) != ltp
1406+
return AbstractIterationResult(Any[Vararg{Any}], nothing)
1407+
end
1408+
end
1409+
result = Any[ Union{} for _ in 1:ltp ]
1410+
for t in utis
1411+
tps = (t::DataType).parameters
1412+
for j in 1:ltp
1413+
@assert valid_as_lattice(tps[j], true)
1414+
result[j] = tmerge(result[j], rewrap_unionall(tps[j], tti0))
1415+
end
14031416
end
1417+
return AbstractIterationResult(result, nothing)
14041418
end
1405-
return AbstractIterationResult(result, nothing)
1406-
elseif tti0 <: Tuple
1419+
end
1420+
if tti0 <: Tuple
14071421
if isa(tti0, DataType)
14081422
return AbstractIterationResult(Any[ p for p in tti0.parameters ], nothing)
14091423
elseif !isa(tti, DataType)
@@ -1667,7 +1681,7 @@ end
16671681
return isa_condition(xt, ty, max_union_splitting)
16681682
end
16691683
@inline function isa_condition(@nospecialize(xt), @nospecialize(ty), max_union_splitting::Int)
1670-
tty_ub, isexact_tty = instanceof_tfunc(ty)
1684+
tty_ub, isexact_tty = instanceof_tfunc(ty, true)
16711685
tty = widenconst(xt)
16721686
if isexact_tty && !isa(tty_ub, TypeVar)
16731687
tty_lb = tty_ub # TODO: this would be wrong if !isexact_tty, but instanceof_tfunc doesn't preserve this info
@@ -1677,7 +1691,7 @@ end
16771691
# `typeintersect` may be unable narrow down `Type`-type
16781692
thentype = tty_ub
16791693
end
1680-
valid_as_lattice(thentype) || (thentype = Bottom)
1694+
valid_as_lattice(thentype, true) || (thentype = Bottom)
16811695
elsetype = typesubtract(tty, tty_lb, max_union_splitting)
16821696
return ConditionalTypes(thentype, elsetype)
16831697
end
@@ -1923,7 +1937,7 @@ function abstract_invoke(interp::AbstractInterpreter, (; fargs, argtypes)::ArgIn
19231937
ft′ = argtype_by_index(argtypes, 2)
19241938
ft = widenconst(ft′)
19251939
ft === Bottom && return CallMeta(Bottom, EFFECTS_THROWS, NoCallInfo())
1926-
(types, isexact, isconcrete, istype) = instanceof_tfunc(argtype_by_index(argtypes, 3))
1940+
(types, isexact, isconcrete, istype) = instanceof_tfunc(argtype_by_index(argtypes, 3), false)
19271941
isexact || return CallMeta(Any, Effects(), NoCallInfo())
19281942
unwrapped = unwrap_unionall(types)
19291943
if types === Bottom || !(unwrapped isa DataType) || unwrapped.name !== Tuple.name
@@ -2153,6 +2167,7 @@ function abstract_call_unknown(interp::AbstractInterpreter, @nospecialize(ft),
21532167
end
21542168
# non-constant function, but the number of arguments is known and the `f` is not a builtin or intrinsic
21552169
atype = argtypes_to_type(arginfo.argtypes)
2170+
atype === Bottom && return CallMeta(Union{}, Union{}, EFFECTS_THROWS, NoCallInfo()) # accidentally unreachable
21562171
return abstract_call_gf_by_type(interp, nothing, arginfo, si, atype, sv, max_methods)
21572172
end
21582173

@@ -2380,7 +2395,7 @@ function abstract_eval_statement_expr(interp::AbstractInterpreter, e::Expr, vtyp
23802395
(; rt, effects) = abstract_eval_call(interp, e, vtypes, sv)
23812396
t = rt
23822397
elseif ehead === :new
2383-
t, isexact = instanceof_tfunc(abstract_eval_value(interp, e.args[1], vtypes, sv))
2398+
t, isexact = instanceof_tfunc(abstract_eval_value(interp, e.args[1], vtypes, sv), true)
23842399
ut = unwrap_unionall(t)
23852400
consistent = ALWAYS_FALSE
23862401
nothrow = false
@@ -2444,7 +2459,7 @@ function abstract_eval_statement_expr(interp::AbstractInterpreter, e::Expr, vtyp
24442459
end
24452460
effects = Effects(EFFECTS_TOTAL; consistent, nothrow)
24462461
elseif ehead === :splatnew
2447-
t, isexact = instanceof_tfunc(abstract_eval_value(interp, e.args[1], vtypes, sv))
2462+
t, isexact = instanceof_tfunc(abstract_eval_value(interp, e.args[1], vtypes, sv), true)
24482463
nothrow = false # TODO: More precision
24492464
if length(e.args) == 2 && isconcretedispatch(t) && !ismutabletype(t)
24502465
at = abstract_eval_value(interp, e.args[2], vtypes, sv)

base/compiler/abstractlattice.jl

+5-3
Original file line numberDiff line numberDiff line change
@@ -98,16 +98,18 @@ is_valid_lattice_norec(::InferenceLattice, @nospecialize(elem)) = isa(elem, Limi
9898
"""
9999
tmeet(𝕃::AbstractLattice, a, b::Type)
100100
101-
Compute the lattice meet of lattice elements `a` and `b` over the lattice `𝕃`.
102-
If `𝕃` is `JLTypeLattice`, this is equivalent to type intersection.
101+
Compute the lattice meet of lattice elements `a` and `b` over the lattice `𝕃`,
102+
dropping any results that will not be inhabited at runtime.
103+
If `𝕃` is `JLTypeLattice`, this is equivalent to type intersection plus the
104+
elimination of results that have no concrete subtypes.
103105
Note that currently `b` is restricted to being a type
104106
(interpreted as a lattice element in the `JLTypeLattice` sub-lattice of `𝕃`).
105107
"""
106108
function tmeet end
107109

108110
function tmeet(::JLTypeLattice, @nospecialize(a::Type), @nospecialize(b::Type))
109111
ti = typeintersect(a, b)
110-
valid_as_lattice(ti) || return Bottom
112+
valid_as_lattice(ti, true) || return Bottom
111113
return ti
112114
end
113115

base/compiler/optimize.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ function stmt_effect_flags(𝕃ₒ::AbstractLattice, @nospecialize(stmt), @nospe
305305
elseif head === :new_opaque_closure
306306
length(args) < 4 && return (false, false, false)
307307
typ = argextype(args[1], src)
308-
typ, isexact = instanceof_tfunc(typ)
308+
typ, isexact = instanceof_tfunc(typ, true)
309309
isexact || return (false, false, false)
310310
(𝕃ₒ, typ, Tuple) || return (false, false, false)
311311
rt_lb = argextype(args[2], src)

base/compiler/ssair/inlining.jl

+4-3
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,7 @@ function handle_invoke_call!(todo::Vector{Pair{Int,Any}},
12021202
end
12031203

12041204
function invoke_signature(argtypes::Vector{Any})
1205-
ft, argtyps = widenconst(argtypes[2]), instanceof_tfunc(widenconst(argtypes[3]))[1]
1205+
ft, argtyps = widenconst(argtypes[2]), instanceof_tfunc(widenconst(argtypes[3]), false)[1]
12061206
return rewrap_unionall(Tuple{ft, unwrap_unionall(argtyps).parameters...}, argtyps)
12071207
end
12081208

@@ -1450,8 +1450,9 @@ function handle_call!(todo::Vector{Pair{Int,Any}},
14501450
cases = compute_inlining_cases(info, flag, sig, state)
14511451
cases === nothing && return nothing
14521452
cases, all_covered, joint_effects = cases
1453-
handle_cases!(todo, ir, idx, stmt, argtypes_to_type(sig.argtypes), cases,
1454-
all_covered, joint_effects)
1453+
atype = argtypes_to_type(sig.argtypes)
1454+
atype === Union{} && return nothing # accidentally actually unreachable
1455+
handle_cases!(todo, ir, idx, stmt, atype, cases, all_covered, joint_effects)
14551456
end
14561457

14571458
function handle_match!(cases::Vector{InliningCase},

base/compiler/ssair/passes.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -1705,7 +1705,7 @@ function adce_pass!(ir::IRCode, inlining::Union{Nothing,InliningState}=nothing)
17051705
else
17061706
if is_known_call(stmt, typeassert, compact) && length(stmt.args) == 3
17071707
# nullify safe `typeassert` calls
1708-
ty, isexact = instanceof_tfunc(argextype(stmt.args[3], compact))
1708+
ty, isexact = instanceof_tfunc(argextype(stmt.args[3], compact), true)
17091709
if isexact && (𝕃ₒ, argextype(stmt.args[2], compact), ty)
17101710
compact[idx] = nothing
17111711
continue

0 commit comments

Comments
 (0)