inference: improve `isa`-constraint propagation for `iskindtype` objects (#46712)
Currently our inference isn't able to propagate `isa`-based type
constraint for cases like `isa(Type{<:...}, DataType)` since
`typeintersect` may return `Type` object itself when taking `Type`
object and `iskindtype`-object.
This case happens in the following kind of situation (motivated by the
discussion at <https://github.com/JuliaLang/julia/pull/46553#issuecomment-1233024271>):
```julia
julia> function isa_kindtype(T::Type{<:AbstractVector})
if isa(T, DataType)
# `T` here should be inferred as `DataType` rather than `Type{<:AbstractVector}`
return T.name.name # should be inferred as ::Symbol
end
return nothing
end
isa_kindtype (generic function with 1 method)
julia> only(code_typed(isa_kindtype; optimize=false))
CodeInfo(
1 ─ %1 = (T isa Main.DataType)::Bool
└── goto #3 if not %1
2 ─ %3 = Base.getproperty(T, :name)::Any
│ %4 = Base.getproperty(%3, :name)::Any
└── return %4
3 ─ return Main.nothing
) => Any
```
This commit improves the situation by adding a special casing for
abstract interpretation, rather than changing the behavior of
`typeintersect`.