diff --git a/Make.inc b/Make.inc index 0f08ac5e33636..a071fd0c995ba 100644 --- a/Make.inc +++ b/Make.inc @@ -454,10 +454,6 @@ CXX_DISABLE_ASSERTION := -DJL_NDEBUG DISABLE_ASSERTIONS := -DNDEBUG -DJL_NDEBUG endif -ifeq ($(LLVM_ASSERTIONS),0) -CXX_DISABLE_ASSERTION += -DNDEBUG -endif - # Compiler specific stuff ifeq ($(USEMSVC), 1) @@ -1043,7 +1039,7 @@ endif # SYSTEM_LLVM # Windows builds need a little help finding the LLVM libraries for llvm-config LLVM_CONFIG_PATH_FIX := ifeq ($(OS),WINNT) -LLVM_CONFIG_PATH_FIX := PATH="$(PATH):$(build_bindir)" +LLVM_CONFIG_PATH_FIX := PATH="$(build_bindir):$(PATH)" endif ifeq ($(BUILD_OS),$(OS)) @@ -1200,12 +1196,6 @@ endef $(foreach proj,$(BB_PROJECTS),$(eval $(call SET_BB_DEFAULT,$(proj)))) - -# Use the Assertions build -BINARYBUILDER_LLVM_ASSERTS ?= 0 - - - # OS specific stuff # install_name_tool diff --git a/NEWS.md b/NEWS.md index 0d7017b41690f..423629c7263ab 100644 --- a/NEWS.md +++ b/NEWS.md @@ -75,6 +75,7 @@ Multi-threading changes * Locks now automatically inhibit finalizers from running, to avoid deadlock ([#38487]). * New function `Base.Threads.foreach(f, channel::Channel)` for multithreaded `Channel` consumption ([#34543]). +* There is no longer a restriction on the number of threads ([#36778]). Build system changes -------------------- diff --git a/base/Base.jl b/base/Base.jl index 878448c3e3964..d1a549f897d4f 100644 --- a/base/Base.jl +++ b/base/Base.jl @@ -394,37 +394,36 @@ in_sysimage(pkgid::PkgId) = pkgid in _sysimage_modules # Precompiles for Revise # TODO: move these to contrib/generate_precompile.jl # The problem is they don't work there -let m = which(+, (Int, Int)) - while true # defeat interpreter heuristic to force compilation - delete!(push!(Set{Method}(), m), m) - copy(Core.Compiler.retrieve_code_info(Core.Compiler.specialize_method(m, [Int, Int], Core.svec()))) - - empty!(Set()) - push!(push!(Set{Union{GlobalRef,Symbol}}(), :two), GlobalRef(Base, :two)) - (setindex!(Dict{String,Base.PkgId}(), Base.PkgId(Base), "file.jl"))["file.jl"] - (setindex!(Dict{Symbol,Vector{Int}}(), [1], :two))[:two] - (setindex!(Dict{Base.PkgId,String}(), "file.jl", Base.PkgId(Base)))[Base.PkgId(Base)] - (setindex!(Dict{Union{GlobalRef,Symbol}, Vector{Int}}(), [1], :two))[:two] - (setindex!(IdDict{Type, Union{Missing, Vector{Tuple{LineNumberNode, Expr}}}}(), missing, Int))[Int] - Dict{Symbol, Union{Nothing, Bool, Symbol}}(:one => false)[:one] - Dict(Base => [:(1+1)])[Base] - Dict(:one => [1])[:one] - Dict("abc" => Set())["abc"] - pushfirst!([], sum) - get(Base.pkgorigins, Base.PkgId(Base), nothing) - sort!([1,2,3]) - unique!([1,2,3]) - cumsum([1,2,3]) - append!(Int[], BitSet()) - isempty(BitSet()) - delete!(BitSet([1,2]), 3) - deleteat!(Int32[1,2,3], [1,3]) - deleteat!(Any[1,2,3], [1,3]) - Core.svec(1, 2) == Core.svec(3, 4) - any(t->t[1].line > 1, [(LineNumberNode(2,:none), :(1+1))]) - - break # end defeat interpreter heuristic - end +for match = _methods(+, (Int, Int), -1, get_world_counter()) + m = match.method + delete!(push!(Set{Method}(), m), m) + copy(Core.Compiler.retrieve_code_info(Core.Compiler.specialize_method(match))) + + empty!(Set()) + push!(push!(Set{Union{GlobalRef,Symbol}}(), :two), GlobalRef(Base, :two)) + (setindex!(Dict{String,Base.PkgId}(), Base.PkgId(Base), "file.jl"))["file.jl"] + (setindex!(Dict{Symbol,Vector{Int}}(), [1], :two))[:two] + (setindex!(Dict{Base.PkgId,String}(), "file.jl", Base.PkgId(Base)))[Base.PkgId(Base)] + (setindex!(Dict{Union{GlobalRef,Symbol}, Vector{Int}}(), [1], :two))[:two] + (setindex!(IdDict{Type, Union{Missing, Vector{Tuple{LineNumberNode, Expr}}}}(), missing, Int))[Int] + Dict{Symbol, Union{Nothing, Bool, Symbol}}(:one => false)[:one] + Dict(Base => [:(1+1)])[Base] + Dict(:one => [1])[:one] + Dict("abc" => Set())["abc"] + pushfirst!([], sum) + get(Base.pkgorigins, Base.PkgId(Base), nothing) + sort!([1,2,3]) + unique!([1,2,3]) + cumsum([1,2,3]) + append!(Int[], BitSet()) + isempty(BitSet()) + delete!(BitSet([1,2]), 3) + deleteat!(Int32[1,2,3], [1,3]) + deleteat!(Any[1,2,3], [1,3]) + Core.svec(1, 2) == Core.svec(3, 4) + any(t->t[1].line > 1, [(LineNumberNode(2,:none), :(1+1))]) + + break # only actually need to do this once end if is_primary_base_module diff --git a/base/abstractarray.jl b/base/abstractarray.jl index ad32a102fa7aa..a880b4eecfd3f 100644 --- a/base/abstractarray.jl +++ b/base/abstractarray.jl @@ -1193,7 +1193,7 @@ function _getindex(::IndexLinear, A::AbstractArray, I::Vararg{Int,M}) where M end _to_linear_index(A::AbstractArray, i::Integer) = i _to_linear_index(A::AbstractVector, i::Integer, I::Integer...) = i -_to_linear_index(A::AbstractArray) = 1 +_to_linear_index(A::AbstractArray) = first(LinearIndices(A)) _to_linear_index(A::AbstractArray, I::Integer...) = (@_inline_meta; _sub2ind(A, I...)) ## IndexCartesian Scalar indexing: Canonical method is full dimensionality of Ints @@ -1481,7 +1481,7 @@ vcat(V::AbstractVector{T}...) where {T} = typed_vcat(T, V...) # but that solution currently fails (see #27188 and #27224) AbstractVecOrTuple{T} = Union{AbstractVector{<:T}, Tuple{Vararg{T}}} -_typed_vcat_similar(V, T, n) = similar(V[1], T, n) +_typed_vcat_similar(V, ::Type{T}, n) where T = similar(V[1], T, n) _typed_vcat(::Type{T}, V::AbstractVecOrTuple{AbstractVector}) where T = _typed_vcat!(_typed_vcat_similar(V, T, mapreduce(length, +, V)), V) @@ -1577,9 +1577,10 @@ cat_size(A::AbstractArray, d) = size(A, d) cat_indices(A, d) = OneTo(1) cat_indices(A::AbstractArray, d) = axes(A, d) -cat_similar(A, T, shape) = Array{T}(undef, shape) -cat_similar(A::AbstractArray, T, shape) = similar(A, T, shape) +cat_similar(A, ::Type{T}, shape) where T = Array{T}(undef, shape) +cat_similar(A::AbstractArray, ::Type{T}, shape) where T = similar(A, T, shape) +# These are for backwards compatibility (even though internal) cat_shape(dims, shape::Tuple{Vararg{Int}}) = shape function cat_shape(dims, shapes::Tuple) out_shape = () @@ -1588,6 +1589,11 @@ function cat_shape(dims, shapes::Tuple) end return out_shape end +# The new way to compute the shape (more inferrable than combining cat_size & cat_shape, due to Varargs + issue#36454) +cat_size_shape(dims) = ntuple(zero, Val(length(dims))) +@inline cat_size_shape(dims, X, tail...) = _cat_size_shape(dims, _cshp(1, dims, (), cat_size(X)), tail...) +_cat_size_shape(dims, shape) = shape +@inline _cat_size_shape(dims, shape, X, tail...) = _cat_size_shape(dims, _cshp(1, dims, shape, cat_size(X)), tail...) _cshp(ndim::Int, ::Tuple{}, ::Tuple{}, ::Tuple{}) = () _cshp(ndim::Int, ::Tuple{}, ::Tuple{}, nshape) = nshape @@ -1631,7 +1637,7 @@ _cat(dims, X...) = cat_t(promote_eltypeof(X...), X...; dims=dims) @inline cat_t(::Type{T}, X...; dims) where {T} = _cat_t(dims, T, X...) @inline function _cat_t(dims, ::Type{T}, X...) where {T} catdims = dims2cat(dims) - shape = cat_shape(catdims, map(cat_size, X)) + shape = cat_size_shape(catdims, X...) A = cat_similar(X[1], T, shape) if count(!iszero, catdims)::Int > 1 fill!(A, zero(T)) @@ -1639,28 +1645,29 @@ _cat(dims, X...) = cat_t(promote_eltypeof(X...), X...; dims=dims) return __cat(A, shape, catdims, X...) end -function __cat(A, shape::NTuple{M}, catdims, X...) where M - N = M::Int - offsets = zeros(Int, N) - inds = Vector{UnitRange{Int}}(undef, N) - concat = copyto!(zeros(Bool, N), catdims) - for x in X - for i = 1:N - if concat[i] - inds[i] = offsets[i] .+ cat_indices(x, i) - offsets[i] += cat_size(x, i) - else - inds[i] = 1:shape[i] - end - end - I::NTuple{N, UnitRange{Int}} = (inds...,) - if x isa AbstractArray - A[I...] = x - else - fill!(view(A, I...), x) - end +# Why isn't this called `__cat!`? +__cat(A, shape, catdims, X...) = __cat_offset!(A, shape, catdims, ntuple(zero, length(shape)), X...) + +function __cat_offset!(A, shape, catdims, offsets, x, X...) + # splitting the "work" on x from X... may reduce latency (fewer costly specializations) + newoffsets = __cat_offset1!(A, shape, catdims, offsets, x) + return __cat_offset!(A, shape, catdims, newoffsets, X...) +end +__cat_offset!(A, shape, catdims, offsets) = A + +function __cat_offset1!(A, shape, catdims, offsets, x) + inds = ntuple(length(offsets)) do i + (i <= length(catdims) && catdims[i]) ? offsets[i] .+ cat_indices(x, i) : 1:shape[i] + end + if x isa AbstractArray + A[inds...] = x + else + fill!(view(A, inds...), x) + end + newoffsets = ntuple(length(offsets)) do i + (i <= length(catdims) && catdims[i]) ? offsets[i] + cat_size(x, i) : offsets[i] end - return A + return newoffsets end """ diff --git a/base/binaryplatforms.jl b/base/binaryplatforms.jl index 493cf446c906c..e93494fac0f7e 100644 --- a/base/binaryplatforms.jl +++ b/base/binaryplatforms.jl @@ -992,7 +992,7 @@ only available in macOS `v"10.11"` and later, or an artifact can state that it r a libstdc++ that is at least `v"3.4.22"`, etc... """ function platforms_match(a::AbstractPlatform, b::AbstractPlatform) - for k in union(keys(tags(a)), keys(tags(b))) + for k in union(keys(tags(a)::Dict{String,String}), keys(tags(b)::Dict{String,String})) ak = get(tags(a), k, nothing) bk = get(tags(b), k, nothing) diff --git a/base/bitarray.jl b/base/bitarray.jl index 94bb94e5a4d03..acc96f7284a54 100644 --- a/base/bitarray.jl +++ b/base/bitarray.jl @@ -1394,7 +1394,7 @@ function bitcount(Bc::Vector{UInt64}; init::T=0) where {T} return n end -count(B::BitArray; init=0) = bitcount(B.chunks; init) +_count(::typeof(identity), B::BitArray, ::Colon, init) = bitcount(B.chunks; init) function unsafe_bitfindnext(Bc::Vector{UInt64}, start::Int) chunk_start = _div64(start-1)+1 diff --git a/base/broadcast.jl b/base/broadcast.jl index ca671d67fd365..19d32199e4eb6 100644 --- a/base/broadcast.jl +++ b/base/broadcast.jl @@ -978,8 +978,10 @@ preprocess_args(dest, args::Tuple{}) = () end end bc′ = preprocess(dest, bc) - @simd for I in eachindex(bc′) - @inbounds dest[I] = bc′[I] + # Performance may vary depending on whether `@inbounds` is placed outside the + # for loop or not. (cf. https://github.com/JuliaLang/julia/issues/38086) + @inbounds @simd for I in eachindex(bc′) + dest[I] = bc′[I] end return dest end diff --git a/base/compiler/abstractinterpretation.jl b/base/compiler/abstractinterpretation.jl index 84a7e18a59b73..c8b4ff5052e47 100644 --- a/base/compiler/abstractinterpretation.jl +++ b/base/compiler/abstractinterpretation.jl @@ -12,9 +12,11 @@ const _REF_NAME = Ref.body.name # logic # ######### -# see if the inference result might affect the final answer -call_result_unused(frame::InferenceState, pc::LineNum=frame.currpc) = - isexpr(frame.src.code[frame.currpc], :call) && isempty(frame.ssavalue_uses[pc]) +# See if the inference result of the current statement's result value might affect +# the final answer for the method (aside from optimization potential and exceptions). +# To do that, we need to check both for slot assignment and SSA usage. +call_result_unused(frame::InferenceState) = + isexpr(frame.src.code[frame.currpc], :call) && isempty(frame.ssavalue_uses[frame.currpc]) # check if this return type is improvable (i.e. whether it's possible that with # more information, we might get a more precise type) @@ -192,6 +194,16 @@ function abstract_call_gf_by_type(interp::AbstractInterpreter, @nospecialize(f), end end #print("=> ", rettype, "\n") + if rettype isa LimitedAccuracy + union!(sv.pclimitations, rettype.causes) + rettype = rettype.typ + end + if !isempty(sv.pclimitations) # remove self, if present + delete!(sv.pclimitations, sv) + for caller in sv.callers_in_cycle + delete!(sv.pclimitations, caller) + end + end return CallMeta(rettype, info) end @@ -313,7 +325,6 @@ function abstract_call_method_with_const_args(interp::AbstractInterpreter, @nosp inf_result = InferenceResult(mi, argtypes) frame = InferenceState(inf_result, #=cache=#false, interp) frame === nothing && return Any # this is probably a bad generated function (unsound), but just ignore it - frame.limited = true frame.parent = sv push!(inf_cache, inf_result) typeinf(interp, frame) || return Any @@ -394,7 +405,7 @@ function abstract_call_method(interp::AbstractInterpreter, method::Method, @nosp parent = parent::InferenceState parent_method2 = parent.src.method_for_inference_limit_heuristics # limit only if user token match parent_method2 isa Method || (parent_method2 = nothing) # Union{Method, Nothing} - if (parent.cached || parent.limited) && parent.linfo.def === sv.linfo.def && sv_method2 === parent_method2 + if (parent.cached || parent.parent !== nothing) && parent.linfo.def === sv.linfo.def && sv_method2 === parent_method2 topmost = infstate edgecycle = true end @@ -443,7 +454,8 @@ function abstract_call_method(interp::AbstractInterpreter, method::Method, @nosp # (non-typically, this means that we lose the ability to detect a guaranteed StackOverflow in some cases) return Any, true, nothing end - poison_callstack(sv, topmost::InferenceState, true) + topmost = topmost::InferenceState + poison_callstack(sv, topmost.parent === nothing ? topmost : topmost.parent) sig = newsig sparams = svec() end @@ -537,8 +549,8 @@ function precise_container_type(interp::AbstractInterpreter, @nospecialize(itft) if _any(t -> !isa(t, DataType) || !(t <: Tuple) || !isknownlength(t), utis) return Any[Vararg{Any}], nothing end - result = Any[rewrap_unionall(p, tti0) for p in utis[1].parameters] - for t in utis[2:end] + result = Any[rewrap_unionall(p, tti0) for p in (utis[1]::DataType).parameters] + for t::DataType in utis[2:end] if length(t.parameters) != length(result) return Any[Vararg{Any}], nothing end @@ -770,8 +782,9 @@ end function argtype_by_index(argtypes::Vector{Any}, i::Int) n = length(argtypes) - if isvarargtype(argtypes[n]) - return i >= n ? unwrapva(argtypes[n]) : argtypes[i] + na = argtypes[n] + if isvarargtype(na) + return i >= n ? unwrapva(na) : argtypes[i] else return i > n ? Bottom : argtypes[i] end @@ -788,25 +801,33 @@ end function abstract_call_builtin(interp::AbstractInterpreter, f::Builtin, fargs::Union{Nothing,Vector{Any}}, argtypes::Vector{Any}, sv::InferenceState, max_methods::Int) la = length(argtypes) - if f === ifelse && fargs isa Vector{Any} && la == 4 && argtypes[2] isa Conditional - # try to simulate this as a real conditional (`cnd ? x : y`), so that the penalty for using `ifelse` instead isn't too high - cnd = argtypes[2]::Conditional - tx = argtypes[3] - ty = argtypes[4] - a = ssa_def_slot(fargs[3], sv) - b = ssa_def_slot(fargs[4], sv) - if isa(a, Slot) && slot_id(cnd.var) == slot_id(a) - tx = typeintersect(tx, cnd.vtype) - end - if isa(b, Slot) && slot_id(cnd.var) == slot_id(b) - ty = typeintersect(ty, cnd.elsetype) - end - return tmerge(tx, ty) + if f === ifelse && fargs isa Vector{Any} && la == 4 + cnd = argtypes[2] + if isa(cnd, Conditional) + newcnd = widenconditional(cnd) + tx = argtypes[3] + ty = argtypes[4] + if isa(newcnd, Const) + # if `cnd` is constant, we should just respect its constantness to keep inference accuracy + return newcnd.val::Bool ? tx : ty + else + # try to simulate this as a real conditional (`cnd ? x : y`), so that the penalty for using `ifelse` instead isn't too high + a = ssa_def_slot(fargs[3], sv) + b = ssa_def_slot(fargs[4], sv) + if isa(a, Slot) && slot_id(cnd.var) == slot_id(a) + tx = (cnd.vtype ⊑ tx ? cnd.vtype : tmeet(tx, widenconst(cnd.vtype))) + end + if isa(b, Slot) && slot_id(cnd.var) == slot_id(b) + ty = (cnd.elsetype ⊑ ty ? cnd.elsetype : tmeet(ty, widenconst(cnd.elsetype))) + end + return tmerge(tx, ty) + end + end end rt = builtin_tfunction(interp, f, argtypes[2:end], sv) if f === getfield && isa(fargs, Vector{Any}) && la == 3 && isa(argtypes[3], Const) && isa(argtypes[3].val, Int) && argtypes[2] ⊑ Tuple cti, _ = precise_container_type(interp, nothing, argtypes[2], sv) - idx = argtypes[3].val + idx = argtypes[3].val::Int if 1 <= idx <= length(cti) rt = unwrapva(cti[idx]) end @@ -884,10 +905,11 @@ end function abstract_call_unionall(argtypes::Vector{Any}) if length(argtypes) == 3 canconst = true - if isa(argtypes[3], Const) - body = argtypes[3].val - elseif isType(argtypes[3]) - body = argtypes[3].parameters[1] + a3 = argtypes[3] + if isa(a3, Const) + body = a3.val + elseif isType(a3) + body = a3.parameters[1] canconst = false else return Any @@ -896,11 +918,11 @@ function abstract_call_unionall(argtypes::Vector{Any}) return Any end if has_free_typevars(body) - if isa(argtypes[2], Const) - tv = argtypes[2].val - elseif isa(argtypes[2], PartialTypeVar) - ptv = argtypes[2] - tv = ptv.tv + a2 = argtypes[2] + if isa(a2, Const) + tv = a2.val + elseif isa(a2, PartialTypeVar) + tv = a2.tv canconst = false else return Any @@ -1090,7 +1112,7 @@ end function abstract_eval_value_expr(interp::AbstractInterpreter, e::Expr, vtypes::VarTable, sv::InferenceState) if e.head === :static_parameter - n = e.args[1] + n = e.args[1]::Int t = Any if 1 <= n <= length(sv.sptypes) t = sv.sptypes[n] @@ -1109,7 +1131,7 @@ function abstract_eval_special_value(interp::AbstractInterpreter, @nospecialize( elseif isa(e, SSAValue) return abstract_eval_ssavalue(e::SSAValue, sv.src) elseif isa(e, Slot) - return vtypes[slot_id(e)].typ + return (vtypes[slot_id(e)]::VarState).typ elseif isa(e, GlobalRef) return abstract_eval_global(e.mod, e.name) end @@ -1121,7 +1143,12 @@ function abstract_eval_value(interp::AbstractInterpreter, @nospecialize(e), vtyp if isa(e, Expr) return abstract_eval_value_expr(interp, e, vtypes, sv) else - return abstract_eval_special_value(interp, e, vtypes, sv) + typ = abstract_eval_special_value(interp, e, vtypes, sv) + if typ isa LimitedAccuracy + union!(sv.pclimitations, typ.causes) + typ = typ.typ + end + return typ end end @@ -1186,9 +1213,9 @@ function abstract_eval_statement(interp::AbstractInterpreter, @nospecialize(e), if length(e.args) == 2 && isconcretetype(t) && !t.mutable at = abstract_eval_value(interp, e.args[2], vtypes, sv) n = fieldcount(t) - if isa(at, Const) && isa(at.val, Tuple) && n == length(at.val) && - let t = t, at = at; _all(i->at.val[i] isa fieldtype(t, i), 1:n); end - t = Const(ccall(:jl_new_structt, Any, (Any, Any), t, at.val)) + if isa(at, Const) && (val = at.val; isa(val, Tuple)) && n == length(val) && + let t = t, val = val; _all(i->val[i] isa fieldtype(t, i), 1:n); end + t = Const(ccall(:jl_new_structt, Any, (Any, Any), t, val)) elseif isa(at, PartialStruct) && at ⊑ Tuple && n == length(at.fields) && let t = t, at = at; _all(i->at.fields[i] ⊑ fieldtype(t, i), 1:n); end t = PartialStruct(t, at.fields) @@ -1244,13 +1271,21 @@ function abstract_eval_statement(interp::AbstractInterpreter, @nospecialize(e), end end else - return abstract_eval_value_expr(interp, e, vtypes, sv) + t = abstract_eval_value_expr(interp, e, vtypes, sv) end @assert !isa(t, TypeVar) if isa(t, DataType) && isdefined(t, :instance) # replace singleton types with their equivalent Const object t = Const(t.instance) end + if !isempty(sv.pclimitations) + if t isa Const || t === Union{} + empty!(sv.pclimitations) + else + t = LimitedAccuracy(t, sv.pclimitations) + sv.pclimitations = IdSet{InferenceState}() + end + end return t end @@ -1305,10 +1340,18 @@ function typeinf_local(interp::AbstractInterpreter, frame::InferenceState) elseif isa(stmt, GotoIfNot) condt = abstract_eval_value(interp, stmt.cond, s[pc], frame) if condt === Bottom + empty!(frame.pclimitations) break end condval = maybe_extract_const_bool(condt) l = stmt.dest::Int + if !isempty(frame.pclimitations) + # we can't model the possible effect of control + # dependencies on the return value, so we propagate it + # directly to all the return values (unless we error first) + condval isa Bool || union!(frame.limitations, frame.pclimitations) + empty!(frame.pclimitations) + end # constant conditions if condval === true elseif condval === false @@ -1343,6 +1386,14 @@ function typeinf_local(interp::AbstractInterpreter, frame::InferenceState) # and is valid inter-procedurally rt = widenconst(rt) end + # copy limitations to return value + if !isempty(frame.pclimitations) + union!(frame.limitations, frame.pclimitations) + empty!(frame.pclimitations) + end + if !isempty(frame.limitations) + rt = LimitedAccuracy(rt, copy(frame.limitations)) + end if tchanged(rt, frame.bestguess) # new (wider) return type for frame frame.bestguess = tmerge(frame.bestguess, rt) @@ -1417,6 +1468,8 @@ function typeinf_local(interp::AbstractInterpreter, frame::InferenceState) end end + @assert isempty(frame.pclimitations) "unhandled LimitedAccuracy" + if t === nothing # mark other reached expressions as `Any` to indicate they don't throw frame.src.ssavaluetypes[pc] = Any diff --git a/base/compiler/compiler.jl b/base/compiler/compiler.jl index 986b8f6497fa3..37e281f2f2724 100644 --- a/base/compiler/compiler.jl +++ b/base/compiler/compiler.jl @@ -103,11 +103,10 @@ using .Sort # compiler # ############ +include("compiler/cicache.jl") include("compiler/types.jl") include("compiler/utilities.jl") include("compiler/validation.jl") - -include("compiler/cicache.jl") include("compiler/methodtable.jl") include("compiler/inferenceresult.jl") diff --git a/base/compiler/inferencestate.jl b/base/compiler/inferencestate.jl index 2d5fce04c0454..3a25cf753ae82 100644 --- a/base/compiler/inferencestate.jl +++ b/base/compiler/inferencestate.jl @@ -10,6 +10,8 @@ mutable struct InferenceState slottypes::Vector{Any} mod::Module currpc::LineNum + pclimitations::IdSet{InferenceState} # causes of precision restrictions (LimitedAccuracy) on currpc ssavalue + limitations::IdSet{InferenceState} # causes of precision restrictions (LimitedAccuracy) on return # info on the state of inference and the linfo src::CodeInfo @@ -39,7 +41,6 @@ mutable struct InferenceState # TODO: move these to InferenceResult / Params? cached::Bool - limited::Bool inferred::Bool dont_work_on_me::Bool @@ -105,6 +106,7 @@ mutable struct InferenceState frame = new( InferenceParams(interp), result, linfo, sp, slottypes, inmodule, 0, + IdSet{InferenceState}(), IdSet{InferenceState}(), src, get_world_counter(interp), valid_worlds, nargs, s_types, s_edges, stmt_info, Union{}, W, 1, n, @@ -113,7 +115,7 @@ mutable struct InferenceState Vector{Tuple{InferenceState,LineNum}}(), # cycle_backedges Vector{InferenceState}(), # callers_in_cycle #=parent=#nothing, - cached, false, false, false, + cached, false, false, CachedMethodTable(method_table(interp)), interp) result.result = frame @@ -261,37 +263,13 @@ function add_mt_backedge!(mt::Core.MethodTable, @nospecialize(typ), caller::Infe nothing end -function poison_callstack(infstate::InferenceState, topmost::InferenceState, poison_topmost::Bool) - poison_topmost && (topmost = topmost.parent) - while !(infstate === topmost) - if call_result_unused(infstate) - # If we won't propagate the result any further (since it's typically unused), - # it's OK that we keep and cache the "limited" result in the parents - # (non-typically, this means that we lose the ability to detect a guaranteed StackOverflow in some cases) - # TODO: we might be able to halt progress much more strongly here, - # since now we know we won't be able to keep anything much that we learned. - # We were mainly only here to compute the calling convention return type, - # but in most situations now, we are unlikely to be able to use that information. - break - end - infstate.limited = true - for infstate_cycle in infstate.callers_in_cycle - infstate_cycle.limited = true - end - infstate = infstate.parent - infstate === nothing && return - end -end - function print_callstack(sv::InferenceState) while sv !== nothing print(sv.linfo) - sv.limited && print(" [limited]") !sv.cached && print(" [uncached]") println() for cycle in sv.callers_in_cycle print(' ', cycle.linfo) - cycle.limited && print(" [limited]") println() end sv = sv.parent diff --git a/base/compiler/optimize.jl b/base/compiler/optimize.jl index 9cdeb94c3c79d..9d9bc45dc1e9f 100644 --- a/base/compiler/optimize.jl +++ b/base/compiler/optimize.jl @@ -44,20 +44,15 @@ mutable struct OptimizationState const_api::Bool inlining::InliningState function OptimizationState(frame::InferenceState, params::OptimizationParams, interp::AbstractInterpreter) - s_edges = frame.stmt_edges[1] - if s_edges === nothing - s_edges = [] - frame.stmt_edges[1] = s_edges - end - src = frame.src + s_edges = frame.stmt_edges[1]::Vector{Any} inlining = InliningState(params, - EdgeTracker(s_edges::Vector{Any}, frame.valid_worlds), + EdgeTracker(s_edges, frame.valid_worlds), InferenceCaches( get_inference_cache(interp), WorldView(code_cache(interp), frame.world)), method_table(interp)) return new(frame.linfo, - src, frame.stmt_info, frame.mod, frame.nargs, + frame.src, frame.stmt_info, frame.mod, frame.nargs, frame.sptypes, frame.slottypes, false, inlining) end diff --git a/base/compiler/tfuncs.jl b/base/compiler/tfuncs.jl index 7f5d3e42522d7..3d5ad1768e5a4 100644 --- a/base/compiler/tfuncs.jl +++ b/base/compiler/tfuncs.jl @@ -544,41 +544,10 @@ function typeof_tfunc(@nospecialize(t)) end add_tfunc(typeof, 1, 1, typeof_tfunc, 0) -function typeassert_type_instance(@nospecialize(v), @nospecialize(t)) - if isa(v, Const) - if !has_free_typevars(t) && !isa(v.val, t) - return Bottom - end - return v - elseif isa(v, PartialStruct) - has_free_typevars(t) && return v - widev = widenconst(v) - if widev <: t - return v - elseif typeintersect(widev, t) === Bottom - return Bottom - end - @assert widev <: Tuple - new_fields = Vector{Any}(undef, length(v.fields)) - for i = 1:length(new_fields) - new_fields[i] = typeassert_type_instance(v.fields[i], getfield_tfunc(t, Const(i))) - if new_fields[i] === Bottom - return Bottom - end - end - return tuple_tfunc(new_fields) - elseif isa(v, Conditional) - if !(Bool <: t) - return Bottom - end - return v - end - return typeintersect(widenconst(v), t) -end function typeassert_tfunc(@nospecialize(v), @nospecialize(t)) t = instanceof_tfunc(t)[1] t === Any && return v - return typeassert_type_instance(v, t) + return tmeet(v, t) end add_tfunc(typeassert, 2, 2, typeassert_tfunc, 4) @@ -1612,25 +1581,29 @@ function return_type_tfunc(interp::AbstractInterpreter, argtypes::Vector{Any}, s if contains_is(argtypes_vec, Union{}) return Const(Union{}) end - rt = abstract_call(interp, nothing, argtypes_vec, sv, -1).rt + rt = widenconditional(abstract_call(interp, nothing, argtypes_vec, sv, -1).rt) if isa(rt, Const) # output was computed to be constant return Const(typeof(rt.val)) + end + rt = widenconst(rt) + if rt === Bottom || (isconcretetype(rt) && !iskindtype(rt)) + # output cannot be improved so it is known for certain + return Const(rt) + elseif !isempty(sv.pclimitations) + # conservatively express uncertainty of this result + # in two ways: both as being a subtype of this, and + # because of LimitedAccuracy causes + return Type{<:rt} + elseif (isa(tt, Const) || isconstType(tt)) && + (isa(aft, Const) || isconstType(aft)) + # input arguments were known for certain + # XXX: this doesn't imply we know anything about rt + return Const(rt) + elseif isType(rt) + return Type{rt} else - rt = widenconst(rt) - if hasuniquerep(rt) || rt === Bottom - # output type was known for certain - return Const(rt) - elseif (isa(tt, Const) || isconstType(tt)) && - (isa(aft, Const) || isconstType(aft)) - # input arguments were known for certain - # XXX: this doesn't imply we know anything about rt - return Const(rt) - elseif isType(rt) - return Type{rt} - else - return Type{<:rt} - end + return Type{<:rt} end end end diff --git a/base/compiler/typeinfer.jl b/base/compiler/typeinfer.jl index 6a4027e2c6f4e..9a456660807da 100644 --- a/base/compiler/typeinfer.jl +++ b/base/compiler/typeinfer.jl @@ -28,7 +28,6 @@ struct InferenceFrameInfo sptypes::Vector{Any} slottypes::Vector{Any} nargs::Int - limited::Bool end function _typeinf_identifier(frame::Core.Compiler.InferenceState) @@ -38,7 +37,6 @@ function _typeinf_identifier(frame::Core.Compiler.InferenceState) copy(frame.sptypes), copy(frame.slottypes), frame.nargs, - frame.limited, ) return mi_info end @@ -85,7 +83,7 @@ function reset_timings() empty!(_timings) push!(_timings, Timing( # The MethodInstance for ROOT(), and default empty values for other fields. - InferenceFrameInfo(ROOTmi, 0x0, Any[], Any[Core.Const(ROOT)], 1, false), + InferenceFrameInfo(ROOTmi, 0x0, Any[], Any[Core.Const(ROOT)], 1), _time_ns())) return nothing end @@ -217,67 +215,62 @@ function _typeinf(interp::AbstractInterpreter, frame::InferenceState) # with no active ip's, frame is done frames = frame.callers_in_cycle isempty(frames) && push!(frames, frame) + valid_worlds = WorldRange() for caller in frames @assert !(caller.dont_work_on_me) caller.dont_work_on_me = true + # might might not fully intersect these earlier, so do that now + valid_worlds = intersect(caller.valid_worlds, valid_worlds) end for caller in frames + caller.valid_worlds = valid_worlds finish(caller, interp) + # finalize and record the linfo result + caller.inferred = true end # collect results for the new expanded frame - results = Tuple{InferenceResult, Bool}[ ( frames[i].result, - frames[i].cached || frames[i].parent !== nothing ) for i in 1:length(frames) ] - # empty!(frames) - valid_worlds = frame.valid_worlds - cached = frame.cached - if cached || frame.parent !== nothing - for (caller, doopt) in results + results = Tuple{InferenceResult, Vector{Any}, Bool}[ + ( frames[i].result, + frames[i].stmt_edges[1], + frames[i].cached ) + for i in 1:length(frames) ] + empty!(frames) + if may_optimize(interp) + for (caller, _, _) in results opt = caller.src if opt isa OptimizationState - run_optimizer = doopt && may_optimize(interp) - if run_optimizer - optimize(interp, opt, OptimizationParams(interp), caller.result) - finish(opt.src, interp) - # finish updating the result struct - validate_code_in_debug_mode(opt.linfo, opt.src, "optimized") - if opt.const_api - if caller.result isa Const - caller.src = caller.result - else - @assert isconstType(caller.result) - caller.src = Const(caller.result.parameters[1]) - end - elseif opt.src.inferred - caller.src = opt.src::CodeInfo # stash a copy of the code (for inlining) + result_type = caller.result + @assert !(result_type isa LimitedAccuracy) + optimize(interp, opt, OptimizationParams(interp), result_type) + finish(opt.src, interp) + # finish updating the result struct + validate_code_in_debug_mode(opt.linfo, opt.src, "optimized") + if opt.const_api + if result_type isa Const + caller.src = result_type else - caller.src = nothing + @assert isconstType(result_type) + caller.src = Const(result_type.parameters[1]) end + elseif opt.src.inferred + caller.src = opt.src::CodeInfo # stash a copy of the code (for inlining) + else + caller.src = nothing end - # As a hack the et reuses frame_edges[1] to push any optimization - # edges into, so we don't need to handle them specially here - valid_worlds = intersect(valid_worlds, opt.inlining.et.valid_worlds[]) + caller.valid_worlds = opt.inlining.et.valid_worlds[] end end end - if last(valid_worlds) == get_world_counter() - valid_worlds = WorldRange(first(valid_worlds), typemax(UInt)) - end - for caller in frames - caller.valid_worlds = valid_worlds - caller.src.min_world = first(valid_worlds) - caller.src.max_world = last(valid_worlds) - if cached - cache_result!(interp, caller.result, valid_worlds) - end - if last(valid_worlds) == typemax(UInt) + for (caller, edges, cached) in results + valid_worlds = caller.valid_worlds + if last(valid_worlds) >= get_world_counter() # if we aren't cached, we don't need this edge # but our caller might, so let's just make it anyways - for caller in frames - store_backedges(caller) - end + store_backedges(caller, edges) + end + if cached + cache_result!(interp, caller) end - # finalize and record the linfo result - caller.inferred = true end return true end @@ -285,20 +278,22 @@ end function CodeInstance(result::InferenceResult, @nospecialize(inferred_result::Any), valid_worlds::WorldRange) local const_flags::Int32 + result_type = result.result + @assert !(result_type isa LimitedAccuracy) if inferred_result isa Const # use constant calling convention rettype_const = (result.src::Const).val const_flags = 0x3 inferred_result = nothing else - if isa(result.result, Const) - rettype_const = (result.result::Const).val + if isa(result_type, Const) + rettype_const = result_type.val const_flags = 0x2 - elseif isconstType(result.result) - rettype_const = result.result.parameters[1] + elseif isconstType(result_type) + rettype_const = result_type.parameters[1] const_flags = 0x2 - elseif isa(result.result, PartialStruct) - rettype_const = (result.result::PartialStruct).fields + elseif isa(result_type, PartialStruct) + rettype_const = result_type.fields const_flags = 0x2 else rettype_const = nothing @@ -306,7 +301,7 @@ function CodeInstance(result::InferenceResult, @nospecialize(inferred_result::An end end return CodeInstance(result.linfo, - widenconst(result.result), rettype_const, inferred_result, + widenconst(result_type), rettype_const, inferred_result, const_flags, first(valid_worlds), last(valid_worlds)) end @@ -343,7 +338,7 @@ function maybe_compress_codeinfo(interp::AbstractInterpreter, linfo::MethodInsta end function transform_result_for_cache(interp::AbstractInterpreter, linfo::MethodInstance, - @nospecialize(inferred_result)) + valid_worlds::WorldRange, @nospecialize(inferred_result)) local const_flags::Int32 # If we decided not to optimize, drop the OptimizationState now. # External interpreters can override as necessary to cache additional information @@ -351,6 +346,8 @@ function transform_result_for_cache(interp::AbstractInterpreter, linfo::MethodIn inferred_result = inferred_result.src end if inferred_result isa CodeInfo + inferred_result.min_world = first(valid_worlds) + inferred_result.max_world = last(valid_worlds) inferred_result = maybe_compress_codeinfo(interp, linfo, inferred_result) end # The global cache can only handle objects that codegen understands @@ -360,7 +357,13 @@ function transform_result_for_cache(interp::AbstractInterpreter, linfo::MethodIn return inferred_result end -function cache_result!(interp::AbstractInterpreter, result::InferenceResult, valid_worlds::WorldRange) +function cache_result!(interp::AbstractInterpreter, result::InferenceResult) + valid_worlds = result.valid_worlds + if last(valid_worlds) == get_world_counter() + # if we've successfully recorded all of the backedges in the global reverse-cache, + # we can now widen our applicability in the global cache too + valid_worlds = WorldRange(first(valid_worlds), typemax(UInt)) + end # check if the existing linfo metadata is also sufficient to describe the current inference result # to decide if it is worth caching this already_inferred = already_inferred_quick_test(interp, result.linfo) @@ -370,28 +373,93 @@ function cache_result!(interp::AbstractInterpreter, result::InferenceResult, val # TODO: also don't store inferred code if we've previously decided to interpret this function if !already_inferred - inferred_result = transform_result_for_cache(interp, result.linfo, result.src) + inferred_result = transform_result_for_cache(interp, result.linfo, valid_worlds, result.src) code_cache(interp)[result.linfo] = CodeInstance(result, inferred_result, valid_worlds) end unlock_mi_inference(interp, result.linfo) nothing end +function cycle_fix_limited(@nospecialize(typ), sv::InferenceState) + if typ isa LimitedAccuracy + if sv.parent === nothing + # when part of a cycle, we might have unintentionally introduced a limit marker + @assert !isempty(sv.callers_in_cycle) + return typ.typ + end + causes = copy(typ.causes) + delete!(causes, sv) + for caller in sv.callers_in_cycle + delete!(causes, caller) + end + if isempty(causes) + return typ.typ + end + if length(causes) != length(typ.causes) + return LimitedAccuracy(typ.typ, causes) + end + end + return typ +end + # inference completed on `me` # update the MethodInstance function finish(me::InferenceState, interp::AbstractInterpreter) # prepare to run optimization passes on fulltree - if me.limited && me.cached && me.parent !== nothing - # a top parent will be cached still, but not this intermediate work + s_edges = me.stmt_edges[1] + if s_edges === nothing + s_edges = [] + me.stmt_edges[1] = s_edges + end + for edges in me.stmt_edges + edges === nothing && continue + edges === s_edges && continue + append!(s_edges, edges) + empty!(edges) + end + if me.src.edges !== nothing + append!(s_edges, me.src.edges) + me.src.edges = nothing + end + # inspect whether our inference had a limited result accuracy, + # else it may be suitable to cache + me.bestguess = cycle_fix_limited(me.bestguess, me) + limited_ret = me.bestguess isa LimitedAccuracy + limited_src = false + if !limited_ret + gt = me.src.ssavaluetypes + for j = 1:length(gt) + gt[j] = gtj = cycle_fix_limited(gt[j], me) + if gtj isa LimitedAccuracy && me.parent !== nothing + limited_src = true + break + end + end + end + if limited_ret + # a parent may be cached still, but not this intermediate work: # we can throw everything else away now + me.result.src = nothing me.cached = false + me.src.inlineable = false unlock_mi_inference(interp, me.linfo) + elseif limited_src + # a type result will be cached still, but not this intermediate work: + # we can throw everything else away now + me.result.src = nothing me.src.inlineable = false else - # annotate fulltree with type information - type_annotate!(me) - me.result.src = OptimizationState(me, OptimizationParams(interp), interp) + # annotate fulltree with type information, + # either because we are the outermost code, or we might use this later + doopt = (me.cached || me.parent !== nothing) + type_annotate!(me, doopt) + if doopt + me.result.src = OptimizationState(me, OptimizationParams(interp), interp) + else + me.result.src = me.src::CodeInfo # stash a convenience copy of the code (e.g. for reflection) + end end + me.result.valid_worlds = me.valid_worlds me.result.result = me.bestguess nothing end @@ -404,20 +472,15 @@ function finish(src::CodeInfo, interp::AbstractInterpreter) end # record the backedges -function store_backedges(frame::InferenceState) +function store_backedges(frame::InferenceResult, edges::Vector{Any}) toplevel = !isa(frame.linfo.def, Method) - if !toplevel && (frame.cached || frame.parent !== nothing) - caller = frame.result.linfo - for edges in frame.stmt_edges - store_backedges(caller, edges) - end - store_backedges(caller, frame.src.edges) - frame.src.edges = nothing + if !toplevel + store_backedges(frame.linfo, edges) end + nothing end -store_backedges(caller, edges::Nothing) = nothing -function store_backedges(caller, edges::Vector) +function store_backedges(caller::MethodInstance, edges::Vector) i = 1 while i <= length(edges) to = edges[i] @@ -482,7 +545,7 @@ end function visit_slot_load!(sl::Slot, vtypes::VarTable, sv::InferenceState, undefs::Array{Bool,1}) id = slot_id(sl) s = vtypes[id] - vt = widenconditional(s.typ) + vt = widenconditional(ignorelimited(s.typ)) if s.undef # find used-undef variables undefs[id] = true @@ -527,10 +590,9 @@ function record_slot_assign!(sv::InferenceState) end # annotate types of all symbols in AST -function type_annotate!(sv::InferenceState) - # delete dead statements only if we're building this IR to cache it - # (otherwise, we'll run the optimization passes later, outside of inference) - run_optimizer = (sv.cached || sv.parent !== nothing) +function type_annotate!(sv::InferenceState, run_optimizer::Bool) + # as an optimization, we delete dead statements immediately if we're going to run the optimizer + # (otherwise, we'll perhaps run the optimization passes later, outside of inference) # remove all unused ssa values gt = sv.src.ssavaluetypes @@ -545,6 +607,7 @@ function type_annotate!(sv::InferenceState) # to hold all of the items assigned into it record_slot_assign!(sv) sv.src.slottypes = sv.slottypes + @assert !(sv.bestguess isa LimitedAccuracy) sv.src.rettype = sv.bestguess # annotate variables load types @@ -640,7 +703,7 @@ function union_caller_cycle!(a::InferenceState, b::InferenceState) return end -function merge_call_chain!(parent::InferenceState, ancestor::InferenceState, child::InferenceState, limited::Bool) +function merge_call_chain!(parent::InferenceState, ancestor::InferenceState, child::InferenceState) # add backedge of parent <- child # then add all backedges of parent <- parent.parent # and merge all of the callers into ancestor.callers_in_cycle @@ -652,17 +715,17 @@ function merge_call_chain!(parent::InferenceState, ancestor::InferenceState, chi parent = child.parent child === ancestor && break end - if limited - for caller in ancestor.callers_in_cycle - caller.limited = true - end - end end function is_same_frame(interp::AbstractInterpreter, linfo::MethodInstance, frame::InferenceState) return linfo === frame.linfo end +function poison_callstack(infstate::InferenceState, topmost::InferenceState) + push!(infstate.pclimitations, topmost) + nothing +end + # Walk through `linfo`'s upstream call chain, starting at `parent`. If a parent # frame matching `linfo` is encountered, then there is a cycle in the call graph # (i.e. `linfo` is a descendant callee of itself). Upon encountering this cycle, @@ -673,28 +736,26 @@ end function resolve_call_cycle!(interp::AbstractInterpreter, linfo::MethodInstance, parent::InferenceState) frame = parent uncached = false - limited = false while isa(frame, InferenceState) uncached |= !frame.cached # ensure we never add an uncached frame to a cycle - limited |= frame.limited if is_same_frame(interp, linfo, frame) if uncached # our attempt to speculate into a constant call lead to an undesired self-cycle # that cannot be converged: poison our call-stack (up to the discovered duplicate frame) # with the limited flag and abort (set return type to Any) now - poison_callstack(parent, frame, false) + poison_callstack(parent, frame) return true end - merge_call_chain!(parent, frame, frame, limited) + merge_call_chain!(parent, frame, frame) return frame end for caller in frame.callers_in_cycle if is_same_frame(interp, linfo, caller) if uncached - poison_callstack(parent, frame, false) + poison_callstack(parent, frame) return true end - merge_call_chain!(parent, frame, caller, limited) + merge_call_chain!(parent, frame, caller) return caller end end @@ -739,12 +800,12 @@ function typeinf_edge(interp::AbstractInterpreter, method::Method, @nospecialize unlock_mi_inference(interp, mi) return Any, nothing end - if caller.cached || caller.limited # don't involve uncached functions in cycle resolution + if caller.cached || caller.parent !== nothing # don't involve uncached functions in cycle resolution frame.parent = caller end typeinf(interp, frame) update_valid_age!(frame, caller) - return widenconst_bestguess(frame.bestguess), frame.inferred ? mi : nothing + return frame.bestguess, frame.inferred ? mi : nothing elseif frame === true # unresolvable cycle return Any, nothing @@ -752,12 +813,7 @@ function typeinf_edge(interp::AbstractInterpreter, method::Method, @nospecialize # return the current knowledge about this cycle frame = frame::InferenceState update_valid_age!(frame, caller) - return widenconst_bestguess(frame.bestguess), nothing -end - -function widenconst_bestguess(bestguess) - !isa(bestguess, Const) && !isa(bestguess, PartialStruct) && !isa(bestguess, Type) && return widenconst(bestguess) - return bestguess + return frame.bestguess, nothing end #### entry points for inferring a MethodInstance given a type signature #### @@ -772,12 +828,12 @@ function typeinf_code(interp::AbstractInterpreter, method::Method, @nospecialize if typeinf(interp, frame) && run_optimizer opt_params = OptimizationParams(interp) opt = OptimizationState(frame, opt_params, interp) - optimize(interp, opt, opt_params, result.result) + optimize(interp, opt, opt_params, ignorelimited(result.result)) opt.src.inferred = true end ccall(:jl_typeinf_end, Cvoid, ()) frame.inferred || return (nothing, Any) - return (frame.src, widenconst(result.result)) + return (frame.src, widenconst(ignorelimited(result.result))) end # compute (and cache) an inferred AST and return type @@ -792,7 +848,8 @@ function typeinf_ext(interp::AbstractInterpreter, mi::MethodInstance) if invoke_api(code) == 2 i == 2 && ccall(:jl_typeinf_end, Cvoid, ()) tree = ccall(:jl_new_code_info_uninit, Ref{CodeInfo}, ()) - tree.code = Any[ ReturnNode(quoted(code.rettype_const)) ] + rettype_const = code.rettype_const + tree.code = Any[ ReturnNode(quoted(rettype_const)) ] nargs = Int(method.nargs) tree.slotnames = ccall(:jl_uncompress_argnames, Vector{Symbol}, (Any,), method.slot_syms) tree.slotflags = fill(0x00, nargs) @@ -804,7 +861,7 @@ function typeinf_ext(interp::AbstractInterpreter, mi::MethodInstance) tree.pure = true tree.inlineable = true tree.parent = mi - tree.rettype = Core.Typeof(code.rettype_const) + tree.rettype = Core.Typeof(rettype_const) tree.min_world = code.min_world tree.max_world = code.max_world return tree @@ -857,7 +914,7 @@ function typeinf_type(interp::AbstractInterpreter, method::Method, @nospecialize typeinf(interp, frame, true) ccall(:jl_typeinf_end, Cvoid, ()) frame.result isa InferenceState && return nothing - return widenconst(frame.result) + return widenconst(ignorelimited(frame.result)) end # This is a bridge for the C code calling `jl_typeinf_func()` diff --git a/base/compiler/typelattice.jl b/base/compiler/typelattice.jl index 17a444e840b77..5df8dfd411ba3 100644 --- a/base/compiler/typelattice.jl +++ b/base/compiler/typelattice.jl @@ -56,6 +56,7 @@ end # Wraps a type and represents that the value may also be undef at this point. # (only used in optimize, not abstractinterpret) +# N.B. in the lattice, this is epsilon bigger than `typ` (even Any) struct MaybeUndef typ MaybeUndef(@nospecialize(typ)) = new(typ) @@ -77,6 +78,16 @@ struct StateUpdate state::VarTable end +# Represent that the type estimate has been approximated, due to "causes" +# (only used in abstractinterpret, doesn't appear in optimize) +# N.B. in the lattice, this is epsilon smaller than `typ` (except Union{}) +struct LimitedAccuracy + typ + causes::IdSet{InferenceState} + LimitedAccuracy(@nospecialize(typ), causes::IdSet{InferenceState}) = + new(typ, causes) +end + struct NotFound end const NOT_FOUND = NotFound() @@ -113,13 +124,23 @@ end maybe_extract_const_bool(@nospecialize c) = nothing function ⊑(@nospecialize(a), @nospecialize(b)) + if isa(b, LimitedAccuracy) + if !isa(a, LimitedAccuracy) + return false + end + if b.causes ⊈ a.causes + return false + end + b = b.typ + end + isa(a, LimitedAccuracy) && (a = a.typ) if isa(a, MaybeUndef) && !isa(b, MaybeUndef) return false end isa(a, MaybeUndef) && (a = a.typ) isa(b, MaybeUndef) && (b = b.typ) - (a === NOT_FOUND || b === Any) && return true - (a === Any || b === NOT_FOUND) && return false + b === Any && return true + a === Any && return false a === Union{} && return true b === Union{} && return false if isa(a, Conditional) @@ -220,6 +241,7 @@ widenconst(c::PartialTypeVar) = TypeVar widenconst(t::PartialStruct) = t.typ widenconst(t::Type) = t widenconst(t::TypeVar) = t +widenconst(t::LimitedAccuracy) = error("unhandled LimitedAccuracy") issubstate(a::VarState, b::VarState) = (a.typ ⊑ b.typ && a.undef <= b.undef) @@ -245,6 +267,10 @@ function widenconditional(typ::Conditional) return Bool end end +widenconditional(t::LimitedAccuracy) = error("unhandled LimitedAccuracy") + +ignorelimited(@nospecialize typ) = typ +ignorelimited(typ::LimitedAccuracy) = typ.typ function stupdate!(state::Nothing, changes::StateUpdate) newst = copy(changes.state) @@ -255,9 +281,13 @@ function stupdate!(state::Nothing, changes::StateUpdate) for i = 1:length(newst) newtype = newst[i] if isa(newtype, VarState) - newtypetyp = newtype.typ + newtypetyp = ignorelimited(newtype.typ) if isa(newtypetyp, Conditional) && slot_id(newtypetyp.var) == changeid - newst[i] = VarState(widenconditional(newtypetyp), newtype.undef) + newtypetyp = widenconditional(newtypetyp) + if newtype.typ isa LimitedAccuracy + newtypetyp = LimitedAccuracy(newtypetyp, newtype.typ.causes) + end + newst[i] = VarState(newtypetyp, newtype.undef) end end end @@ -280,9 +310,13 @@ function stupdate!(state::VarTable, changes::StateUpdate) oldtype = state[i] # remove any Conditional for this Slot from the vtable if isa(newtype, VarState) - newtypetyp = newtype.typ + newtypetyp = ignorelimited(newtype.typ) if isa(newtypetyp, Conditional) && slot_id(newtypetyp.var) == changeid - newtype = VarState(widenconditional(newtypetyp), newtype.undef) + newtypetyp = widenconditional(newtypetyp) + if newtype.typ isa LimitedAccuracy + newtypetyp = LimitedAccuracy(newtypetyp, newtype.typ.causes) + end + newtype = VarState(newtypetyp, newtype.undef) end end if schanged(newtype, oldtype) @@ -319,9 +353,13 @@ function stupdate1!(state::VarTable, change::StateUpdate) for i = 1:length(state) oldtype = state[i] if isa(oldtype, VarState) - oldtypetyp = oldtype.typ + oldtypetyp = ignorelimited(oldtype.typ) if isa(oldtypetyp, Conditional) && slot_id(oldtypetyp.var) == changeid - state[i] = VarState(widenconditional(oldtypetyp), oldtype.undef) + oldtypetyp = widenconditional(oldtypetyp) + if oldtype.typ isa LimitedAccuracy + oldtypetyp = LimitedAccuracy(oldtypetyp, oldtype.typ.causes) + end + state[i] = VarState(oldtypetyp, oldtype.undef) end end end diff --git a/base/compiler/typelimits.jl b/base/compiler/typelimits.jl index 22be265287fa5..c3bf35d35b1a6 100644 --- a/base/compiler/typelimits.jl +++ b/base/compiler/typelimits.jl @@ -278,7 +278,9 @@ union_count_abstract(x::Union) = union_count_abstract(x.a) + union_count_abstrac union_count_abstract(@nospecialize(x)) = !isdispatchelem(x) function issimpleenoughtype(@nospecialize t) - return unionlen(t)+union_count_abstract(t) <= MAX_TYPEUNION_LENGTH && unioncomplexity(t) <= MAX_TYPEUNION_COMPLEXITY + t = ignorelimited(t) + return unionlen(t) + union_count_abstract(t) <= MAX_TYPEUNION_LENGTH && + unioncomplexity(t) <= MAX_TYPEUNION_COMPLEXITY end # pick a wider type that contains both typea and typeb, @@ -294,6 +296,24 @@ function tmerge(@nospecialize(typea), @nospecialize(typeb)) suba && subb && return typea subb && issimpleenoughtype(typea) && return typea + # type-lattice for LimitedAccuracy wrapper + # the merge create a slightly narrower type than needed, but we can't + # represent the precise intersection of causes and don't attempt to + # enumerate some of these cases where we could + if isa(typea, LimitedAccuracy) && isa(typeb, LimitedAccuracy) + if typea.causes ⊆ typeb.causes + causes = typeb.causes + elseif typeb.causes ⊆ typea.causes + causes = typea.causes + else + causes = union!(copy(typea.causes), typeb.causes) + end + return LimitedAccuracy(tmerge(typea.typ, typeb.typ), causes) + elseif isa(typea, LimitedAccuracy) + return LimitedAccuracy(tmerge(typea.typ, typeb), typea.causes) + elseif isa(typeb, LimitedAccuracy) + return LimitedAccuracy(tmerge(typea, typeb.typ), typeb.causes) + end # type-lattice for MaybeUndef wrapper if isa(typea, MaybeUndef) || isa(typeb, MaybeUndef) return MaybeUndef(tmerge( @@ -521,3 +541,43 @@ function tuplemerge(a::DataType, b::DataType) end return Tuple{p...} end + +# compute typeintersect over the extended inference lattice +# where v is in the extended lattice, and t is a Type +function tmeet(@nospecialize(v), @nospecialize(t)) + if isa(v, Const) + if !has_free_typevars(t) && !isa(v.val, t) + return Bottom + end + return v + elseif isa(v, PartialStruct) + has_free_typevars(t) && return v + widev = widenconst(v) + if widev <: t + return v + end + ti = typeintersect(widev, t) + if ti === Bottom + return Bottom + end + @assert widev <: Tuple + new_fields = Vector{Any}(undef, length(v.fields)) + for i = 1:length(new_fields) + if isvarargtype(v.fields[i]) + new_fields[i] = v.fields[i] + else + new_fields[i] = tmeet(v.fields[i], widenconst(getfield_tfunc(t, Const(i)))) + if new_fields[i] === Bottom + return Bottom + end + end + end + return tuple_tfunc(new_fields) + elseif isa(v, Conditional) + if !(Bool <: t) + return Bottom + end + return v + end + return typeintersect(widenconst(v), t) +end diff --git a/base/compiler/types.jl b/base/compiler/types.jl index 3ca6cff20ccd6..1a1cbb0890e65 100644 --- a/base/compiler/types.jl +++ b/base/compiler/types.jl @@ -28,9 +28,10 @@ mutable struct InferenceResult overridden_by_const::BitVector result # ::Type, or InferenceState if WIP src #::Union{CodeInfo, OptimizationState, Nothing} # if inferred copy is available + valid_worlds::WorldRange # if inference and optimization is finished function InferenceResult(linfo::MethodInstance, given_argtypes = nothing) argtypes, overridden_by_const = matching_cache_argtypes(linfo, given_argtypes) - return new(linfo, argtypes, overridden_by_const, Any, nothing) + return new(linfo, argtypes, overridden_by_const, Any, nothing, WorldRange()) end end diff --git a/base/compiler/typeutils.jl b/base/compiler/typeutils.jl index 9ebe759fe87ee..954f14cfbfbbc 100644 --- a/base/compiler/typeutils.jl +++ b/base/compiler/typeutils.jl @@ -34,7 +34,9 @@ end function has_nontrivial_const_info(@nospecialize t) isa(t, PartialStruct) && return true - return isa(t, Const) && !isdefined(typeof(t.val), :instance) && !(isa(t.val, Type) && hasuniquerep(t.val)) + isa(t, Const) || return false + val = t.val + return !isdefined(typeof(val), :instance) && !(isa(val, Type) && hasuniquerep(val)) end # Subtyping currently intentionally answers certain queries incorrectly for kind types. For diff --git a/base/gcutils.jl b/base/gcutils.jl index 82bdf74c9a4d4..1280b4ab71afc 100644 --- a/base/gcutils.jl +++ b/base/gcutils.jl @@ -114,7 +114,20 @@ the current Task. Finalizers will only run when the counter is at zero. (Set `true` for enabling, `false` for disabling). They may still run concurrently on another Task or thread. """ -enable_finalizers(on::Bool) = ccall(:jl_gc_enable_finalizers, Cvoid, (Ptr{Cvoid}, Int32,), C_NULL, on) +enable_finalizers(on::Bool) = on ? enable_finalizers() : disable_finalizers() + +function enable_finalizers() + Base.@_inline_meta + ccall(:jl_gc_enable_finalizers_internal, Cvoid, ()) + if unsafe_load(cglobal(:jl_gc_have_pending_finalizers, Cint)) != 0 + ccall(:jl_gc_run_pending_finalizers, Cvoid, (Ptr{Cvoid},), C_NULL) + end +end + +function disable_finalizers() + Base.@_inline_meta + ccall(:jl_gc_disable_finalizers_internal, Cvoid, ()) +end """ GC.@preserve x1 x2 ... xn expr diff --git a/base/loading.jl b/base/loading.jl index cc0cd88a4b123..093e14e00e74e 100644 --- a/base/loading.jl +++ b/base/loading.jl @@ -1645,9 +1645,10 @@ function get_preferences(uuid::UUID) end function get_preferences_hash(uuid::Union{UUID, Nothing}, prefs_list::Vector{String}) - # Start from the "null" hash - h = UInt64(0x6e65726566657250) - uuid === nothing && return h + # Start from a predictable hash point to ensure that the same preferences always + # hash to the same value, modulo changes in how Dictionaries are hashed. + h = UInt(0) + uuid === nothing && return UInt64(h) # Load the preferences prefs = get_preferences(uuid) @@ -1659,7 +1660,8 @@ function get_preferences_hash(uuid::Union{UUID, Nothing}, prefs_list::Vector{Str h = hash(prefs_name, h) end end - return h + # We always return a `UInt64` so that our serialization format is stable + return UInt64(h) end get_preferences_hash(m::Module, prefs_list::Vector{String}) = get_preferences_hash(PkgId(m).uuid, prefs_list) diff --git a/base/lock.jl b/base/lock.jl index 7a8e0eaef878e..b013a593cde84 100644 --- a/base/lock.jl +++ b/base/lock.jl @@ -65,7 +65,7 @@ function trylock(rl::ReentrantLock) if rl.reentrancy_cnt == 0 rl.locked_by = t rl.reentrancy_cnt = 1 - GC.enable_finalizers(false) + GC.disable_finalizers() got = true else got = false @@ -93,7 +93,7 @@ function lock(rl::ReentrantLock) if rl.reentrancy_cnt == 0 rl.locked_by = t rl.reentrancy_cnt = 1 - GC.enable_finalizers(false) + GC.disable_finalizers() break end try @@ -135,7 +135,7 @@ function unlock(rl::ReentrantLock) rethrow() end end - GC.enable_finalizers(true) + GC.enable_finalizers() unlock(rl.cond_wait) end return @@ -157,7 +157,7 @@ function unlockall(rl::ReentrantLock) rethrow() end end - GC.enable_finalizers(true) + GC.enable_finalizers() unlock(rl.cond_wait) return n end diff --git a/base/locks-mt.jl b/base/locks-mt.jl index 6a3b68016cb81..41e1ef33c574c 100644 --- a/base/locks-mt.jl +++ b/base/locks-mt.jl @@ -61,12 +61,12 @@ Base.assert_havelock(l::SpinLock) = islocked(l) ? nothing : Base.concurrency_vio function lock(l::SpinLock) while true if _get(l) == 0 - GC.enable_finalizers(false) + GC.disable_finalizers() p = _xchg!(l, 1) if p == 0 return end - GC.enable_finalizers(true) + GC.enable_finalizers() end ccall(:jl_cpu_pause, Cvoid, ()) # Temporary solution before we have gc transition support in codegen. @@ -76,12 +76,12 @@ end function trylock(l::SpinLock) if _get(l) == 0 - GC.enable_finalizers(false) + GC.disable_finalizers() p = _xchg!(l, 1) if p == 0 return true end - GC.enable_finalizers(true) + GC.enable_finalizers() end return false end @@ -89,7 +89,7 @@ end function unlock(l::SpinLock) _get(l) == 0 && error("unlock count must match lock count") _set!(l, 0) - GC.enable_finalizers(true) + GC.enable_finalizers() ccall(:jl_cpu_wake, Cvoid, ()) return end diff --git a/base/methodshow.jl b/base/methodshow.jl index 2dfab099d9386..a1dc99ec47a08 100644 --- a/base/methodshow.jl +++ b/base/methodshow.jl @@ -51,7 +51,7 @@ function argtype_decl(env, n, @nospecialize(sig::DataType), i::Int, nargs, isva: end function method_argnames(m::Method) - argnames = ccall(:jl_uncompress_argnames, Vector{Any}, (Any,), m.slot_syms) + argnames = ccall(:jl_uncompress_argnames, Vector{Symbol}, (Any,), m.slot_syms) isempty(argnames) && return argnames return argnames[1:m.nargs] end diff --git a/base/multidimensional.jl b/base/multidimensional.jl index 0fcd70b2d2a9e..32d66c4c54cda 100644 --- a/base/multidimensional.jl +++ b/base/multidimensional.jl @@ -1698,9 +1698,9 @@ extrema(f, A::AbstractArray; dims=:) = _extrema_dims(f, A, dims) _extrema_dims(f, A::AbstractArray, ::Colon) = _extrema_itr(f, A) function _extrema_dims(f, A::AbstractArray, dims) - sz = [size(A)...] + sz = size(A) for d in dims - sz[d] = 1 + sz = setindex(sz, 1, d) end T = promote_op(f, eltype(A)) B = Array{Tuple{T,T}}(undef, sz...) diff --git a/base/operators.jl b/base/operators.jl index c2645910bf039..45690a25a2a04 100644 --- a/base/operators.jl +++ b/base/operators.jl @@ -520,17 +520,37 @@ xor(x::Integer) = x const ⊻ = xor -# foldl for argument lists. expand recursively up to a point, then -# switch to a loop. this allows small cases like `a+b+c+d` to be inlined +# foldl for argument lists. expand fully up to a point, then +# switch to a loop. this allows small cases like `a+b+c+d` to be managed # efficiently, without a major slowdown for `+(x...)` when `x` is big. -afoldl(op,a) = a -afoldl(op,a,b) = op(a,b) -afoldl(op,a,b,c...) = afoldl(op, op(a,b), c...) -function afoldl(op,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,qs...) - y = op(op(op(op(op(op(op(op(op(op(op(op(op(op(op(a,b),c),d),e),f),g),h),i),j),k),l),m),n),o),p) - for x in qs; y = op(y,x); end - y +# n.b.: keep this method count small, so it can be inferred without hitting the +# method count limit in inference +afoldl(op, a) = a +function afoldl(op, a, bs...) + l = length(bs) + i = 0; y = a; l == i && return y + #@nexprs 15 i -> (y = op(y, bs[i]); l == i && return y) + i = 1; y = op(y, bs[i]); l == i && return y + i = 2; y = op(y, bs[i]); l == i && return y + i = 3; y = op(y, bs[i]); l == i && return y + i = 4; y = op(y, bs[i]); l == i && return y + i = 5; y = op(y, bs[i]); l == i && return y + i = 6; y = op(y, bs[i]); l == i && return y + i = 7; y = op(y, bs[i]); l == i && return y + i = 8; y = op(y, bs[i]); l == i && return y + i = 9; y = op(y, bs[i]); l == i && return y + i = 10; y = op(y, bs[i]); l == i && return y + i = 11; y = op(y, bs[i]); l == i && return y + i = 12; y = op(y, bs[i]); l == i && return y + i = 13; y = op(y, bs[i]); l == i && return y + i = 14; y = op(y, bs[i]); l == i && return y + i = 15; y = op(y, bs[i]); l == i && return y + for i in (i + 1):l + y = op(y, bs[i]) + end + return y end +typeof(afoldl).name.mt.max_args = 18 for op in (:+, :*, :&, :|, :xor, :min, :max, :kron) @eval begin diff --git a/base/path.jl b/base/path.jl index d0239dbdd61df..1827346bb2edb 100644 --- a/base/path.jl +++ b/base/path.jl @@ -492,6 +492,9 @@ contractuser(path::AbstractString) Return a relative filepath to `path` either from the current directory or from an optional start directory. This is a path computation: the filesystem is not accessed to confirm the existence or nature of `path` or `startpath`. + +On Windows, case sensitivity is applied to every part of the path except drive letters. If +`path` and `startpath` refer to different drives, the absolute path of `path` is returned. """ function relpath(path::String, startpath::String = ".") isempty(path) && throw(ArgumentError("`path` must be specified")) @@ -499,8 +502,13 @@ function relpath(path::String, startpath::String = ".") curdir = "." pardir = ".." path == startpath && return curdir - path_arr = split(abspath(path), path_separator_re) - start_arr = split(abspath(startpath), path_separator_re) + path_drive, path_without_drive = splitdrive(path) + startpath_drive, startpath_without_drive = splitdrive(startpath) + path_arr = split(abspath(path_without_drive), path_separator_re) + start_arr = split(abspath(startpath_without_drive), path_separator_re) + if Sys.iswindows() + lowercase(path_drive) != lowercase(startpath_drive) && return abspath(path) + end i = 0 while i < min(length(path_arr), length(start_arr)) i += 1 diff --git a/base/reinterpretarray.jl b/base/reinterpretarray.jl index 34fc5d47e2bf5..decc745caf853 100644 --- a/base/reinterpretarray.jl +++ b/base/reinterpretarray.jl @@ -276,7 +276,8 @@ eachindex(style::IndexSCartesian2, A::AbstractArray) = eachindex(style, parent(A parent(a::ReinterpretArray) = a.parent dataids(a::ReinterpretArray) = dataids(a.parent) -unaliascopy(a::ReinterpretArray{T}) where {T} = reinterpret(T, unaliascopy(a.parent)) +unaliascopy(a::NonReshapedReinterpretArray{T}) where {T} = reinterpret(T, unaliascopy(a.parent)) +unaliascopy(a::ReshapedReinterpretArray{T}) where {T} = reinterpret(reshape, T, unaliascopy(a.parent)) function size(a::NonReshapedReinterpretArray{T,N,S} where {N}) where {T,S} psize = size(a.parent) diff --git a/base/show.jl b/base/show.jl index 814184c810af0..2fbc8f50ee737 100644 --- a/base/show.jl +++ b/base/show.jl @@ -532,8 +532,9 @@ function makeproper(io::IO, x::Type) push!(y, typ) end end - normal || (x = Union{y...}) - properx = rewrap_unionall(x, properx) + if !normal + properx = rewrap_unionall(Union{y...}, properx) + end end has_free_typevars(properx) && return Any return properx @@ -580,8 +581,8 @@ function make_typealias(@nospecialize(x::Type)) applied = rewrap_unionall(applied, p) end has_free_typevars(applied) && continue - applied == x || continue # it couldn't figure out the parameter matching - elseif alias <: x + applied === x || continue # it couldn't figure out the parameter matching + elseif alias === x env = Core.svec() else continue # not a complete match @@ -596,7 +597,7 @@ function make_typealias(@nospecialize(x::Type)) end end -function show_typealias(io::IO, name::GlobalRef, x::Type, env::SimpleVector) +function show_typealias(io::IO, name::GlobalRef, x::Type, env::SimpleVector, wheres::Vector) if !(get(io, :compact, false)::Bool) # Print module prefix unless alias is visible from module passed to # IOContext. If :module is not set, default to Main. nothing can be used @@ -612,34 +613,70 @@ function show_typealias(io::IO, name::GlobalRef, x::Type, env::SimpleVector) n == 0 && return print(io, "{") - let io = IOContext(io) - for i = n:-1:1 - p = env[i] - if p isa TypeVar - io = IOContext(io, :unionall_env => p) + param_io = IOContext(io) + for i = 1:length(wheres) + p = wheres[i]::TypeVar + param_io = IOContext(param_io, :unionall_env => p) + end + for i = 1:n + p = env[i] + show(param_io, p) + i < n && print(io, ", ") + end + print(io, "}") +end + +function make_wheres(io::IO, env::SimpleVector, @nospecialize(x::Type)) + seen = IdSet() + wheres = TypeVar[] + # record things printed by the context + if io isa IOContext + for (key, val) in io.dict + if key === :unionall_env && val isa TypeVar && has_typevar(x, val) + push!(seen, val) end end - for i = 1:n - p = env[i] - show(io, p) - i < n && print(io, ", ") + end + # record things in x to print outermost + while x isa UnionAll + if !(x.var in seen) + push!(seen, x.var) + push!(wheres, x.var) end + x = x.body end - print(io, "}") - for i = n:-1:1 + # record remaining things in env to print innermost + for i = length(env):-1:1 p = env[i] - if p isa TypeVar && !io_has_tvar_name(io, p.name, x) - print(io, " where ") - show(io, p) + if p isa TypeVar && !(p in seen) + push!(seen, p) + pushfirst!(wheres, p) end end + return wheres +end + +function show_wheres(io::IO, env::Vector) + isempty(env) && return + io = IOContext(io) + n = length(env) + for i = 1:n + p = env[i]::TypeVar + print(io, n == 1 ? " where " : i == 1 ? " where {" : ", ") + show(io, p) + io = IOContext(io, :unionall_env => p) + end + n > 1 && print(io, "}") + nothing end function show_typealias(io::IO, x::Type) properx = makeproper(io, x) alias = make_typealias(properx) alias === nothing && return false - show_typealias(io, alias[1], x, alias[2]) + wheres = make_wheres(io, alias[2], x) + show_typealias(io, alias[1], x, alias[2], wheres) + show_wheres(io, wheres) return true end @@ -735,13 +772,17 @@ function show_unionaliases(io::IO, x::Union) end if first && length(aliases) == 1 alias = aliases[1] - show_typealias(io, alias[1], x, alias[2]) + wheres = make_wheres(io, alias[2], x) + show_typealias(io, alias[1], x, alias[2], wheres) + show_wheres(io, wheres) else for alias in aliases print(io, first ? "Union{" : ", ") first = false env = alias[2] - show_typealias(io, alias[1], x, alias[2]) + wheres = make_wheres(io, alias[2], x) + show_typealias(io, alias[1], x, alias[2], wheres) + show_wheres(io, wheres) end print(io, "}") end @@ -751,7 +792,7 @@ function show(io::IO, ::MIME"text/plain", @nospecialize(x::Type)) show(io, x) if !print_without_params(x) && get(io, :compact, true) properx = makeproper(io, x) - if make_typealias(properx) !== nothing || x <: make_typealiases(properx)[2] + if make_typealias(properx) !== nothing || (unwrap_unionall(x) isa Union && x <: make_typealiases(properx)[2]) print(io, " (alias for ") show(IOContext(io, :compact => false), x) print(io, ")") @@ -786,22 +827,30 @@ function show(io::IO, @nospecialize(x::Type)) end x = x::UnionAll - if x.var.name === :_ || io_has_tvar_name(io, x.var.name, x) - counter = 1 - while true - newname = Symbol(x.var.name, counter) - if !io_has_tvar_name(io, newname, x) - newtv = TypeVar(newname, x.var.lb, x.var.ub) - x = UnionAll(newtv, x{newtv}) - break + wheres = TypeVar[] + let io = IOContext(io) + while x isa UnionAll + var = x.var + if var.name === :_ || io_has_tvar_name(io, var.name, x) + counter = 1 + while true + newname = Symbol(var.name, counter) + if !io_has_tvar_name(io, newname, x) + var = TypeVar(newname, var.lb, var.ub) + x = x{var} + break + end + counter += 1 + end + else + x = x.body end - counter += 1 + push!(wheres, var) + io = IOContext(io, :unionall_env => var) end + show(io, x) end - - show(IOContext(io, :unionall_env => x.var), x.body) - print(io, " where ") - show(io, x.var) + show_wheres(io, wheres) end # Check whether 'sym' (defined in module 'parent') is visible from module 'from' @@ -1434,12 +1483,12 @@ end # Print `sym` as it would appear as an identifier name in code # * Print valid identifiers & operators literally; also macros names if allow_macroname=true # * Escape invalid identifiers with var"" syntax -function show_sym(io::IO, sym; allow_macroname=false) +function show_sym(io::IO, sym::Symbol; allow_macroname=false) if is_valid_identifier(sym) print(io, sym) elseif allow_macroname && (sym_str = string(sym); startswith(sym_str, '@')) print(io, '@') - show_sym(io, sym_str[2:end]) + show_sym(io, Symbol(sym_str[2:end])) else print(io, "var", repr(string(sym))) end diff --git a/base/toml_parser.jl b/base/toml_parser.jl index 32e0593c1fdc9..c69096504df0b 100644 --- a/base/toml_parser.jl +++ b/base/toml_parser.jl @@ -657,10 +657,20 @@ end ######### function push!!(v::Vector, el) + # Since these types are typically non-inferrable, they are a big invalidation risk, + # and since it's used by the package-loading infrastructure the cost of invalidation + # is high. Therefore, this is written to reduce the "exposed surface area": e.g., rather + # than writing `T[el]` we write it as `push!(Vector{T}(undef, 1), el)` so that there + # is no ambiguity about what types of objects will be created. T = eltype(v) - if el isa T || typeof(el) === T + t = typeof(el) + if el isa T || t === T push!(v, el::T) return v + elseif T === Union{} + out = Vector{t}(undef, 1) + out[1] = el + return out else if typeof(T) === Union newT = Any diff --git a/cli/trampolines/trampolines_x86_64.S b/cli/trampolines/trampolines_x86_64.S index 904d90e0c2511..f80b4bb478c97 100644 --- a/cli/trampolines/trampolines_x86_64.S +++ b/cli/trampolines/trampolines_x86_64.S @@ -34,10 +34,10 @@ #define XX(name) \ DEBUGINFO(name); \ -.global name; \ +.global CNAME(name); \ .cfi_startproc; \ SEH_START1(name); \ -name##:; \ +CNAME(name)##:; \ SEH_START2(); \ CET_START(); \ mov CNAME(name##_addr)(%rip),%r11; \ diff --git a/contrib/generate_precompile.jl b/contrib/generate_precompile.jl index 1e5de2ca83c5a..41e7c16e49e89 100644 --- a/contrib/generate_precompile.jl +++ b/contrib/generate_precompile.jl @@ -1,6 +1,6 @@ # This file is a part of Julia. License is MIT: https://julialang.org/license -if isempty(ARGS) || ARGS[1] !== "0" +if isempty(Base.ARGS) || Base.ARGS[1] !== "0" Sys.__init_build() # Prevent this from being put into the Main namespace @eval Module() begin diff --git a/contrib/mac/app/Makefile b/contrib/mac/app/Makefile index a8c0c4d707c5c..edb6f868c9486 100644 --- a/contrib/mac/app/Makefile +++ b/contrib/mac/app/Makefile @@ -52,7 +52,7 @@ dmg/$(APP_NAME): startup.applescript julia.icns find $@/Contents/Resources/julia -type f -exec chmod -w {} \; if [ -n "$$MACOS_CODESIGN_IDENTITY" ]; then \ echo "Codesigning with identity $$MACOS_CODESIGN_IDENTITY"; \ - MACHO_FILES=$$(find "$@" -type f -perm -755 | cut -d: -f1); \ + MACHO_FILES=$$(find "$@" -type f -perm -0111 | cut -d: -f1); \ for f in $${MACHO_FILES}; do \ echo "Codesigning $${f}..."; \ codesign -s "$$MACOS_CODESIGN_IDENTITY" --option=runtime --entitlements Entitlements.plist -vvv --timestamp --deep --force "$${f}"; \ diff --git a/deps/Versions.make b/deps/Versions.make index b59bfd70a4f77..b0b2e72f63f2e 100644 --- a/deps/Versions.make +++ b/deps/Versions.make @@ -15,7 +15,7 @@ CSL_JLL_NAME := CompilerSupportLibraries # Clang (paired with LLVM, only here as a JLL download) CLANG_JLL_NAME := Clang -CLANG_JLL_VER := 11.0.0+5 +CLANG_JLL_VER := 11.0.1+0 # DSFMT DSFMT_VER := 2.2.4 @@ -33,7 +33,7 @@ CURL_JLL_NAME := LibCURL LAPACK_VER := 3.9.0 # LibGit2 -LIBGIT2_VER := 1.1.0 +LIBGIT2_JLL_VER := 1.2.2+0 LIBGIT2_JLL_NAME := LibGit2 # LibSSH2 @@ -45,17 +45,13 @@ LIBUV_VER := 2 LIBUV_JLL_NAME := LibUV # LLVM -LLVM_VER := 11.0.0 +LLVM_VER := 11.0.1 +LLVM_ASSERT_JLL_VER := 11.0.1+0 LLVM_JLL_NAME := libLLVM -# We provide a way to subversively swap out which LLVM JLL we pull artifacts from -ifeq ($(BINARYBUILDER_LLVM_ASSERTS), 1) -LLVM_JLL_VER := 11.0.0+4 -LLVM_JLL_DOWNLOAD_NAME := libLLVM_assert -endif # LLVM_tools (downloads LLVM_jll to get things like `lit` and `opt`) LLVM_TOOLS_JLL_NAME := LLVM -LLVM_TOOLS_JLL_VER := 11.0.0+6 +LLVM_TOOLS_JLL_VER := 11.0.1+0 # MbedTLS MBEDTLS_VER := 2.24.0 diff --git a/deps/checksums/Downloads-4e55241413c95551c54fc5c9bfdf5f48cb02fc4c.tar.gz/md5 b/deps/checksums/Downloads-4e55241413c95551c54fc5c9bfdf5f48cb02fc4c.tar.gz/md5 new file mode 100644 index 0000000000000..fe7ca5582969c --- /dev/null +++ b/deps/checksums/Downloads-4e55241413c95551c54fc5c9bfdf5f48cb02fc4c.tar.gz/md5 @@ -0,0 +1 @@ +7e7a92138a053f4f65265821714d0919 diff --git a/deps/checksums/Downloads-4e55241413c95551c54fc5c9bfdf5f48cb02fc4c.tar.gz/sha512 b/deps/checksums/Downloads-4e55241413c95551c54fc5c9bfdf5f48cb02fc4c.tar.gz/sha512 new file mode 100644 index 0000000000000..e16064534e7ef --- /dev/null +++ b/deps/checksums/Downloads-4e55241413c95551c54fc5c9bfdf5f48cb02fc4c.tar.gz/sha512 @@ -0,0 +1 @@ +31628f766030e5ab46de78d4da458944f37fbe460a60a9f8969a9eab6be105373f7a57230e70b22ac66a72a85a46b0f7e215d084f9e5141b215a5271b26c6162 diff --git a/deps/checksums/LibGit2.v1.2.1+0.x86_64-apple-darwin.tar.gz/md5 b/deps/checksums/LibGit2.v1.2.1+0.x86_64-apple-darwin.tar.gz/md5 new file mode 100644 index 0000000000000..3e66eb33f76f3 --- /dev/null +++ b/deps/checksums/LibGit2.v1.2.1+0.x86_64-apple-darwin.tar.gz/md5 @@ -0,0 +1 @@ +48b3eb5811566f1cc70a9581b8f702f4 diff --git a/deps/checksums/LibGit2.v1.2.1+0.x86_64-apple-darwin.tar.gz/sha512 b/deps/checksums/LibGit2.v1.2.1+0.x86_64-apple-darwin.tar.gz/sha512 new file mode 100644 index 0000000000000..d9a0fef30537c --- /dev/null +++ b/deps/checksums/LibGit2.v1.2.1+0.x86_64-apple-darwin.tar.gz/sha512 @@ -0,0 +1 @@ +46af2fbe9c96a18a97531aefc79e710abd8e12eca64ddcb2a0ddc8bc675dbaed0723ddbd4401d870eddcae04d99c4306cc6bdaa54b063de36d7fc0981ba86587 diff --git a/deps/checksums/LibGit2.v1.2.2+0.x86_64-apple-darwin.tar.gz/md5 b/deps/checksums/LibGit2.v1.2.2+0.x86_64-apple-darwin.tar.gz/md5 new file mode 100644 index 0000000000000..fc98d12c46b63 --- /dev/null +++ b/deps/checksums/LibGit2.v1.2.2+0.x86_64-apple-darwin.tar.gz/md5 @@ -0,0 +1 @@ +693080c66702c9ff106b0935f01d1f96 diff --git a/deps/checksums/LibGit2.v1.2.2+0.x86_64-apple-darwin.tar.gz/sha512 b/deps/checksums/LibGit2.v1.2.2+0.x86_64-apple-darwin.tar.gz/sha512 new file mode 100644 index 0000000000000..bf56d1c06d292 --- /dev/null +++ b/deps/checksums/LibGit2.v1.2.2+0.x86_64-apple-darwin.tar.gz/sha512 @@ -0,0 +1 @@ +f21d5846b443188a0c604255dce77603ea861db8d4c6fc55cebd5db6da07e94ae40f0a165221c95e13db9df8777fddb05f55c865f554f45e56cd442332a95336 diff --git a/deps/checksums/Pkg-9adb32bb8027815dadc266b94201d772ac4c48b1.tar.gz/md5 b/deps/checksums/Pkg-9adb32bb8027815dadc266b94201d772ac4c48b1.tar.gz/md5 new file mode 100644 index 0000000000000..773576eef8348 --- /dev/null +++ b/deps/checksums/Pkg-9adb32bb8027815dadc266b94201d772ac4c48b1.tar.gz/md5 @@ -0,0 +1 @@ +85308d0346e6e7c773b5618a088d93e4 diff --git a/deps/checksums/Pkg-9adb32bb8027815dadc266b94201d772ac4c48b1.tar.gz/sha512 b/deps/checksums/Pkg-9adb32bb8027815dadc266b94201d772ac4c48b1.tar.gz/sha512 new file mode 100644 index 0000000000000..d615e3301cd81 --- /dev/null +++ b/deps/checksums/Pkg-9adb32bb8027815dadc266b94201d772ac4c48b1.tar.gz/sha512 @@ -0,0 +1 @@ +16f366f671ad2b7431dcd0cd1ebd2fd87310c3f3048584d063e6c73006466ce0da0a8e72f48c238fbf614f33306e72d217c19160e5bd3892ff3a5263ff99f0bb diff --git a/deps/checksums/Pkg-df09a610dad721771243cabcb387324d883ca6c9.tar.gz/md5 b/deps/checksums/Pkg-df09a610dad721771243cabcb387324d883ca6c9.tar.gz/md5 deleted file mode 100644 index 0cb757a69c026..0000000000000 --- a/deps/checksums/Pkg-df09a610dad721771243cabcb387324d883ca6c9.tar.gz/md5 +++ /dev/null @@ -1 +0,0 @@ -6f5536ee7d7864ee8ab4aaf200b58204 diff --git a/deps/checksums/Pkg-df09a610dad721771243cabcb387324d883ca6c9.tar.gz/sha512 b/deps/checksums/Pkg-df09a610dad721771243cabcb387324d883ca6c9.tar.gz/sha512 deleted file mode 100644 index 69622ab08c9a0..0000000000000 --- a/deps/checksums/Pkg-df09a610dad721771243cabcb387324d883ca6c9.tar.gz/sha512 +++ /dev/null @@ -1 +0,0 @@ -57942eff7e565adb327e7917fa7386ac4df031592a0ff1ccc135e77027bee61842eb5cff699a18ce1cb2d6e1152726e66277e6878677049734d8caf28a14dc8b diff --git a/deps/checksums/clang b/deps/checksums/clang index 3418bdd2a037d..e8925bc759262 100644 --- a/deps/checksums/clang +++ b/deps/checksums/clang @@ -1,60 +1,58 @@ -Clang.v11.0.0+5.aarch64-apple-darwin.tar.gz/md5/ee869cb2099c8f601f6709a606c13675 -Clang.v11.0.0+5.aarch64-apple-darwin.tar.gz/sha512/0013160dff035ef95fb0ac7fc20698502e57d65cb3b6c1d6d7ff0b108027f848339ef6f5df69572bbdf9c71a838f0e36f91d60743fc5457e71a675846b8909c1 -Clang.v11.0.0+5.aarch64-linux-gnu-cxx03.tar.gz/md5/5119ff5fe445989a72d898960bf5f3b7 -Clang.v11.0.0+5.aarch64-linux-gnu-cxx03.tar.gz/sha512/705deae4e76acdf99ebd9d69a12234713e86c1f7f70813fbced373ea1861d55551673f96eb27fb66a24a3e73a015fda5822afa484246de630db4a514a13c744b -Clang.v11.0.0+5.aarch64-linux-gnu-cxx11.tar.gz/md5/50e69755bd6b32c1b412afcfb17de416 -Clang.v11.0.0+5.aarch64-linux-gnu-cxx11.tar.gz/sha512/a3b18fc3542f9a9cb84971c64276b62fb2ad3a9d4a591e567a408ec1f14d5084f9444d768981a0d0557fcadb70bfceef3d0b8309ef95e4a8d3eb4241daeed372 -Clang.v11.0.0+5.aarch64-linux-musl-cxx03.tar.gz/md5/f1b670ad6beedf8d219af395679c95ea -Clang.v11.0.0+5.aarch64-linux-musl-cxx03.tar.gz/sha512/e806c42a33b17570286725b5671100513d30caadcc2ee732a47f114e317627947b754cb0efedc88cb5fb2a24500df83316cc7a34121cf1dce98dcf8bcebe2bd0 -Clang.v11.0.0+5.aarch64-linux-musl-cxx11.tar.gz/md5/b436fb5b0f7a3598439ba0c4459ccc75 -Clang.v11.0.0+5.aarch64-linux-musl-cxx11.tar.gz/sha512/cd6642f5ebfe238bb60c555c36cae39229333be7c4c44b1d963f6a853568c7ed3f82e93bc53ad972bdda5992318a6b8d10daeac44e1a2fb40534cb60b6969162 -Clang.v11.0.0+5.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/7ec7a1f1f0914a2f41001009e64a2011 -Clang.v11.0.0+5.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/ab4dc2f726c39bdb8c0ca328e61412c1a6838a88d3bd6d8427a49e9b4b48bcc753b90804784d5bfd8f2e1dc475e1bb3f55b9fa414f4d9bcf85ff0e63877fdf45 -Clang.v11.0.0+5.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/82d5c0eaaf002914bc6da3303a648ee5 -Clang.v11.0.0+5.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/9ecd73513b7631d6633b9fb1892e9af761a408c5918c3c75e3a396f6a5ab8cf3086f7d31c8e2b642769a73c904f9298278967fe98bf4c176ea91a4067558ef10 -Clang.v11.0.0+5.armv6l-linux-musleabihf-cxx03.tar.gz/md5/cbc6c81dfb273214226bf2e9ccf70ca9 -Clang.v11.0.0+5.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/1b6cbff37a97312ffdc8481585bfcaeabb849af7a88cbe4a2f40e23ce4b9eeb92ade5d302f1bd3978f7101bb38109cf09982c47294d8cd71b2a2b828e6ffb20d -Clang.v11.0.0+5.armv6l-linux-musleabihf-cxx11.tar.gz/md5/d9db1b16ae1d2d2e31f3833c667f4281 -Clang.v11.0.0+5.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/a7c43d7cef60df18d9e4dbc6b8cd54002c14a5a06fc4e669bb83a90459c8e79913f7ec29f5f7c1dd70ca6a7633b72dc205174056b4ca513b6522442e2b613ef1 -Clang.v11.0.0+5.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/19269cc26a412d1925a37c8725f17779 -Clang.v11.0.0+5.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/a7d572766498c6cc052596c2e5d623d903c01b978773e778d36c19495bec458508b0e9150d85547ceebacbe55d66484042e22c33b2e66efad94b13229bb0d4e4 -Clang.v11.0.0+5.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/d2d87790c35a9c47fab7923e875e50a5 -Clang.v11.0.0+5.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/a7fb3a38545d4f2cdbd8aa18b8fba4bc25167d686ff3ff7f499881aab51fb9b82e637b8885c2f1c9b0371dc9d9a8ea52dec1aecc0d9bc463d08e72ba20bebff3 -Clang.v11.0.0+5.armv7l-linux-musleabihf-cxx03.tar.gz/md5/b9834356f1b5248e7baa9d47ba979573 -Clang.v11.0.0+5.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/e9ddfbde93b75875537c969de68c74a155c282c5de795adf5be39e79f8e9ee45d1e03a0eefe40f611da81794a611acf6139e6894f8dc8140b9e79d5863988ec2 -Clang.v11.0.0+5.armv7l-linux-musleabihf-cxx11.tar.gz/md5/5976a9955e67267810b78b319b31900a -Clang.v11.0.0+5.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/b4ff28cd505fe870b6450c4009881409ec76e8d8f75a1a57c1d7be4e435c78f1b5e0ff66defc2d9e089efaa23421aa8eed7f438e129fed3313569c667a9e41fa -Clang.v11.0.0+5.i686-linux-gnu-cxx03.tar.gz/md5/54e9d0f4ef0527f931464943e419c475 -Clang.v11.0.0+5.i686-linux-gnu-cxx03.tar.gz/sha512/9061e2ff3dbbe68c44c3ee3d2c455bf1ce216bae1aca4f4da56275ed84020b537eeaf510085b585bf27fded6bee2a05fad6bf457d4eb6a87d4ee74dd25788648 -Clang.v11.0.0+5.i686-linux-gnu-cxx11.tar.gz/md5/7bc64cc7b057ea02950a1f9e62658b42 -Clang.v11.0.0+5.i686-linux-gnu-cxx11.tar.gz/sha512/3a5cd8445ef37406d380d250d68727bc37029b679f0529c6efbe05dc3583cd5020a45c1619e7e1b758b966fa64973193e010f20ec80340f4d91e6b6e718c166d -Clang.v11.0.0+5.i686-linux-musl-cxx03.tar.gz/md5/af9793c0bdcecd654f055d127b988f29 -Clang.v11.0.0+5.i686-linux-musl-cxx03.tar.gz/sha512/ceb18e6c1182a79203a3cb292cc1655edd15c92cab394e29c3f7b0fcd07b7c4a9c545dde313fde4e2e00425759ecfaa2294028fe7535ce16dbd18e1495020189 -Clang.v11.0.0+5.i686-linux-musl-cxx11.tar.gz/md5/d557e35ca96715b5afc5d1e94723e858 -Clang.v11.0.0+5.i686-linux-musl-cxx11.tar.gz/sha512/77477ab77b91f2d14e950968b8001be89dc551e258dc1d30165d1f191aee6b58e67c72d8d2d19547b7bbe505eccade35243d6ad0a9126a131fbb73a88d66e6fa -Clang.v11.0.0+5.i686-w64-mingw32-cxx03.tar.gz/md5/2014ef645f4224afddee27dfd4d3debc -Clang.v11.0.0+5.i686-w64-mingw32-cxx03.tar.gz/sha512/e912596d75395b87799daad4e50d0aea1fb92ae4447c59751f3251ae43bd9c7f0d27448cd5b64a38762d95c515660a347f422d38fe5451313149d1e6e6dd7229 -Clang.v11.0.0+5.i686-w64-mingw32-cxx11.tar.gz/md5/5c50168c711e09cf3742263ad6f98f88 -Clang.v11.0.0+5.i686-w64-mingw32-cxx11.tar.gz/sha512/10210f051ed83fbd4e095deb31fcba24f69653a9d76d7074f256f524312a1af2529e94239127c8f6995b4cdb02f5063f7932616b01456c0297ed7d433eae85e2 -Clang.v11.0.0+5.powerpc64le-linux-gnu-cxx03.tar.gz/md5/dae1cfc253daf8225cba968144145985 -Clang.v11.0.0+5.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/d481561e0c28cbc98df2b37f29c05cb6dfe5473a766dbea6c889af0b5fa77081939d4b6c5d2ac7c80047ede33b370b94bfb74d464708999409e1451d0cebd0ea -Clang.v11.0.0+5.powerpc64le-linux-gnu-cxx11.tar.gz/md5/7646c87464295d598e745f3720c07c63 -Clang.v11.0.0+5.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/3d8e602acfacbf03903854cf7be0addd87541edfbc8b8ce54ee4b82634ec1d3f5bb89639fe7b81a58b2ab4d3f70b7837a953f5a564bf6ac6176659804716de69 -Clang.v11.0.0+5.x86_64-apple-darwin.tar.gz/md5/29bd442f1ab0dc93f8134d3206d417c2 -Clang.v11.0.0+5.x86_64-apple-darwin.tar.gz/sha512/814aa5eb0d1363a7e766c2abde8738dfc0c985b900375fafd327bee74827832a2007405d1489675295cf7a99339757d30c9fa879668f53cbf6cc5d222b888f3f -Clang.v11.0.0+5.x86_64-linux-gnu-cxx03.tar.gz/md5/6d895ddeb6d12aa0f9a31d8a5107740e -Clang.v11.0.0+5.x86_64-linux-gnu-cxx03.tar.gz/sha512/32aedd555fdb16b786b4b4236ebc6af2ec2a650ecb075ea69399f7ef0bf231a7a7d5ffe96cb902ade8893eeef70a87ff9e7270eddb86496095df8dfe2cf76781 -Clang.v11.0.0+5.x86_64-linux-gnu-cxx11.tar.gz/md5/a867af44afd3a8db704f16c880ad6fe7 -Clang.v11.0.0+5.x86_64-linux-gnu-cxx11.tar.gz/sha512/5800fdadb932c2919bfb93effd095a9de1a1fad3be22e2ecb40720889aa362688628ac6259a14076b05bf0a5d2b4a71ca23e9e1869fa17a863dd3b48e6abba5a -Clang.v11.0.0+5.x86_64-linux-musl-cxx03.tar.gz/md5/db111e1ccc6ff0f980351718de56df41 -Clang.v11.0.0+5.x86_64-linux-musl-cxx03.tar.gz/sha512/79b0e005eae0fb8bc842f7999fbab95a039fd50cd6a2dc09be61bfbca1ac2756b41ada2a9fffb19389a230de577b8bcfdaf396e785622e1cda7a53eeb1633656 -Clang.v11.0.0+5.x86_64-linux-musl-cxx11.tar.gz/md5/f7722956e75183cfb4660a77fe151204 -Clang.v11.0.0+5.x86_64-linux-musl-cxx11.tar.gz/sha512/e81ac1e6b5ae4aa2ed298ad27a31d3661d29dd1e25fd42618feb843eaf80199782e4fe93737d063f97461c6b0dcdf1fa7a6cf91a2c04278a3b2a9f8ffc70ba6d -Clang.v11.0.0+5.x86_64-unknown-freebsd.tar.gz/md5/36e9bb2651d4e6bd9057eb9f6b460b8d -Clang.v11.0.0+5.x86_64-unknown-freebsd.tar.gz/sha512/eec634359e79a977101a1981576dff86782b4b9cd36d21dfbf0c1900d83f5809fb53170befc80efe7979d5cd3a986f4ba5b517a9c547401ec1824513d01dff70 -Clang.v11.0.0+5.x86_64-w64-mingw32-cxx03.tar.gz/md5/5e09b6fdc8dc8eee91d9e4069d0aa1ce -Clang.v11.0.0+5.x86_64-w64-mingw32-cxx03.tar.gz/sha512/83b5ab18479c9755686771465976fb22e779a280498d95b371c9bf6d4d956f689f15bea1a85eb117fa03ea683edee9b8bcf3b9f1fb49c0ac659326d8d1a84271 -Clang.v11.0.0+5.x86_64-w64-mingw32-cxx11.tar.gz/md5/c77285af89c91830f1a95a6a9377256b -Clang.v11.0.0+5.x86_64-w64-mingw32-cxx11.tar.gz/sha512/20ff223db7309589c612f49c62d75b4c38b4149d8f2db67c0f5b00f8ba83f60b639502c91df99e1c1b3f4a04be491397a6330cb606f469e059dbee978db31f55 -clang-11.0.0.src.tar.xz/md5/d8fbc5b1d27f44922cfbbf199d0bab78 -clang-11.0.0.src.tar.xz/sha512/5874d99d05aa6ac0a7f5131a8522440ca1fc332a63cbfbf92f844ecb03e7f698a1839106fe6d1c8efaa839d03a4547cda5ab40f445d9923b99907d8cf1988276 +Clang.v11.0.1+0.aarch64-apple-darwin.tar.gz/md5/f01b3fb362068c230bfe65b07a55bd3f +Clang.v11.0.1+0.aarch64-apple-darwin.tar.gz/sha512/5cccc6e042f5c435bd7e25535651c6803b078dc1ebb49a2f653a928870bf686ff2b8963f80d6b2f553da6d23d3e168c24273bee9b6aa4391bbce7a681065a1aa +Clang.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/md5/4e67174cebead479bd89b3390debaf5e +Clang.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/sha512/1449fc2ee161d5d81ec125b9e93089fe0c9cb519fc44738a7867b717ab26d53dcf4dc2ae93cf08df3470f7c3c1209671a4f9540a32ac7525427c12b724898aed +Clang.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/md5/9c8ad928aa8fbb9c27da41dfc9f6355c +Clang.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/sha512/9f32c67064e8a4bccbfce02a9214fafaba9ad7043bfac59edb2ece5ef08864cea4e516179bcb1331178a6aa7449b6d22b556b3a3bc295d819e10a0885102ef72 +Clang.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/md5/585a30e5a5a68f92f154574e5f2086e3 +Clang.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/sha512/fd8c7131c4e288f092840feda0e7b20feabdbece45abca0fa7ce3161ce6579dbc839097a635686012f26aff0a860bfaa593c296066d062f0bec4ec3872b2126f +Clang.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/md5/f1cdb2be71d8c16ab8f7850261890070 +Clang.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/sha512/4f44dacc01a3a39cf7c0efcdfa6704bec75ca38b93971d336bcdabfddb7fd39a1d7dd6c4b8574b8190ef03507cd8990352bfb524d6df9af82c5a6083b38321c0 +Clang.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/7f58048db2e5095a5fb797f58f804430 +Clang.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/2712637e3cb38bf74d1695ec84478e6c76aaa8d52bd000f81a4e4e73771d6c2b008ed17e94154588310cd51378d43a6f158b51645cfc75e665bbe84c488adc3f +Clang.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/1299a67b65ec7a1adc2b327c6e5a4195 +Clang.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/5d9fe1fa151fc065c38525a880ee1993c53f049717475cf473b67c6a8c44021f1bc6add29fe6c1ab196a66b524647c5dabb1bd336651bea2a2a7910a668fb096 +Clang.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/md5/a51f767667e7be8d0ead7c5b4f58656e +Clang.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/2ea5218cbec3e4d1aa61c182451e8717f0295b9be221462fe24bb24dbd503c82051156420d090003b49b2454baf2f171e5e8d5011b3643c4153025474738f043 +Clang.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/md5/6ce5593f191da26b58a84844d6834af6 +Clang.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/b07d9546db5105eb60010fcd21476be625e4bf5d5804dddc53a242363ddb93f0dbc1e2de67fb91c545000c38c197eabb0db219acc293e2e175eb95866527b4f8 +Clang.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/5beac00e4c5755c14f66656470a2d91a +Clang.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/d98d516724d4d6ecf5c7c6f6e4e64ba333af91949a14661a60318ab1f48a50f54923f9e9071578e447a0744b8ffba2e468591f92373c0d5cfc202ada4283e2e1 +Clang.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/1bf95e16121bf4ef7ab7534ec2906e8d +Clang.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/922b45b33f316d41ba6b089c30ba0606a26a58cac341e32db37c3565b711d74d43b9b6e6e2db64b307300f6f9b1613bdc69e8b85a47605474b34b2eb5132db65 +Clang.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/md5/3905ff26b1ba349bfed10036cfadc8b2 +Clang.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/209b8087ba26cdaffe6d5f379f7dda00d32fabaf914139067728fabef7788ecd54b39a298ce9191ec45ff708a109e99add41d7953a1e9c4c0ddadff204df4a80 +Clang.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/md5/13c587485207dce3537b3349d4bfa33d +Clang.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/d0bd627a6f6b23833c728ba50dc38f9a8b172202d3a581cb72da3ef8add6ce2a4d3dfdae10f8c4a694f4881c5c08d48e61ab6d426002651f5e9ebaf2c8167c76 +Clang.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/md5/27d72e0c76e2269daa5db96d66640b10 +Clang.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/sha512/ab0ba11b03fc97c9b2817bfe43d6871e2eb201b14849ffac284eb49be02c9c5893d50bc89b48411de9d87b7267c1527f60b5995d81b1495afa3af473224cf216 +Clang.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/md5/200d9bb6dac86649fc671467d2343585 +Clang.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/sha512/7808084dfe733577932f434cc5107a6f77cdc6f25e830928045f3ab8d9b8a75349aad0bbc337075d06b1492c84e3704dc922cd5006abafe3d10a197420952197 +Clang.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/md5/41c1508f51f157d0df10a7f4ac901a17 +Clang.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/sha512/370202acb230a82a2b9613a984d22d0208aa7458d032b31d90a5cc04ed7afcaef3f704ae37910815ed090c4fec093dec0b90a10a0bbd2539c1dc0c5e564aa85c +Clang.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/md5/d2a5fd3dc0feb4964383f425d6e00477 +Clang.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/sha512/0b7a442b2b87883e3b50996af7e114dee77d46ae898fcaa4e934da0ecfe3efd9603c5af433d61997c2722917937fb04c5c29cdb2ddd0f718375b8915636000e9 +Clang.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/md5/a9af99fa1c6e7ab67dbb9f317ebe7431 +Clang.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/sha512/1fc204a2c1a6b5668d3e80b4226226f0cc301c70dc794030d32dbb9280b2010fddf3298158750a32c0ce1e40191e8fa2c036c1f4d3532888bcefffd8194bf64e +Clang.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/md5/7ea67c2feed4e7227cd9079abb4b39d5 +Clang.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/sha512/f3926a8f9a6fce8198a31a5a221954c60cf3df28ded5b3683344b223ba8de769cb543de81f807bf09c3007b421e7c5c06a1aa6c36c4f3dcff5704caffc3c23bf +Clang.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/md5/e33c9f7503b25350ea757871b8b6dc92 +Clang.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/6eb506361cd427ab9b7cb60458d26dba453bd2c152246391482028fb94643b4868a77fa34f8c59ef14150f17c32c29ec8ac50fcccb83511e5fe6154f4e172b6e +Clang.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/md5/1cce0a376b3b3ae764e153c70d0480b5 +Clang.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/d6685af43b0bffbd141e03ab7613b3a6431496b9734cba92025863cf0cad2d25d2baf4d6eb6aeaf342d0670389d45ccda5bfff6d3e859e65a0dffac17c11240c +Clang.v11.0.1+0.x86_64-apple-darwin.tar.gz/md5/4af3cbcfb1c0d352bc1e8f61ed108017 +Clang.v11.0.1+0.x86_64-apple-darwin.tar.gz/sha512/9d20901febabcb06d87b706aabbc0aa7a0ebb173c4999b8708b590fa5113577bc93a4bce59f9cc0aa9078d3e35f4242424a6d949c21118a146484901297661e3 +Clang.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/md5/e8c701382bf8e2d01ff79e5415a51875 +Clang.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/sha512/72187909227c7bcdb30c60655a53178af9b518c02a5ac5784bcf522ed536365da12054c3d16b7aa7e2a2d21f88b6b4fa1c54a66437ca221122859079409426ed +Clang.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/md5/5d92dda365296697e88abd5996495b38 +Clang.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/sha512/6d2acf3bf2d2ba6e9d9c6351aa1e43d59528e89c5218bdf732ad4e475f4b4787d578055b863401a4573b7c88b76cf6787f76bc06d0a100ddd5908f31538752c6 +Clang.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/md5/7b51ff2a6eb55c45bad712318a6aff5f +Clang.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/sha512/3d607531beeea0e46b0d2b5f0d6589a11f933fff1ed53b59758375efcce9a3dfe5513f57f242b85983a2b11205a797f9ee1e2033a17efe0ffa77e3286820efba +Clang.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/md5/119345ed95b24b84cdbd272e575e3143 +Clang.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/sha512/8ea6a61d6275c15d47528a465fac3707159b37dd994c80da70712bc869b860417e26d71a99a8c09f91e7d274ddce4fcb27003c10058319efe75a592de40bad0b +Clang.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/md5/9c1c8559ed4d0bb16194cc09cc2186ba +Clang.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/sha512/91522014a111180f86b7e0e026cce31836481f12136b9e3cfb196c1b769b389571f586d9528fc8834a6282f7eee72513f9f144aa519c5bdb37b4c0ae50627f77 +Clang.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/md5/c68ddbca935a7edcb698a4a8582fcfd3 +Clang.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/sha512/892d9f55a4647d5f3b3a458647c2aa642ef931e10af253972ac344acd264c3be9cb0d7fab4e8b0249b606a98f43f9f95601fbf8dbcb7572a01422982d0e66d95 +Clang.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/md5/16dae3d351001a49378c200f9990d7cb +Clang.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/sha512/8e29ae0d0d1747ca566f1c79736d2d53dd6b883ecada2561a613378d84d3e733d2946783f48a6ddb462cfe5676f1ee62369ae5e5cd68ba411f9fa43e5b541cc1 diff --git a/deps/checksums/clang-11.0.1.src.tar.xz/md5 b/deps/checksums/clang-11.0.1.src.tar.xz/md5 new file mode 100644 index 0000000000000..4c4b87aa1e2c7 --- /dev/null +++ b/deps/checksums/clang-11.0.1.src.tar.xz/md5 @@ -0,0 +1 @@ +b4cb0b74b1f3292a89c9720f3e1e2934 diff --git a/deps/checksums/clang-11.0.1.src.tar.xz/sha512 b/deps/checksums/clang-11.0.1.src.tar.xz/sha512 new file mode 100644 index 0000000000000..14b91b3162906 --- /dev/null +++ b/deps/checksums/clang-11.0.1.src.tar.xz/sha512 @@ -0,0 +1 @@ +bb98ffb0a992c9907795f7bb7492196f7195fdb5e292e8a764a7a1a8cc078dcf60bebf26ed3db116f78b7022a600c996fd2645e5f6e5d24e4ed99392e1f08df3 diff --git a/deps/checksums/compiler-rt-11.0.0.src.tar.xz/md5 b/deps/checksums/compiler-rt-11.0.0.src.tar.xz/md5 deleted file mode 100644 index a155272bad5a1..0000000000000 --- a/deps/checksums/compiler-rt-11.0.0.src.tar.xz/md5 +++ /dev/null @@ -1 +0,0 @@ -182511f9ba2c83b9d3c934501d48bee9 diff --git a/deps/checksums/compiler-rt-11.0.0.src.tar.xz/sha512 b/deps/checksums/compiler-rt-11.0.0.src.tar.xz/sha512 deleted file mode 100644 index 19cdcef20fcb2..0000000000000 --- a/deps/checksums/compiler-rt-11.0.0.src.tar.xz/sha512 +++ /dev/null @@ -1 +0,0 @@ -e2085753528670d300d49c4b2dd2991f78c36f356c40ba9da8918f141e6dd5dca8d91686466252829af936206e8c1219a69da2448691922a9e6624f6523ab0c7 diff --git a/deps/checksums/compiler-rt-11.0.1.src.tar.xz/md5 b/deps/checksums/compiler-rt-11.0.1.src.tar.xz/md5 new file mode 100644 index 0000000000000..0ad8aad90f820 --- /dev/null +++ b/deps/checksums/compiler-rt-11.0.1.src.tar.xz/md5 @@ -0,0 +1 @@ +29d6186e048936008512b8bbdb3a1b71 diff --git a/deps/checksums/compiler-rt-11.0.1.src.tar.xz/sha512 b/deps/checksums/compiler-rt-11.0.1.src.tar.xz/sha512 new file mode 100644 index 0000000000000..59f76a7d34acd --- /dev/null +++ b/deps/checksums/compiler-rt-11.0.1.src.tar.xz/sha512 @@ -0,0 +1 @@ +869208f0d2c5f0828a317a6006d4ce47a946b03db2692c8557485caddc56fbeb0335a87b4c9663aa0d1397de94337e56ae10f802c4aca443072962f728e2bdf4 diff --git a/deps/checksums/libcxx-11.0.1.src.tar.xz/md5 b/deps/checksums/libcxx-11.0.1.src.tar.xz/md5 new file mode 100644 index 0000000000000..5b905de3304cc --- /dev/null +++ b/deps/checksums/libcxx-11.0.1.src.tar.xz/md5 @@ -0,0 +1 @@ +4b2467eb023c9b4c84335808f811d5fa diff --git a/deps/checksums/libcxx-11.0.1.src.tar.xz/sha512 b/deps/checksums/libcxx-11.0.1.src.tar.xz/sha512 new file mode 100644 index 0000000000000..251c002b1e83d --- /dev/null +++ b/deps/checksums/libcxx-11.0.1.src.tar.xz/sha512 @@ -0,0 +1 @@ +adda227d412bc28a47612cc6580bf85353838792b4816633d8401efb92cd65f6801278941f779d301bd6162b75ef8d54825f9cdfb0f61c6f5f621eca7fb7c004 diff --git a/deps/checksums/lldb-11.0.0.src.tar.xz/md5 b/deps/checksums/lldb-11.0.0.src.tar.xz/md5 deleted file mode 100644 index 6b1dcc9ca61d6..0000000000000 --- a/deps/checksums/lldb-11.0.0.src.tar.xz/md5 +++ /dev/null @@ -1 +0,0 @@ -f36e38d039721555cd41e8687d577094 diff --git a/deps/checksums/lldb-11.0.0.src.tar.xz/sha512 b/deps/checksums/lldb-11.0.0.src.tar.xz/sha512 deleted file mode 100644 index 1c5d8b6b4021d..0000000000000 --- a/deps/checksums/lldb-11.0.0.src.tar.xz/sha512 +++ /dev/null @@ -1 +0,0 @@ -e781d70de2b59142779503df6078ff118e49a0f8053e9296c34251a4c3ddb9676b375a7a6f94de61e472209bba72d719744b143990d4fdaea722fd0997e99920 diff --git a/deps/checksums/lldb-11.0.1.src.tar.xz/md5 b/deps/checksums/lldb-11.0.1.src.tar.xz/md5 new file mode 100644 index 0000000000000..901bdea38188d --- /dev/null +++ b/deps/checksums/lldb-11.0.1.src.tar.xz/md5 @@ -0,0 +1 @@ +e49cde09adb5ed43a651e6d5bcb2aded diff --git a/deps/checksums/lldb-11.0.1.src.tar.xz/sha512 b/deps/checksums/lldb-11.0.1.src.tar.xz/sha512 new file mode 100644 index 0000000000000..16f939fb1007e --- /dev/null +++ b/deps/checksums/lldb-11.0.1.src.tar.xz/sha512 @@ -0,0 +1 @@ +05de84a0606becdabacb46fbc5cd67607ca47c22469da13470b76a96b96e6f34b3045fd1f5bed9c82228c2ce529562ee71667788a5048f079fef450d63a1557c diff --git a/deps/checksums/llvm b/deps/checksums/llvm index 510b707335865..43d18317aad5a 100644 --- a/deps/checksums/llvm +++ b/deps/checksums/llvm @@ -1,176 +1,178 @@ -LLVM.v11.0.0+6.aarch64-apple-darwin.tar.gz/md5/3e0ff34539a29b704e2b003cdd2a7108 -LLVM.v11.0.0+6.aarch64-apple-darwin.tar.gz/sha512/06a901dd77c61eba56c36479d0ce4bd8b5482e2d3c23802438bc34e3c5520821ada03bb466ac9e99f0bf101981c4c5b1201b9fe644c996dea90eed9f828f609b -LLVM.v11.0.0+6.aarch64-linux-gnu-cxx03.tar.gz/md5/549f263a2ac5faaac2fc72628c3c5b15 -LLVM.v11.0.0+6.aarch64-linux-gnu-cxx03.tar.gz/sha512/75b37cc23b467347f03fd9914ea8b40d13ba90bf0011a071f2d61acad9d33f761270b7cc416938f774efc7403835c85a56a6b302b0ff9a71abd76e78d0e6cba6 -LLVM.v11.0.0+6.aarch64-linux-gnu-cxx11.tar.gz/md5/cb60a5ecb9482a8a88c1cc7f5c5e3344 -LLVM.v11.0.0+6.aarch64-linux-gnu-cxx11.tar.gz/sha512/1b11cf9da5caa257732d9b5a08317cf0468bddfb0a99497c75b3882d1fc8ef76ea49ebecc81d62101ffadad6067fd3b1b79ea4d097b3180e0112813bc3a0c875 -LLVM.v11.0.0+6.aarch64-linux-musl-cxx03.tar.gz/md5/691251e5c3d844f979eb8b9bc39c3f9e -LLVM.v11.0.0+6.aarch64-linux-musl-cxx03.tar.gz/sha512/e6d935bc7143c7633ffc522f0746724f337c02bf2203f2724a0d01611b74d3249a11738e034b224af72dc8cbd0cb997c6455906d70bb41165723de50b567bfc5 -LLVM.v11.0.0+6.aarch64-linux-musl-cxx11.tar.gz/md5/67038d047362f3540e9d066dd16bf849 -LLVM.v11.0.0+6.aarch64-linux-musl-cxx11.tar.gz/sha512/a3b65fe6946425a705827cc7e9317bca32f00509d29410dcd0ff3a5975403f39d8ffb629bf65d0458d94fab7b8ef0466ed7cf895833894ebebc38d03c163901b -LLVM.v11.0.0+6.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/787eead1b671978bf0e8c4530be3bc71 -LLVM.v11.0.0+6.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/34019249d77aed4a36ce2f04cda2af74778c41c48bb13913ba49d30c28f2a24d8c7c6ed3063465462daeaa644ad99134cfa1c62858b547787cd08a0521a2b3b0 -LLVM.v11.0.0+6.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/c5c0d2d7d7b8823d822a1d49fd5ba172 -LLVM.v11.0.0+6.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/040047a781e708a1d6849d1293767e06fb917f7cbf1bc4454f4c20bcfc406120a80082e6f03eed8c2fd80f783d375052d6f73a6112988aee0f181698f79568bd -LLVM.v11.0.0+6.armv6l-linux-musleabihf-cxx03.tar.gz/md5/7597a3aeb80562e1a59d06bfc5ad6841 -LLVM.v11.0.0+6.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/88cd3be30f1f75c8be680290a73fef0f49936ec5f6dba80942c302c21ca97d5ad4b9a597806ca8e3b8524b1d4d692ce36da91f42f1d79ec3dea7ddd0714bba47 -LLVM.v11.0.0+6.armv6l-linux-musleabihf-cxx11.tar.gz/md5/b969a695379510a1822b37cff723c21c -LLVM.v11.0.0+6.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/ef485d65da6e402d61820a6dc9fdb3dc6c7008309fc0403f5142a0ba4ebcee03517f134585b2ae287db212c5113db59170c20bd073caf71467b8de4894503ff5 -LLVM.v11.0.0+6.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/d1e5ca62e51421c2f86db4e9fa50cc96 -LLVM.v11.0.0+6.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/30c258f1cf6e5b0d92e909ea506990ed567ddb82f562e62f49afa4f5fcc54009f30d878b24d61e32c8414ebb7ec4ad1ea2f5e7e3e4460176104a4cac4444d00b -LLVM.v11.0.0+6.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/b899546dab2f8d8a3a4ac321a7603a27 -LLVM.v11.0.0+6.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/524331371c6c3e963029453066597ef650f327341161e35b667eedf79b8b4d8e20bc4c5f1240e3eb16724751390b32c236e15fba6a0aefa69e09d751ec278212 -LLVM.v11.0.0+6.armv7l-linux-musleabihf-cxx03.tar.gz/md5/0f4b4d02fd8027244e0873427214fec1 -LLVM.v11.0.0+6.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/5f8d1f18b9d0132b4cb5287ed106ebec869ce62c15e3878f7c05cbd44f11515357205522774d56de27d86d086fa995c8390755167e8f4b16a9f9814ab8267b40 -LLVM.v11.0.0+6.armv7l-linux-musleabihf-cxx11.tar.gz/md5/f387b55a71c8d318ca04aeb42091ce7e -LLVM.v11.0.0+6.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/06ec735719f0055e84ba2af4ba187570944cb40805e69f6fa22edcbe72c9e36298fc064ce745106d0a8b72fbe8b710fc5b0619755a0014a3a52fc4073126006e -LLVM.v11.0.0+6.i686-linux-gnu-cxx03.tar.gz/md5/afe179dea20b7105fa2b5ab3cfa961d8 -LLVM.v11.0.0+6.i686-linux-gnu-cxx03.tar.gz/sha512/496e0853060d51fd3a987712fc0019fb85c91dbd380363dda694555467fa12eae2da2155a208b5cbc7d830ae2e395327d898d278d26fe619e9f6f555487aa1b5 -LLVM.v11.0.0+6.i686-linux-gnu-cxx11.tar.gz/md5/232c1e2787c6bbf1876a9c7411bc6a10 -LLVM.v11.0.0+6.i686-linux-gnu-cxx11.tar.gz/sha512/195adac959928eeea08106fa98f6549f15210ff4f0f46cde7584f29be89461419c9a89f5536851f1d9859eb92e3cf2aa13455445b5480ebc317d3d6dc0b42cbb -LLVM.v11.0.0+6.i686-linux-musl-cxx03.tar.gz/md5/7322d77b517871a9571fc21fca2bd065 -LLVM.v11.0.0+6.i686-linux-musl-cxx03.tar.gz/sha512/319ed21dd088335e04811dd504ed1e365c51ad5addc8ff95b80dca75712c011bafa6181ff1bb72e8fb76a026617f871fbfaba39bf7a4311a0e6b8db57dbad7f3 -LLVM.v11.0.0+6.i686-linux-musl-cxx11.tar.gz/md5/a806d0c580246edd8a80eea8abd6b678 -LLVM.v11.0.0+6.i686-linux-musl-cxx11.tar.gz/sha512/11dbec48a79a3e7a70adc77d19f2113a43d43443384b57a5b3be6404249d649a4aeebe340d310b1a450967a3c75ae4167861d9730371a364819275c2c26d4863 -LLVM.v11.0.0+6.i686-w64-mingw32-cxx03.tar.gz/md5/ed5a05c610bd4772f21225a20a9b8586 -LLVM.v11.0.0+6.i686-w64-mingw32-cxx03.tar.gz/sha512/c6bf82cbf1976a7c3794ed0387682bd960e41417a7ee99238583a2f0220995b53a1c02aebbcb3653520bb2d5526aa982db0dd7bb52d4bac91cf00b7d1c97cfc7 -LLVM.v11.0.0+6.i686-w64-mingw32-cxx11.tar.gz/md5/713c04d75a5f5cc2c12b28ed547d8a3c -LLVM.v11.0.0+6.i686-w64-mingw32-cxx11.tar.gz/sha512/5046809e71da67e8081c780b59604b7f13068b8d02437131d7e888a4f66f7fc61566a0e196900610ab72352157742356ae45a4bd681a170282489a61f38385b7 -LLVM.v11.0.0+6.powerpc64le-linux-gnu-cxx03.tar.gz/md5/3134eead7a2107fae23b9daf32770943 -LLVM.v11.0.0+6.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/5de28a4d0750312917cf2449926330ed0c582ba3d969854d7d00cbced3b9e37a27990b0ac0852c73519a53b57b2047beb90f2da9c1397d5c5e5480fcd89e507b -LLVM.v11.0.0+6.powerpc64le-linux-gnu-cxx11.tar.gz/md5/2c5f4d09f5eb67178781442b4ce41aa2 -LLVM.v11.0.0+6.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/c1288af0da46066e39aa5f524d068c8fc27477c5dcdf480b7b0d434b45f4559a68952862e0348861d9022664613874e4ceb0f249cc83871f174c985dcf23695d -LLVM.v11.0.0+6.x86_64-apple-darwin.tar.gz/md5/228475fbd2c4804fddedec0da65adb21 -LLVM.v11.0.0+6.x86_64-apple-darwin.tar.gz/sha512/5ec770de6c44d0a04f36678f39a0f608a62dcea4d1cfd6ffe80afa1d583a238aaa70252aa71c2ce31f4567ebeb989f7757aea72007337676a13a33697fe31ba7 -LLVM.v11.0.0+6.x86_64-linux-gnu-cxx03.tar.gz/md5/fde67e1f15124e0912fef35d99be99e2 -LLVM.v11.0.0+6.x86_64-linux-gnu-cxx03.tar.gz/sha512/78c8f8791b026e5c6b7e5b7c77a4bdc370147c61c243d68f3ad7e1d8f144abc5e9978fc5dc6b7cd96351e9f88ee00670658270841fa115811b3eeccafe22fa91 -LLVM.v11.0.0+6.x86_64-linux-gnu-cxx11.tar.gz/md5/8e848e4624dd4760b75b932c0802f999 -LLVM.v11.0.0+6.x86_64-linux-gnu-cxx11.tar.gz/sha512/922e914ec453a43f7f5cde514b0a68a06ffdb53ae778d89b4374a91d1ba3d5b4612c1e302726efa8fd824fea7e0f2c509696841cd41f9dbfc8c1444d0c582351 -LLVM.v11.0.0+6.x86_64-linux-musl-cxx03.tar.gz/md5/0fba7b176d093b1582299bfbfd1f22c4 -LLVM.v11.0.0+6.x86_64-linux-musl-cxx03.tar.gz/sha512/28aa06364af5d508c77f43fb45c054791b2c01698ce1e3bb348fc83732f6f434dbc9077d31bd7ecd49ed933723fed0b0c88ff407fc20cfa123b100d48babadb8 -LLVM.v11.0.0+6.x86_64-linux-musl-cxx11.tar.gz/md5/34ccced0be355f34db5c1fb57e1f9a6c -LLVM.v11.0.0+6.x86_64-linux-musl-cxx11.tar.gz/sha512/bbac3fc2ead3751446fd2576a37a57f0729ff4545098aa8638a55a4166174351309354a7d3a8c16287f5281ec967f5026f24e858dd3bf08eab735bac38e200c7 -LLVM.v11.0.0+6.x86_64-unknown-freebsd.tar.gz/md5/ba009ee74424f1071812b38669cd941a -LLVM.v11.0.0+6.x86_64-unknown-freebsd.tar.gz/sha512/bd3b27ebaf504778367e2f2d90205626a6c59c94a016d8ea7b1aa97bfe0075900582ebeb34c51506eda67be8092dc566044b3af3fa1fd92800a38d3a18923fda -LLVM.v11.0.0+6.x86_64-w64-mingw32-cxx03.tar.gz/md5/1853967bea81faacbd73c476f2252414 -LLVM.v11.0.0+6.x86_64-w64-mingw32-cxx03.tar.gz/sha512/0a7f81dfae7ecd6ef965fe9d1a11233d88925e29095fecfb1c3366a5c95d193d86bc2b760e0897fd118620232407f042328f870625260b1258cb2522e752904f -LLVM.v11.0.0+6.x86_64-w64-mingw32-cxx11.tar.gz/md5/9cbe2a347d3ceaf2392396ecdda5c907 -LLVM.v11.0.0+6.x86_64-w64-mingw32-cxx11.tar.gz/sha512/ee5d20f94c19e823062353b56bfa48cb5bc537315b4d39a4dcad264e496930e87c8536f1ed3b1eee15c53bdd4fc12e61d3c751dbdc5ddc4471fe70597b76bbfe -libLLVM.v11.0.0+5.aarch64-apple-darwin.tar.gz/md5/6093c33101fcc79379c93ed1198bea45 -libLLVM.v11.0.0+5.aarch64-apple-darwin.tar.gz/sha512/9091d6193589b7a46aa82ec5eebda0be4e394a5d478e3ae4c8b0cb68f295de5ab92707a058742fb04c346fa230348d0b69ff0cb5ce45de6018ac10853cf66ab7 -libLLVM.v11.0.0+5.aarch64-linux-gnu-cxx03.tar.gz/md5/cc137eb7f436df8ab862691a602d7609 -libLLVM.v11.0.0+5.aarch64-linux-gnu-cxx03.tar.gz/sha512/f873e6aa4644422076bb2e74f3d2c46243adb156abd6963407d782bc1d49751393477256c82ab2a38549a81decd95cee48f64229f1274d3fa531de97f23c4d0b -libLLVM.v11.0.0+5.aarch64-linux-gnu-cxx11.tar.gz/md5/c5ef17143ab1103d76eca8c066858cd5 -libLLVM.v11.0.0+5.aarch64-linux-gnu-cxx11.tar.gz/sha512/915da9f1b0a931479156ab7c9b04b355584b1dda74cf2e59d49922ff448980bfea2dd702c82e8fd79748e55744d752bad36f02ff7511722e28b14e25d22cc895 -libLLVM.v11.0.0+5.aarch64-linux-musl-cxx03.tar.gz/md5/d50977717fb2218a20abe4f464a18a44 -libLLVM.v11.0.0+5.aarch64-linux-musl-cxx03.tar.gz/sha512/f67780a963854bc71f99c06dd6b9e49d01208126e7a56e438574cbaa64f684d554f56cf9bbae0c2cb03f5a8d88ca440d0f7d25a4c3bc28fc94837b3f7b78f682 -libLLVM.v11.0.0+5.aarch64-linux-musl-cxx11.tar.gz/md5/42ef1a781c9fbfb1934e5d6bb5e9f003 -libLLVM.v11.0.0+5.aarch64-linux-musl-cxx11.tar.gz/sha512/cfab5718ca64265bc1a900dd8c5f5700940943b901c61416f476299c0b01db0b9d8feeaf2c4ab73e5ab4ca3b3e53f20b8d0cd01d6af0fa3b20c02b24bad83ac8 -libLLVM.v11.0.0+5.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/46164ebf60f61996cc87bbd9f4d8a3f4 -libLLVM.v11.0.0+5.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/c755ca6140175353e25499cb6e26568c65e83065064e7f94bda44f4135e82e19373f8d254185b21941d3c3998db0d70199ed854e1aba3e6bfda166a038e71dad -libLLVM.v11.0.0+5.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/50e236b476687f13b702c88324f3ba84 -libLLVM.v11.0.0+5.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/a75cc8cc1dd7efcd04c654dd4647fe45e56ef5c0ea61eb86ab73a3ec62479f9842feedbc9843b6b1e7cd27234ef23c3ccdecac257f9503742d68e466e8ab577c -libLLVM.v11.0.0+5.armv6l-linux-musleabihf-cxx03.tar.gz/md5/1b30fa450e7a36c99a9296d726985ff9 -libLLVM.v11.0.0+5.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/77da6971da255f7b497473a57e615c981684a7d0cbc4e8a50a4021a054fe9b36ff0c4956502e45cfdd0b721693e27a9e5121ec51344f051faf5d542ffb70fd39 -libLLVM.v11.0.0+5.armv6l-linux-musleabihf-cxx11.tar.gz/md5/e9dbaf111bd4820ffdf219d3194851a0 -libLLVM.v11.0.0+5.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/340a8933539f32ded7a6a43ce9545a08cf3fcdce65c081b04fb01d61e02cb34fde7e186d3e6b62b6631a52a5abddb2d2c2b90c6d5a06f56cf0804ff7be7578ba -libLLVM.v11.0.0+5.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/427af130d0f4f40bc861e410046edd55 -libLLVM.v11.0.0+5.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/33eed570f1c578ea0343082632fc6885dc46c4a9175df13c4c559560b386629a757eb7d17950ae3d34d2f7f513ee59d84636550c5d114800bc1963d6f377ef4c -libLLVM.v11.0.0+5.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/8724eaff65ada8bc7799bfa8cb5a70fe -libLLVM.v11.0.0+5.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/ea6367325fe2a63725ec544fc0f72bb7110883fa312cc5550bc95e8376ef28d78582af0e4574f7e9835218b48f0fe6cbc2ff452770147c224d6c7108497b715d -libLLVM.v11.0.0+5.armv7l-linux-musleabihf-cxx03.tar.gz/md5/fd3772219994c175c714c046254d6ae0 -libLLVM.v11.0.0+5.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/dd73cc75aff7feaaa84d87eeeb14e2df565d104942af96891f29c2f7da944467b2b1d599649336cba5bf7205c958117a7c6a6213c775f07e7ca86a2016542f8d -libLLVM.v11.0.0+5.armv7l-linux-musleabihf-cxx11.tar.gz/md5/83b869822caa630768c6bd2b7cfe03f4 -libLLVM.v11.0.0+5.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/057602f5388f8b9ec55515ec758edb8477a84d70afe2bde6c56b9001b07753ca7f70bda3d7ed4919df119e4aaa5515c47f967bf5f5cac272694a75477fc644b4 -libLLVM.v11.0.0+5.i686-linux-gnu-cxx03.tar.gz/md5/4e1526f2cd92dc7448b1d24e8aac064c -libLLVM.v11.0.0+5.i686-linux-gnu-cxx03.tar.gz/sha512/93dc0c9964cce8794fc6d41594e8ac5446fae07c9e3a8c185445e0c10976562a2edb738520ce1075b63cda165dfe60e8ecee432cd522d1a8d81cbbe0f1423ad3 -libLLVM.v11.0.0+5.i686-linux-gnu-cxx11.tar.gz/md5/829fa4d0feaec240c91ebce879bee440 -libLLVM.v11.0.0+5.i686-linux-gnu-cxx11.tar.gz/sha512/08c00feac8b9fbdceac2952a85e4c9b9836ed9994be266963fdea566e18981c7e763562fa534746c25381b7c7feed50e1e35b78e6040cefde90de35f61bb347d -libLLVM.v11.0.0+5.i686-linux-musl-cxx03.tar.gz/md5/891ee75595110ab8b85b17decd1598dc -libLLVM.v11.0.0+5.i686-linux-musl-cxx03.tar.gz/sha512/f5bef30a1ac951c50e195638c1931a989528e1ec02316c0bbfe61070a5c1ce6b1d4108ea393aeeebab0ca089f1132bf74ee664d1b0f0b17b9e7c7964d9137050 -libLLVM.v11.0.0+5.i686-linux-musl-cxx11.tar.gz/md5/5ed1de36778f8afc47d7e8b230532bc0 -libLLVM.v11.0.0+5.i686-linux-musl-cxx11.tar.gz/sha512/51fbbff8b227cc5fe9d3c862ad990e395baa7523103a4d6cf6e4a7bd411e0f00c4567e60989269917d7b546103764f21fe212bcf574c74f75b6f4b668c144e69 -libLLVM.v11.0.0+5.i686-w64-mingw32-cxx03.tar.gz/md5/1a649637bec7fbe82e29b32dc70c9c9b -libLLVM.v11.0.0+5.i686-w64-mingw32-cxx03.tar.gz/sha512/61d4203fbffef54b9b251f2319c9224608f3331e974b30895817956ff8fa12b95afd579fe68d9521e37c351194931763a5f74e72a36e62aca3400a3cbca058c6 -libLLVM.v11.0.0+5.i686-w64-mingw32-cxx11.tar.gz/md5/ab780f440cea869cf8f26051e4a99037 -libLLVM.v11.0.0+5.i686-w64-mingw32-cxx11.tar.gz/sha512/ad5c02984cbd6dbb2d3c67e1a0350fdc62a786185aeefc1b7f3f94782a23a12a5525813405c4a2ea829a7fbd71869a9226b9a520817eda0bc9d9508fef130fdc -libLLVM.v11.0.0+5.powerpc64le-linux-gnu-cxx03.tar.gz/md5/5556521e7ef57eabae57979a5bee9513 -libLLVM.v11.0.0+5.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/783ea0396a9d3e435cb85a8c94b842ed3155c16b12d7218c1f1d0525550ab25b91ef1a2bf697154ba036034642f4453d1d9b5d5dfde1a34c6298c5fecce6d344 -libLLVM.v11.0.0+5.powerpc64le-linux-gnu-cxx11.tar.gz/md5/03abedbd8120e81b62645a8e01c7dcfa -libLLVM.v11.0.0+5.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/09896cb94818ef583a1aacea0e207bb502ab779fecd2693f672463864de12bd2b87e57430bff17c2e1ba5a166069031ab5bc6866645b37889f42e403adc2992c -libLLVM.v11.0.0+5.x86_64-apple-darwin.tar.gz/md5/a58cca2dd2ca7251d59b92032aa23453 -libLLVM.v11.0.0+5.x86_64-apple-darwin.tar.gz/sha512/77088da3a569cdaf1f26ef3fc9a4e3abf5b4b3cd686715fa8133efef5206e0e886508bbd1a986e858d0bad6eceb64113e8ec6fd69b38053871df194df3b24559 -libLLVM.v11.0.0+5.x86_64-linux-gnu-cxx03.tar.gz/md5/4d45b86cc2bc673e7447e0400e1444c2 -libLLVM.v11.0.0+5.x86_64-linux-gnu-cxx03.tar.gz/sha512/506b406bde06b46cd0ae49ba35659b37572f6942ff825f5a682a18d7deafc7b38ab9f78ec6f122baec4b851f009091c3d1b89731ba871f67334f1463a6820fed -libLLVM.v11.0.0+5.x86_64-linux-gnu-cxx11.tar.gz/md5/f6221d802cfae827b780906969510aa6 -libLLVM.v11.0.0+5.x86_64-linux-gnu-cxx11.tar.gz/sha512/1913b4766a5032badcff8247b72584ee0f0a6a6c3de73b6051fa65f707b530e2186fe9696f15685257c211a0fd52d0eb52c490801ada775536f38e2dbc656821 -libLLVM.v11.0.0+5.x86_64-linux-musl-cxx03.tar.gz/md5/bfc7dffb58563c23976b391677510afa -libLLVM.v11.0.0+5.x86_64-linux-musl-cxx03.tar.gz/sha512/122067a7d5a64ec67331d30f289ebccd62ee9cce1dec828644ca5e210aacb427b632d9e46939e7753da599693fd8926099768babacad06c57b79fc784c76520e -libLLVM.v11.0.0+5.x86_64-linux-musl-cxx11.tar.gz/md5/1fef97d7b6a66eb5047c23abc740a757 -libLLVM.v11.0.0+5.x86_64-linux-musl-cxx11.tar.gz/sha512/9a0d18d4752b81cd5026392501d725c71d955938a55bf126a6b8d1dc7ec4035147bb86ab44592de1a3e9f8d6505dcb0cd1b3f2f667ed67569188a1347dbd71ea -libLLVM.v11.0.0+5.x86_64-unknown-freebsd.tar.gz/md5/fd1b477fca09cadbdcc7e812b3952245 -libLLVM.v11.0.0+5.x86_64-unknown-freebsd.tar.gz/sha512/89e6a796292c6cb045dc78e2d9c82c31c3507fecc5aa31fca84e79ea3a402318c1c0822fa3a88c329b8731d220550733737df83266036b648d367f50e9f77f4e -libLLVM.v11.0.0+5.x86_64-w64-mingw32-cxx03.tar.gz/md5/6ad1eb4936bf7c181fe6b3bb987ebf31 -libLLVM.v11.0.0+5.x86_64-w64-mingw32-cxx03.tar.gz/sha512/042259fbd70cfdc1f27bba8d692cbf40b046b0df966c8ec8119a08dd63bf32c0da7f6bc541b45dd7606ce67996b1b7ee6ce4900a95b4e6def28bd7061c461ea7 -libLLVM.v11.0.0+5.x86_64-w64-mingw32-cxx11.tar.gz/md5/6f73f4a673025c078505ff14e6608929 -libLLVM.v11.0.0+5.x86_64-w64-mingw32-cxx11.tar.gz/sha512/26c18ecd415faced18116c01a0d491ccb0a9dd957f33bcea17147c7209d00a4092508a66c803fc057ea824f4bb1408526d201cdd1d31d3c2ba20016bc48d9272 -libLLVM_assert.v11.0.0+4.aarch64-apple-darwin.tar.gz/md5/b3f2d92a01d0634dae3cd285ca828034 -libLLVM_assert.v11.0.0+4.aarch64-apple-darwin.tar.gz/sha512/d830858163fdf7686c909faf086db589f5702be227d99cccfab9b5ce255d611937dd304dbf55731e72082c0ea0bca2a9841b4d8b7f57b861de54cf2911a51dfd -libLLVM_assert.v11.0.0+4.aarch64-linux-gnu-cxx03.tar.gz/md5/c44b3954aadb451b0bcd9985555fedd9 -libLLVM_assert.v11.0.0+4.aarch64-linux-gnu-cxx03.tar.gz/sha512/dc25a8cbcc090719c8d62a12a456c285eeaacb5e0329ccb07caa5ad8b7060566e17a78eafab5fe8671808ff450b0d7d5b9184c08e25a5e06be3ccac48d558568 -libLLVM_assert.v11.0.0+4.aarch64-linux-gnu-cxx11.tar.gz/md5/1613b5d7fbd98e8955f8ad2690357e26 -libLLVM_assert.v11.0.0+4.aarch64-linux-gnu-cxx11.tar.gz/sha512/955e7304d1f0ac77d7f3a89d95b9f94da3b5125027343ad3138c14b940e800190f5a1a69482c6bc7ddd688f9a42b246ffb6c2f0966c5726ee8b4ff255f793127 -libLLVM_assert.v11.0.0+4.aarch64-linux-musl-cxx03.tar.gz/md5/a4d5f0ec7394524259309fb1bae109d4 -libLLVM_assert.v11.0.0+4.aarch64-linux-musl-cxx03.tar.gz/sha512/646bc7d60fb66e0fbac4fbfe617b14a0c025d4a08f40dba7cc93ddfc2e5b8fc565b1ce97fe77229fa1409720952d1540a6fdc8a2767ed49ac7b9ad234a1ba726 -libLLVM_assert.v11.0.0+4.aarch64-linux-musl-cxx11.tar.gz/md5/aa6260325bf0c2dc0013b1898feea408 -libLLVM_assert.v11.0.0+4.aarch64-linux-musl-cxx11.tar.gz/sha512/0981de6cd9e59b90dca8f536d79ce38f13b76f21e952ded6dc2ca033e83f79d1851cc90485d8583dd88052d1836ae7b2faf241ada43644fce32ac291dd562f6f -libLLVM_assert.v11.0.0+4.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/d813f8574a389fcff274c56539dac3fe -libLLVM_assert.v11.0.0+4.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/a5d61fb8ff01db31ae6b654b310f65fed3fc50632bff12a384ceae9e539d24f144899f42aa03fc897732b4e1ab98f522fff1710b17323e73cdfa3bf8659117a3 -libLLVM_assert.v11.0.0+4.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/d7c742feacc6c241ad503c67ec926eb6 -libLLVM_assert.v11.0.0+4.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/2a858171fed4cf139cfff6797a7765a2ba635e541e7df31819aec926a8de1827bc5d5549f2d1c25fbcdc7da53081b7f02174b279a36bf71d1239ec8bdd6cc6e6 -libLLVM_assert.v11.0.0+4.armv6l-linux-musleabihf-cxx03.tar.gz/md5/c6adb1bdbc4e6de054ddff011e83828d -libLLVM_assert.v11.0.0+4.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/cfab24788c33cbf941e50c9a575c43811879d2c31a053e262589be4dba16660f99ed4d86167a775a8029685bed499867d2e55d303fbe50f07a5e3b4ad3dfd3d4 -libLLVM_assert.v11.0.0+4.armv6l-linux-musleabihf-cxx11.tar.gz/md5/82b9b7fdd60a8b585237221d72a9c197 -libLLVM_assert.v11.0.0+4.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/fe15f9639a34b0796528a99d3a50c5c985d6ada1584a980a18aa9ce5254ffcdfc96d4051928c14de6455c9c4964be07496fa34186e96a3904b21583e1452398e -libLLVM_assert.v11.0.0+4.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/a3a7df2a953df4573e9541bac02c36f5 -libLLVM_assert.v11.0.0+4.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/19f27571f1b4621ab8dc7ebede362346d9da3ef16a13d35823394f62efacd4d1a45e3372b69c2f0488f5901706fead7e605eccf5f63005fb619bf71e69d9b9c4 -libLLVM_assert.v11.0.0+4.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/97cbcb5a1fe9363a951705aa6b4becdf -libLLVM_assert.v11.0.0+4.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/42bfe71d8d6b0ade455ca0a820ecb2b5a9efedf3932c1b86f46b2c7143dee45986c3cfd862ff7c02111f8efb49eb8eac8c293a3adf522d5424b2365915b89a6e -libLLVM_assert.v11.0.0+4.armv7l-linux-musleabihf-cxx03.tar.gz/md5/db76a75a4bbcdc27d0a5fbf5d5dcf5f3 -libLLVM_assert.v11.0.0+4.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/27962b2457337b0548a9f121d582c10ab7154b7c99b65f8dc465bd9165dbe67d5719f41047630b7f176fae57f61d28caf93946ea6b63e852585340ee387fffd3 -libLLVM_assert.v11.0.0+4.armv7l-linux-musleabihf-cxx11.tar.gz/md5/860f98bbef0d9b4bbcd22cad5bf655d8 -libLLVM_assert.v11.0.0+4.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/53073a3a886a0ee4a250a27effb26cfa95cf790d6a04a93a01453a5e0db6b3e1dc333da294750dfaeb77de39254c153a93270bb168655d53a69058315bbb4e00 -libLLVM_assert.v11.0.0+4.i686-linux-gnu-cxx03.tar.gz/md5/35a3ed96171881cd54ca185f0811dc8a -libLLVM_assert.v11.0.0+4.i686-linux-gnu-cxx03.tar.gz/sha512/608c19b8b0fce94405b781ac43658f3149f3586a5665420e41dd8d99111b5e22f536ef92d3bc1e266328dca3acb098832aaf8d01ce77c089e2fed9b4328fe9b3 -libLLVM_assert.v11.0.0+4.i686-linux-gnu-cxx11.tar.gz/md5/da1cebec9227f0c027aa21d01dde91ae -libLLVM_assert.v11.0.0+4.i686-linux-gnu-cxx11.tar.gz/sha512/478c380c7e47a15db023d6805baa0553f2fa7eefb084017ff03739862d677d03a2ab233992f74466e15d7c2d1d0f8e74a6f14a59a7ff543169121f8c71e13bd4 -libLLVM_assert.v11.0.0+4.i686-linux-musl-cxx03.tar.gz/md5/b907e624bf517c934f0a72ece354bf11 -libLLVM_assert.v11.0.0+4.i686-linux-musl-cxx03.tar.gz/sha512/7256348daeb5f2e5a582b77c747d813b6d2c814a48c93b5072c2973d59ab5c320deff0fc2cc860092d9dec3042021982219b9b2eece1be43f6b782cebf7808e2 -libLLVM_assert.v11.0.0+4.i686-linux-musl-cxx11.tar.gz/md5/76e47ca276cce508a79822916989b9fc -libLLVM_assert.v11.0.0+4.i686-linux-musl-cxx11.tar.gz/sha512/8f4a276258d24cc07192cf2a4f0063943947dbbd74f2a35b3c89e77a62a087578d913f348c934beb50f70a3fb17217b8011d35a3d4eb7cdaf90e91c7232f7a4c -libLLVM_assert.v11.0.0+4.i686-w64-mingw32-cxx03.tar.gz/md5/d8694a65b6c69ac7d1632372ee59b331 -libLLVM_assert.v11.0.0+4.i686-w64-mingw32-cxx03.tar.gz/sha512/314a1669c428ad518d1b38ea45b177ce4c1ba141efb1a9f7202ca1f531b62400d8964baaff6e16f86abae276fe65bf2b18bd0ad181a8a059be39e05fff3d2ccb -libLLVM_assert.v11.0.0+4.i686-w64-mingw32-cxx11.tar.gz/md5/1a91e6dc0eed69dd78e2e684e5a45c1f -libLLVM_assert.v11.0.0+4.i686-w64-mingw32-cxx11.tar.gz/sha512/37f4fed310a34a414821f04bb5c333825bba06f483a33a6faede3c3f8eaa3d955b8f307398fb8906c44f0e140d4c9bbcc49bab6a6076120f31d5b51716885206 -libLLVM_assert.v11.0.0+4.powerpc64le-linux-gnu-cxx03.tar.gz/md5/dacf4d3b3d1894952662d669b0a6573a -libLLVM_assert.v11.0.0+4.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/e13787342514824d8620cb06741fceb28f22fa2153882d9823a20fe5eeff36db3f950f13e71a4cf80f05e4d55c315b77730b9495689ba3472e40e876018ee868 -libLLVM_assert.v11.0.0+4.powerpc64le-linux-gnu-cxx11.tar.gz/md5/b9361a6158fe52cf757fa3a54232bd4f -libLLVM_assert.v11.0.0+4.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/ed54814963100fc7ff669e7efd6fc9bba8119ee5415a8da7e3a329e5b8646dc4cbd92b4b7ded081e37c4b76dbb9d3d90abbd3c3eaea884b1f165877971882627 -libLLVM_assert.v11.0.0+4.x86_64-apple-darwin.tar.gz/md5/9c3718c0a565d2c63660f21db8f885be -libLLVM_assert.v11.0.0+4.x86_64-apple-darwin.tar.gz/sha512/adc9d0e42eadc1121291c859901adc9d6dcb83ad25b66a2b6845bcb72f27a4c6e457ac248595fd3ebb9641f6c4c8de5a7969043e28c2dc4a31a79c6fc46f1735 -libLLVM_assert.v11.0.0+4.x86_64-linux-gnu-cxx03.tar.gz/md5/c1335b3639dc3f24618c5ef9c73f1e3f -libLLVM_assert.v11.0.0+4.x86_64-linux-gnu-cxx03.tar.gz/sha512/7e05546a25d72a8e90378edb9704bf9d9be1f7757672b3c7a05b670df993718b076598343cbf078b91cf852f6f229bd9b8cb0d1c77cbbb24707a1407feb5c665 -libLLVM_assert.v11.0.0+4.x86_64-linux-gnu-cxx11.tar.gz/md5/91f99a06286db80153289c1b0857a0de -libLLVM_assert.v11.0.0+4.x86_64-linux-gnu-cxx11.tar.gz/sha512/1a3e15dc1ef2c0721425b341929d3aa4cec5070964b4fc0d3330ec14e0babbe7274e6dec262fdfe972712f8bbf577e4918e296d7cdd60e72e5efb53b57e8e304 -libLLVM_assert.v11.0.0+4.x86_64-linux-musl-cxx03.tar.gz/md5/d4252bda895100039b2edd0447c06636 -libLLVM_assert.v11.0.0+4.x86_64-linux-musl-cxx03.tar.gz/sha512/8643543c32494d4a2237d9c22fbb20f7780f7cb64aef89dc43583d83790288832a687a4352462877f6fe5cf48e5a1bad5a20eb3b2e51f082797b0c18a43db82e -libLLVM_assert.v11.0.0+4.x86_64-linux-musl-cxx11.tar.gz/md5/e740aa378f788810814b03b8ca6dbcc0 -libLLVM_assert.v11.0.0+4.x86_64-linux-musl-cxx11.tar.gz/sha512/4ccf31c437a9377f77e216cedb459eb133d9c2b0f4e2878cc3a354069f6f070899c1136829aa2cc4833fd2a75ed91b093e5e701f1bed2acfad08468d8fc3f183 -libLLVM_assert.v11.0.0+4.x86_64-unknown-freebsd.tar.gz/md5/561ce469e0a1da154efd4f25108317c0 -libLLVM_assert.v11.0.0+4.x86_64-unknown-freebsd.tar.gz/sha512/3d0ac0fdd255087db3bcb4d0c1f53350090a611d888bb77c3f422f91a6ab43fddba2b39686f271bae098330be9461657c338171c32f7038c2484a32052d8b05b -libLLVM_assert.v11.0.0+4.x86_64-w64-mingw32-cxx03.tar.gz/md5/702c79a18b1f460cbe7d1c33a4258b4d -libLLVM_assert.v11.0.0+4.x86_64-w64-mingw32-cxx03.tar.gz/sha512/16f7e377ae8a7f443d631906470875ed97a6c4b23b0d74071a21e77f3fc1055fea52e59e74dcc4cb5e5486df0241b54c5398a188d6c75275ca345d14ffe56825 -libLLVM_assert.v11.0.0+4.x86_64-w64-mingw32-cxx11.tar.gz/md5/e40a01d070092c5aaa6dd335d5ba75e9 -libLLVM_assert.v11.0.0+4.x86_64-w64-mingw32-cxx11.tar.gz/sha512/3628b68fc42b95a7817c42987780c22f95a4e80374063a0a748c4bcae979ff8f669ec02f8e69d11f06d2d06db09e1969f54b2d4f53b8b3feafb2669d294bd5a1 -llvm-11.0.0.src.tar.xz/md5/85844102335b2e01b3c64b6734fb56f2 -llvm-11.0.0.src.tar.xz/sha512/b3e92091ac48772edc0c30801218ce646ef374e1968baab91df9005f58e11c3ce149b2c4c655c7001f8554fd337caa02c08783bc736153bf58f35fe008e624a4 +libLLVM_assert.v11.0.1+0.aarch64-apple-darwin.tar.gz/md5/72cb73b4eb0420466ebccc0fea17a324 +libLLVM_assert.v11.0.1+0.aarch64-apple-darwin.tar.gz/sha512/09f443cf3ea3daf81a650822e7277f4da5edfaf5c1f79b9456f503cb7d884855d5c23f7b25fd7674d66e7ae7892a1749ea7ab87893e99c568e718fc4596e4c33 +libLLVM_assert.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/md5/b387f40172a505f48c06b04943e939a8 +libLLVM_assert.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/sha512/ca4b1ea26c6151c72c56f70be2cecea58ab5d9b2b793e0316a15c10ed25e3fafaa392219e508d7a21a33e0b1a7e172e70c1b0b9fc70693fc2409312675af2bbe +libLLVM_assert.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/md5/5b65df008d5b6f824e5cf456cc6112df +libLLVM_assert.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/sha512/b0525756f8099bc44b50392bcce955909a8e784bd55de09a1bad445d9f079e34ea8fafc8c6992522edc8a19fc15b23318cce40ddb9b23191d300ff3554c0ee06 +libLLVM_assert.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/md5/eaf292542f6c2f24f98563c7a25cb242 +libLLVM_assert.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/sha512/350a5158d6cd79039c45068fe26e5bc73343b184407f12442096a4e5f3549f70468ec7bb72d40bdfd69d945b8d3b75a280367c9fb7fce13012d5fe5d07802b9b +libLLVM_assert.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/md5/f25d713fd86eebd93e5ad4cb049b1569 +libLLVM_assert.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/sha512/a536a5bb3c23b8f1a76d8eaced4842b711ecae820ce38dbe0e0ac7466773a0b838832465518f2c54e881208a557d88a73bf7120b3263b03e697e38a1914686c8 +libLLVM_assert.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/fe0952b6450241b7b517c166ccea4c88 +libLLVM_assert.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/49f8b100199f4d9d668be6314b3ae6c1b4044c9520b2a3bd7812813bac469341208df67b5f875c8cec18a6eec93bb287a36a5235fdd289b2e43bdeecb7621e23 +libLLVM_assert.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/9f879b954eccefef125bd3a8a62021c1 +libLLVM_assert.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/aca699cad540681d1b07845492abb42b96d3662313aa0177b1764616cf281398d3e8e9cfa59b18440be58c8f65f843857e626ba95fa9baca296fc2406f453a34 +libLLVM_assert.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/md5/a7b1d9a513d587591aa3308203ce6268 +libLLVM_assert.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/03e1bbc38635e8c65a1e14a173f2920519e2566ac240afaceea669345982459d7d98c6ef82aeb1c9e199b1f1e3e556ee34f5516bd30ff18cf8b683d91169fa0e +libLLVM_assert.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/md5/12457a9b3fa21c99a49caf93b373c574 +libLLVM_assert.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/ab193741a31f5452abc295d2a09301eeae0c3b6a03bf92691cac84880b40d6527a4628e468234822991ad55e35598ae5858a2bd00ef9eab9c90c45e18317b851 +libLLVM_assert.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/576f3ec63c7d64491cef6205c359b115 +libLLVM_assert.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/e48baf95c5812bb3a9c7d37fd78beb961c91fe58beef549d1b4e0e1b66809341c096fae68cc908be3dc94de71b0fe828496ae2febdcc4e09cd308cf697e4c414 +libLLVM_assert.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/6e1b2c07501a17453c039f549ae3a75a +libLLVM_assert.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/c7f12fefacb420b40ba7283226e1c458ce46e70ce5e5527c81cdbd2fa2cc7debdbfd14aeadb1dada1bf510ac678928432f850e1c3f8f74c8f8c34f078ded30f6 +libLLVM_assert.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/md5/4c550be2bb9de498aa9c2a71b42b4980 +libLLVM_assert.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/e5b505476ae796d52549884d2924c5ee4546b1d43b6a6205b9be18badbe1cf842181d4c8e699ef6daeefc12d7741c558f2594ea8bda1661a6a00bb34339191fb +libLLVM_assert.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/md5/247a069c1af0d07353ababdd8d0ad534 +libLLVM_assert.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/e7b46803f2dbc9734d824e0464cf1c999d0b4efd2ee7283695a94e9e04ded524b60cc97498e02d3b4330604fff7ce3b59ec74839cd6793657cb064158dfe0f70 +libLLVM_assert.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/md5/424a59e82d63f0559a4440f97c4fb0a4 +libLLVM_assert.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/sha512/aef94d142af96419f3749c13fdc89d2f0a9d072d5bb817fdb787718aa04825c28c9187970645d0dc48f79f58e5eb48003267d78d20e09c8bf76155e016f8c2f7 +libLLVM_assert.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/md5/684d885f70bcd2fed245a6d5e275a86f +libLLVM_assert.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/sha512/808d932f565a03837bc5a189d58e942ee205e34cc5f985f384aceb83dfb3b721c10507339079dc87edc90db92aacd01e95534754867a6184755580b06699a6f3 +libLLVM_assert.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/md5/087b86f490f1b0032f0b63beedc5d8bf +libLLVM_assert.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/sha512/566bc8c09d9b4e01ad8ea784d1e4ba13c3fe54338d49043251b91f9e3ef2ca718f64369f7b637a45b011eca03940825d2f0a48d306182ed32dc3af6b6ce757ee +libLLVM_assert.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/md5/4e86a5d2a79ec57402a36d05f19ab870 +libLLVM_assert.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/sha512/de36ce76dc6611c12957123aeefccb1be26ef7b63c5aea0967afeddd7f473ac4674365ebfd9e35ea1607567b9701a1d58b55b1100b7e2f830723bf45315c68ca +libLLVM_assert.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/md5/7cda46769ad2c27e0ba9e7404e1cd7cb +libLLVM_assert.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/sha512/a51eb2d0f4a61947b3449ba3ed60110b5e183fcd09126b9b0bfc63d285e881373e8ae26c0925e42bb3b69176bdb6c9bf9301ebc5d7c9775115af690f728d1476 +libLLVM_assert.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/md5/8449c26f913b7b6ce1aff4e0c89d223d +libLLVM_assert.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/sha512/4196db36c4fddd2f267b97144ba0469f616952931df757708bdbdb28bd5e7615cdc292456019f5ca5747b708e7b805a2651e56dda74e33b1a8638d3e6197f856 +libLLVM_assert.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/md5/73933ef6ac652ab1df761f44054ff926 +libLLVM_assert.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/5267f1bb0fd73bc87f77c5b323b2664fd98c1e92aec67d7dac0ce748c57bf68284585f0474b995cdb7bd25c7b0840a21be55cf00e9a0b12f7bafaa7a4626c04d +libLLVM_assert.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/md5/788729c6e58a0e0d1ff06f7a07157e09 +libLLVM_assert.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/e97c0461c88c86f2ef07fbe3e1298d03381b3240fde1ce1e3e49e267eec81bd3a043ddabad90a9014d9eefecb632eeb07597a5e8316ff9c37cc6617800ff5e8a +libLLVM_assert.v11.0.1+0.x86_64-apple-darwin.tar.gz/md5/5fd60a44a572000f2621dee40ea16841 +libLLVM_assert.v11.0.1+0.x86_64-apple-darwin.tar.gz/sha512/c8104fbe347b8984a6c60ce4f26ebc85f2618a225f1b9787b4f7867bbab887ac9b661847e72e0bf8ac703505b9e37aa83aaa1367228d96ff7e52477c5de805ec +libLLVM_assert.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/md5/e97353b1761afd7a24eb9ddcc38f701e +libLLVM_assert.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/sha512/34580edbfb68c7472ec40c14d5aa48458d754b9cab24ae7cfe3c1bd6ab7b383ff021af4963b79495028fc0c94e07e221dfcad8272e7815b1cbf3bf4042bddf70 +libLLVM_assert.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/md5/59c6c59e083c55ac2e2ab2ad25a330f4 +libLLVM_assert.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/sha512/569bd4a55f6cddcfcce250f408cd1f8ea1c1a20ba81076a24acd27fb84242ba9c44c70bb7ec32d544c23679bd9032f378e604d0df30b948e12a0ac4b08afb521 +libLLVM_assert.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/md5/ff17494ba9d7ca146d56eaef17ac9d20 +libLLVM_assert.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/sha512/10e1eee6d1b0e84aaaaf8424ebd9c07f08315dc0d92d34ea05165673416a1c41aded9ce4f1980b8a06abf301017884756e0835735677e125ee0854f81e90a881 +libLLVM_assert.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/md5/3848a194f4dee0f4e0140e31f68e2e8c +libLLVM_assert.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/sha512/d0b2423a21de72ebaa76a69e7764f83f87f572f880a36cc6e26582db8f49d054265c4d8c12411b735b623c6ee2ba90b28dd37821e9bbe83120a7babde376a969 +libLLVM_assert.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/md5/cba351ba676be1ae16ae194f1d313a39 +libLLVM_assert.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/sha512/c8dde7849ab528ff0c1fddc5f76d4fff67680fd93e8c44f5241009f4c5a6049e6fcf4ba5c168574f6efabc59ec87d81f1d1382ff55abeb9617addf69aef385cf +libLLVM_assert.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/md5/6c2b449509d27d65a70549def9566c58 +libLLVM_assert.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/sha512/bfcf864871c590eef891cf604daf1507f1a9f117e091d88c3730dfb60dc8b49133b388315da8cd75a51683c54d7e7ae1887aee617cb8c704a6eafe7d0b81e948 +libLLVM_assert.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/md5/7cb9c53aceb48acc4b1ff0bcb2d32073 +libLLVM_assert.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/sha512/e5b47e3697b695f45117af1d0ac0a37886e9c85d128d8b7d6ae40f3ea957b6ef04dd1539578bdc37a80f52b241ff34f49d75e104bafeaa76790b8a57ed95d1c8 +libLLVM.v11.0.1+0.aarch64-apple-darwin.tar.gz/md5/6bbbe4f8828d965e6bda15ca6ed686d3 +libLLVM.v11.0.1+0.aarch64-apple-darwin.tar.gz/sha512/6f0ba6a0b8cfe9ca00d4a1ca11a0537542ca6b0d108b44148ad558245fc9b9a5849a8c31c98ea78c5cbc781cb264c9fafa4568412030f98ce78d895f88ddb083 +libLLVM.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/md5/ff941c8f9b710d8300eeeb29bf77688b +libLLVM.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/sha512/fc5a41931d5af01452f9a104ffe4434a8842fa6ec4279f7534e8825bab0f7b5395d973a7269643af6e662b4dd8680920cd2879af4208aa6a96f0ec3d9eaa847b +libLLVM.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/md5/b429299c2ea4123b53d352bf15436fb4 +libLLVM.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/sha512/1365e9df2f0c69be190b956e33ae8d89fb468f3475b25a1955ad9ad3a87545c9c433af9bc1a419394afba2ed7d06557a59ae700b19a8ca99b1989fe2c51fc24b +libLLVM.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/md5/7d1d63f817c40728881da6d5e5a759f3 +libLLVM.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/sha512/c2b81988a6fa95a5186580fefe9ca645a37bd0b1529e77d3b32c60c2cd3201260197997230d43d96f5d94418ca85b641041c13a1a5737b6dc5002be6b410cc47 +libLLVM.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/md5/f497572a7ddc42ccccf8588ef1be63ea +libLLVM.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/sha512/5646bd76573eec9ee7276a702bdf72681f9271b8ee06903a04fede7057c012dde7fd2a4c297f92b5a13ebdddbb7e82decc9bfbb1e6bf561da16bfe4e91a39615 +libLLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/e2ca9e7ce03d1d5f9a8f926ec43a2f1d +libLLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/a62343736796c8f38593db6f433bf88652163e440ae597647acd2d03935ce8644c8a73b5759533a126479ff8c1e7aecb80f96683b119b0568432f90b1eb9a616 +libLLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/e21cb8bf3381613346c8e7e0a557f3b0 +libLLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/ca8c593339b19b514b29dd60e0ddfe8027b74c549915430e63baa94bcbb655640e1cfb5c0671eb02a5a966aa219b1be72a8433f79fd6b1cf35a48663cd0f9903 +libLLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/md5/698481903ca0c777c866f7d3df59f665 +libLLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/1f06d2758817cbbc87e17e694b2a28e361579061e713d434a8305e67101b86d403a5032342f032e779c65e5bddc1618139d7dce328210599166d5b89aa6ea53c +libLLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/md5/3a0bfd5e1b7f0bccb594d8247b1c3482 +libLLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/ebe41b12be7dd9aeba28305e05cced23a4536af84712f09356071a2f8042f9ba5195bb252b4bf641dd56141bafc04aea8a98ff21249d865ffdd0f4d2e4954285 +libLLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/b6be95080504eed815a14d43ff20ebe9 +libLLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/a1107732bcab4810a0856e0150be52178b71d527b77f37c9cdc702f371c7cfc16c5b42377752cf403a15584d891a20b7cb73f5c61f4944dd5b7e20272c5e02b5 +libLLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/abbd5e59d90b7207137537782c08c685 +libLLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/b2386fad803560b3b995b0aee4b8bdebd225953f380f36e327893b6c29ddfd955b2792b02ff580d8656f978d28d7ab4d6ed1d06e585b2a7b2fa05e5e0a8e02b7 +libLLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/md5/6eafded818a43bc73d2673d09728f1ad +libLLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/970c3ac986fc57fc0e2326fb55ffc8a32b88771e2527e5407d0e7c70ceb6484b19e906c6e51f2e7f93c92c2fba808e91a7567a07c72b791fb150bd12d9e80716 +libLLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/md5/7c8e834845e30584f3980ca02df71a0e +libLLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/21c1adbc367ff56f1873bc27d8e8ddd7e860b52b73a8e7663d93ad7f4c9a5a116975b97298d804821b1af7ec05547936a25586ff989cc52f61901fbf8ed60945 +libLLVM.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/md5/2dac9d6b8d1bf5ff11c76381aebf23fc +libLLVM.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/sha512/894a4bb9eeb742f7db103d16c1f55f735afae26419d11791e4dc5cf97f285681b59c91d6f41aafcb59d6a274419fa3cd5e6bd9496577c0c71732c7789b61c839 +libLLVM.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/md5/1551a6e70daff5c990dbc40cc069a73b +libLLVM.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/sha512/0c0c36e42323364648844bdb3afc8d0efc4553484924e1fcd74e33c689e0b4076d614e85b29afd989aa007e5c03bb5b117504558d44e0566aaaa616d18c26161 +libLLVM.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/md5/ea235c280d3c76f05842b7630d1a5de6 +libLLVM.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/sha512/cea4aca951683b3ec4cd590dd2d6626267de2a12edafaf07304e2dfdd0ee799f88a9ef2a126cfa32546fa221f724da928397798e1beba0964a80a8a56fbdd1bb +libLLVM.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/md5/e3b21c9a06e8b28be5e727807517d71e +libLLVM.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/sha512/880f67c2c7613ee2c50c834c128770e06d58297bfb1f80b11f05833c231ffb3e1449b5c6069590f697c6fbba58c80719c8fb3fdc2786252176ec7d45db93db8e +libLLVM.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/md5/73a6b7a8837aea5b75b3e6a8f721dcef +libLLVM.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/sha512/6fb7611a7f9a95123eb706ead1d470c055c517194839feb2c235285ab9c7a11be8fdc774726f64bb51908a9c5ba6838ef2376455f3064a6bffda8e9f8e6a295e +libLLVM.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/md5/2d6b5dd1752f9425ab9aad465a6fe691 +libLLVM.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/sha512/6d107e0929fd121bf7cd98afc83c5b2da8808d69ed3126b87a9238ac7adbe073de96da0ed211eb226eabb64ad88a0176cad2fd2e86f928f8903995814f47695f +libLLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/md5/9c06d611fc1fa0ce4fcc0c12570f8471 +libLLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/25f8ba2faba088dd4a53e25ddbbfff7ae35f23caa05e43c7f8f269ca289820e423255b174451a7f50f3b0631b4b3a1a977a3edfd67132f461774cc5a59178778 +libLLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/md5/79838f0f3b33f5808a029f9ad47655a3 +libLLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/2bf5f9bdbf04f15cbcbc31efa5d122f46994bb9070d8421105dde3ffac4379be0b9a1c87e4b1224cff198b75ddeb9edb32313bb6e63e6083d97d039bb1c11e87 +libLLVM.v11.0.1+0.x86_64-apple-darwin.tar.gz/md5/f0e546033f265a397272a69704addc54 +libLLVM.v11.0.1+0.x86_64-apple-darwin.tar.gz/sha512/68c8a2f46f18e70998415c99c4e59241138b455e32f09077633ba8ecf4de90ec4ac76ea0d0dae0cecd4e0a000ff879151b54593bf9aaed076586bf6bb11f23cb +libLLVM.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/md5/39389153062b455b210aedd75c8ee0e7 +libLLVM.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/sha512/4301516630ff4b0ae81c37a94b32d9905cbb180d564692a4ba6baed66813eb7fab9a630fc6a252312af44eee8453eb4758ffef14d01460bec6b9b60a8dc59e54 +libLLVM.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/md5/b57ba068f4a5bf91706d81ebb5951482 +libLLVM.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/sha512/8c931fe67045f2d321e3529e714835fb12d45776e32da3ad88a2180f92e9d28c55c7260af8dbac6273de41a540e18bcc941bc46f733d01b10669ff2620603893 +libLLVM.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/md5/1cc16ff9eceeddf92f3dd2d84bf53602 +libLLVM.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/sha512/5b076f85ac97141881d165941e7cf5d3b2cb2e7aa8456dc7401c066015443720047887ccb2ced73a730f936770dbce0a8d45c4dabd5743fc3e094a8e6aeb1ea9 +libLLVM.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/md5/c4fbdb281f80c19459fdf3b9c8e5df9e +libLLVM.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/sha512/b79582daec0842d6975484cc7848c9e6517b6a1c4d71f66ec348b8fb04e671a1231f47eab51425fd08a5e7a1c6e85c6414fce85c9e305eba02949db7ba77c326 +libLLVM.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/md5/34d2e843abb3c3721fec3da9d024b00c +libLLVM.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/sha512/49f2a15d78f4aec7768393490a80c48a88a3fe3c5728b303d9871efc74862bf7a76a6355e7bfc08068aa8b4f6f637f51276cabc9cea75749fbdf5ee373bf9e15 +libLLVM.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/md5/8e96606a79e4321b38546a15c05bc69d +libLLVM.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/sha512/6313fd9ede345acd9b228971846208228f67f237380341e3631725a43759f7da804a2b9c57169a08d02d1130bef51f7a7168fcf200c51261cac04f590766bcd2 +libLLVM.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/md5/fa3c453c5ec7068fdc84bb1ce1575b98 +libLLVM.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/sha512/576e09913861b3148894bf217c3c411a9e8f8e67c47c2faae1c5cdc01a69b7dd411e9d606822304b4454fec9594e09871e7a2f0e97b88b2d5a6def80b29f0eaf +llvm-11.0.1.src.tar.xz/md5/6ec7ae9fd43da9b87cda15b3ab9cc7af +llvm-11.0.1.src.tar.xz/sha512/b42c67ef88e09dd94171f85cdf49a421a15cfc82ff715c7ce6de22f98cefbe6c7cdf6bf4af7ca017d56ecf6aa3e36df3d823a78cf2dd5312de4301b54b43dbe8 +LLVM.v11.0.1+0.aarch64-apple-darwin.tar.gz/md5/5be4edc31ab210cc82ebf1f54b1265ba +LLVM.v11.0.1+0.aarch64-apple-darwin.tar.gz/sha512/80766e9fbabeb917acd73170a5f1efe4c20e56057cb1ef3949e56af17998b9e0df6be2a49158d9a11178f92449ed6cb849024b8ea598d666c492da249863548b +LLVM.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/md5/a30c59e4203473bccc9101de03a2f397 +LLVM.v11.0.1+0.aarch64-linux-gnu-cxx03.tar.gz/sha512/54b18e13d8ce56ee837031df7066cef80779f2c5b5bb6c95842d3263c86b0ac29e995fb96d91f259b7d97b2a6b716da6e12ed8194ddcd0c9320a6e69150a3057 +LLVM.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/md5/a59800f9b6590831294d42799e47e432 +LLVM.v11.0.1+0.aarch64-linux-gnu-cxx11.tar.gz/sha512/edbd8bf8c5dd0b6150d0f092a043296f2c63a1a5ccdb101c2a953eafcd706c110c4791adfa46cc99332e9c67a2ed366289e704a7279fa760ac8af92efbd5fbd8 +LLVM.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/md5/8f0607508601a4c682c8d8dd251f4d2f +LLVM.v11.0.1+0.aarch64-linux-musl-cxx03.tar.gz/sha512/59d5418cc96f14137cb65737e9fbd1846010d724e8af533386fe820a71664992823b772b8dae58258bc911bbfb7e9e3319f7dad3b9fdd527e3f6a1f304578c16 +LLVM.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/md5/6c99ea3f1b0a9bbd04bbc919c9c4fad1 +LLVM.v11.0.1+0.aarch64-linux-musl-cxx11.tar.gz/sha512/8bfd91ae7412028d9d25320deff175d86b3e095bf5e7a2781950cea18d1f3e0ec7ad46ad3a3d3bff721d591828aac4b19af8ae10ec324f49ed092026a3490e67 +LLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/md5/6818ad05767ee2a782613125f48dcdf5 +LLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx03.tar.gz/sha512/ab7e01257e1182f819bea8de889185e1d87eca4b1b2ca8205c9e7b284005aa498d0941856d15411e844f745bf02df096e2740f66e5630b7d280b215fc3883258 +LLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/md5/c58d60a8097b29d9bbbae81331a84683 +LLVM.v11.0.1+0.armv6l-linux-gnueabihf-cxx11.tar.gz/sha512/9258c1ccdd0bc135b3b5922a766fc20e5d9522719e10e648d344ac0817f08bcfe253026e18107d281cbd9a6ee98bcdeed5efdb52142adc024e77546c5d280569 +LLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/md5/351e7c8bfb2a925ece5811c6e08516a9 +LLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx03.tar.gz/sha512/ae4ae45d033e263c8e7ae1f7ba24dc43b4f55c150e77d3d9c643ec3a09f702ef0fb28aa9f840e1c32a6fe5c28d8e45533ea9a25b1a767d78429f78b93c898992 +LLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/md5/a97853f6cd8046a5b730dda7b800b3cf +LLVM.v11.0.1+0.armv6l-linux-musleabihf-cxx11.tar.gz/sha512/e63f11f157e08f848d3103c0e807fec5dfae8348de4e854d5fe78e72c5c34f3f387b07feadade05437c84582440fd19322f24b03891b46260d28cf3fd33f2782 +LLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/md5/8ca68d4bb2e4076c49da331fea41fdac +LLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx03.tar.gz/sha512/8fed9e024b3bd3424816588f5b3ee3566631f3bcb3f32501108d3e60391cb03a606d9c757c778c5850502519899ca1ed334e6b2a5762a8bab5cf64310ebf4c29 +LLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/md5/a5ceb1385feb62f5ca3e8a6ad6531ad0 +LLVM.v11.0.1+0.armv7l-linux-gnueabihf-cxx11.tar.gz/sha512/13ee40541029344c6f75a674c15aa0205d00dcbd1eca675e11f2ac1fb15a7f9624cfc9f8e26ab792f146b98362e981e63accb3217791b7260bbdb61aa84ef00c +LLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/md5/bbb55319cd6163998b6fe36b2eeef4db +LLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx03.tar.gz/sha512/398c6a1836bd32467edc6572b409656a675c75917b097095c3d8bb33d13f3fc0b2c2331d7f5d150c4744f68a450fa6a5184f4d662a0cc4a7ef7152c81fd444e2 +LLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/md5/1ed476e3ebc4db6fb0b9ea218eb11558 +LLVM.v11.0.1+0.armv7l-linux-musleabihf-cxx11.tar.gz/sha512/e736bf84fe6180fa510a070f7f9591e8fad16300bc4e8dd1d982df2806de7061c31f4d152eb1cba9cdd9e41b074a0e65536e2fbd336a93f493bf1e13a0321016 +LLVM.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/md5/264b00ad61ee082e0ae68243532b9d63 +LLVM.v11.0.1+0.i686-linux-gnu-cxx03.tar.gz/sha512/d5307a36c404d1b8a9164e89eabb220554423960d318c6ccb64feadb9900f1f00a4ba3a3400ea136a5c5b08efab928fbe8e998a896027c1261fcec6fc99ddc1d +LLVM.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/md5/a774e0bb1d7c94dd4e70cb59845979a3 +LLVM.v11.0.1+0.i686-linux-gnu-cxx11.tar.gz/sha512/ff9fb1d986009df355e6c20472e819183fae939a60afcbbab50fb4a047d107ce946ba32aeb55c84079a8cfef92f85c1e0ced3976a715ae1b4f204aa7d69efd8a +LLVM.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/md5/88a0c5300850fbbb9e2be2fe0bcf377b +LLVM.v11.0.1+0.i686-linux-musl-cxx03.tar.gz/sha512/719e23389c70be70f4401cef07fcf1cdc51e670a3d6ae596088fc0c7994c3bf835c73e544e65cd92ac41fb08999fcbe8fa20d89c3b4242fbd65a127ffed3dd31 +LLVM.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/md5/63bd2a87830c152e58e980c27bb8fc9c +LLVM.v11.0.1+0.i686-linux-musl-cxx11.tar.gz/sha512/d7d50e66ff2176ca400910c03d7ddfc34afb7e9b4c7dc785b55fef8b1a49ccc933a2857a5a0315029e878bd0a8840c6043d6d1220a01ef252218ba14ba9c9b54 +LLVM.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/md5/367672d3155efbd4b11aa98ba6ba0c6a +LLVM.v11.0.1+0.i686-w64-mingw32-cxx03.tar.gz/sha512/577ffa7a06fb95b590c4670a02d9e98a3260c407f25e8772b7f8cfb9c9f1cd460535aeab980279145a22b0d8d92eb886ef8229c98fc4b65ca2f665c5cc262391 +LLVM.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/md5/0251f63dec58d97ef2413011c1d48400 +LLVM.v11.0.1+0.i686-w64-mingw32-cxx11.tar.gz/sha512/3c0f9da5b60035ce8465113ec543e4d1cf16ddfa6ed288a4480f3df5f324d96b8a1fb6ea96d79dee1c6de2a886853c2e80968ad07e7316ed74ed55d989438420 +LLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/md5/a7030f4c9bd9c10400c76da7171393f9 +LLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx03.tar.gz/sha512/26ae774eaed261d8fdce36bf6fe2c6d0ac4e1a4af74b0cf6b26cc474c7c1579746e16a1ce2f0b4e080a9af1ad26bc17bd4e9d87b806d49da58e4947be5cdccf1 +LLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/md5/94884b7d1b30a79065e12d096c48f717 +LLVM.v11.0.1+0.powerpc64le-linux-gnu-cxx11.tar.gz/sha512/4bd281cf3a8af6c76436d04dfc3812c3d56d0e69028cffe39111a0389ea7bdb916065d742dfbd7e5268d45591abe3c26682171ee77c254d084167a547c54637b +LLVM.v11.0.1+0.x86_64-apple-darwin.tar.gz/md5/a281080d225f0321aa7b9a924064e67d +LLVM.v11.0.1+0.x86_64-apple-darwin.tar.gz/sha512/9fc77ab5a555b86d256e8fd86031d58aaafd38cdcd3d579cd0d7041b529bd7dfa6538fc459568049545cb7f192f6d89eb1b88aa81e4595799895c4284cedb97c +LLVM.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/md5/2f34a3438aa0cd283cb7ad37cc3983d7 +LLVM.v11.0.1+0.x86_64-linux-gnu-cxx03.tar.gz/sha512/1e1854b654784d9a6691e40e222f53e7647ec81e095d4e4263a2824f8cbd00554826a24557684f84c1807d7614c231387a81600a432e1c7580c9e63b6b956ee8 +LLVM.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/md5/174ee46ac15dc748967e11e5c669213f +LLVM.v11.0.1+0.x86_64-linux-gnu-cxx11.tar.gz/sha512/325f4fea92edb982ce0a705ae5113684bcf5ad5d3a8a323edea3885fa6c84a7a668e660a0e24032fe63a2eb8c504128b17488aa2314e6c4fc898ae5907c34824 +LLVM.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/md5/f6a66b26dc73de147ff2f93897250b47 +LLVM.v11.0.1+0.x86_64-linux-musl-cxx03.tar.gz/sha512/403d101e35db30b3afe6f792bc8fd56fe3ca08d2a11b36243afa8f40a3889a8f0428fa0576e35385dc58bc2580163f8fbc00398d1ee82da16028a4c443c2ee2d +LLVM.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/md5/3d728c8e73961909b0af13a40d9e359b +LLVM.v11.0.1+0.x86_64-linux-musl-cxx11.tar.gz/sha512/3284e85e7d382ef857ccb6504d50588f679aebebc96da83b4d9cd37cb15d8c525b36b4772a9b9fea7f25453ca6a75e94084194f1167dbf6337c6bc52a0216d60 +LLVM.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/md5/895006761bc396e2bfc29cb2838e34b7 +LLVM.v11.0.1+0.x86_64-unknown-freebsd.tar.gz/sha512/9b10e02d2089fb48f652d3aad003a1ca0a73f89807baafa2de08c2aba886fc98b13b16ae1e4dcc739d5f697a2e09052a082ed1615d5eee62254a524c2348cffc +LLVM.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/md5/4f043db38279e19cc34a96a4997cb91f +LLVM.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/md5/4f043db38279e19cc34a96a4997cb91f +LLVM.v11.0.1+0.x86_64-w64-mingw32-cxx03.tar.gz/sha512/cdb8470d8d6100433367f8dec73861a2d9f5bf5570e21ac9fd415a03b9dd8aac33ca8c508dc42a4a36e52f7308370543c06880e80cf3cb33770fe61dbb65a32e +LLVM.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/md5/9e8c2570ae870165b4febd2cf51077d7 +LLVM.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/md5/9e8c2570ae870165b4febd2cf51077d7 +LLVM.v11.0.1+0.x86_64-w64-mingw32-cxx11.tar.gz/sha512/56c15ace14d7dceca059ef680873a2fe6a5b889c1d6a0869860d8eddef6f4bc746ffa5996950515717efe2693f3532a95bfbe089b28c0d0edc299bc9dca8a735 diff --git a/deps/csl.mk b/deps/csl.mk index b25957b9019c5..2858d9919a454 100644 --- a/deps/csl.mk +++ b/deps/csl.mk @@ -44,6 +44,7 @@ $(eval $(call copy_csl,$(call gen_libname,quadmath,0))) $(eval $(call copy_csl,$(call gen_libname,stdc++,6))) $(eval $(call copy_csl,$(call gen_libname,ssp,0))) $(eval $(call copy_csl,$(call gen_libname,atomic,1))) +$(eval $(call copy_csl,$(call gen_libname,gomp,1))) ifeq ($(OS),WINNT) # Windwos has special gcc_s names @@ -73,6 +74,7 @@ clean-csl: -rm -f $(build_shlibdir)/libpthread*$(SHLIB_EXT)* -rm -f $(build_shlibdir)/libwinpthread*$(SHLIB_EXT)* -rm -f $(build_shlibdir)/libatomic*$(SHLIB_EXT)* + -rm -f $(build_shlibdir)/libgomp*$(SHLIB_EXT)* else $(eval $(call bb-install,csl,CSL,true)) diff --git a/deps/libgit2.mk b/deps/libgit2.mk index 301e73b454c5e..82e9817134454 100644 --- a/deps/libgit2.mk +++ b/deps/libgit2.mk @@ -46,9 +46,15 @@ $(LIBGIT2_SRC_PATH)/libgit2-mbedtls-incdir.patch-applied: $(LIBGIT2_SRC_PATH)/li patch -p1 -f < $(SRCDIR)/patches/libgit2-mbedtls-incdir.patch echo 1 > $@ +$(LIBGIT2_SRC_PATH)/libgit2-hostkey.patch-applied: $(LIBGIT2_SRC_PATH)/libgit2-mbedtls-incdir.patch-applied + cd $(LIBGIT2_SRC_PATH) && \ + patch -p1 -f < $(SRCDIR)/patches/libgit2-hostkey.patch + echo 1 > $@ + $(BUILDDIR)/$(LIBGIT2_SRC_DIR)/build-configured: \ $(LIBGIT2_SRC_PATH)/libgit2-agent-nonfatal.patch-applied \ - $(LIBGIT2_SRC_PATH)/libgit2-mbedtls-incdir.patch-applied + $(LIBGIT2_SRC_PATH)/libgit2-mbedtls-incdir.patch-applied \ + $(LIBGIT2_SRC_PATH)/libgit2-hostkey.patch-applied $(BUILDDIR)/$(LIBGIT2_SRC_DIR)/build-configured: $(LIBGIT2_SRC_PATH)/source-extracted mkdir -p $(dir $@) diff --git a/deps/llvm.mk b/deps/llvm.mk index f5a4060070320..c3a3c0b4208c1 100644 --- a/deps/llvm.mk +++ b/deps/llvm.mk @@ -484,6 +484,7 @@ $(eval $(call LLVM_PATCH,llvm-julia-tsan-custom-as)) $(eval $(call LLVM_PATCH,llvm-9.0-D85499)) # landed as D85553 $(eval $(call LLVM_PATCH,llvm-D80101)) # remove for LLVM 12 $(eval $(call LLVM_PATCH,llvm-D84031)) # remove for LLVM 12 +$(eval $(call LLVM_PATCH,llvm-rGb498303066a6-gcc11-header-fix)) # remove for LLVM 12 endif # LLVM_VER 9.0 ifeq ($(LLVM_VER_SHORT),10.0) @@ -508,10 +509,13 @@ $(eval $(call LLVM_PATCH,llvm-10-unique_function_clang-sa)) ifeq ($(BUILD_LLVM_CLANG),1) $(eval $(call LLVM_PATCH,llvm-D88630-clang-cmake)) endif +$(eval $(call LLVM_PATCH,llvm-rGb498303066a6-gcc11-header-fix)) # remove for LLVM 12 endif # LLVM_VER 10.0 ifeq ($(LLVM_VER_SHORT),11.0) +ifeq ($(LLVM_VER_PATCH), 0) $(eval $(call LLVM_PATCH,llvm-D27629-AArch64-large_model_6.0.1)) # remove for LLVM 12 +endif # LLVM_VER 11.0.0 $(eval $(call LLVM_PATCH,llvm8-D34078-vectorize-fdiv)) # remove for LLVM 12 $(eval $(call LLVM_PATCH,llvm-7.0-D44650)) # replaced by D90969 for LLVM 12 $(eval $(call LLVM_PATCH,llvm-6.0-DISABLE_ABI_CHECKS)) # Needs upstreaming @@ -521,18 +525,28 @@ $(eval $(call LLVM_PATCH,llvm-11-D75072-SCEV-add-type)) $(eval $(call LLVM_PATCH,llvm-julia-tsan-custom-as)) $(eval $(call LLVM_PATCH,llvm-D80101)) # remove for LLVM 12 $(eval $(call LLVM_PATCH,llvm-D84031)) # remove for LLVM 12 +ifeq ($(LLVM_VER_PATCH), 0) $(eval $(call LLVM_PATCH,llvm-10-D85553)) # remove for LLVM 12 +endif # LLVM_VER 11.0.0 $(eval $(call LLVM_PATCH,llvm-10-unique_function_clang-sa)) # Needs upstreaming ifeq ($(BUILD_LLVM_CLANG),1) $(eval $(call LLVM_PATCH,llvm-D88630-clang-cmake)) endif +ifeq ($(LLVM_VER_PATCH), 0) $(eval $(call LLVM_PATCH,llvm-11-D85313-debuginfo-empty-arange)) # remove for LLVM 12 $(eval $(call LLVM_PATCH,llvm-11-D90722-rtdyld-absolute-relocs)) # remove for LLVM 12 +endif # LLVM_VER 11.0.0 $(eval $(call LLVM_PATCH,llvm-invalid-addrspacecast-sink)) # upstreamed as D92210 $(eval $(call LLVM_PATCH,llvm-11-D92906-ppc-setjmp)) # remove for LLVM 12 $(eval $(call LLVM_PATCH,llvm-11-PR48458-X86ISelDAGToDAG)) # remove for LLVM 12 -$(eval $(call LLVM_PATCH,llvm-11-D93092-ppc-knownbits)) +$(eval $(call LLVM_PATCH,llvm-11-D93092-ppc-knownbits)) # remove for LLVM 12 $(eval $(call LLVM_PATCH,llvm-11-D93154-globalisel-as)) +$(eval $(call LLVM_PATCH,llvm-11-ppc-half-ctr)) # remove for LLVM 12 +$(eval $(call LLVM_PATCH,llvm-11-ppc-sp-from-bp)) # remove for LLVM 12 +$(eval $(call LLVM_PATCH,llvm-rGb498303066a6-gcc11-header-fix)) # remove for LLVM 12 +$(eval $(call LLVM_PATCH,llvm-11-D94813-mergeicmps)) +$(eval $(call LLVM_PATCH,llvm-11-D94980-CTR-half)) +$(eval $(call LLVM_PATCH,llvm-11-D94058-sext-atomic-ops)) # remove for LLVM 12 endif # LLVM_VER 11.0 @@ -618,6 +632,12 @@ update-llvm: endif else # USE_BINARYBUILDER_LLVM +# We provide a way to subversively swap out which LLVM JLL we pull artifacts from +ifeq ($(LLVM_ASSERTIONS), 1) +LLVM_JLL_DOWNLOAD_NAME := libLLVM_assert +LLVM_JLL_VER := $(LLVM_ASSERT_JLL_VER) +endif + $(eval $(call bb-install,llvm,LLVM,false,true)) $(eval $(call bb-install,clang,CLANG,false,true)) $(eval $(call bb-install,llvm-tools,LLVM_TOOLS,false,true)) diff --git a/deps/mbedtls.mk b/deps/mbedtls.mk index 494771466ad00..83085ed2d2709 100644 --- a/deps/mbedtls.mk +++ b/deps/mbedtls.mk @@ -24,7 +24,7 @@ $(SRCCACHE)/$(MBEDTLS_SRC)/source-extracted: $(SRCCACHE)/$(MBEDTLS_SRC).tar.gz mkdir -p $(dir $@) && \ $(TAR) -C $(dir $@) --strip-components 1 -xf $< # Force-enable MD4 - sed "s|//#define MBEDTLS_MD4_C|#define MBEDTLS_MD4_C|" -i $(SRCCACHE)/$(MBEDTLS_SRC)/include/mbedtls/config.h + sed -i.org "s|//#define MBEDTLS_MD4_C|#define MBEDTLS_MD4_C|" $(SRCCACHE)/$(MBEDTLS_SRC)/include/mbedtls/config.h touch -c $(SRCCACHE)/$(MBEDTLS_SRC)/CMakeLists.txt # old target echo 1 > $@ @@ -37,7 +37,7 @@ $(SRCCACHE)/$(MBEDTLS_SRC)/mbedtls-cmake-findpy.patch-applied: $(SRCCACHE)/$(MBE # are it will be included at least in their next minor release (2.26.0?). cd $(SRCCACHE)/$(MBEDTLS_SRC) && \ patch -p1 -f < $(SRCDIR)/patches/mbedtls-cmake-findpy.patch - echo 1 > @$ + echo 1 > $@ $(BUILDDIR)/$(MBEDTLS_SRC)/build-configured: \ $(SRCCACHE)/$(MBEDTLS_SRC)/mbedtls-cmake-findpy.patch-applied diff --git a/deps/patches/libgit2-hostkey.patch b/deps/patches/libgit2-hostkey.patch new file mode 100644 index 0000000000000..f07d4d1e0a116 --- /dev/null +++ b/deps/patches/libgit2-hostkey.patch @@ -0,0 +1,61 @@ +diff --git a/include/git2/cert.h b/include/git2/cert.h +index e8cd2d180..54293cd31 100644 +--- a/include/git2/cert.h ++++ b/include/git2/cert.h +@@ -111,6 +111,14 @@ typedef struct { + * have the SHA-256 hash of the hostkey. + */ + unsigned char hash_sha256[32]; ++ ++ /** ++ * Hostkey itself. ++ */ ++ int hostkey_type; ++ size_t hostkey_len; ++ unsigned char hostkey[1024]; ++ + } git_cert_hostkey; + + /** +diff --git a/src/transports/ssh.c b/src/transports/ssh.c +index f4ed05bb1..ec6366a5f 100644 +--- a/src/transports/ssh.c ++++ b/src/transports/ssh.c +@@ -523,6 +523,7 @@ static int _git_ssh_setup_conn( + git_credential *cred = NULL; + LIBSSH2_SESSION* session=NULL; + LIBSSH2_CHANNEL* channel=NULL; ++ char *host_and_port; + + t->current_stream = NULL; + +@@ -566,6 +567,12 @@ post_extract: + + cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2; + ++ key = libssh2_session_hostkey(session, &cert.hostkey_len, &cert.hostkey_type); ++ bzero(&cert.hostkey, sizeof(cert.hostkey)); ++ if (cert.hostkey_len > sizeof(cert.hostkey)) ++ cert.hostkey_len = sizeof(cert.hostkey); ++ memcpy(&cert.hostkey, key, cert.hostkey_len); ++ + #ifdef LIBSSH2_HOSTKEY_HASH_SHA256 + key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256); + if (key != NULL) { +@@ -597,7 +604,15 @@ post_extract: + + cert_ptr = &cert; + +- error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, urldata.host, t->owner->message_cb_payload); ++ if (atoi(urldata.port) == SSH_DEFAULT_PORT) { ++ host_and_port = urldata.host; ++ } else { ++ size_t n = strlen(urldata.host) + strlen(urldata.port) + 2; ++ host_and_port = alloca(n); ++ sprintf(host_and_port, "%s:%s", urldata.host, urldata.port); ++ } ++ ++ error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, host_and_port, t->owner->message_cb_payload); + + if (error < 0 && error != GIT_PASSTHROUGH) { + if (!git_error_last()) diff --git a/deps/patches/llvm-11-D93092-ppc-knownbits.patch b/deps/patches/llvm-11-D93092-ppc-knownbits.patch index a4ebecafc82a9..47e6f743ddefd 100644 --- a/deps/patches/llvm-11-D93092-ppc-knownbits.patch +++ b/deps/patches/llvm-11-D93092-ppc-knownbits.patch @@ -1,8 +1,8 @@ -From 8bec64e2c0386934d4e38344907f0f4b0de4d8a3 Mon Sep 17 00:00:00 2001 -From: Valentin Churavy -Date: Tue, 15 Dec 2020 09:59:18 -0500 -Subject: [PATCH] [PowerPC] KnownBits should be constant when performing - non-sign comparison +From b5a0e6ca2b0c6367b082dd9a77b02c26607c8d7d Mon Sep 17 00:00:00 2001 +From: Kai Luo +Date: Tue, 29 Dec 2020 12:11:55 +0000 +Subject: [PATCH 2/4] [PowerPC] Remaining KnownBits should be constant when + performing non-sign comparison In `PPCTargetLowering::DAGCombineTruncBoolExt`, when checking if it's correct to perform the transformation for non-sign comparison, as the comment says ``` @@ -23,20 +23,30 @@ Bit 4, besides bit 0, is still unknown and affects the final result. This patch fixes https://bugs.llvm.org/show_bug.cgi?id=48388. +Reviewed By: nemanjai, #powerpc + Differential Revision: https://reviews.llvm.org/D93092 --- - llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 3 +- - llvm/test/CodeGen/PowerPC/pr48388.ll | 42 +++++++++++++++++++++ - 2 files changed, 44 insertions(+), 1 deletion(-) + llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 10 +++-- + llvm/test/CodeGen/PowerPC/pr48388.ll | 41 +++++++++++++++++++++ + 2 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 llvm/test/CodeGen/PowerPC/pr48388.ll diff --git llvm/lib/Target/PowerPC/PPCISelLowering.cpp llvm/lib/Target/PowerPC/PPCISelLowering.cpp -index f54f1673526d..76b32db44656 100644 +index f54f1673526d..38dbff4197b9 100644 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp -@@ -13291,7 +13291,8 @@ SDValue PPCTargetLowering::DAGCombineTruncBoolExt(SDNode *N, - Op1Known.Zero.clearBit(0); Op1Known.One.clearBit(0); - Op2Known.Zero.clearBit(0); Op2Known.One.clearBit(0); +@@ -13287,11 +13287,13 @@ SDValue PPCTargetLowering::DAGCombineTruncBoolExt(SDNode *N, + KnownBits Op2Known = DAG.computeKnownBits(N->getOperand(1)); + + // We don't really care about what is known about the first bit (if +- // anything), so clear it in all masks prior to comparing them. +- Op1Known.Zero.clearBit(0); Op1Known.One.clearBit(0); +- Op2Known.Zero.clearBit(0); Op2Known.One.clearBit(0); ++ // anything), so pretend that it is known zero for both to ensure they can ++ // be compared as constants. ++ Op1Known.Zero.setBit(0); Op1Known.One.clearBit(0); ++ Op2Known.Zero.setBit(0); Op2Known.One.clearBit(0); - if (Op1Known.Zero != Op2Known.Zero || Op1Known.One != Op2Known.One) + if (!Op1Known.isConstant() || !Op2Known.isConstant() || @@ -46,10 +56,10 @@ index f54f1673526d..76b32db44656 100644 } diff --git llvm/test/CodeGen/PowerPC/pr48388.ll llvm/test/CodeGen/PowerPC/pr48388.ll new file mode 100644 -index 000000000000..138fb6147832 +index 000000000000..822e5d852317 --- /dev/null +++ llvm/test/CodeGen/PowerPC/pr48388.ll -@@ -0,0 +1,42 @@ +@@ -0,0 +1,41 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le -ppc-asm-full-reg-names \ +; RUN: < %s | FileCheck %s @@ -58,13 +68,12 @@ index 000000000000..138fb6147832 +; CHECK-LABEL: julia_div_i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: divd r6, r3, r4 -+; CHECK-NEXT: li r5, 32767 -+; CHECK-NEXT: sldi r5, r5, 32 -+; CHECK-NEXT: oris r7, r5, 40069 -+; CHECK-NEXT: oris r5, r5, 40079 ++; CHECK-NEXT: lis r5, -1592 ++; CHECK-NEXT: ori r7, r5, 21321 ++; CHECK-NEXT: ori r5, r5, 65519 +; CHECK-NEXT: cmpdi r3, 0 -+; CHECK-NEXT: ori r7, r7, 13456 -+; CHECK-NEXT: ori r5, r5, 65264 ++; CHECK-NEXT: rldic r7, r7, 4, 17 ++; CHECK-NEXT: rldic r5, r5, 4, 17 +; CHECK-NEXT: iselgt r9, r5, r7 +; CHECK-NEXT: cmpdi r4, 0 +; CHECK-NEXT: mulld r8, r6, r4 @@ -93,5 +102,5 @@ index 000000000000..138fb6147832 + ret i64 %12 +} -- -2.29.2 +2.30.0 diff --git a/deps/patches/llvm-11-D94058-sext-atomic-ops.patch b/deps/patches/llvm-11-D94058-sext-atomic-ops.patch new file mode 100644 index 0000000000000..732ae2b2b143a --- /dev/null +++ b/deps/patches/llvm-11-D94058-sext-atomic-ops.patch @@ -0,0 +1,1201 @@ +From b46706e1d5307d98a5a4895380f91380a0987ded Mon Sep 17 00:00:00 2001 +From: Nemanja Ivanovic +Date: Mon, 18 Jan 2021 21:19:11 -0600 +Subject: [PATCH] [PowerPC] Sign extend comparison operand for signed atomic + comparisons + +As of 8dacca943af8a53a23b1caf3142d10fb4a77b645, we sign extend the atomic loaded +operand for signed subword comparisons. However, the assumption that the other +operand is correctly sign extended doesn't always hold. This patch sign extends +the other operand if it needs to be sign extended. + +This is a second fix for https://bugs.llvm.org/show_bug.cgi?id=30451 + +Differential revision: https://reviews.llvm.org/D94058 +--- + llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 79 +++- + .../CodeGen/PowerPC/atomics-regression.ll | 440 ++++++++++-------- + llvm/test/CodeGen/PowerPC/sign-ext-atomics.ll | 105 +++++ + 3 files changed, 418 insertions(+), 206 deletions(-) + create mode 100644 llvm/test/CodeGen/PowerPC/sign-ext-atomics.ll + +diff --git llvm/lib/Target/PowerPC/PPCISelLowering.cpp llvm/lib/Target/PowerPC/PPCISelLowering.cpp +index f54f1673526d..867ef24ea53b 100644 +--- llvm/lib/Target/PowerPC/PPCISelLowering.cpp ++++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp +@@ -11444,17 +11444,88 @@ PPCTargetLowering::EmitAtomicBinary(MachineInstr &MI, MachineBasicBlock *BB, + return BB; + } + ++static bool isSignExtended(MachineInstr &MI, const PPCInstrInfo *TII) { ++ switch(MI.getOpcode()) { ++ default: ++ return false; ++ case PPC::COPY: ++ return TII->isSignExtended(MI); ++ case PPC::LHA: ++ case PPC::LHA8: ++ case PPC::LHAU: ++ case PPC::LHAU8: ++ case PPC::LHAUX: ++ case PPC::LHAUX8: ++ case PPC::LHAX: ++ case PPC::LHAX8: ++ case PPC::LWA: ++ case PPC::LWAUX: ++ case PPC::LWAX: ++ case PPC::LWAX_32: ++ case PPC::LWA_32: ++ case PPC::PLHA: ++ case PPC::PLHA8: ++ case PPC::PLHA8pc: ++ case PPC::PLHApc: ++ case PPC::PLWA: ++ case PPC::PLWA8: ++ case PPC::PLWA8pc: ++ case PPC::PLWApc: ++ case PPC::EXTSB: ++ case PPC::EXTSB8: ++ case PPC::EXTSB8_32_64: ++ case PPC::EXTSB8_rec: ++ case PPC::EXTSB_rec: ++ case PPC::EXTSH: ++ case PPC::EXTSH8: ++ case PPC::EXTSH8_32_64: ++ case PPC::EXTSH8_rec: ++ case PPC::EXTSH_rec: ++ case PPC::EXTSW: ++ case PPC::EXTSWSLI: ++ case PPC::EXTSWSLI_32_64: ++ case PPC::EXTSWSLI_32_64_rec: ++ case PPC::EXTSWSLI_rec: ++ case PPC::EXTSW_32: ++ case PPC::EXTSW_32_64: ++ case PPC::EXTSW_32_64_rec: ++ case PPC::EXTSW_rec: ++ case PPC::SRAW: ++ case PPC::SRAWI: ++ case PPC::SRAWI_rec: ++ case PPC::SRAW_rec: ++ return true; ++ } ++ return false; ++} ++ + MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary( + MachineInstr &MI, MachineBasicBlock *BB, + bool is8bit, // operation + unsigned BinOpcode, unsigned CmpOpcode, unsigned CmpPred) const { ++ // This also handles ATOMIC_SWAP, indicated by BinOpcode==0. ++ const PPCInstrInfo *TII = Subtarget.getInstrInfo(); ++ ++ // If this is a signed comparison and the value being compared is not known ++ // to be sign extended, sign extend it here. ++ DebugLoc dl = MI.getDebugLoc(); ++ MachineFunction *F = BB->getParent(); ++ MachineRegisterInfo &RegInfo = F->getRegInfo(); ++ Register incr = MI.getOperand(3).getReg(); ++ bool IsSignExtended = Register::isVirtualRegister(incr) && ++ isSignExtended(*RegInfo.getVRegDef(incr), TII); ++ ++ if (CmpOpcode == PPC::CMPW && !IsSignExtended) { ++ Register ValueReg = RegInfo.createVirtualRegister(&PPC::GPRCRegClass); ++ BuildMI(*BB, MI, dl, TII->get(is8bit ? PPC::EXTSB : PPC::EXTSH), ValueReg) ++ .addReg(MI.getOperand(3).getReg()); ++ MI.getOperand(3).setReg(ValueReg); ++ } + // If we support part-word atomic mnemonics, just use them + if (Subtarget.hasPartwordAtomics()) + return EmitAtomicBinary(MI, BB, is8bit ? 1 : 2, BinOpcode, CmpOpcode, + CmpPred); + +- // This also handles ATOMIC_SWAP, indicated by BinOpcode==0. +- const TargetInstrInfo *TII = Subtarget.getInstrInfo(); + // In 64 bit mode we have to use 64 bits for addresses, even though the + // lwarx/stwcx are 32 bits. With the 32-bit atomics we can use address + // registers without caring whether they're 32 or 64, but here we're +@@ -11464,14 +11535,11 @@ MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary( + unsigned ZeroReg = is64bit ? PPC::ZERO8 : PPC::ZERO; + + const BasicBlock *LLVM_BB = BB->getBasicBlock(); +- MachineFunction *F = BB->getParent(); + MachineFunction::iterator It = ++BB->getIterator(); + + Register dest = MI.getOperand(0).getReg(); + Register ptrA = MI.getOperand(1).getReg(); + Register ptrB = MI.getOperand(2).getReg(); +- Register incr = MI.getOperand(3).getReg(); +- DebugLoc dl = MI.getDebugLoc(); + + MachineBasicBlock *loopMBB = F->CreateMachineBasicBlock(LLVM_BB); + MachineBasicBlock *loop2MBB = +@@ -11485,7 +11553,6 @@ MachineBasicBlock *PPCTargetLowering::EmitPartwordAtomicBinary( + std::next(MachineBasicBlock::iterator(MI)), BB->end()); + exitMBB->transferSuccessorsAndUpdatePHIs(BB); + +- MachineRegisterInfo &RegInfo = F->getRegInfo(); + const TargetRegisterClass *RC = + is64bit ? &PPC::G8RCRegClass : &PPC::GPRCRegClass; + const TargetRegisterClass *GPRC = &PPC::GPRCRegClass; +diff --git llvm/test/CodeGen/PowerPC/atomics-regression.ll llvm/test/CodeGen/PowerPC/atomics-regression.ll +index ae79f82e1e06..3b7caeee91e4 100644 +--- llvm/test/CodeGen/PowerPC/atomics-regression.ll ++++ llvm/test/CodeGen/PowerPC/atomics-regression.ll +@@ -4352,16 +4352,17 @@ define i64 @test259(i64* %ptr, i64 %val) { + define i8 @test260(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test260: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB260_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB260_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB260_1 + ; PPC64LE-NEXT: .LBB260_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val monotonic + ret i8 %ret +@@ -4370,16 +4371,17 @@ define i8 @test260(i8* %ptr, i8 %val) { + define i8 @test261(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test261: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB261_1: +-; PPC64LE-NEXT: lbarx 3, 0, 5 +-; PPC64LE-NEXT: extsb 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB261_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 5 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB261_1 + ; PPC64LE-NEXT: .LBB261_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val acquire +@@ -4389,17 +4391,18 @@ define i8 @test261(i8* %ptr, i8 %val) { + define i8 @test262(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test262: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB262_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB262_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB262_1 + ; PPC64LE-NEXT: .LBB262_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val release + ret i8 %ret +@@ -4408,17 +4411,18 @@ define i8 @test262(i8* %ptr, i8 %val) { + define i8 @test263(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test263: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB263_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB263_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB263_1 + ; PPC64LE-NEXT: .LBB263_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val acq_rel +@@ -4428,17 +4432,18 @@ define i8 @test263(i8* %ptr, i8 %val) { + define i8 @test264(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test264: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB264_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB264_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB264_1 + ; PPC64LE-NEXT: .LBB264_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val seq_cst +@@ -4448,16 +4453,17 @@ define i8 @test264(i8* %ptr, i8 %val) { + define i16 @test265(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test265: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB265_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB265_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB265_1 + ; PPC64LE-NEXT: .LBB265_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val monotonic + ret i16 %ret +@@ -4466,16 +4472,17 @@ define i16 @test265(i16* %ptr, i16 %val) { + define i16 @test266(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test266: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB266_1: +-; PPC64LE-NEXT: lharx 3, 0, 5 +-; PPC64LE-NEXT: extsh 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB266_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 5 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB266_1 + ; PPC64LE-NEXT: .LBB266_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val acquire +@@ -4485,17 +4492,18 @@ define i16 @test266(i16* %ptr, i16 %val) { + define i16 @test267(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test267: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB267_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB267_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB267_1 + ; PPC64LE-NEXT: .LBB267_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val release + ret i16 %ret +@@ -4504,17 +4512,18 @@ define i16 @test267(i16* %ptr, i16 %val) { + define i16 @test268(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test268: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB268_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB268_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB268_1 + ; PPC64LE-NEXT: .LBB268_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val acq_rel +@@ -4524,17 +4533,18 @@ define i16 @test268(i16* %ptr, i16 %val) { + define i16 @test269(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test269: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB269_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB269_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB269_1 + ; PPC64LE-NEXT: .LBB269_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val seq_cst +@@ -4726,16 +4736,17 @@ define i64 @test279(i64* %ptr, i64 %val) { + define i8 @test280(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test280: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB280_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB280_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB280_1 + ; PPC64LE-NEXT: .LBB280_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val monotonic + ret i8 %ret +@@ -4744,16 +4755,17 @@ define i8 @test280(i8* %ptr, i8 %val) { + define i8 @test281(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test281: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB281_1: +-; PPC64LE-NEXT: lbarx 3, 0, 5 +-; PPC64LE-NEXT: extsb 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB281_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 5 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB281_1 + ; PPC64LE-NEXT: .LBB281_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val acquire +@@ -4763,17 +4775,18 @@ define i8 @test281(i8* %ptr, i8 %val) { + define i8 @test282(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test282: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB282_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB282_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB282_1 + ; PPC64LE-NEXT: .LBB282_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val release + ret i8 %ret +@@ -4782,17 +4795,18 @@ define i8 @test282(i8* %ptr, i8 %val) { + define i8 @test283(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test283: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB283_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB283_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB283_1 + ; PPC64LE-NEXT: .LBB283_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val acq_rel +@@ -4802,17 +4816,18 @@ define i8 @test283(i8* %ptr, i8 %val) { + define i8 @test284(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test284: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB284_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB284_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB284_1 + ; PPC64LE-NEXT: .LBB284_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val seq_cst +@@ -4822,16 +4837,17 @@ define i8 @test284(i8* %ptr, i8 %val) { + define i16 @test285(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test285: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB285_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB285_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB285_1 + ; PPC64LE-NEXT: .LBB285_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val monotonic + ret i16 %ret +@@ -4840,16 +4856,17 @@ define i16 @test285(i16* %ptr, i16 %val) { + define i16 @test286(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test286: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB286_1: +-; PPC64LE-NEXT: lharx 3, 0, 5 +-; PPC64LE-NEXT: extsh 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB286_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 5 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB286_1 + ; PPC64LE-NEXT: .LBB286_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val acquire +@@ -4859,17 +4876,18 @@ define i16 @test286(i16* %ptr, i16 %val) { + define i16 @test287(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test287: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB287_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB287_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB287_1 + ; PPC64LE-NEXT: .LBB287_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val release + ret i16 %ret +@@ -4878,17 +4896,18 @@ define i16 @test287(i16* %ptr, i16 %val) { + define i16 @test288(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test288: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB288_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB288_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB288_1 + ; PPC64LE-NEXT: .LBB288_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val acq_rel +@@ -4898,17 +4917,18 @@ define i16 @test288(i16* %ptr, i16 %val) { + define i16 @test289(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test289: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB289_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB289_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB289_1 + ; PPC64LE-NEXT: .LBB289_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val seq_cst +@@ -8076,16 +8096,17 @@ define i64 @test479(i64* %ptr, i64 %val) { + define i8 @test480(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test480: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB480_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB480_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB480_1 + ; PPC64LE-NEXT: .LBB480_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val syncscope("singlethread") monotonic + ret i8 %ret +@@ -8094,16 +8115,17 @@ define i8 @test480(i8* %ptr, i8 %val) { + define i8 @test481(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test481: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB481_1: +-; PPC64LE-NEXT: lbarx 3, 0, 5 +-; PPC64LE-NEXT: extsb 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB481_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 5 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB481_1 + ; PPC64LE-NEXT: .LBB481_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val syncscope("singlethread") acquire +@@ -8113,17 +8135,18 @@ define i8 @test481(i8* %ptr, i8 %val) { + define i8 @test482(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test482: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB482_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB482_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB482_1 + ; PPC64LE-NEXT: .LBB482_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val syncscope("singlethread") release + ret i8 %ret +@@ -8132,17 +8155,18 @@ define i8 @test482(i8* %ptr, i8 %val) { + define i8 @test483(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test483: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB483_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB483_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB483_1 + ; PPC64LE-NEXT: .LBB483_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val syncscope("singlethread") acq_rel +@@ -8152,17 +8176,18 @@ define i8 @test483(i8* %ptr, i8 %val) { + define i8 @test484(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test484: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB484_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB484_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB484_1 + ; PPC64LE-NEXT: .LBB484_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i8* %ptr, i8 %val syncscope("singlethread") seq_cst +@@ -8172,16 +8197,17 @@ define i8 @test484(i8* %ptr, i8 %val) { + define i16 @test485(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test485: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB485_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB485_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB485_1 + ; PPC64LE-NEXT: .LBB485_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val syncscope("singlethread") monotonic + ret i16 %ret +@@ -8190,16 +8216,17 @@ define i16 @test485(i16* %ptr, i16 %val) { + define i16 @test486(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test486: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB486_1: +-; PPC64LE-NEXT: lharx 3, 0, 5 +-; PPC64LE-NEXT: extsh 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB486_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 5 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB486_1 + ; PPC64LE-NEXT: .LBB486_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val syncscope("singlethread") acquire +@@ -8209,17 +8236,18 @@ define i16 @test486(i16* %ptr, i16 %val) { + define i16 @test487(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test487: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB487_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB487_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB487_1 + ; PPC64LE-NEXT: .LBB487_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val syncscope("singlethread") release + ret i16 %ret +@@ -8228,17 +8256,18 @@ define i16 @test487(i16* %ptr, i16 %val) { + define i16 @test488(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test488: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB488_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB488_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB488_1 + ; PPC64LE-NEXT: .LBB488_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val syncscope("singlethread") acq_rel +@@ -8248,17 +8277,18 @@ define i16 @test488(i16* %ptr, i16 %val) { + define i16 @test489(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test489: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB489_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: ble 0, .LBB489_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB489_1 + ; PPC64LE-NEXT: .LBB489_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw max i16* %ptr, i16 %val syncscope("singlethread") seq_cst +@@ -8450,16 +8480,17 @@ define i64 @test499(i64* %ptr, i64 %val) { + define i8 @test500(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test500: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB500_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB500_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB500_1 + ; PPC64LE-NEXT: .LBB500_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val syncscope("singlethread") monotonic + ret i8 %ret +@@ -8468,16 +8499,17 @@ define i8 @test500(i8* %ptr, i8 %val) { + define i8 @test501(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test501: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: .LBB501_1: +-; PPC64LE-NEXT: lbarx 3, 0, 5 +-; PPC64LE-NEXT: extsb 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB501_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 5 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB501_1 + ; PPC64LE-NEXT: .LBB501_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val syncscope("singlethread") acquire +@@ -8487,17 +8519,18 @@ define i8 @test501(i8* %ptr, i8 %val) { + define i8 @test502(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test502: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB502_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB502_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB502_1 + ; PPC64LE-NEXT: .LBB502_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val syncscope("singlethread") release + ret i8 %ret +@@ -8506,17 +8539,18 @@ define i8 @test502(i8* %ptr, i8 %val) { + define i8 @test503(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test503: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB503_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB503_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB503_1 + ; PPC64LE-NEXT: .LBB503_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val syncscope("singlethread") acq_rel +@@ -8526,17 +8560,18 @@ define i8 @test503(i8* %ptr, i8 %val) { + define i8 @test504(i8* %ptr, i8 %val) { + ; PPC64LE-LABEL: test504: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsb 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB504_1: +-; PPC64LE-NEXT: lbarx 5, 0, 3 +-; PPC64LE-NEXT: extsb 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lbarx 4, 0, 3 ++; PPC64LE-NEXT: extsb 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB504_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: stbcx. 4, 0, 3 ++; PPC64LE-NEXT: stbcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB504_1 + ; PPC64LE-NEXT: .LBB504_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i8* %ptr, i8 %val syncscope("singlethread") seq_cst +@@ -8546,16 +8581,17 @@ define i8 @test504(i8* %ptr, i8 %val) { + define i16 @test505(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test505: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB505_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB505_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB505_1 + ; PPC64LE-NEXT: .LBB505_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val syncscope("singlethread") monotonic + ret i16 %ret +@@ -8564,16 +8600,17 @@ define i16 @test505(i16* %ptr, i16 %val) { + define i16 @test506(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test506: + ; PPC64LE: # %bb.0: +-; PPC64LE-NEXT: mr 5, 3 ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: .LBB506_1: +-; PPC64LE-NEXT: lharx 3, 0, 5 +-; PPC64LE-NEXT: extsh 6, 3 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB506_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 5 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB506_1 + ; PPC64LE-NEXT: .LBB506_3: ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val syncscope("singlethread") acquire +@@ -8583,17 +8620,18 @@ define i16 @test506(i16* %ptr, i16 %val) { + define i16 @test507(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test507: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB507_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB507_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB507_1 + ; PPC64LE-NEXT: .LBB507_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val syncscope("singlethread") release + ret i16 %ret +@@ -8602,17 +8640,18 @@ define i16 @test507(i16* %ptr, i16 %val) { + define i16 @test508(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test508: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: .LBB508_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB508_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB508_1 + ; PPC64LE-NEXT: .LBB508_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val syncscope("singlethread") acq_rel +@@ -8622,17 +8661,18 @@ define i16 @test508(i16* %ptr, i16 %val) { + define i16 @test509(i16* %ptr, i16 %val) { + ; PPC64LE-LABEL: test509: + ; PPC64LE: # %bb.0: ++; PPC64LE-NEXT: extsh 5, 4 + ; PPC64LE-NEXT: sync + ; PPC64LE-NEXT: .LBB509_1: +-; PPC64LE-NEXT: lharx 5, 0, 3 +-; PPC64LE-NEXT: extsh 6, 5 +-; PPC64LE-NEXT: cmpw 4, 6 ++; PPC64LE-NEXT: lharx 4, 0, 3 ++; PPC64LE-NEXT: extsh 6, 4 ++; PPC64LE-NEXT: cmpw 5, 6 + ; PPC64LE-NEXT: bge 0, .LBB509_3 + ; PPC64LE-NEXT: # %bb.2: +-; PPC64LE-NEXT: sthcx. 4, 0, 3 ++; PPC64LE-NEXT: sthcx. 5, 0, 3 + ; PPC64LE-NEXT: bne 0, .LBB509_1 + ; PPC64LE-NEXT: .LBB509_3: +-; PPC64LE-NEXT: mr 3, 5 ++; PPC64LE-NEXT: mr 3, 4 + ; PPC64LE-NEXT: lwsync + ; PPC64LE-NEXT: blr + %ret = atomicrmw min i16* %ptr, i16 %val syncscope("singlethread") seq_cst +diff --git llvm/test/CodeGen/PowerPC/sign-ext-atomics.ll llvm/test/CodeGen/PowerPC/sign-ext-atomics.ll +new file mode 100644 +index 000000000000..7716dc0cedcc +--- /dev/null ++++ llvm/test/CodeGen/PowerPC/sign-ext-atomics.ll +@@ -0,0 +1,105 @@ ++; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ++; RUN: llc -mtriple=powerpc64le-linux-gnu < %s | FileCheck %s ++define i16 @SEXTParam(i16 signext %0) #0 { ++; CHECK-LABEL: SEXTParam: ++; CHECK: # %bb.0: # %top ++; CHECK-NEXT: li 4, 0 ++; CHECK-NEXT: sth 4, -4(1) ++; CHECK-NEXT: addi 4, 1, -4 ++; CHECK-NEXT: lwsync ++; CHECK-NEXT: .LBB0_1: # %top ++; CHECK-NEXT: # ++; CHECK-NEXT: lharx 5, 0, 4 ++; CHECK-NEXT: extsh 5, 5 ++; CHECK-NEXT: cmpw 3, 5 ++; CHECK-NEXT: bge 0, .LBB0_3 ++; CHECK-NEXT: # %bb.2: # %top ++; CHECK-NEXT: # ++; CHECK-NEXT: sthcx. 3, 0, 4 ++; CHECK-NEXT: bne 0, .LBB0_1 ++; CHECK-NEXT: .LBB0_3: # %top ++; CHECK-NEXT: lwsync ++; CHECK-NEXT: lhz 3, -4(1) ++; CHECK-NEXT: cmpd 7, 3, 3 ++; CHECK-NEXT: bne- 7, .+4 ++; CHECK-NEXT: isync ++; CHECK-NEXT: blr ++top: ++ %1 = alloca i16, align 4 ++ %2 = bitcast i16* %1 to i8* ++ store i16 0, i16* %1, align 4 ++ %rv.i = atomicrmw min i16* %1, i16 %0 acq_rel ++ %rv.i2 = load atomic i16, i16* %1 acquire, align 16 ++ ret i16 %rv.i2 ++} ++ ++define i16 @noSEXTParam(i16 %0) #0 { ++; CHECK-LABEL: noSEXTParam: ++; CHECK: # %bb.0: # %top ++; CHECK-NEXT: li 4, 0 ++; CHECK-NEXT: extsh 3, 3 ++; CHECK-NEXT: sth 4, -4(1) ++; CHECK-NEXT: addi 4, 1, -4 ++; CHECK-NEXT: lwsync ++; CHECK-NEXT: .LBB1_1: # %top ++; CHECK-NEXT: # ++; CHECK-NEXT: lharx 5, 0, 4 ++; CHECK-NEXT: extsh 5, 5 ++; CHECK-NEXT: cmpw 3, 5 ++; CHECK-NEXT: bge 0, .LBB1_3 ++; CHECK-NEXT: # %bb.2: # %top ++; CHECK-NEXT: # ++; CHECK-NEXT: sthcx. 3, 0, 4 ++; CHECK-NEXT: bne 0, .LBB1_1 ++; CHECK-NEXT: .LBB1_3: # %top ++; CHECK-NEXT: lwsync ++; CHECK-NEXT: lhz 3, -4(1) ++; CHECK-NEXT: cmpd 7, 3, 3 ++; CHECK-NEXT: bne- 7, .+4 ++; CHECK-NEXT: isync ++; CHECK-NEXT: blr ++top: ++ %1 = alloca i16, align 4 ++ %2 = bitcast i16* %1 to i8* ++ store i16 0, i16* %1, align 4 ++ %rv.i = atomicrmw min i16* %1, i16 %0 acq_rel ++ %rv.i2 = load atomic i16, i16* %1 acquire, align 16 ++ ret i16 %rv.i2 ++} ++ ++define i16 @noSEXTLoad(i16 *%p) #0 { ++; CHECK-LABEL: noSEXTLoad: ++; CHECK: # %bb.0: # %top ++; CHECK-NEXT: lhz 5, 0(3) ++; CHECK-NEXT: li 4, 0 ++; CHECK-NEXT: addi 3, 1, -4 ++; CHECK-NEXT: sth 4, -4(1) ++; CHECK-NEXT: extsh 4, 5 ++; CHECK-NEXT: lwsync ++; CHECK-NEXT: .LBB2_1: # %top ++; CHECK-NEXT: # ++; CHECK-NEXT: lharx 5, 0, 3 ++; CHECK-NEXT: extsh 5, 5 ++; CHECK-NEXT: cmpw 4, 5 ++; CHECK-NEXT: bge 0, .LBB2_3 ++; CHECK-NEXT: # %bb.2: # %top ++; CHECK-NEXT: # ++; CHECK-NEXT: sthcx. 4, 0, 3 ++; CHECK-NEXT: bne 0, .LBB2_1 ++; CHECK-NEXT: .LBB2_3: # %top ++; CHECK-NEXT: lwsync ++; CHECK-NEXT: lhz 3, -4(1) ++; CHECK-NEXT: cmpd 7, 3, 3 ++; CHECK-NEXT: bne- 7, .+4 ++; CHECK-NEXT: isync ++; CHECK-NEXT: blr ++top: ++ %0 = load i16, i16* %p, align 2 ++ %1 = alloca i16, align 4 ++ %2 = bitcast i16* %1 to i8* ++ store i16 0, i16* %1, align 4 ++ %rv.i = atomicrmw min i16* %1, i16 %0 acq_rel ++ %rv.i2 = load atomic i16, i16* %1 acquire, align 16 ++ ret i16 %rv.i2 ++} ++attributes #0 = { nounwind } +-- +2.30.0 + diff --git a/deps/patches/llvm-11-D94813-mergeicmps.patch b/deps/patches/llvm-11-D94813-mergeicmps.patch new file mode 100644 index 0000000000000..5eb98be41cbe5 --- /dev/null +++ b/deps/patches/llvm-11-D94813-mergeicmps.patch @@ -0,0 +1,111 @@ +From 5fda6724d697d428136266a61159a46c5da092f0 Mon Sep 17 00:00:00 2001 +From: Valentin Churavy +Date: Sat, 16 Jan 2021 17:36:09 -0500 +Subject: [PATCH] [MergeICmps] Don't merge icmps derived from pointers with + addressspaces + +IIUC we can't emit `memcmp` between pointers in addressspaces, +doing so will trigger an assertion since the signature of the memcmp +will not match it's arguments (https://bugs.llvm.org/show_bug.cgi?id=48661). + +This PR disables the attempt to merge icmps, +when the pointer is in an addressspace. + +Differential Revision: https://reviews.llvm.org/D94813 +--- + llvm/lib/Transforms/Scalar/MergeICmps.cpp | 4 ++ + .../Transforms/MergeICmps/addressspaces.ll | 67 +++++++++++++++++++ + 2 files changed, 71 insertions(+) + create mode 100644 llvm/test/Transforms/MergeICmps/addressspaces.ll + +diff --git llvm/lib/Transforms/Scalar/MergeICmps.cpp llvm/lib/Transforms/Scalar/MergeICmps.cpp +index 1559e7a41a7c..621c9e504398 100644 +--- llvm/lib/Transforms/Scalar/MergeICmps.cpp ++++ llvm/lib/Transforms/Scalar/MergeICmps.cpp +@@ -154,6 +154,10 @@ BCEAtom visitICmpLoadOperand(Value *const Val, BaseIdentifier &BaseId) { + return {}; + } + Value *const Addr = LoadI->getOperand(0); ++ if (Addr->getType()->getPointerAddressSpace() != 0) { ++ LLVM_DEBUG(dbgs() << "from non-zero AddressSpace\n"); ++ return {}; ++ } + auto *const GEP = dyn_cast(Addr); + if (!GEP) + return {}; +diff --git llvm/test/Transforms/MergeICmps/addressspaces.ll llvm/test/Transforms/MergeICmps/addressspaces.ll +new file mode 100644 +index 000000000000..9a74b4a5b2ca +--- /dev/null ++++ llvm/test/Transforms/MergeICmps/addressspaces.ll +@@ -0,0 +1,67 @@ ++; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ++; RUN: opt < %s -mergeicmps -S | FileCheck %s ++ ++source_filename = "==" ++target datalayout = "e-m:e-i64:64-n32:64" ++target triple = "powerpc64le-unknown-linux-gnu" ++ ++define void @juliaAS([2 x [5 x i64]] addrspace(11)* nocapture nonnull readonly align 8 dereferenceable(80) %0, [2 x [5 x i64]] addrspace(11)* nocapture nonnull readonly align 8 dereferenceable(80) %1) { ++; CHECK-LABEL: @juliaAS( ++; CHECK-NEXT: top: ++; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* [[TMP0:%.*]], i64 0, i64 1, i64 2 ++; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* [[TMP0]], i64 0, i64 1, i64 3 ++; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* [[TMP0]], i64 0, i64 1, i64 4 ++; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* [[TMP1:%.*]], i64 0, i64 1, i64 2 ++; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* [[TMP1]], i64 0, i64 1, i64 3 ++; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* [[TMP1]], i64 0, i64 1, i64 4 ++; CHECK-NEXT: [[TMP8:%.*]] = load i64, i64 addrspace(11)* [[TMP2]], align 8 ++; CHECK-NEXT: [[TMP9:%.*]] = load i64, i64 addrspace(11)* [[TMP5]], align 8 ++; CHECK-NEXT: [[DOTNOT17:%.*]] = icmp eq i64 [[TMP8]], [[TMP9]] ++; CHECK-NEXT: br i1 [[DOTNOT17]], label [[L70:%.*]], label [[L90:%.*]] ++; CHECK: L70: ++; CHECK-NEXT: [[TMP10:%.*]] = load i64, i64 addrspace(11)* [[TMP3]], align 8 ++; CHECK-NEXT: [[TMP11:%.*]] = load i64, i64 addrspace(11)* [[TMP6]], align 8 ++; CHECK-NEXT: [[DOTNOT18:%.*]] = icmp eq i64 [[TMP10]], [[TMP11]] ++; CHECK-NEXT: br i1 [[DOTNOT18]], label [[L74:%.*]], label [[L90]] ++; CHECK: L74: ++; CHECK-NEXT: [[TMP12:%.*]] = load i64, i64 addrspace(11)* [[TMP4]], align 8 ++; CHECK-NEXT: [[TMP13:%.*]] = load i64, i64 addrspace(11)* [[TMP7]], align 8 ++; CHECK-NEXT: [[DOTNOT19:%.*]] = icmp eq i64 [[TMP12]], [[TMP13]] ++; CHECK-NEXT: br label [[L90]] ++; CHECK: L90: ++; CHECK-NEXT: [[VALUE_PHI2_OFF0:%.*]] = phi i1 [ false, [[TOP:%.*]] ], [ [[DOTNOT19]], [[L74]] ], [ false, [[L70]] ] ++; CHECK-NEXT: ret void ++; ++top: ++ %2 = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* %0, i64 0, i64 1, i64 2 ++ %3 = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* %0, i64 0, i64 1, i64 3 ++ %4 = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* %0, i64 0, i64 1, i64 4 ++ %5 = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* %1, i64 0, i64 1, i64 2 ++ %6 = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* %1, i64 0, i64 1, i64 3 ++ %7 = getelementptr inbounds [2 x [5 x i64]], [2 x [5 x i64]] addrspace(11)* %1, i64 0, i64 1, i64 4 ++ %8 = load i64, i64 addrspace(11)* %2, align 8 ++ %9 = load i64, i64 addrspace(11)* %5, align 8 ++ %.not17 = icmp eq i64 %8, %9 ++ br i1 %.not17, label %L70, label %L90 ++ ++L70: ; preds = %top ++ %10 = load i64, i64 addrspace(11)* %3, align 8 ++ %11 = load i64, i64 addrspace(11)* %6, align 8 ++ %.not18 = icmp eq i64 %10, %11 ++ br i1 %.not18, label %L74, label %L90 ++ ++L74: ; preds = %L70 ++ %12 = load i64, i64 addrspace(11)* %4, align 8 ++ %13 = load i64, i64 addrspace(11)* %7, align 8 ++ %.not19 = icmp eq i64 %12, %13 ++ br label %L90 ++ ++L90: ; preds = %L74, %L70, %top ++ %value_phi2.off0 = phi i1 [ false, %top ], [ %.not19, %L74 ], [ false, %L70 ] ++ ret void ++} ++ ++!llvm.module.flags = !{!0} ++ ++!0 = !{i32 1, !"Debug Info Version", i32 3} ++ +-- +2.30.0 + diff --git a/deps/patches/llvm-11-D94980-CTR-half.patch b/deps/patches/llvm-11-D94980-CTR-half.patch new file mode 100644 index 0000000000000..64debc43a9e92 --- /dev/null +++ b/deps/patches/llvm-11-D94980-CTR-half.patch @@ -0,0 +1,398 @@ +From 8a3be8c0ff83f2b9d2db4fd581ec014bd3217505 Mon Sep 17 00:00:00 2001 +From: Nemanja Ivanovic +Date: Tue, 19 Jan 2021 19:52:31 -0500 +Subject: [PATCH] [PowerPC] Do not emit HW loop with half precision operations + +If a loop has any operations on half precision values, there will be calls to library functions on Power8. Even on Power9, there is a small subset of instructions that are actually supported for the type. + +This patch disables HW loops whenever any operations on the type are found (other than the handfull of supported ones when compiling for Power9). Fixes a few PR's opened by Julia: + +https://bugs.llvm.org/show_bug.cgi?id=48785 +https://bugs.llvm.org/show_bug.cgi?id=48786 +https://bugs.llvm.org/show_bug.cgi?id=48519 +--- + .../Target/PowerPC/PPCTargetTransformInfo.cpp | 29 +- + llvm/test/CodeGen/PowerPC/pr48519.ll | 296 ++++++++++++++++-- + 2 files changed, 299 insertions(+), 26 deletions(-) + +diff --git llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp +index 49c10fdf8898..adf9f0df82f8 100644 +--- llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp ++++ llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp +@@ -276,8 +276,33 @@ bool PPCTTIImpl::mightUseCTR(BasicBlock *BB, TargetLibraryInfo *LibInfo, + return false; + }; + ++ auto supportedHalfPrecisionOp = [](Instruction *Inst) { ++ switch (Inst->getOpcode()) { ++ default: return false; ++ case Instruction::FPTrunc: ++ case Instruction::FPExt: ++ case Instruction::Load: ++ case Instruction::Store: ++ case Instruction::FPToUI: ++ case Instruction::UIToFP: ++ case Instruction::FPToSI: ++ case Instruction::SIToFP: ++ return true; ++ } ++ }; ++ + for (BasicBlock::iterator J = BB->begin(), JE = BB->end(); + J != JE; ++J) { ++ // There are no direct operations on half precision so assume that ++ // anything with that type requires a call except for a few select ++ // operations with Power9. ++ if (Instruction *CurrInst = dyn_cast(J)) { ++ for (const auto &Op : CurrInst->operands()) { ++ if (Op->getType()->getScalarType()->isHalfTy() || ++ CurrInst->getType()->getScalarType()->isHalfTy()) ++ return !(ST->isISA3_0() && supportedHalfPrecisionOp(CurrInst)); ++ } ++ } + if (CallInst *CI = dyn_cast(J)) { + // Inline ASM is okay, unless it clobbers the ctr register. + if (InlineAsm *IA = dyn_cast(CI->getCalledOperand())) { +@@ -441,10 +466,6 @@ bool PPCTTIImpl::mightUseCTR(BasicBlock *BB, TargetLibraryInfo *LibInfo, + isLargeIntegerTy(!TM.isPPC64(), CI->getSrcTy()->getScalarType()) || + isLargeIntegerTy(!TM.isPPC64(), CI->getDestTy()->getScalarType())) + return true; +- if (!ST->isISA3_0() && +- (CI->getSrcTy()->getScalarType()->isHalfTy() || +- CI->getDestTy()->getScalarType()->isHalfTy())) +- return true; + } else if (isLargeIntegerTy(!TM.isPPC64(), + J->getType()->getScalarType()) && + (J->getOpcode() == Instruction::UDiv || +diff --git llvm/test/CodeGen/PowerPC/pr48519.ll llvm/test/CodeGen/PowerPC/pr48519.ll +index 777874e91c26..50970cb185d8 100644 +--- llvm/test/CodeGen/PowerPC/pr48519.ll ++++ llvm/test/CodeGen/PowerPC/pr48519.ll +@@ -1,9 +1,13 @@ + ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py + ; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ + ; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s ++; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ ++; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \ ++; RUN: -check-prefix=CHECK-P9 ++ + define void @julia__typed_vcat_20() #0 { + ; CHECK-LABEL: julia__typed_vcat_20: +-; CHECK: # %bb.0: # %top ++; CHECK: # %bb.0: # %bb + ; CHECK-NEXT: mflr r0 + ; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill + ; CHECK-NEXT: std r0, 16(r1) +@@ -11,7 +15,7 @@ define void @julia__typed_vcat_20() #0 { + ; CHECK-NEXT: li r3, 1 + ; CHECK-NEXT: li r30, 0 + ; CHECK-NEXT: .p2align 4 +-; CHECK-NEXT: .LBB0_1: # %L139 ++; CHECK-NEXT: .LBB0_1: # %bb3 + ; CHECK-NEXT: # + ; CHECK-NEXT: addi r3, r3, -1 + ; CHECK-NEXT: mtfprd f0, r3 +@@ -24,32 +28,280 @@ define void @julia__typed_vcat_20() #0 { + ; CHECK-NEXT: li r3, 0 + ; CHECK-NEXT: cmpldi r30, 0 + ; CHECK-NEXT: bne+ cr0, .LBB0_1 +-; CHECK-NEXT: # %bb.2: # %pass.1 ++; CHECK-NEXT: # %bb.2: # %bb11 + ; CHECK-NEXT: bl __gnu_f2h_ieee + ; CHECK-NEXT: nop + ; CHECK-NEXT: sth r3, 0(r3) +-top: +- %.sroa.6.0.copyload = load i64, i64 addrspace(11)* null, align 8 +- %0 = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %.sroa.6.0.copyload, i64 0) +- %1 = extractvalue { i64, i1 } %0, 0 +- br label %L139 +- +-L139: ; preds = %L139, %top +- %value_phi21 = phi i64 [ %5, %L139 ], [ 1, %top ] +- %value_phi23 = phi i64 [ 0, %L139 ], [ 1, %top ] +- %2 = add nsw i64 %value_phi23, -1 +- %3 = add i64 %2, 0 +- %4 = sitofp i64 %3 to half +- store half %4, half addrspace(13)* undef, align 2 +- %.not101.not = icmp eq i64 %value_phi21, 0 +- %5 = add i64 %value_phi21, 1 +- br i1 %.not101.not, label %pass.1, label %L139 +- +-pass.1: ; preds = %L139 ++; ++; CHECK-P9-LABEL: julia__typed_vcat_20: ++; CHECK-P9: # %bb.0: # %bb ++; CHECK-P9-NEXT: li r3, 0 ++; CHECK-P9-NEXT: mtctr r3 ++; CHECK-P9-NEXT: li r3, 1 ++; CHECK-P9-NEXT: .p2align 4 ++; CHECK-P9-NEXT: .LBB0_1: # %bb3 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: addi r3, r3, -1 ++; CHECK-P9-NEXT: mtfprd f0, r3 ++; CHECK-P9-NEXT: xscvsxdsp f0, f0 ++; CHECK-P9-NEXT: xscvdphp f0, f0 ++; CHECK-P9-NEXT: mffprwz r3, f0 ++; CHECK-P9-NEXT: mtfprwz f0, r3 ++; CHECK-P9-NEXT: li r3, 0 ++; CHECK-P9-NEXT: xscvhpdp f0, f0 ++; CHECK-P9-NEXT: bdnz .LBB0_1 ++; CHECK-P9-NEXT: # %bb.2: # %bb11 ++; CHECK-P9-NEXT: xscvdphp f0, f0 ++; CHECK-P9-NEXT: stxsihx f0, 0, r3 ++bb: ++ %i = load i64, i64 addrspace(11)* null, align 8 ++ %i1 = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %i, i64 0) ++ %i2 = extractvalue { i64, i1 } %i1, 0 ++ br label %bb3 ++ ++bb3: ; preds = %bb3, %bb ++ %i4 = phi i64 [ %i10, %bb3 ], [ 1, %bb ] ++ %i5 = phi i64 [ 0, %bb3 ], [ 1, %bb ] ++ %i6 = add nsw i64 %i5, -1 ++ %i7 = add i64 %i6, 0 ++ %i8 = sitofp i64 %i7 to half ++ store half %i8, half addrspace(13)* undef, align 2 ++ %i9 = icmp eq i64 %i4, 0 ++ %i10 = add i64 %i4, 1 ++ br i1 %i9, label %bb11, label %bb3 ++ ++bb11: ; preds = %bb3 + unreachable + } + +-; Function Attrs: nounwind readnone speculatable willreturn + declare { i64, i1 } @llvm.ssub.with.overflow.i64(i64, i64) #0 + ++define void @julia__hypot_17() #0 { ++; CHECK-LABEL: julia__hypot_17: ++; CHECK: # %bb.0: # %bb ++; CHECK-NEXT: mflr r0 ++; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill ++; CHECK-NEXT: std r0, 16(r1) ++; CHECK-NEXT: stdu r1, -48(r1) ++; CHECK-NEXT: li r30, 3 ++; CHECK-NEXT: .p2align 5 ++; CHECK-NEXT: .LBB1_1: # %bb1 ++; CHECK-NEXT: # ++; CHECK-NEXT: addi r30, r30, -1 ++; CHECK-NEXT: cmpldi r30, 0 ++; CHECK-NEXT: beq cr0, .LBB1_3 ++; CHECK-NEXT: # %bb.2: # %bb3 ++; CHECK-NEXT: # ++; CHECK-NEXT: lhz r3, 0(0) ++; CHECK-NEXT: bl __gnu_h2f_ieee ++; CHECK-NEXT: nop ++; CHECK-NEXT: fcmpu cr0, f1, f1 ++; CHECK-NEXT: bun cr0, .LBB1_1 ++; CHECK-NEXT: .LBB1_3: # %bb9 ++; CHECK-NEXT: addi r1, r1, 48 ++; CHECK-NEXT: ld r0, 16(r1) ++; CHECK-NEXT: ld r30, -16(r1) # 8-byte Folded Reload ++; CHECK-NEXT: mtlr r0 ++; CHECK-NEXT: blr ++; ++; CHECK-P9-LABEL: julia__hypot_17: ++; CHECK-P9: # %bb.0: # %bb ++; CHECK-P9-NEXT: li r3, 3 ++; CHECK-P9-NEXT: mtctr r3 ++; CHECK-P9-NEXT: li r3, 0 ++; CHECK-P9-NEXT: .p2align 5 ++; CHECK-P9-NEXT: .LBB1_1: # %bb1 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: bdzlr ++; CHECK-P9-NEXT: # %bb.2: # %bb3 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: lxsihzx f0, 0, r3 ++; CHECK-P9-NEXT: xscvhpdp f0, f0 ++; CHECK-P9-NEXT: fcmpu cr0, f0, f0 ++; CHECK-P9-NEXT: bun cr0, .LBB1_1 ++; CHECK-P9-NEXT: # %bb.3: # %bb9 ++; CHECK-P9-NEXT: blr ++bb: ++ br label %bb1 ++ ++bb1: ; preds = %bb3, %bb ++ %i = phi i64 [ %i4, %bb3 ], [ 2, %bb ] ++ %i2 = icmp eq i64 %i, 4 ++ br i1 %i2, label %bb9, label %bb3 ++ ++bb3: ; preds = %bb1 ++ %i4 = add nuw nsw i64 %i, 1 ++ %i5 = load half, half* null, align 2 ++ %i6 = fpext half %i5 to float ++ %i7 = fcmp uno float %i6, 0.000000e+00 ++ %i8 = or i1 %i7, false ++ br i1 %i8, label %bb1, label %bb9 ++ ++bb9: ; preds = %bb3, %bb1 ++ ret void ++} ++ ++define void @func_48786() #0 { ++; CHECK-LABEL: func_48786: ++; CHECK: # %bb.0: # %bb ++; CHECK-NEXT: mfocrf r12, 32 ++; CHECK-NEXT: mflr r0 ++; CHECK-NEXT: std r0, 16(r1) ++; CHECK-NEXT: stw r12, 8(r1) ++; CHECK-NEXT: stdu r1, -48(r1) ++; CHECK-NEXT: ld r3, 0(r3) ++; CHECK-NEXT: std r30, 32(r1) # 8-byte Folded Spill ++; CHECK-NEXT: # implicit-def: $x30 ++; CHECK-NEXT: cmpdi r3, 0 ++; CHECK-NEXT: crnot 4*cr2+lt, eq ++; CHECK-NEXT: bc 12, 4*cr5+lt, .LBB2_3 ++; CHECK-NEXT: .p2align 4 ++; CHECK-NEXT: .LBB2_1: # %bb4 ++; CHECK-NEXT: lhz r3, 0(r3) ++; CHECK-NEXT: bl __gnu_h2f_ieee ++; CHECK-NEXT: nop ++; CHECK-NEXT: bc 4, 4*cr2+lt, .LBB2_6 ++; CHECK-NEXT: # %bb.2: # %bb8 ++; CHECK-NEXT: bl __gnu_f2h_ieee ++; CHECK-NEXT: nop ++; CHECK-NEXT: sth r3, 0(0) ++; CHECK-NEXT: .LBB2_3: # %bb10 ++; CHECK-NEXT: # ++; CHECK-NEXT: cmpldi r30, 0 ++; CHECK-NEXT: beq cr0, .LBB2_5 ++; CHECK-NEXT: # %bb.4: # %bb12 ++; CHECK-NEXT: # ++; CHECK-NEXT: addi r30, r30, 1 ++; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB2_1 ++; CHECK-NEXT: b .LBB2_3 ++; CHECK-NEXT: .LBB2_5: # %bb14 ++; CHECK-NEXT: ld r30, 32(r1) # 8-byte Folded Reload ++; CHECK-NEXT: addi r1, r1, 48 ++; CHECK-NEXT: ld r0, 16(r1) ++; CHECK-NEXT: lwz r12, 8(r1) ++; CHECK-NEXT: mtocrf 32, r12 ++; CHECK-NEXT: mtlr r0 ++; CHECK-NEXT: blr ++; CHECK-NEXT: .LBB2_6: # %bb15 ++; ++; CHECK-P9-LABEL: func_48786: ++; CHECK-P9: # %bb.0: # %bb ++; CHECK-P9-NEXT: ld r3, 0(r3) ++; CHECK-P9-NEXT: cmpdi r3, 0 ++; CHECK-P9-NEXT: mtctr r3 ++; CHECK-P9-NEXT: li r3, 0 ++; CHECK-P9-NEXT: crnot 4*cr5+lt, eq ++; CHECK-P9-NEXT: b .LBB2_2 ++; CHECK-P9-NEXT: .p2align 5 ++; CHECK-P9-NEXT: .LBB2_1: # %bb10 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: bdzlr ++; CHECK-P9-NEXT: .LBB2_2: # %bb2 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: bc 12, 4*cr5+lt, .LBB2_1 ++; CHECK-P9-NEXT: # %bb.3: # %bb4 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: lxsihzx f0, 0, r3 ++; CHECK-P9-NEXT: xscvhpdp f0, f0 ++; CHECK-P9-NEXT: bc 4, 4*cr5+lt, .LBB2_5 ++; CHECK-P9-NEXT: # %bb.4: # %bb8 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: xscvdphp f0, f0 ++; CHECK-P9-NEXT: stxsihx f0, 0, r3 ++; CHECK-P9-NEXT: b .LBB2_1 ++; CHECK-P9-NEXT: .LBB2_5: # %bb15 ++bb: ++ %i = load i64, i64 addrspace(11)* undef, align 8 ++ %i1 = load i64, i64 addrspace(11)* undef, align 8 ++ br label %bb2 ++ ++bb2: ; preds = %bb12, %bb ++ %i3 = phi i64 [ undef, %bb ], [ %i13, %bb12 ] ++ br i1 undef, label %bb10, label %bb4 ++ ++bb4: ; preds = %bb2 ++ switch i32 undef, label %bb9 [ ++ i32 1426063360, label %bb5 ++ i32 1275068416, label %bb5 ++ ] ++ ++bb5: ; preds = %bb4, %bb4 ++ %i6 = load half, half addrspace(13)* undef, align 2 ++ %i7 = icmp ult i64 0, %i1 ++ br i1 %i7, label %bb8, label %bb15 ++ ++bb8: ; preds = %bb5 ++ store half %i6, half addrspace(13)* null, align 2 ++ br label %bb10 ++ ++bb9: ; preds = %bb4 ++ unreachable ++ ++bb10: ; preds = %bb8, %bb2 ++ %i11 = icmp eq i64 %i3, 0 ++ br i1 %i11, label %bb14, label %bb12 ++ ++bb12: ; preds = %bb10 ++ %i13 = add i64 %i3, 1 ++ br label %bb2 ++ ++bb14: ; preds = %bb10 ++ ret void ++ ++bb15: ; preds = %bb5 ++ unreachable ++} ++ ++define void @func_48785(half %arg) #0 { ++; CHECK-LABEL: func_48785: ++; CHECK: # %bb.0: # %bb ++; CHECK-NEXT: mflr r0 ++; CHECK-NEXT: std r29, -32(r1) # 8-byte Folded Spill ++; CHECK-NEXT: std r30, -24(r1) # 8-byte Folded Spill ++; CHECK-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill ++; CHECK-NEXT: std r0, 16(r1) ++; CHECK-NEXT: stdu r1, -64(r1) ++; CHECK-NEXT: fmr f31, f1 ++; CHECK-NEXT: li r30, 0 ++; CHECK-NEXT: .p2align 5 ++; CHECK-NEXT: .LBB3_1: # %bb1 ++; CHECK-NEXT: # ++; CHECK-NEXT: fmr f1, f31 ++; CHECK-NEXT: sldi r29, r30, 1 ++; CHECK-NEXT: bl __gnu_f2h_ieee ++; CHECK-NEXT: nop ++; CHECK-NEXT: addi r30, r30, 12 ++; CHECK-NEXT: sth r3, 0(r29) ++; CHECK-NEXT: cmpldi r30, 0 ++; CHECK-NEXT: bne+ cr0, .LBB3_1 ++; CHECK-NEXT: # %bb.2: # %bb5 ++; ++; CHECK-P9-LABEL: func_48785: ++; CHECK-P9: # %bb.0: # %bb ++; CHECK-P9-NEXT: li r3, 1 ++; CHECK-P9-NEXT: rldic r3, r3, 62, 1 ++; CHECK-P9-NEXT: mtctr r3 ++; CHECK-P9-NEXT: li r3, 0 ++; CHECK-P9-NEXT: .p2align 4 ++; CHECK-P9-NEXT: .LBB3_1: # %bb1 ++; CHECK-P9-NEXT: # ++; CHECK-P9-NEXT: xscvdphp f0, f1 ++; CHECK-P9-NEXT: stxsihx f0, 0, r3 ++; CHECK-P9-NEXT: addi r3, r3, 24 ++; CHECK-P9-NEXT: bdnz .LBB3_1 ++; CHECK-P9-NEXT: # %bb.2: # %bb5 ++bb: ++ br label %bb1 ++ ++bb1: ; preds = %bb1, %bb ++ %i = phi i64 [ 0, %bb ], [ %i3, %bb1 ] ++ %i2 = getelementptr inbounds half, half addrspace(13)* null, i64 %i ++ store half %arg, half addrspace(13)* %i2, align 2 ++ %i3 = add i64 %i, 12 ++ %i4 = icmp eq i64 %i3, 0 ++ br i1 %i4, label %bb5, label %bb1 ++ ++bb5: ; preds = %bb1 ++ unreachable ++} + attributes #0 = { nounwind } +-- +2.30.0 + diff --git a/deps/patches/llvm-11-ppc-half-ctr.patch b/deps/patches/llvm-11-ppc-half-ctr.patch new file mode 100644 index 0000000000000..e9a9b9a4d5f86 --- /dev/null +++ b/deps/patches/llvm-11-ppc-half-ctr.patch @@ -0,0 +1,96 @@ +From 79a73d6388790cfec9bd76b1790f0f5551a9df8c Mon Sep 17 00:00:00 2001 +From: Nemanja Ivanovic +Date: Mon, 28 Dec 2020 22:51:51 -0600 +Subject: [PATCH 1/4] [PowerPC] Disable CTR loops containing operations on + half-precision + +On subtargets prior to Power9, conversions to/from half precision +are lowered to libcalls. This makes loops containing such operations +invalid candidates for HW loops. + +Fixes: https://bugs.llvm.org/show_bug.cgi?id=48519 +--- + .../Target/PowerPC/PPCTargetTransformInfo.cpp | 4 ++ + llvm/test/CodeGen/PowerPC/pr48519.ll | 55 +++++++++++++++++++ + 2 files changed, 59 insertions(+) + create mode 100644 llvm/test/CodeGen/PowerPC/pr48519.ll + +diff --git llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp +index 53556ffc267d..49c10fdf8898 100644 +--- llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp ++++ llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp +@@ -441,6 +441,10 @@ bool PPCTTIImpl::mightUseCTR(BasicBlock *BB, TargetLibraryInfo *LibInfo, + isLargeIntegerTy(!TM.isPPC64(), CI->getSrcTy()->getScalarType()) || + isLargeIntegerTy(!TM.isPPC64(), CI->getDestTy()->getScalarType())) + return true; ++ if (!ST->isISA3_0() && ++ (CI->getSrcTy()->getScalarType()->isHalfTy() || ++ CI->getDestTy()->getScalarType()->isHalfTy())) ++ return true; + } else if (isLargeIntegerTy(!TM.isPPC64(), + J->getType()->getScalarType()) && + (J->getOpcode() == Instruction::UDiv || +diff --git llvm/test/CodeGen/PowerPC/pr48519.ll llvm/test/CodeGen/PowerPC/pr48519.ll +new file mode 100644 +index 000000000000..777874e91c26 +--- /dev/null ++++ llvm/test/CodeGen/PowerPC/pr48519.ll +@@ -0,0 +1,55 @@ ++; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ++; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ ++; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s ++define void @julia__typed_vcat_20() #0 { ++; CHECK-LABEL: julia__typed_vcat_20: ++; CHECK: # %bb.0: # %top ++; CHECK-NEXT: mflr r0 ++; CHECK-NEXT: std r30, -16(r1) # 8-byte Folded Spill ++; CHECK-NEXT: std r0, 16(r1) ++; CHECK-NEXT: stdu r1, -48(r1) ++; CHECK-NEXT: li r3, 1 ++; CHECK-NEXT: li r30, 0 ++; CHECK-NEXT: .p2align 4 ++; CHECK-NEXT: .LBB0_1: # %L139 ++; CHECK-NEXT: # ++; CHECK-NEXT: addi r3, r3, -1 ++; CHECK-NEXT: mtfprd f0, r3 ++; CHECK-NEXT: xscvsxdsp f1, f0 ++; CHECK-NEXT: bl __gnu_f2h_ieee ++; CHECK-NEXT: nop ++; CHECK-NEXT: bl __gnu_h2f_ieee ++; CHECK-NEXT: nop ++; CHECK-NEXT: addi r30, r30, -1 ++; CHECK-NEXT: li r3, 0 ++; CHECK-NEXT: cmpldi r30, 0 ++; CHECK-NEXT: bne+ cr0, .LBB0_1 ++; CHECK-NEXT: # %bb.2: # %pass.1 ++; CHECK-NEXT: bl __gnu_f2h_ieee ++; CHECK-NEXT: nop ++; CHECK-NEXT: sth r3, 0(r3) ++top: ++ %.sroa.6.0.copyload = load i64, i64 addrspace(11)* null, align 8 ++ %0 = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %.sroa.6.0.copyload, i64 0) ++ %1 = extractvalue { i64, i1 } %0, 0 ++ br label %L139 ++ ++L139: ; preds = %L139, %top ++ %value_phi21 = phi i64 [ %5, %L139 ], [ 1, %top ] ++ %value_phi23 = phi i64 [ 0, %L139 ], [ 1, %top ] ++ %2 = add nsw i64 %value_phi23, -1 ++ %3 = add i64 %2, 0 ++ %4 = sitofp i64 %3 to half ++ store half %4, half addrspace(13)* undef, align 2 ++ %.not101.not = icmp eq i64 %value_phi21, 0 ++ %5 = add i64 %value_phi21, 1 ++ br i1 %.not101.not, label %pass.1, label %L139 ++ ++pass.1: ; preds = %L139 ++ unreachable ++} ++ ++; Function Attrs: nounwind readnone speculatable willreturn ++declare { i64, i1 } @llvm.ssub.with.overflow.i64(i64, i64) #0 ++ ++attributes #0 = { nounwind } +-- +2.30.0 + diff --git a/deps/patches/llvm-11-ppc-sp-from-bp.patch b/deps/patches/llvm-11-ppc-sp-from-bp.patch new file mode 100644 index 0000000000000..014cfb237a303 --- /dev/null +++ b/deps/patches/llvm-11-ppc-sp-from-bp.patch @@ -0,0 +1,621 @@ +From 646760460fa06f8577d35282cde5faf8f0ed8499 Mon Sep 17 00:00:00 2001 +From: Nemanja Ivanovic +Date: Tue, 22 Dec 2020 05:43:33 -0600 +Subject: [PATCH 4/4] [PowerPC] Restore stack ptr from base ptr when available + +On subtargets that have a red zone, we will copy the stack pointer to the base +pointer in the prologue prior to updating the stack pointer. There are no other +updates to the base pointer after that. This suggests that we should be able to +restore the stack pointer from the base pointer rather than loading it from the +back chain or adding the frame size back to either the stack pointer or the +frame pointer. +This came about because functions that call setjmp need to restore the SP from +the FP because the back chain might have been clobbered +(see https://reviews.llvm.org/D92906). However, if the stack is realigned, the +restored SP might be incorrect (which is what caused the failures in the two +ASan test cases). + +This patch was tested quite extensivelly both with sanitizer runtimes and +general code. + +Differential revision: https://reviews.llvm.org/D93327 +--- + llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 9 +- + llvm/test/CodeGen/PowerPC/aix-base-pointer.ll | 8 +- + llvm/test/CodeGen/PowerPC/pr46759.ll | 2 +- + .../CodeGen/PowerPC/stack-clash-prologue.ll | 498 ++++++++++++++++++ + llvm/test/CodeGen/PowerPC/stack-realign.ll | 4 +- + 5 files changed, 513 insertions(+), 8 deletions(-) + +diff --git llvm/lib/Target/PowerPC/PPCFrameLowering.cpp llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +index 66db0f199e15..80cbaa475184 100644 +--- llvm/lib/Target/PowerPC/PPCFrameLowering.cpp ++++ llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +@@ -1704,11 +1704,18 @@ void PPCFrameLowering::emitEpilogue(MachineFunction &MF, + // offset by the STDU/STDUX/STWU/STWUX instruction. For targets with red + // zone add this offset back now. + ++ // If the function has a base pointer, the stack pointer has been copied ++ // to it so we can restore it by copying in the other direction. ++ if (HasRedZone && HasBP) { ++ BuildMI(MBB, MBBI, dl, OrInst, RBReg). ++ addReg(BPReg). ++ addReg(BPReg); ++ } + // If this function contained a fastcc call and GuaranteedTailCallOpt is + // enabled (=> hasFastCall()==true) the fastcc call might contain a tail + // call which invalidates the stack pointer value in SP(0). So we use the + // value of R31 in this case. Similar situation exists with setjmp. +- if (FI->hasFastCall() || MF.exposesReturnsTwice()) { ++ else if (FI->hasFastCall() || MF.exposesReturnsTwice()) { + assert(HasFP && "Expecting a valid frame pointer."); + if (!HasRedZone) + RBReg = FPReg; +diff --git llvm/test/CodeGen/PowerPC/aix-base-pointer.ll llvm/test/CodeGen/PowerPC/aix-base-pointer.ll +index 2566e31c025d..5141fd9e4222 100644 +--- llvm/test/CodeGen/PowerPC/aix-base-pointer.ll ++++ llvm/test/CodeGen/PowerPC/aix-base-pointer.ll +@@ -27,8 +27,8 @@ declare void @callee(i32*) + ; 32BIT: stwux 1, 1, 0 + ; 32BIT: addi 3, 1, 64 + ; 32BIT: bl .callee +-; 32BIT: lwz 1, 0(1) +-; 32BIT: lwz 30, -8(1) ++; 32BIT: mr 1, 30 ++; 32BIT: lwz 30, -16(1) + + ; 64BIT-LABEL: .caller: + ; 64BIT: std 30, -16(1) +@@ -38,5 +38,5 @@ declare void @callee(i32*) + ; 64BIT: stdux 1, 1, 0 + ; 64BIT: addi 3, 1, 128 + ; 64BIT: bl .callee +-; 64BIT: ld 1, 0(1) +-; 64BIT: ld 30, -16(1) ++; 64BIT: mr 1, 30 ++; 64BIT: ld 30, -24(1) +diff --git llvm/test/CodeGen/PowerPC/pr46759.ll llvm/test/CodeGen/PowerPC/pr46759.ll +index d1d68a5db7e3..92f2c64bc06a 100644 +--- llvm/test/CodeGen/PowerPC/pr46759.ll ++++ llvm/test/CodeGen/PowerPC/pr46759.ll +@@ -45,7 +45,7 @@ define void @foo(i32 %vla_size) #0 { + ; CHECK-LE-NEXT: .LBB0_2: # %entry + ; CHECK-LE-NEXT: addi r3, r1, 2048 + ; CHECK-LE-NEXT: lbz r3, 0(r3) +-; CHECK-LE-NEXT: ld r1, 0(r1) ++; CHECK-LE-NEXT: mr r1, r30 + ; CHECK-LE-NEXT: ld r31, -8(r1) + ; CHECK-LE-NEXT: ld r30, -16(r1) + ; CHECK-LE-NEXT: blr +diff --git llvm/test/CodeGen/PowerPC/stack-clash-prologue.ll llvm/test/CodeGen/PowerPC/stack-clash-prologue.ll +index cb513be9128c..6443059c9704 100644 +--- llvm/test/CodeGen/PowerPC/stack-clash-prologue.ll ++++ llvm/test/CodeGen/PowerPC/stack-clash-prologue.ll +@@ -528,4 +528,502 @@ entry: + ret i8 %c + } + ++; alloca + align < probe_size ++define i32 @f8(i64 %i) local_unnamed_addr #0 { ++; CHECK-LE-LABEL: f8: ++; CHECK-LE: # %bb.0: ++; CHECK-LE-NEXT: clrldi r0, r1, 58 ++; CHECK-LE-NEXT: std r30, -16(r1) ++; CHECK-LE-NEXT: mr r30, r1 ++; CHECK-LE-NEXT: subfic r0, r0, -896 ++; CHECK-LE-NEXT: stdux r1, r1, r0 ++; CHECK-LE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-LE-NEXT: .cfi_offset r30, -16 ++; CHECK-LE-NEXT: addi r4, r1, 64 ++; CHECK-LE-NEXT: sldi r3, r3, 2 ++; CHECK-LE-NEXT: li r5, 1 ++; CHECK-LE-NEXT: stwx r5, r4, r3 ++; CHECK-LE-NEXT: lwz r3, 64(r1) ++; CHECK-LE-NEXT: mr r1, r30 ++; CHECK-LE-NEXT: ld r30, -16(r1) ++; CHECK-LE-NEXT: blr ++; ++; CHECK-BE-LABEL: f8: ++; CHECK-BE: # %bb.0: ++; CHECK-BE-NEXT: clrldi r0, r1, 58 ++; CHECK-BE-NEXT: std r30, -16(r1) ++; CHECK-BE-NEXT: mr r30, r1 ++; CHECK-BE-NEXT: subfic r0, r0, -896 ++; CHECK-BE-NEXT: stdux r1, r1, r0 ++; CHECK-BE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-BE-NEXT: .cfi_offset r30, -16 ++; CHECK-BE-NEXT: addi r4, r1, 64 ++; CHECK-BE-NEXT: li r5, 1 ++; CHECK-BE-NEXT: sldi r3, r3, 2 ++; CHECK-BE-NEXT: stwx r5, r4, r3 ++; CHECK-BE-NEXT: lwz r3, 64(r1) ++; CHECK-BE-NEXT: mr r1, r30 ++; CHECK-BE-NEXT: ld r30, -16(r1) ++; CHECK-BE-NEXT: blr ++; ++; CHECK-32-LABEL: f8: ++; CHECK-32: # %bb.0: ++; CHECK-32-NEXT: clrlwi r0, r1, 26 ++; CHECK-32-NEXT: subfic r0, r0, -896 ++; CHECK-32-NEXT: stwux r1, r1, r0 ++; CHECK-32-NEXT: sub r0, r1, r0 ++; CHECK-32-NEXT: addic r0, r0, -8 ++; CHECK-32-NEXT: stwx r30, 0, r0 ++; CHECK-32-NEXT: addic r30, r0, 8 ++; CHECK-32-NEXT: .cfi_def_cfa_register r30 ++; CHECK-32-NEXT: .cfi_offset r30, -8 ++; CHECK-32-NEXT: addi r3, r1, 64 ++; CHECK-32-NEXT: li r5, 1 ++; CHECK-32-NEXT: slwi r4, r4, 2 ++; CHECK-32-NEXT: stwx r5, r3, r4 ++; CHECK-32-NEXT: mr r0, r31 ++; CHECK-32-NEXT: lwz r3, 64(r1) ++; CHECK-32-NEXT: lwz r31, 0(r1) ++; CHECK-32-NEXT: lwz r30, -8(r31) ++; CHECK-32-NEXT: mr r1, r31 ++; CHECK-32-NEXT: mr r31, r0 ++; CHECK-32-NEXT: blr ++ %a = alloca i32, i32 200, align 64 ++ %b = getelementptr inbounds i32, i32* %a, i64 %i ++ store volatile i32 1, i32* %b ++ %c = load volatile i32, i32* %a ++ ret i32 %c ++} ++ ++; alloca > probe_size, align > probe_size ++define i32 @f9(i64 %i) local_unnamed_addr #0 { ++; CHECK-LE-LABEL: f9: ++; CHECK-LE: # %bb.0: ++; CHECK-LE-NEXT: std r30, -16(r1) ++; CHECK-LE-NEXT: mr r30, r1 ++; CHECK-LE-NEXT: .cfi_def_cfa r30, 0 ++; CHECK-LE-NEXT: clrldi r0, r30, 53 ++; CHECK-LE-NEXT: subc r12, r30, r0 ++; CHECK-LE-NEXT: clrldi r0, r0, 52 ++; CHECK-LE-NEXT: cmpdi r0, 0 ++; CHECK-LE-NEXT: beq cr0, .LBB9_2 ++; CHECK-LE-NEXT: # %bb.1: ++; CHECK-LE-NEXT: neg r0, r0 ++; CHECK-LE-NEXT: stdux r30, r1, r0 ++; CHECK-LE-NEXT: .LBB9_2: ++; CHECK-LE-NEXT: li r0, -4096 ++; CHECK-LE-NEXT: cmpd r1, r12 ++; CHECK-LE-NEXT: beq cr0, .LBB9_4 ++; CHECK-LE-NEXT: .LBB9_3: ++; CHECK-LE-NEXT: stdux r30, r1, r0 ++; CHECK-LE-NEXT: cmpd r1, r12 ++; CHECK-LE-NEXT: bne cr0, .LBB9_3 ++; CHECK-LE-NEXT: .LBB9_4: ++; CHECK-LE-NEXT: mr r12, r30 ++; CHECK-LE-NEXT: stdu r12, -2048(r1) ++; CHECK-LE-NEXT: stdu r12, -4096(r1) ++; CHECK-LE-NEXT: stdu r12, -4096(r1) ++; CHECK-LE-NEXT: .cfi_def_cfa_register r1 ++; CHECK-LE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-LE-NEXT: .cfi_offset r30, -16 ++; CHECK-LE-NEXT: addi r4, r1, 2048 ++; CHECK-LE-NEXT: sldi r3, r3, 2 ++; CHECK-LE-NEXT: li r5, 1 ++; CHECK-LE-NEXT: stwx r5, r4, r3 ++; CHECK-LE-NEXT: lwz r3, 2048(r1) ++; CHECK-LE-NEXT: mr r1, r30 ++; CHECK-LE-NEXT: ld r30, -16(r1) ++; CHECK-LE-NEXT: blr ++; ++; CHECK-BE-LABEL: f9: ++; CHECK-BE: # %bb.0: ++; CHECK-BE-NEXT: std r30, -16(r1) ++; CHECK-BE-NEXT: mr r30, r1 ++; CHECK-BE-NEXT: .cfi_def_cfa r30, 0 ++; CHECK-BE-NEXT: clrldi r0, r30, 53 ++; CHECK-BE-NEXT: subc r12, r30, r0 ++; CHECK-BE-NEXT: clrldi r0, r0, 52 ++; CHECK-BE-NEXT: cmpdi r0, 0 ++; CHECK-BE-NEXT: beq cr0, .LBB9_2 ++; CHECK-BE-NEXT: # %bb.1: ++; CHECK-BE-NEXT: neg r0, r0 ++; CHECK-BE-NEXT: stdux r30, r1, r0 ++; CHECK-BE-NEXT: .LBB9_2: ++; CHECK-BE-NEXT: li r0, -4096 ++; CHECK-BE-NEXT: cmpd r1, r12 ++; CHECK-BE-NEXT: beq cr0, .LBB9_4 ++; CHECK-BE-NEXT: .LBB9_3: ++; CHECK-BE-NEXT: stdux r30, r1, r0 ++; CHECK-BE-NEXT: cmpd r1, r12 ++; CHECK-BE-NEXT: bne cr0, .LBB9_3 ++; CHECK-BE-NEXT: .LBB9_4: ++; CHECK-BE-NEXT: mr r12, r30 ++; CHECK-BE-NEXT: stdu r12, -2048(r1) ++; CHECK-BE-NEXT: stdu r12, -4096(r1) ++; CHECK-BE-NEXT: stdu r12, -4096(r1) ++; CHECK-BE-NEXT: .cfi_def_cfa_register r1 ++; CHECK-BE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-BE-NEXT: .cfi_offset r30, -16 ++; CHECK-BE-NEXT: addi r4, r1, 2048 ++; CHECK-BE-NEXT: li r5, 1 ++; CHECK-BE-NEXT: sldi r3, r3, 2 ++; CHECK-BE-NEXT: stwx r5, r4, r3 ++; CHECK-BE-NEXT: lwz r3, 2048(r1) ++; CHECK-BE-NEXT: mr r1, r30 ++; CHECK-BE-NEXT: ld r30, -16(r1) ++; CHECK-BE-NEXT: blr ++; ++; CHECK-32-LABEL: f9: ++; CHECK-32: # %bb.0: ++; CHECK-32-NEXT: mr r12, r1 ++; CHECK-32-NEXT: .cfi_def_cfa r12, 0 ++; CHECK-32-NEXT: clrlwi r0, r12, 21 ++; CHECK-32-NEXT: subc r1, r1, r0 ++; CHECK-32-NEXT: stwu r12, -2048(r1) ++; CHECK-32-NEXT: stwu r12, -4096(r1) ++; CHECK-32-NEXT: stwu r12, -4096(r1) ++; CHECK-32-NEXT: .cfi_def_cfa_register r1 ++; CHECK-32-NEXT: sub r0, r1, r12 ++; CHECK-32-NEXT: sub r0, r1, r0 ++; CHECK-32-NEXT: addic r0, r0, -8 ++; CHECK-32-NEXT: stwx r30, 0, r0 ++; CHECK-32-NEXT: addic r30, r0, 8 ++; CHECK-32-NEXT: .cfi_def_cfa_register r30 ++; CHECK-32-NEXT: .cfi_offset r30, -8 ++; CHECK-32-NEXT: addi r3, r1, 2048 ++; CHECK-32-NEXT: li r5, 1 ++; CHECK-32-NEXT: slwi r4, r4, 2 ++; CHECK-32-NEXT: stwx r5, r3, r4 ++; CHECK-32-NEXT: mr r0, r31 ++; CHECK-32-NEXT: lwz r3, 2048(r1) ++; CHECK-32-NEXT: lwz r31, 0(r1) ++; CHECK-32-NEXT: lwz r30, -8(r31) ++; CHECK-32-NEXT: mr r1, r31 ++; CHECK-32-NEXT: mr r31, r0 ++; CHECK-32-NEXT: blr ++ %a = alloca i32, i32 2000, align 2048 ++ %b = getelementptr inbounds i32, i32* %a, i64 %i ++ store volatile i32 1, i32* %b ++ %c = load volatile i32, i32* %a ++ ret i32 %c ++} ++ ++; alloca < probe_size, align < probe_size, alloca + align > probe_size ++define i32 @f10(i64 %i) local_unnamed_addr #0 { ++; CHECK-LE-LABEL: f10: ++; CHECK-LE: # %bb.0: ++; CHECK-LE-NEXT: std r30, -16(r1) ++; CHECK-LE-NEXT: mr r30, r1 ++; CHECK-LE-NEXT: .cfi_def_cfa r30, 0 ++; CHECK-LE-NEXT: clrldi r0, r30, 54 ++; CHECK-LE-NEXT: subc r12, r30, r0 ++; CHECK-LE-NEXT: clrldi r0, r0, 52 ++; CHECK-LE-NEXT: cmpdi r0, 0 ++; CHECK-LE-NEXT: beq cr0, .LBB10_2 ++; CHECK-LE-NEXT: # %bb.1: ++; CHECK-LE-NEXT: neg r0, r0 ++; CHECK-LE-NEXT: stdux r30, r1, r0 ++; CHECK-LE-NEXT: .LBB10_2: ++; CHECK-LE-NEXT: li r0, -4096 ++; CHECK-LE-NEXT: cmpd r1, r12 ++; CHECK-LE-NEXT: beq cr0, .LBB10_4 ++; CHECK-LE-NEXT: .LBB10_3: ++; CHECK-LE-NEXT: stdux r30, r1, r0 ++; CHECK-LE-NEXT: cmpd r1, r12 ++; CHECK-LE-NEXT: bne cr0, .LBB10_3 ++; CHECK-LE-NEXT: .LBB10_4: ++; CHECK-LE-NEXT: mr r12, r30 ++; CHECK-LE-NEXT: stdu r12, -1024(r1) ++; CHECK-LE-NEXT: stdu r12, -4096(r1) ++; CHECK-LE-NEXT: .cfi_def_cfa_register r1 ++; CHECK-LE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-LE-NEXT: .cfi_offset r30, -16 ++; CHECK-LE-NEXT: addi r4, r1, 1024 ++; CHECK-LE-NEXT: sldi r3, r3, 2 ++; CHECK-LE-NEXT: li r5, 1 ++; CHECK-LE-NEXT: stwx r5, r4, r3 ++; CHECK-LE-NEXT: lwz r3, 1024(r1) ++; CHECK-LE-NEXT: mr r1, r30 ++; CHECK-LE-NEXT: ld r30, -16(r1) ++; CHECK-LE-NEXT: blr ++; ++; CHECK-BE-LABEL: f10: ++; CHECK-BE: # %bb.0: ++; CHECK-BE-NEXT: std r30, -16(r1) ++; CHECK-BE-NEXT: mr r30, r1 ++; CHECK-BE-NEXT: .cfi_def_cfa r30, 0 ++; CHECK-BE-NEXT: clrldi r0, r30, 54 ++; CHECK-BE-NEXT: subc r12, r30, r0 ++; CHECK-BE-NEXT: clrldi r0, r0, 52 ++; CHECK-BE-NEXT: cmpdi r0, 0 ++; CHECK-BE-NEXT: beq cr0, .LBB10_2 ++; CHECK-BE-NEXT: # %bb.1: ++; CHECK-BE-NEXT: neg r0, r0 ++; CHECK-BE-NEXT: stdux r30, r1, r0 ++; CHECK-BE-NEXT: .LBB10_2: ++; CHECK-BE-NEXT: li r0, -4096 ++; CHECK-BE-NEXT: cmpd r1, r12 ++; CHECK-BE-NEXT: beq cr0, .LBB10_4 ++; CHECK-BE-NEXT: .LBB10_3: ++; CHECK-BE-NEXT: stdux r30, r1, r0 ++; CHECK-BE-NEXT: cmpd r1, r12 ++; CHECK-BE-NEXT: bne cr0, .LBB10_3 ++; CHECK-BE-NEXT: .LBB10_4: ++; CHECK-BE-NEXT: mr r12, r30 ++; CHECK-BE-NEXT: stdu r12, -1024(r1) ++; CHECK-BE-NEXT: stdu r12, -4096(r1) ++; CHECK-BE-NEXT: .cfi_def_cfa_register r1 ++; CHECK-BE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-BE-NEXT: .cfi_offset r30, -16 ++; CHECK-BE-NEXT: addi r4, r1, 1024 ++; CHECK-BE-NEXT: li r5, 1 ++; CHECK-BE-NEXT: sldi r3, r3, 2 ++; CHECK-BE-NEXT: stwx r5, r4, r3 ++; CHECK-BE-NEXT: lwz r3, 1024(r1) ++; CHECK-BE-NEXT: mr r1, r30 ++; CHECK-BE-NEXT: ld r30, -16(r1) ++; CHECK-BE-NEXT: blr ++; ++; CHECK-32-LABEL: f10: ++; CHECK-32: # %bb.0: ++; CHECK-32-NEXT: mr r12, r1 ++; CHECK-32-NEXT: .cfi_def_cfa r12, 0 ++; CHECK-32-NEXT: clrlwi r0, r12, 22 ++; CHECK-32-NEXT: subc r1, r1, r0 ++; CHECK-32-NEXT: stwu r12, -1024(r1) ++; CHECK-32-NEXT: stwu r12, -4096(r1) ++; CHECK-32-NEXT: .cfi_def_cfa_register r1 ++; CHECK-32-NEXT: sub r0, r1, r12 ++; CHECK-32-NEXT: sub r0, r1, r0 ++; CHECK-32-NEXT: addic r0, r0, -8 ++; CHECK-32-NEXT: stwx r30, 0, r0 ++; CHECK-32-NEXT: addic r30, r0, 8 ++; CHECK-32-NEXT: .cfi_def_cfa_register r30 ++; CHECK-32-NEXT: .cfi_offset r30, -8 ++; CHECK-32-NEXT: addi r3, r1, 1024 ++; CHECK-32-NEXT: li r5, 1 ++; CHECK-32-NEXT: slwi r4, r4, 2 ++; CHECK-32-NEXT: stwx r5, r3, r4 ++; CHECK-32-NEXT: mr r0, r31 ++; CHECK-32-NEXT: lwz r3, 1024(r1) ++; CHECK-32-NEXT: lwz r31, 0(r1) ++; CHECK-32-NEXT: lwz r30, -8(r31) ++; CHECK-32-NEXT: mr r1, r31 ++; CHECK-32-NEXT: mr r31, r0 ++; CHECK-32-NEXT: blr ++ %a = alloca i32, i32 1000, align 1024 ++ %b = getelementptr inbounds i32, i32* %a, i64 %i ++ store volatile i32 1, i32* %b ++ %c = load volatile i32, i32* %a ++ ret i32 %c ++} ++ ++define void @f11(i32 %vla_size, i64 %i) #0 { ++; CHECK-LE-LABEL: f11: ++; CHECK-LE: # %bb.0: ++; CHECK-LE-NEXT: std r31, -8(r1) ++; CHECK-LE-NEXT: std r30, -16(r1) ++; CHECK-LE-NEXT: mr r30, r1 ++; CHECK-LE-NEXT: .cfi_def_cfa r30, 0 ++; CHECK-LE-NEXT: clrldi r0, r30, 49 ++; CHECK-LE-NEXT: subc r12, r30, r0 ++; CHECK-LE-NEXT: clrldi r0, r0, 52 ++; CHECK-LE-NEXT: cmpdi r0, 0 ++; CHECK-LE-NEXT: beq cr0, .LBB11_2 ++; CHECK-LE-NEXT: # %bb.1: ++; CHECK-LE-NEXT: neg r0, r0 ++; CHECK-LE-NEXT: stdux r30, r1, r0 ++; CHECK-LE-NEXT: .LBB11_2: ++; CHECK-LE-NEXT: li r0, -4096 ++; CHECK-LE-NEXT: cmpd r1, r12 ++; CHECK-LE-NEXT: beq cr0, .LBB11_4 ++; CHECK-LE-NEXT: .LBB11_3: ++; CHECK-LE-NEXT: stdux r30, r1, r0 ++; CHECK-LE-NEXT: cmpd r1, r12 ++; CHECK-LE-NEXT: bne cr0, .LBB11_3 ++; CHECK-LE-NEXT: .LBB11_4: ++; CHECK-LE-NEXT: mr r12, r30 ++; CHECK-LE-NEXT: li r0, 24 ++; CHECK-LE-NEXT: mtctr r0 ++; CHECK-LE-NEXT: .LBB11_5: ++; CHECK-LE-NEXT: stdu r12, -4096(r1) ++; CHECK-LE-NEXT: bdnz .LBB11_5 ++; CHECK-LE-NEXT: # %bb.6: ++; CHECK-LE-NEXT: .cfi_def_cfa_register r1 ++; CHECK-LE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-LE-NEXT: .cfi_offset r31, -8 ++; CHECK-LE-NEXT: .cfi_offset r30, -16 ++; CHECK-LE-NEXT: clrldi r3, r3, 32 ++; CHECK-LE-NEXT: lis r5, 1 ++; CHECK-LE-NEXT: mr r31, r1 ++; CHECK-LE-NEXT: li r6, 1 ++; CHECK-LE-NEXT: addi r3, r3, 15 ++; CHECK-LE-NEXT: ori r5, r5, 0 ++; CHECK-LE-NEXT: rldicl r3, r3, 60, 4 ++; CHECK-LE-NEXT: sldi r4, r4, 2 ++; CHECK-LE-NEXT: add r5, r31, r5 ++; CHECK-LE-NEXT: rldicl r3, r3, 4, 31 ++; CHECK-LE-NEXT: stwx r6, r5, r4 ++; CHECK-LE-NEXT: li r4, -32768 ++; CHECK-LE-NEXT: neg r7, r3 ++; CHECK-LE-NEXT: ld r3, 0(r1) ++; CHECK-LE-NEXT: and r4, r7, r4 ++; CHECK-LE-NEXT: mr r7, r4 ++; CHECK-LE-NEXT: li r4, -4096 ++; CHECK-LE-NEXT: divd r5, r7, r4 ++; CHECK-LE-NEXT: mulld r4, r5, r4 ++; CHECK-LE-NEXT: sub r5, r7, r4 ++; CHECK-LE-NEXT: add r4, r1, r7 ++; CHECK-LE-NEXT: stdux r3, r1, r5 ++; CHECK-LE-NEXT: cmpd r1, r4 ++; CHECK-LE-NEXT: beq cr0, .LBB11_8 ++; CHECK-LE-NEXT: .LBB11_7: ++; CHECK-LE-NEXT: stdu r3, -4096(r1) ++; CHECK-LE-NEXT: cmpd r1, r4 ++; CHECK-LE-NEXT: bne cr0, .LBB11_7 ++; CHECK-LE-NEXT: .LBB11_8: ++; CHECK-LE-NEXT: addi r3, r1, -32768 ++; CHECK-LE-NEXT: lbz r3, 0(r3) ++; CHECK-LE-NEXT: mr r1, r30 ++; CHECK-LE-NEXT: ld r31, -8(r1) ++; CHECK-LE-NEXT: ld r30, -16(r1) ++; CHECK-LE-NEXT: blr ++; ++; CHECK-BE-LABEL: f11: ++; CHECK-BE: # %bb.0: ++; CHECK-BE-NEXT: std r31, -8(r1) ++; CHECK-BE-NEXT: std r30, -16(r1) ++; CHECK-BE-NEXT: mr r30, r1 ++; CHECK-BE-NEXT: .cfi_def_cfa r30, 0 ++; CHECK-BE-NEXT: clrldi r0, r30, 49 ++; CHECK-BE-NEXT: subc r12, r30, r0 ++; CHECK-BE-NEXT: clrldi r0, r0, 52 ++; CHECK-BE-NEXT: cmpdi r0, 0 ++; CHECK-BE-NEXT: beq cr0, .LBB11_2 ++; CHECK-BE-NEXT: # %bb.1: ++; CHECK-BE-NEXT: neg r0, r0 ++; CHECK-BE-NEXT: stdux r30, r1, r0 ++; CHECK-BE-NEXT: .LBB11_2: ++; CHECK-BE-NEXT: li r0, -4096 ++; CHECK-BE-NEXT: cmpd r1, r12 ++; CHECK-BE-NEXT: beq cr0, .LBB11_4 ++; CHECK-BE-NEXT: .LBB11_3: ++; CHECK-BE-NEXT: stdux r30, r1, r0 ++; CHECK-BE-NEXT: cmpd r1, r12 ++; CHECK-BE-NEXT: bne cr0, .LBB11_3 ++; CHECK-BE-NEXT: .LBB11_4: ++; CHECK-BE-NEXT: mr r12, r30 ++; CHECK-BE-NEXT: li r0, 24 ++; CHECK-BE-NEXT: mtctr r0 ++; CHECK-BE-NEXT: .LBB11_5: ++; CHECK-BE-NEXT: stdu r12, -4096(r1) ++; CHECK-BE-NEXT: bdnz .LBB11_5 ++; CHECK-BE-NEXT: # %bb.6: ++; CHECK-BE-NEXT: .cfi_def_cfa_register r1 ++; CHECK-BE-NEXT: .cfi_def_cfa_register r30 ++; CHECK-BE-NEXT: .cfi_offset r31, -8 ++; CHECK-BE-NEXT: .cfi_offset r30, -16 ++; CHECK-BE-NEXT: clrldi r3, r3, 32 ++; CHECK-BE-NEXT: lis r5, 1 ++; CHECK-BE-NEXT: addi r3, r3, 15 ++; CHECK-BE-NEXT: mr r31, r1 ++; CHECK-BE-NEXT: ori r5, r5, 0 ++; CHECK-BE-NEXT: rldicl r3, r3, 60, 4 ++; CHECK-BE-NEXT: add r5, r31, r5 ++; CHECK-BE-NEXT: sldi r4, r4, 2 ++; CHECK-BE-NEXT: li r6, 1 ++; CHECK-BE-NEXT: rldicl r3, r3, 4, 31 ++; CHECK-BE-NEXT: stwx r6, r5, r4 ++; CHECK-BE-NEXT: neg r7, r3 ++; CHECK-BE-NEXT: li r4, -32768 ++; CHECK-BE-NEXT: and r4, r7, r4 ++; CHECK-BE-NEXT: ld r3, 0(r1) ++; CHECK-BE-NEXT: mr r7, r4 ++; CHECK-BE-NEXT: li r4, -4096 ++; CHECK-BE-NEXT: divd r5, r7, r4 ++; CHECK-BE-NEXT: mulld r4, r5, r4 ++; CHECK-BE-NEXT: sub r5, r7, r4 ++; CHECK-BE-NEXT: add r4, r1, r7 ++; CHECK-BE-NEXT: stdux r3, r1, r5 ++; CHECK-BE-NEXT: cmpd r1, r4 ++; CHECK-BE-NEXT: beq cr0, .LBB11_8 ++; CHECK-BE-NEXT: .LBB11_7: ++; CHECK-BE-NEXT: stdu r3, -4096(r1) ++; CHECK-BE-NEXT: cmpd r1, r4 ++; CHECK-BE-NEXT: bne cr0, .LBB11_7 ++; CHECK-BE-NEXT: .LBB11_8: ++; CHECK-BE-NEXT: addi r3, r1, -32768 ++; CHECK-BE-NEXT: lbz r3, 0(r3) ++; CHECK-BE-NEXT: mr r1, r30 ++; CHECK-BE-NEXT: ld r31, -8(r1) ++; CHECK-BE-NEXT: ld r30, -16(r1) ++; CHECK-BE-NEXT: blr ++; ++; CHECK-32-LABEL: f11: ++; CHECK-32: # %bb.0: ++; CHECK-32-NEXT: mr r12, r1 ++; CHECK-32-NEXT: .cfi_def_cfa r12, 0 ++; CHECK-32-NEXT: clrlwi r0, r12, 17 ++; CHECK-32-NEXT: subc r1, r1, r0 ++; CHECK-32-NEXT: li r0, 24 ++; CHECK-32-NEXT: mtctr r0 ++; CHECK-32-NEXT: .LBB11_1: ++; CHECK-32-NEXT: stwu r12, -4096(r1) ++; CHECK-32-NEXT: bdnz .LBB11_1 ++; CHECK-32-NEXT: # %bb.2: ++; CHECK-32-NEXT: .cfi_def_cfa_register r1 ++; CHECK-32-NEXT: sub r0, r1, r12 ++; CHECK-32-NEXT: sub r0, r1, r0 ++; CHECK-32-NEXT: addic r0, r0, -4 ++; CHECK-32-NEXT: stwx r31, 0, r0 ++; CHECK-32-NEXT: addic r0, r0, -4 ++; CHECK-32-NEXT: stwx r30, 0, r0 ++; CHECK-32-NEXT: addic r30, r0, 8 ++; CHECK-32-NEXT: .cfi_def_cfa_register r30 ++; CHECK-32-NEXT: .cfi_offset r31, -4 ++; CHECK-32-NEXT: .cfi_offset r30, -8 ++; CHECK-32-NEXT: lis r4, 1 ++; CHECK-32-NEXT: mr r31, r1 ++; CHECK-32-NEXT: ori r4, r4, 0 ++; CHECK-32-NEXT: addi r3, r3, 15 ++; CHECK-32-NEXT: add r4, r31, r4 ++; CHECK-32-NEXT: li r5, 1 ++; CHECK-32-NEXT: slwi r6, r6, 2 ++; CHECK-32-NEXT: rlwinm r3, r3, 0, 0, 27 ++; CHECK-32-NEXT: neg r7, r3 ++; CHECK-32-NEXT: stwx r5, r4, r6 ++; CHECK-32-NEXT: li r4, -32768 ++; CHECK-32-NEXT: and r4, r7, r4 ++; CHECK-32-NEXT: lwz r3, 0(r1) ++; CHECK-32-NEXT: mr r7, r4 ++; CHECK-32-NEXT: li r4, -4096 ++; CHECK-32-NEXT: divw r5, r7, r4 ++; CHECK-32-NEXT: mullw r4, r5, r4 ++; CHECK-32-NEXT: sub r5, r7, r4 ++; CHECK-32-NEXT: add r4, r1, r7 ++; CHECK-32-NEXT: stwux r3, r1, r5 ++; CHECK-32-NEXT: cmpw r1, r4 ++; CHECK-32-NEXT: beq cr0, .LBB11_4 ++; CHECK-32-NEXT: .LBB11_3: ++; CHECK-32-NEXT: stwu r3, -4096(r1) ++; CHECK-32-NEXT: cmpw r1, r4 ++; CHECK-32-NEXT: bne cr0, .LBB11_3 ++; CHECK-32-NEXT: .LBB11_4: ++; CHECK-32-NEXT: addi r3, r1, -32768 ++; CHECK-32-NEXT: lbz r3, 0(r3) ++; CHECK-32-NEXT: lwz r31, 0(r1) ++; CHECK-32-NEXT: lwz r0, -4(r31) ++; CHECK-32-NEXT: lwz r30, -8(r31) ++; CHECK-32-NEXT: mr r1, r31 ++; CHECK-32-NEXT: mr r31, r0 ++; CHECK-32-NEXT: blr ++ %a = alloca i32, i32 4096, align 32768 ++ %b = getelementptr inbounds i32, i32* %a, i64 %i ++ store volatile i32 1, i32* %b ++ %1 = zext i32 %vla_size to i64 ++ %vla = alloca i8, i64 %1, align 2048 ++ %2 = load volatile i8, i8* %vla, align 2048 ++ ret void ++} ++ + attributes #0 = { "probe-stack"="inline-asm" } +diff --git llvm/test/CodeGen/PowerPC/stack-realign.ll llvm/test/CodeGen/PowerPC/stack-realign.ll +index ea3603b9ce20..640bfb81709a 100644 +--- llvm/test/CodeGen/PowerPC/stack-realign.ll ++++ llvm/test/CodeGen/PowerPC/stack-realign.ll +@@ -43,7 +43,7 @@ entry: + + ; CHECK: std 3, 48(30) + +-; CHECK: ld 1, 0(1) ++; CHECK: mr 1, 30 + ; CHECK-DAG: ld [[SR:[0-9]+]], 16(1) + ; CHECK-DAG: ld 30, -16(1) + ; CHECK-DAG: mtlr [[SR]] +@@ -69,7 +69,7 @@ entry: + + ; CHECK-FP: std 3, 48(30) + +-; CHECK-FP: ld 1, 0(1) ++; CHECK-FP: mr 1, 30 + ; CHECK-FP-DAG: ld [[SR:[0-9]+]], 16(1) + ; CHECK-FP-DAG: ld 31, -8(1) + ; CHECK-FP-DAG: ld 30, -16(1) +-- +2.30.0 + diff --git a/deps/patches/llvm-rGb498303066a6-gcc11-header-fix.patch b/deps/patches/llvm-rGb498303066a6-gcc11-header-fix.patch new file mode 100644 index 0000000000000..a1683c91c5b29 --- /dev/null +++ b/deps/patches/llvm-rGb498303066a6-gcc11-header-fix.patch @@ -0,0 +1,21 @@ +From b498303066a63a203d24f739b2d2e0e56dca70d1 Mon Sep 17 00:00:00 2001 +From: serge-sans-paille +Date: Tue, 10 Nov 2020 14:55:25 +0100 +Subject: [PATCH] [nfc] Fix missing include + +--- + llvm/utils/benchmark/src/benchmark_register.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/llvm/utils/benchmark/src/benchmark_register.h b/llvm/utils/benchmark/src/benchmark_register.h +index 0705e219f2fa..4caa5ad4da07 100644 +--- a/utils/benchmark/src/benchmark_register.h ++++ b/utils/benchmark/src/benchmark_register.h +@@ -1,6 +1,7 @@ + #ifndef BENCHMARK_REGISTER_H + #define BENCHMARK_REGISTER_H + ++#include + #include + + #include "check.h" diff --git a/deps/patches/mbedtls-cmake-findpy.patch b/deps/patches/mbedtls-cmake-findpy.patch index 0b66a8b2ac1d7..ddbb1fc2f4aa7 100644 --- a/deps/patches/mbedtls-cmake-findpy.patch +++ b/deps/patches/mbedtls-cmake-findpy.patch @@ -19,5 +19,5 @@ index 8833246..2ed55ed 100644 +cmake_policy(SET CMP0012 NEW) + if(TEST_CPP) - project("mbed TLS" C CXX) + project("mbed TLS" C CXX) else() diff --git a/deps/suitesparse.mk b/deps/suitesparse.mk index f4515f6b0a884..eda7a1c21c12d 100644 --- a/deps/suitesparse.mk +++ b/deps/suitesparse.mk @@ -17,7 +17,7 @@ CHOLMOD_CONFIG += -DNPARTITION ifneq ($(USE_BINARYBUILDER_SUITESPARSE), 1) SUITESPARSE_PROJECTS := AMD BTF CAMD CCOLAMD COLAMD CHOLMOD LDL KLU UMFPACK RBio SPQR -SUITESPARSE_LIBS := $(addsuffix .*$(SHLIB_EXT)*,suitesparseconfig amd btf camd ccolamd colamd cholmod klu umfpack rbio spqr) +SUITESPARSE_LIBS := $(addsuffix .*$(SHLIB_EXT)*,suitesparseconfig amd btf camd ccolamd colamd cholmod klu ldl umfpack rbio spqr) SUITE_SPARSE_LIB := $(LDFLAGS) -L"$(abspath $(BUILDDIR))/SuiteSparse-$(SUITESPARSE_VER)/lib" ifeq ($(OS), Darwin) diff --git a/deps/tools/common.mk b/deps/tools/common.mk index 35effcb75bd96..a2a552830c495 100644 --- a/deps/tools/common.mk +++ b/deps/tools/common.mk @@ -23,6 +23,10 @@ CMAKE_CXX_ARG := $(CXX_ARG) CMAKE_COMMON := -DCMAKE_INSTALL_PREFIX:PATH=$(build_prefix) -DCMAKE_PREFIX_PATH=$(build_prefix) CMAKE_COMMON += -DCMAKE_INSTALL_LIBDIR=$(build_libdir) -DCMAKE_INSTALL_BINDIR=$(build_bindir) CMAKE_COMMON += -DLIB_INSTALL_DIR=$(build_shlibdir) +ifeq ($(OS), Darwin) +CMAKE_COMMON += -DCMAKE_MACOSX_RPATH=1 +endif + ifneq ($(VERBOSE), 0) CMAKE_COMMON += -DCMAKE_VERBOSE_MAKEFILE=ON endif diff --git a/doc/src/manual/environment-variables.md b/doc/src/manual/environment-variables.md index 597e65510421a..710ba2e5b09f9 100644 --- a/doc/src/manual/environment-variables.md +++ b/doc/src/manual/environment-variables.md @@ -190,11 +190,9 @@ a master process to establish a connection before dying. ### [`JULIA_NUM_THREADS`](@id JULIA_NUM_THREADS) An unsigned 64-bit integer (`uint64_t`) that sets the maximum number of threads -available to Julia. If `$JULIA_NUM_THREADS` exceeds the number of available -CPU threads (logical cores), then the number of threads is set to the number of CPU threads. If -`$JULIA_NUM_THREADS` is not positive or is not set, or if the number of CPU -threads cannot be determined through system calls, then the number of threads is -set to `1`. +available to Julia. If `$JULIA_NUM_THREADS` is not positive or is not set, or if +the number of CPU threads cannot be determined through system calls, then the number +of threads is set to `1`. !!! note diff --git a/src/aotcompile.cpp b/src/aotcompile.cpp index c95d6430e04dd..b7bdac7923c2e 100644 --- a/src/aotcompile.cpp +++ b/src/aotcompile.cpp @@ -279,7 +279,7 @@ static void jl_ci_cache_lookup(const jl_cgparams_t &cgparams, jl_method_instance // takes the running content that has collected in the shadow module and dump it to disk // this builds the object file portion of the sysimage files for fast startup, and can // also be used be extern consumers like GPUCompiler.jl to obtain a module containing -// all reachable & inferrrable functions. The `policy` flag switches between the defaul +// all reachable & inferrrable functions. The `policy` flag switches between the default // mode `0` and the extern mode `1`. extern "C" JL_DLLEXPORT void *jl_create_native(jl_array_t *methods, const jl_cgparams_t cgparams, int _policy) @@ -404,16 +404,18 @@ void *jl_create_native(jl_array_t *methods, const jl_cgparams_t cgparams, int _p // move everything inside, now that we've merged everything // (before adding the exported headers) - for (GlobalObject &G : clone->global_objects()) { - if (!G.isDeclaration()) { - G.setLinkage(Function::InternalLinkage); - makeSafeName(G); - addComdat(&G); + if (policy == CompilationPolicy::Default) { + for (GlobalObject &G : clone->global_objects()) { + if (!G.isDeclaration()) { + G.setLinkage(Function::InternalLinkage); + makeSafeName(G); + addComdat(&G); #if defined(_OS_WINDOWS_) && defined(_CPU_X86_64_) - // Add unwind exception personalities to functions to handle async exceptions - if (Function *F = dyn_cast(&G)) - F->setPersonalityFn(juliapersonality_func); + // Add unwind exception personalities to functions to handle async exceptions + if (Function *F = dyn_cast(&G)) + F->setPersonalityFn(juliapersonality_func); #endif + } } } diff --git a/src/ccall.cpp b/src/ccall.cpp index 8ef419d18bf84..65c0fa74c9ace 100644 --- a/src/ccall.cpp +++ b/src/ccall.cpp @@ -1053,7 +1053,7 @@ std::string generate_func_sig(const char *fname) // see pull req #978. need to annotate signext/zeroext for // small integer arguments. jl_datatype_t *bt = (jl_datatype_t*)tti; - if (jl_datatype_size(bt) < 4) { + if (jl_datatype_size(bt) < 4 && bt != jl_float16_type) { if (jl_signed_type && jl_subtype(tti, (jl_value_t*)jl_signed_type)) ab.addAttribute(Attribute::SExt); else @@ -1481,6 +1481,28 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs) tbaa_decorate(tbaa_const, tid); return mark_or_box_ccall_result(ctx, tid, retboxed, rt, unionall, static_rt); } + else if (is_libjulia_func(jl_gc_disable_finalizers_internal) +#ifdef NDEBUG + || is_libjulia_func(jl_gc_enable_finalizers_internal) +#endif + ) { + JL_GC_POP(); + Value *ptls_i32 = emit_bitcast(ctx, ctx.ptlsStates, T_pint32); + const int finh_offset = offsetof(jl_tls_states_t, finalizers_inhibited); + Value *pfinh = ctx.builder.CreateInBoundsGEP(ptls_i32, ConstantInt::get(T_size, finh_offset / 4)); + LoadInst *finh = ctx.builder.CreateAlignedLoad(pfinh, Align(sizeof(int32_t))); + Value *newval; + if (is_libjulia_func(jl_gc_disable_finalizers_internal)) { + newval = ctx.builder.CreateAdd(finh, ConstantInt::get(T_int32, 1)); + } + else { + newval = ctx.builder.CreateSelect(ctx.builder.CreateICmpEQ(finh, ConstantInt::get(T_int32, 0)), + ConstantInt::get(T_int32, 0), + ctx.builder.CreateSub(finh, ConstantInt::get(T_int32, 1))); + } + ctx.builder.CreateStore(newval, pfinh); + return ghostValue(jl_nothing_type); + } else if (is_libjulia_func(jl_get_current_task)) { assert(lrt == T_prjlvalue); assert(!isVa && !llvmcall && nccallargs == 0); diff --git a/src/codegen.cpp b/src/codegen.cpp index f1440be540607..c7f8f4b942c19 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1377,7 +1377,7 @@ static inline jl_cgval_t update_julia_type(jl_codectx_t &ctx, const jl_cgval_t & return jl_cgval_t(v, typ, NULL); } -static jl_cgval_t convert_julia_type(jl_codectx_t &ctx, const jl_cgval_t &v, jl_value_t *typ); +static jl_cgval_t convert_julia_type(jl_codectx_t &ctx, const jl_cgval_t &v, jl_value_t *typ, Value **skip=nullptr); // --- allocating local variables --- @@ -1438,7 +1438,7 @@ static void CreateConditionalAbort(IRBuilder<> &irbuilder, Value *test) #include "cgutils.cpp" -static jl_cgval_t convert_julia_type_union(jl_codectx_t &ctx, const jl_cgval_t &v, jl_value_t *typ) +static jl_cgval_t convert_julia_type_union(jl_codectx_t &ctx, const jl_cgval_t &v, jl_value_t *typ, Value **skip) { // previous value was a split union, compute new index, or box Value *new_tindex = ConstantInt::get(T_int8, 0x80); @@ -1463,6 +1463,10 @@ static jl_cgval_t convert_julia_type_union(jl_codectx_t &ctx, const jl_cgval_t & // new value doesn't need to be boxed // since it isn't part of the new union t = true; + if (skip) { + Value *skip1 = ctx.builder.CreateICmpEQ(tindex, ConstantInt::get(T_int8, idx)); + *skip = *skip ? ctx.builder.CreateOr(*skip, skip1) : skip1; + } } else { // will actually need to box this element @@ -1553,7 +1557,8 @@ static jl_cgval_t convert_julia_type_union(jl_codectx_t &ctx, const jl_cgval_t & if (v.V == NULL) { // v.V might be NULL if it was all ghost objects before return jl_cgval_t(boxv, NULL, false, typ, new_tindex); - } else { + } + else { Value *isboxv = ctx.builder.CreateIsNotNull(boxv); Value *slotv; MDNode *tbaa; @@ -1585,7 +1590,7 @@ static jl_cgval_t convert_julia_type_union(jl_codectx_t &ctx, const jl_cgval_t & // given a value marked with type `v.typ`, compute the mapping and/or boxing to return a value of type `typ` // TODO: should this set TIndex when trivial (such as 0x80 or concrete types) ? -static jl_cgval_t convert_julia_type(jl_codectx_t &ctx, const jl_cgval_t &v, jl_value_t *typ) +static jl_cgval_t convert_julia_type(jl_codectx_t &ctx, const jl_cgval_t &v, jl_value_t *typ, Value **skip) { if (typ == (jl_value_t*)jl_typeofbottom_type) return ghostValue(typ); // normalize TypeofBottom to Type{Union{}} @@ -1596,6 +1601,7 @@ static jl_cgval_t convert_julia_type(jl_codectx_t &ctx, const jl_cgval_t &v, jl_ return ghostValue(typ); Value *new_tindex = NULL; if (jl_is_concrete_type(typ)) { + assert(skip == nullptr && "skip only valid for union type return"); if (v.TIndex && !jl_is_pointerfree(typ)) { // discovered that this union-split type must actually be isboxed if (v.Vboxed) { @@ -1618,7 +1624,7 @@ static jl_cgval_t convert_julia_type(jl_codectx_t &ctx, const jl_cgval_t &v, jl_ else { bool makeboxed = false; if (v.TIndex) { - return convert_julia_type_union(ctx, v, typ); + return convert_julia_type_union(ctx, v, typ, skip); } else if (!v.isboxed && jl_is_uniontype(typ)) { // previous value was unboxed (leaftype), statically compute union tindex @@ -1638,6 +1644,11 @@ static jl_cgval_t convert_julia_type(jl_codectx_t &ctx, const jl_cgval_t &v, jl_ else if (jl_subtype(v.typ, typ)) { makeboxed = true; } + else if (skip) { + // undef + *skip = ConstantInt::get(T_int1, 1); + return jl_cgval_t(); + } else { // unreachable CreateTrap(ctx.builder); @@ -4612,7 +4623,7 @@ static Function *emit_tojlinvoke(jl_code_instance_t *codeinst, Module *M, jl_cod ctx.builder.SetInsertPoint(b0); Function *theFunc; Value *theFarg; - if (codeinst->invoke != NULL) { + if (params.cache && codeinst->invoke != NULL) { StringRef theFptrName = jl_ExecutionEngine->getFunctionAtAddress((uintptr_t)codeinst->invoke, codeinst); theFunc = cast( M->getOrInsertFunction(theFptrName, jlinvoke_func->_type(jl_LLVMContext)).getCallee()); @@ -5631,6 +5642,7 @@ static jl_returninfo_t get_specsig_function(jl_codectx_t &ctx, Module *M, String unsigned argno = 1; #if JL_LLVM_VERSION < 120000 attributes = attributes.addAttribute(jl_LLVMContext, argno, Attribute::StructRet); + (void)srt; // silence unused variable error #else Attribute sret = Attribute::getWithStructRetType(jl_LLVMContext, srt); attributes = attributes.addAttribute(jl_LLVMContext, argno, sret); @@ -5668,6 +5680,11 @@ static jl_returninfo_t get_specsig_function(jl_codectx_t &ctx, Module *M, String else if (isboxed && jl_is_immutable_datatype(jt)) { attributes = attributes.addParamAttribute(jl_LLVMContext, argno, Attribute::ReadOnly); } + else if (jl_is_primitivetype(jt) && ty->isIntegerTy()) { + bool issigned = jl_signed_type && jl_subtype(jt, (jl_value_t*)jl_signed_type); + Attribute::AttrKind attr = issigned ? Attribute::SExt : Attribute::ZExt; + attributes = attributes.addParamAttribute(jl_LLVMContext, argno, attr); + } fsig.push_back(ty); } @@ -6916,12 +6933,16 @@ static std::pair, jl_llvm_functions_t> V = boxed(ctx, val); } else { + // XXX: must emit undef here (rather than a bitcast or + // load of val) if the runtime type of val isn't phiType V = emit_unbox(ctx, VN->getType(), val, phiType); } VN->addIncoming(V, ctx.builder.GetInsertBlock()); assert(!TindexN); } else if (dest && val.typ != (jl_value_t*)jl_bottom_type) { + // XXX: must emit undef here (rather than a bitcast or + // load of val) if the runtime type of val isn't phiType assert(lty != T_prjlvalue); (void)emit_unbox(ctx, lty, val, phiType, maybe_decay_tracked(ctx, dest)); } @@ -6954,7 +6975,10 @@ static std::pair, jl_llvm_functions_t> } } else { - jl_cgval_t new_union = convert_julia_type(ctx, val, phiType); + Value *skip = NULL; + // must compute skip here, since the runtime type of val might not be in phiType + // caution: only Phi and PhiC are allowed to do this (and maybe sometimes Pi) + jl_cgval_t new_union = convert_julia_type(ctx, val, phiType, &skip); RTindex = new_union.TIndex; if (!RTindex) { assert(new_union.isboxed && new_union.Vboxed && "convert_julia_type failed"); @@ -6969,11 +6993,12 @@ static std::pair, jl_llvm_functions_t> if (VN) V = new_union.Vboxed ? new_union.Vboxed : V_rnull; if (dest) { // basically, if !ghost union - Value *skip = NULL; - if (new_union.Vboxed != nullptr) - skip = ctx.builder.CreateICmpNE( // if 0x80 is set, we won't select this slot anyways + if (new_union.Vboxed != nullptr) { + Value *isboxed = ctx.builder.CreateICmpNE( // if 0x80 is set, we won't select this slot anyways ctx.builder.CreateAnd(RTindex, ConstantInt::get(T_int8, 0x80)), ConstantInt::get(T_int8, 0)); + skip = skip ? ctx.builder.CreateOr(isboxed, skip) : isboxed; + } emit_unionmove(ctx, dest, tbaa_arraybuf, new_union, skip); } } diff --git a/src/debuginfo.cpp b/src/debuginfo.cpp index 6e93d85e73ab1..cc7993390e0ee 100644 --- a/src/debuginfo.cpp +++ b/src/debuginfo.cpp @@ -974,10 +974,10 @@ static objfileentry_t &find_object_file(uint64_t fbase, StringRef fname) JL_NOTS DebugInfo(errorCodeToError(std::make_error_code(std::errc::no_such_file_or_directory))); // Can't find a way to construct an empty Expected object // that can be ignored. - ignoreError(DebugInfo); if (fname.substr(sep + 1) != info.filename) { debuginfopath = fname.substr(0, sep + 1).str(); debuginfopath += info.filename; + ignoreError(DebugInfo); DebugInfo = openDebugInfo(debuginfopath, info); } if (!DebugInfo) { diff --git a/src/dump.c b/src/dump.c index 0daad95c03b5c..44ed6b0604479 100644 --- a/src/dump.c +++ b/src/dump.c @@ -348,9 +348,10 @@ static void jl_serialize_module(jl_serializer_state *s, jl_module_t *m) write_int8(s->s, 0); jl_serialize_value(s, m->parent); void **table = m->bindings.table; - for (i = 1; i < m->bindings.size; i += 2) { - if (table[i] != HT_NOTFOUND) { - jl_binding_t *b = (jl_binding_t*)table[i]; + for (i = 0; i < m->bindings.size; i += 2) { + if (table[i+1] != HT_NOTFOUND) { + jl_serialize_value(s, (jl_value_t*)table[i]); + jl_binding_t *b = (jl_binding_t*)table[i+1]; jl_serialize_value(s, b->name); jl_value_t *e = b->value; if (!b->constp && e && jl_is_cpointer(e) && jl_unbox_voidpointer(e) != (void*)-1 && jl_unbox_voidpointer(e) != NULL) @@ -1551,12 +1552,12 @@ static jl_value_t *jl_deserialize_value_module(jl_serializer_state *s) JL_GC_DIS jl_gc_wb(m, m->parent); while (1) { - jl_sym_t *name = (jl_sym_t*)jl_deserialize_value(s, NULL); - if (name == NULL) + jl_sym_t *asname = (jl_sym_t*)jl_deserialize_value(s, NULL); + if (asname == NULL) break; - jl_binding_t *b = jl_get_binding_wr(m, name, 1); + jl_binding_t *b = jl_get_binding_wr(m, asname, 1); + b->name = (jl_sym_t*)jl_deserialize_value(s, (jl_value_t**)&b->name); b->value = jl_deserialize_value(s, &b->value); - jl_gc_wb_buf(m, b, sizeof(jl_binding_t)); if (b->value != NULL) jl_gc_wb(m, b->value); b->globalref = jl_deserialize_value(s, &b->globalref); if (b->globalref != NULL) jl_gc_wb(m, b->globalref); diff --git a/src/gc.c b/src/gc.c index ef1ef52da26d4..94f5a80fd0cbe 100644 --- a/src/gc.c +++ b/src/gc.c @@ -181,6 +181,7 @@ bigval_t *big_objects_marked = NULL; // `to_finalize` should not have tagged pointers. arraylist_t finalizer_list_marked; arraylist_t to_finalize; +int jl_gc_have_pending_finalizers = 0; NOINLINE uintptr_t gc_get_stack_ptr(void) { @@ -261,6 +262,7 @@ static void schedule_finalization(void *o, void *f) JL_NOTSAFEPOINT { arraylist_push(&to_finalize, o); arraylist_push(&to_finalize, f); + jl_gc_have_pending_finalizers = 1; } static void run_finalizer(jl_ptls_t ptls, jl_value_t *o, jl_value_t *ff) @@ -386,12 +388,24 @@ static void run_finalizers(jl_ptls_t ptls) if (to_finalize.items == to_finalize._space) { copied_list.items = copied_list._space; } + jl_gc_have_pending_finalizers = 0; arraylist_new(&to_finalize, 0); // This releases the finalizers lock. jl_gc_run_finalizers_in_list(ptls, &copied_list); arraylist_free(&copied_list); } +JL_DLLEXPORT void jl_gc_run_pending_finalizers(jl_ptls_t ptls) +{ + if (ptls == NULL) + ptls = jl_get_ptls_states(); + if (!ptls->in_finalizer && ptls->locks.len == 0 && ptls->finalizers_inhibited == 0) { + ptls->in_finalizer = 1; + run_finalizers(ptls); + ptls->in_finalizer = 0; + } +} + JL_DLLEXPORT int jl_gc_get_finalizers_inhibited(jl_ptls_t ptls) { if (ptls == NULL) @@ -399,6 +413,22 @@ JL_DLLEXPORT int jl_gc_get_finalizers_inhibited(jl_ptls_t ptls) return ptls->finalizers_inhibited; } +JL_DLLEXPORT void jl_gc_disable_finalizers_internal(void) +{ + jl_ptls_t ptls = jl_get_ptls_states(); + ptls->finalizers_inhibited++; +} + +JL_DLLEXPORT void jl_gc_enable_finalizers_internal(void) +{ + jl_ptls_t ptls = jl_get_ptls_states(); +#ifdef NDEBUG + ptls->finalizers_inhibited--; +#else + jl_gc_enable_finalizers(ptls, 1); +#endif +} + JL_DLLEXPORT void jl_gc_enable_finalizers(jl_ptls_t ptls, int on) { if (ptls == NULL) @@ -421,10 +451,8 @@ JL_DLLEXPORT void jl_gc_enable_finalizers(jl_ptls_t ptls, int on) return; } ptls->finalizers_inhibited = new_val; - if (!new_val && old_val && !ptls->in_finalizer && ptls->locks.len == 0) { - ptls->in_finalizer = 1; - run_finalizers(ptls); - ptls->in_finalizer = 0; + if (jl_gc_have_pending_finalizers) { + jl_gc_run_pending_finalizers(ptls); } } diff --git a/src/gf.c b/src/gf.c index a4c98d3ce29ce..4b07e35e2edba 100644 --- a/src/gf.c +++ b/src/gf.c @@ -104,7 +104,9 @@ static int speccache_eq(size_t idx, const void *ty, jl_svec_t *data, uint_t hv) // get or create the MethodInstance for a specialization JL_DLLEXPORT jl_method_instance_t *jl_specializations_get_linfo(jl_method_t *m JL_PROPAGATES_ROOT, jl_value_t *type, jl_svec_t *sparams) { - uint_t hv = ((jl_datatype_t*)(jl_is_unionall(type) ? jl_unwrap_unionall(type) : type))->hash; + jl_value_t *ut = jl_is_unionall(type) ? jl_unwrap_unionall(type) : type; + JL_TYPECHK(specializations, datatype, ut); + uint_t hv = ((jl_datatype_t*)ut)->hash; for (int locked = 0; ; locked++) { jl_array_t *speckeyset = jl_atomic_load_acquire(&m->speckeyset); jl_svec_t *specializations = jl_atomic_load_acquire(&m->specializations); @@ -646,7 +648,7 @@ static void jl_compilation_sig( else if (jl_is_type_type(elt)) { // elt isa Type{T} if (very_general_type(decl_i)) { /* - here's a fairly simple heuristic: if this argument slot's + Here's a fairly simple heuristic: if this argument slot's declared type is general (Type or Any), then don't specialize for every Type that got passed. @@ -661,8 +663,9 @@ static void jl_compilation_sig( x::TypeConstructor matches the first but not the second, while also matching all other TypeConstructors. This means neither Type{TC} nor TypeConstructor is more specific. + + But don't apply this heuristic if the argument is called (issue #36783). */ - // don't apply this heuristic if the argument is called (issue #36783) int iscalled = i_arg > 0 && i_arg <= 8 && (definition->called & (1 << (i_arg - 1))); if (!iscalled) { if (!*newparams) *newparams = jl_svec_copy(tt->parameters); @@ -672,13 +675,13 @@ static void jl_compilation_sig( else if (jl_is_type_type(jl_tparam0(elt)) && // try to give up on specializing type parameters for Type{Type{Type{...}}} (jl_is_type_type(jl_tparam0(jl_tparam0(elt))) || !jl_has_free_typevars(decl_i))) { - // TODO: this is probably solidly unsound and would corrupt the cache in many cases /* actual argument was Type{...}, we computed its type as - Type{Type{...}}. we must avoid unbounded nesting here, so - cache the signature as Type{T}, unless something more - specific like Type{Type{Int32}} was actually declared. - this can be determined using a type intersection. + Type{Type{...}}. we like to avoid unbounded nesting here, so + compile (and hopefully cache) the signature as Type{T}, + unless something more specific like Type{Type{Int32}} was + actually declared. this can be determined using a type + intersection. */ if (!*newparams) *newparams = jl_svec_copy(tt->parameters); if (i < nargs || !definition->isva) { @@ -1017,12 +1020,12 @@ static jl_method_instance_t *cache_method( intptr_t nspec = (mt == NULL || mt == jl_type_type_mt || mt == jl_nonfunction_mt ? definition->nargs + 1 : mt->max_args + 2); jl_compilation_sig(tt, sparams, definition, nspec, &newparams); if (newparams) { - cache_with_orig = 0; compilationsig = jl_apply_tuple_type(newparams); temp2 = (jl_value_t*)compilationsig; // In most cases `!jl_isa_compileable_sig(tt, definition))`, // although for some cases, (notably Varargs) // we might choose a replacement type that's preferable but not strictly better + cache_with_orig = !jl_subtype(compilationsig, definition->sig); } // TODO: maybe assert(jl_isa_compileable_sig(compilationsig, definition)); newmeth = jl_specializations_get_linfo(definition, (jl_value_t*)compilationsig, sparams); @@ -1031,7 +1034,6 @@ static jl_method_instance_t *cache_method( jl_svec_t* guardsigs = jl_emptysvec; if (!cache_with_orig && mt) { // now examine what will happen if we chose to use this sig in the cache - // TODO: should we first check `compilationsig <: definition`? size_t min_valid2 = 1; size_t max_valid2 = ~(size_t)0; temp = ml_matches(mt, 0, compilationsig, MAX_UNSPECIALIZED_CONFLICTS, 1, 1, world, 0, &min_valid2, &max_valid2, NULL); @@ -1659,21 +1661,33 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method size_t ins = 0; for (i = 1; i < na; i += 2) { jl_value_t *backedgetyp = backedges[i - 1]; + int missing = 0; if (jl_type_intersection2(backedgetyp, (jl_value_t*)type, &isect, &isect2)) { - // see if the intersection was actually already fully - // covered by anything (method or ambiguity is okay) + // See if the intersection was actually already fully + // covered, but that the new method is ambiguous. + // -> no previous method: now there is one, need to update the missing edge + // -> one+ previously matching method(s): + // -> more specific then all of them: need to update the missing edge + // -> some may have been ambiguous: now there is a replacement + // -> some may have been called: now there is a replacement (also will be detected in the loop later) + // -> less specific or ambiguous with any one of them: can ignore the missing edge (not missing) + // -> some may have been ambiguous: still are + // -> some may have been called: they may be partly replaced (will be detected in the loop later) + missing = 1; size_t j; for (j = 0; j < n; j++) { jl_method_t *m = d[j]; - if (jl_subtype(isect, m->sig)) - break; - if (isect2 && jl_subtype(isect2, m->sig)) - break; + if (jl_subtype(isect, m->sig) || (isect2 && jl_subtype(isect2, m->sig))) { + // We now know that there actually was a previous + // method for this part of the type intersection. + if (!jl_type_morespecific(type, m->sig)) { + missing = 0; + break; + } + } } - if (j != n) - isect = jl_bottom_type; } - if (isect != jl_bottom_type) { + if (missing) { jl_method_instance_t *backedge = (jl_method_instance_t*)backedges[i]; invalidate_external(backedge, max_world); invalidate_method_instance(backedge, max_world, 0); @@ -1715,7 +1729,7 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method isect3 = jl_type_intersection(m->sig, (jl_value_t*)mi->specTypes); if (jl_type_intersection2(type, isect3, &isect, &isect2)) { if (morespec[j] == (char)morespec_unknown) - morespec[j] = (char)jl_type_morespecific(m->sig, type) ? morespec_is : morespec_isnot; + morespec[j] = (char)(jl_type_morespecific(m->sig, type) ? morespec_is : morespec_isnot); if (morespec[j] == (char)morespec_is) // not actually shadowing--the existing method is still better break; @@ -1730,7 +1744,7 @@ JL_DLLEXPORT void jl_method_table_insert(jl_methtable_t *mt, jl_method_t *method if (m == m2 || !(jl_subtype(isect, m2->sig) || (isect && jl_subtype(isect, m2->sig)))) continue; if (morespec[k] == (char)morespec_unknown) - morespec[k] = (char)jl_type_morespecific(m2->sig, type) ? morespec_is : morespec_isnot; + morespec[k] = (char)(jl_type_morespecific(m2->sig, type) ? morespec_is : morespec_isnot); if (morespec[k] == (char)morespec_is) // not actually shadowing this--m2 will still be better break; diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index 6269607ae575c..aada046d46b69 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -726,7 +726,7 @@ JuliaOJIT::JuliaOJIT(TargetMachine &TM, LLVMContext *LLVMCtx) static void *atomic_hdl = jl_load_dynamic_library(libatomic, JL_RTLD_LOCAL, 0); if (atomic_hdl != NULL) { GlobalJD.addGenerator( - std::move(*orc::DynamicLibrarySearchGenerator::Load( + cantFail(orc::DynamicLibrarySearchGenerator::Load( libatomic, DL.getGlobalPrefix(), [&](const orc::SymbolStringPtr &S) { @@ -814,13 +814,21 @@ JL_JITSymbol JuliaOJIT::findUnmangledSymbol(StringRef Name) uint64_t JuliaOJIT::getGlobalValueAddress(StringRef Name) { auto addr = findSymbol(getMangledName(Name), false); - return addr ? cantFail(addr.getAddress()) : 0; + if (!addr) { + consumeError(addr.takeError()); + return 0; + } + return cantFail(addr.getAddress()); } uint64_t JuliaOJIT::getFunctionAddress(StringRef Name) { auto addr = findSymbol(getMangledName(Name), false); - return addr ? cantFail(addr.getAddress()) : 0; + if (!addr) { + consumeError(addr.takeError()); + return 0; + } + return cantFail(addr.getAddress()); } static int globalUniqueGeneratedNames; diff --git a/src/julia_threads.h b/src/julia_threads.h index 1eaf0e0035f52..f42984130f9a3 100644 --- a/src/julia_threads.h +++ b/src/julia_threads.h @@ -332,6 +332,10 @@ int8_t jl_gc_safe_leave(jl_ptls_t ptls, int8_t state); // Can be a safepoint JL_DLLEXPORT void (jl_gc_safepoint)(void); JL_DLLEXPORT void jl_gc_enable_finalizers(jl_ptls_t ptls, int on); +JL_DLLEXPORT void jl_gc_disable_finalizers_internal(void); +JL_DLLEXPORT void jl_gc_enable_finalizers_internal(void); +JL_DLLEXPORT void jl_gc_run_pending_finalizers(jl_ptls_t ptls); +extern JL_DLLEXPORT int jl_gc_have_pending_finalizers; JL_DLLEXPORT void jl_wakeup_thread(int16_t tid); diff --git a/src/llvm-alloc-opt.cpp b/src/llvm-alloc-opt.cpp index c6d9dce9b8548..381380372db40 100644 --- a/src/llvm-alloc-opt.cpp +++ b/src/llvm-alloc-opt.cpp @@ -936,7 +936,12 @@ void Optimizer::moveToStack(CallInst *orig_inst, size_t sz, bool has_ref) ptr = cast(prolog_builder.CreateBitCast(buff, pass.T_pint8)); } else { - buff = prolog_builder.CreateAlloca(Type::getIntNTy(pass.getLLVMContext(), sz * 8)); + Type *buffty; + if (pass.DL->isLegalInteger(sz * 8)) + buffty = Type::getIntNTy(pass.getLLVMContext(), sz * 8); + else + buffty = ArrayType::get(Type::getInt8Ty(pass.getLLVMContext()), sz); + buff = prolog_builder.CreateAlloca(buffty); buff->setAlignment(Align(align)); ptr = cast(prolog_builder.CreateBitCast(buff, pass.T_pint8)); } @@ -1193,8 +1198,10 @@ void Optimizer::splitOnStack(CallInst *orig_inst) else if (field.elty && !field.multiloc) { allocty = field.elty; } - else { + else if (pass.DL->isLegalInteger(field.size * 8)) { allocty = Type::getIntNTy(pass.getLLVMContext(), field.size * 8); + } else { + allocty = ArrayType::get(Type::getInt8Ty(pass.getLLVMContext()), field.size); } slot.slot = prolog_builder.CreateAlloca(allocty); insertLifetime(prolog_builder.CreateBitCast(slot.slot, pass.T_pint8), diff --git a/src/locks.h b/src/locks.h index b02fc8c5011e5..262390bb718f3 100644 --- a/src/locks.h +++ b/src/locks.h @@ -132,9 +132,8 @@ static inline void jl_mutex_unlock(jl_mutex_t *lock) jl_mutex_unlock_nogc(lock); jl_lock_frame_pop(); JL_SIGATOMIC_END(); - if (ptls->locks.len == 0 && ptls->finalizers_inhibited == 0) { - ptls->finalizers_inhibited = 1; - jl_gc_enable_finalizers(ptls, 1); // call run_finalizers (may GC) + if (jl_gc_have_pending_finalizers) { + jl_gc_run_pending_finalizers(ptls); // may GC } } diff --git a/src/rtutils.c b/src/rtutils.c index 5ac68510ae392..ed62021ebcb1e 100644 --- a/src/rtutils.c +++ b/src/rtutils.c @@ -265,10 +265,8 @@ JL_DLLEXPORT void jl_eh_restore_state(jl_handler_t *eh) if (old_defer_signal && !eh->defer_signal) { jl_sigint_safepoint(ptls); } - if (unlocks && eh->locks_len == 0 && ptls->finalizers_inhibited == 0) { - // call run_finalizers - ptls->finalizers_inhibited = 1; - jl_gc_enable_finalizers(ptls, 1); + if (jl_gc_have_pending_finalizers && unlocks && eh->locks_len == 0) { + jl_gc_run_pending_finalizers(ptls); } } diff --git a/src/staticdata.c b/src/staticdata.c index cdd675a5a6f44..625cc6c197309 100644 --- a/src/staticdata.c +++ b/src/staticdata.c @@ -387,9 +387,10 @@ static void jl_serialize_module(jl_serializer_state *s, jl_module_t *m) jl_serialize_value(s, m->parent); size_t i; void **table = m->bindings.table; - for (i = 1; i < m->bindings.size; i += 2) { - if (table[i] != HT_NOTFOUND) { - jl_binding_t *b = (jl_binding_t*)table[i]; + for (i = 0; i < m->bindings.size; i += 2) { + if (table[i+1] != HT_NOTFOUND) { + jl_serialize_value(s, (jl_value_t*)table[i]); + jl_binding_t *b = (jl_binding_t*)table[i+1]; jl_serialize_value(s, b->name); jl_serialize_value(s, b->value); jl_serialize_value(s, b->globalref); @@ -629,9 +630,11 @@ static void jl_write_module(jl_serializer_state *s, uintptr_t item, jl_module_t size_t count = 0; size_t i; void **table = m->bindings.table; - for (i = 1; i < m->bindings.size; i += 2) { - if (table[i] != HT_NOTFOUND) { - jl_binding_t *b = (jl_binding_t*)table[i]; + for (i = 0; i < m->bindings.size; i += 2) { + if (table[i+1] != HT_NOTFOUND) { + jl_binding_t *b = (jl_binding_t*)table[i+1]; + write_pointerfield(s, (jl_value_t*)table[i]); + tot += sizeof(void*); write_gctaggedfield(s, (uintptr_t)BindingRef << RELOC_TAG_OFFSET); tot += sizeof(void*); size_t binding_reloc_offset = ios_pos(s->s); @@ -1383,12 +1386,13 @@ static void jl_reinit_item(jl_value_t *v, int how) JL_GC_DISABLED size_t nbindings = mod->bindings.size; htable_new(&mod->bindings, nbindings); struct binding { + jl_sym_t *asname; uintptr_t tag; jl_binding_t b; } *b; b = (struct binding*)&mod[1]; while (nbindings > 0) { - ptrhash_put(&mod->bindings, (char*)b->b.name, &b->b); + ptrhash_put(&mod->bindings, b->asname, &b->b); b += 1; nbindings -= 1; } @@ -1427,22 +1431,25 @@ static void jl_finalize_deserializer(jl_serializer_state *s) JL_GC_DISABLED -// --- helper functions --- - -// remove cached types not referenced in the stream -static int keep_type_cache_entry(jl_value_t *ti) +static void jl_scan_type_cache_gv(jl_serializer_state *s, jl_svec_t *cache) { - if (ptrhash_get(&backref_table, ti) != HT_NOTFOUND || jl_get_llvm_gv(native_functions, ti) != 0) - return 1; - if (jl_is_datatype(ti)) { - jl_value_t *singleton = ((jl_datatype_t*)ti)->instance; - if (singleton && (ptrhash_get(&backref_table, singleton) != HT_NOTFOUND || - jl_get_llvm_gv(native_functions, singleton) != 0)) - return 1; - } - return 0; + size_t l = jl_svec_len(cache), i; + for (i = 0; i < l; i++) { + jl_value_t *ti = jl_svecref(cache, i); + if (ti == NULL || ti == jl_nothing) + continue; + if (jl_get_llvm_gv(native_functions, ti)) { + jl_serialize_value(s, ti); + } + else if (jl_is_datatype(ti)) { + jl_value_t *singleton = ((jl_datatype_t*)ti)->instance; + if (singleton && jl_get_llvm_gv(native_functions, singleton)) + jl_serialize_value(s, ti); + } + } } +// remove cached types not referenced in the stream static void jl_prune_type_cache_hash(jl_svec_t *cache) { size_t l = jl_svec_len(cache), i; @@ -1450,7 +1457,7 @@ static void jl_prune_type_cache_hash(jl_svec_t *cache) jl_value_t *ti = jl_svecref(cache, i); if (ti == NULL || ti == jl_nothing) continue; - if (!keep_type_cache_entry(ti)) + if (ptrhash_get(&backref_table, ti) == HT_NOTFOUND) jl_svecset(cache, i, jl_nothing); } } @@ -1462,7 +1469,7 @@ static void jl_prune_type_cache_linear(jl_svec_t *cache) jl_value_t *ti = jl_svecref(cache, i); if (ti == NULL) break; - if (keep_type_cache_entry(ti)) + if (ptrhash_get(&backref_table, ti) != HT_NOTFOUND) jl_svecset(cache, ins++, ti); } if (i > ins) { @@ -1528,14 +1535,28 @@ static void jl_save_system_image_to_stream(ios_t *f) JL_GC_DISABLED jl_value_t *tag = *tags[i]; jl_serialize_value(&s, tag); } - // prune unused entries from built-in type caches + // step 1.1: check for values only found in the generated code + arraylist_t typenames; + arraylist_new(&typenames, 0); for (i = 0; i < backref_table.size; i += 2) { jl_typename_t *tn = (jl_typename_t*)backref_table.table[i]; if (tn == HT_NOTFOUND || !jl_is_typename(tn)) continue; + arraylist_push(&typenames, tn); + } + for (i = 0; i < typenames.len; i++) { + jl_typename_t *tn = (jl_typename_t*)typenames.items[i]; + jl_scan_type_cache_gv(&s, tn->cache); + jl_scan_type_cache_gv(&s, tn->linearcache); + } + // step 1.2: prune (garbage collect) some special weak references from + // built-in type caches + for (i = 0; i < typenames.len; i++) { + jl_typename_t *tn = (jl_typename_t*)typenames.items[i]; jl_prune_type_cache_hash(tn->cache); jl_prune_type_cache_linear(tn->linearcache); } + arraylist_free(&typenames); } { // step 2: build all the sysimg sections diff --git a/src/subtype.c b/src/subtype.c index baf5a91b11899..8a3300cad8bac 100644 --- a/src/subtype.c +++ b/src/subtype.c @@ -1072,7 +1072,7 @@ static int subtype_tuple_tail(struct subtype_tuple_env *env, int8_t R, jl_stenv_ // an identical type on the left doesn't need to be compared to a Vararg // element type on the right more than twice. } - else if (x_same && + else if (x_same && e->Runions.depth == 0 && ((yi == env->lasty && !jl_has_free_typevars(xi) && !jl_has_free_typevars(yi)) || (yi == env->lasty && !env->vx && env->vy && jl_is_concrete_type(xi)))) { // fast path for repeated elements diff --git a/stdlib/Artifacts/docs/src/index.md b/stdlib/Artifacts/docs/src/index.md new file mode 100644 index 0000000000000..80f4c62cbf77f --- /dev/null +++ b/stdlib/Artifacts/docs/src/index.md @@ -0,0 +1,21 @@ +# Artifacts + +```@meta +DocTestSetup = :(using Artifacts) +``` + +Starting with Julia 1.6, the artifacts support has moved from `Pkg.jl` to Julia itself. +Until proper documentation can be added here, you can learn more about artifacts in the +`Pkg.jl` manual at . + +!!! compat "Julia 1.6" + Julia's artifacts API requires at least Julia 1.6. In Julia + versions 1.3 to 1.5, you can use `Pkg.Artifacts` instead. + + +```@docs +Artifacts.artifact_meta +Artifacts.artifact_hash +Artifacts.find_artifacts_toml +Artifacts.@artifact_str +``` diff --git a/stdlib/Artifacts/src/Artifacts.jl b/stdlib/Artifacts/src/Artifacts.jl index fb59b4df82bb7..fd65494782d92 100644 --- a/stdlib/Artifacts/src/Artifacts.jl +++ b/stdlib/Artifacts/src/Artifacts.jl @@ -541,7 +541,9 @@ function _artifact_str(__module__, artifacts_toml, name, path_tail, artifact_dic meta = artifact_meta(name, artifact_dict, artifacts_toml; platform) if meta !== nothing && get(meta, "lazy", false) if lazyartifacts isa Module && isdefined(lazyartifacts, :ensure_artifact_installed) - nameof(lazyartifacts) === :Pkg && Base.depwarn("using Pkg instead of using LazyArtifacts is deprecated", :var"@artifact_str", force=true) + if nameof(lazyartifacts) in (:Pkg, :Artifacts) + Base.depwarn("using Pkg instead of using LazyArtifacts is deprecated", :var"@artifact_str", force=true) + end return jointail(lazyartifacts.ensure_artifact_installed(string(name), artifacts_toml; platform), path_tail) end error("Artifact $(repr(name)) is a lazy artifact; package developers must call `using LazyArtifacts` in $(__module__) before using lazy artifacts.") @@ -549,7 +551,7 @@ function _artifact_str(__module__, artifacts_toml, name, path_tail, artifact_dic error("Artifact $(repr(name)) was not installed correctly. Try `using Pkg; Pkg.instantiate()` to re-install all missing resources.") end -""" +raw""" split_artifact_slash(name::String) Splits an artifact indexing string by path deliminters, isolates the first path element, @@ -557,7 +559,7 @@ returning that and the `joinpath()` of the remaining arguments. This normalizes separators to the native path separator for the current platform. Examples: # Examples -```jldoctest +```jldoctest; setup = :(using Artifacts: split_artifact_slash) julia> split_artifact_slash("Foo") ("Foo", "") @@ -659,9 +661,13 @@ macro artifact_str(name, platform=nothing) Base.include_dependency(artifacts_toml) # Check if the user has provided `LazyArtifacts`, and thus supports lazy artifacts - lazyartifacts = isdefined(__module__, :LazyArtifacts) ? GlobalRef(__module__, :LazyArtifacts) : nothing - if lazyartifacts === nothing && isdefined(__module__, :Pkg) - lazyartifacts = GlobalRef(__module__, :Pkg) # deprecated + # If not, check to see if `Pkg` or `Pkg.Artifacts` has been imported. + lazyartifacts = nothing + for module_name in (:LazyArtifacts, :Pkg, :Artifacts) + if isdefined(__module__, module_name) + lazyartifacts = GlobalRef(__module__, module_name) + break + end end # If `name` is a constant, (and we're using the default `Platform`) we can actually load diff --git a/stdlib/Artifacts/test/runtests.jl b/stdlib/Artifacts/test/runtests.jl index 5e89f97bfba35..cd7d6beea32fb 100644 --- a/stdlib/Artifacts/test/runtests.jl +++ b/stdlib/Artifacts/test/runtests.jl @@ -134,12 +134,27 @@ end end @testset "@artifact_str install errors" begin - mktempdir() do tempdir - with_artifacts_directory(tempdir) do - ex = @test_throws ErrorException artifact"c_simple" - @test startswith(ex.value.msg, "Artifact \"c_simple\" was not installed correctly. ") - ex = @test_throws ErrorException artifact"socrates" - @test startswith(ex.value.msg, "Artifact \"socrates\" is a lazy artifact; ") + for imports in ("Artifacts, Pkg", "Pkg, Pkg.Artifacts", "Pkg.Artifacts") + mktempdir() do tempdir + with_artifacts_directory(tempdir) do + ex = @test_throws ErrorException artifact"c_simple" + @test startswith(ex.value.msg, "Artifact \"c_simple\" was not installed correctly. ") + ex = @test_throws ErrorException artifact"socrates" + @test startswith(ex.value.msg, "Artifact \"socrates\" is a lazy artifact; ") + + # Can install if we load `Pkg` or `Pkg.Artifacts` + anon = Module(:__anon__) + Core.eval(anon, Meta.parse("using $(imports), Test")) + # Ensure that we get the expected exception, since this test runs with --depwarn=error + Core.eval(anon, quote + try + artifact"socrates" + @assert false "this @artifact_str macro invocation should have failed!" + catch e + @test startswith("using Pkg instead of using LazyArtifacts is deprecated", e.msg) + end + end) + end end end end diff --git a/stdlib/Downloads.version b/stdlib/Downloads.version index 1435d8d4e655e..b6dd897b63dd3 100644 --- a/stdlib/Downloads.version +++ b/stdlib/Downloads.version @@ -1,2 +1,2 @@ DOWNLOADS_BRANCH = master -DOWNLOADS_SHA1 = a6e4926ca3e9cdb72487026c0b57394e71a68a07 +DOWNLOADS_SHA1 = 4e55241413c95551c54fc5c9bfdf5f48cb02fc4c diff --git a/stdlib/LazyArtifacts/docs/src/index.md b/stdlib/LazyArtifacts/docs/src/index.md new file mode 100644 index 0000000000000..9de6b219c6988 --- /dev/null +++ b/stdlib/LazyArtifacts/docs/src/index.md @@ -0,0 +1,10 @@ +# Lazy Artifacts + +```@meta +DocTestSetup = :(using LazyArtifacts) +``` + +In order for a package to download artifacts lazily, `LazyArtifacts` must be +explicitly listed as a dependency of that package. + +For further information on artifacts, see [Artifacts](@ref). diff --git a/stdlib/LibGit2/src/callbacks.jl b/stdlib/LibGit2/src/callbacks.jl index 604014bbea7b2..18de45a994420 100644 --- a/stdlib/LibGit2/src/callbacks.jl +++ b/stdlib/LibGit2/src/callbacks.jl @@ -360,24 +360,14 @@ function fetchhead_foreach_callback(ref_name::Cstring, remote_url::Cstring, end struct CertHostKey - parent :: Cint - mask :: Cint - md5 :: NTuple{16,UInt8} - sha1 :: NTuple{20,UInt8} - sha256 :: NTuple{32,UInt8} -end - -struct KeyHashes - sha1 :: Union{NTuple{20,UInt8}, Nothing} - sha256 :: Union{NTuple{32,UInt8}, Nothing} -end - -function KeyHashes(cert_p::Ptr{CertHostKey}) - cert = unsafe_load(cert_p) - return KeyHashes( - cert.mask & Consts.CERT_SSH_SHA1 != 0 ? cert.sha1 : nothing, - cert.mask & Consts.CERT_SSH_SHA256 != 0 ? cert.sha256 : nothing, - ) + parent :: Cint + mask :: Cint + md5 :: NTuple{16,UInt8} + sha1 :: NTuple{20,UInt8} + sha256 :: NTuple{32,UInt8} + type :: Cint + len :: Csize_t + data :: NTuple{1024,UInt8} end function verify_host_error(message::AbstractString) @@ -406,22 +396,21 @@ function certificate_callback( return Consts.CERT_REJECT elseif transport == "SSH" # SSH verification has to be done here - files = [joinpath(homedir(), ".ssh", "known_hosts")] - check = ssh_knownhost_check(files, host, KeyHashes(cert_p)) + files = NetworkOptions.ssh_known_hosts_files() + cert = unsafe_load(cert_p) + check = ssh_knownhost_check(files, host, cert) valid = false - if check == Consts.SSH_HOST_KNOWN + if check == Consts.LIBSSH2_KNOWNHOST_CHECK_MATCH valid = true - elseif check == Consts.SSH_HOST_UNKNOWN + elseif check == Consts.LIBSSH2_KNOWNHOST_CHECK_NOTFOUND if Sys.which("ssh-keyscan") !== nothing msg = "Please run `ssh-keyscan $host >> $(files[1])` in order to add the server to your known hosts file and then try again." else msg = "Please connect once using `ssh $host` in order to add the server to your known hosts file and then try again. You may not be allowed to log in (wrong user and/or no login allowed), but ssh will prompt you to add a host key for the server which will allow libgit2 to verify the server." end verify_host_error("SSH host verification: the server `$host` is not a known host. $msg") - elseif check == Consts.SSH_HOST_MISMATCH + elseif check == Consts.LIBSSH2_KNOWNHOST_CHECK_MISMATCH verify_host_error("SSH host verification: the identity of the server `$host` does not match its known hosts record. Someone could be trying to man-in-the-middle your connection. It is also possible that the server has changed its key, in which case you should check with the server administrator and if they confirm that the key has been changed, update your known hosts file.") - elseif check == Consts.SSH_HOST_BAD_HASH - verify_host_error("SSH host verification: no secure certificate hash available for `$host`, cannot verify server identity.") else @error("unexpected SSH known host check result", check) end @@ -431,31 +420,6 @@ function certificate_callback( return Consts.CERT_REJECT end -## SSH known host checking -# -# We can't use libssh2_knownhost_check because libgit2, for no good reason, -# doesn't give us a host fingerprint that we can use for that and instead gives -# us multiple hashes of that fingerprint instead. Moreover, since a host can -# have multiple fingerprints in the known hosts file with different encryption -# types (gitlab.com does this, for example), we need to iterate through all the -# known hosts entries and manually check if any of them is a match. -# -# The fact that libgit2 won't give us a fingerprint also means that we cannot, -# even if we wanted to, prompt the user for whether to add the fingerprint to -# the known hosts file, since we don't have the fingerprint that should be -# added. The only option is to instruct the user how to add it themselves. -# -# Check logic: if a host appears in a known hosts file at all then one of the -# keys in that file must match or we declare a mismatch; if the host name -# doesn't appear in the file at all, however, we will continue searching files. -# -# This allows adding a host to the system known hosts file to fully override -# that host appearing in a bundled known hosts file. It is necessary to allow -# any of multiple entries in a single file to match, however, to allow for the -# possiblity that the file contains multiple fingerprints for the same host. If -# libgit2 gave us the fucking fingerprint then we could search for only an entry -# with the correct type, but we can't do that without the actual fingerprint. - struct KnownHost magic :: Cuint node :: Ptr{Cvoid} @@ -465,12 +429,28 @@ struct KnownHost end function ssh_knownhost_check( - files :: AbstractVector{<:AbstractString}, - host :: AbstractString, - hashes :: KeyHashes, + files :: AbstractVector{<:AbstractString}, + host :: AbstractString, + cert :: CertHostKey, +) + key = collect(cert.data)[1:cert.len] + return ssh_knownhost_check(files, host, key) +end + +function ssh_knownhost_check( + files :: AbstractVector{<:AbstractString}, + host :: AbstractString, + key :: Vector{UInt8}, ) - hashes.sha1 === hashes.sha256 === nothing && - return Consts.SSH_HOST_BAD_HASH + if (m = match(r"^(.+):(\d+)$", host)) !== nothing + host = m.captures[1] + port = parse(Int, m.captures[2]) + else + port = 22 # default SSH port + end + len = length(key) + mask = Consts.LIBSSH2_KNOWNHOST_TYPE_PLAIN | + Consts.LIBSSH2_KNOWNHOST_KEYENC_RAW session = @ccall "libssh2".libssh2_session_init_ex( C_NULL :: Ptr{Cvoid}, C_NULL :: Ptr{Cvoid}, @@ -492,46 +472,31 @@ function ssh_knownhost_check( @ccall "libssh2".libssh2_knownhost_free(hosts::Ptr{Cvoid})::Cvoid continue end - name_match = false - prev = Ptr{KnownHost}(0) - store = Ref{Ptr{KnownHost}}() - while true - get = @ccall "libssh2".libssh2_knownhost_get( - hosts :: Ptr{Cvoid}, - store :: Ptr{Ptr{KnownHost}}, - prev :: Ptr{KnownHost}, - ) :: Cint - get < 0 && @warn("Error searching SSH known hosts file `$file`") - get == 0 || break # end of file or error - # got a known hosts record for host, now check its key hash - prev = store[] - known_host = unsafe_load(prev) - known_host.name == C_NULL && continue - host == unsafe_string(known_host.name) || continue - name_match = true # we've found some entry in this file - key_match = true # all available hashes must match - key = base64decode(unsafe_string(known_host.key)) - if hashes.sha1 !== nothing - key_match &= sha1(key) == collect(hashes.sha1) - end - if hashes.sha256 !== nothing - key_match &= sha256(key) == collect(hashes.sha256) - end - key_match || continue - # name and key match found + check = @ccall "libssh2".libssh2_knownhost_checkp( + hosts :: Ptr{Cvoid}, + host :: Cstring, + port :: Cint, + key :: Ptr{UInt8}, + len :: Csize_t, + mask :: Cint, + C_NULL :: Ptr{Ptr{KnownHost}}, + ) :: Cint + if check == Consts.LIBSSH2_KNOWNHOST_CHECK_MATCH || + check == Consts.LIBSSH2_KNOWNHOST_CHECK_MISMATCH @ccall "libssh2".libssh2_knownhost_free(hosts::Ptr{Cvoid})::Cvoid @assert 0 == @ccall "libssh2".libssh2_session_free(session::Ptr{Cvoid})::Cint - return Consts.SSH_HOST_KNOWN + return check + else + @ccall "libssh2".libssh2_knownhost_free(hosts::Ptr{Cvoid})::Cvoid + if check == Consts.LIBSSH2_KNOWNHOST_CHECK_FAILURE + @warn("Error searching SSH known hosts file `$file`") + end + continue end - @ccall "libssh2".libssh2_knownhost_free(hosts::Ptr{Cvoid})::Cvoid - name_match || continue # no name match, search more files - # name match but no key match => host mismatch - @assert 0 == @ccall "libssh2".libssh2_session_free(session::Ptr{Cvoid})::Cint - return Consts.SSH_HOST_MISMATCH end # name not found in any known hosts files @assert 0 == @ccall "libssh2".libssh2_session_free(session::Ptr{Cvoid})::Cint - return Consts.SSH_HOST_UNKNOWN + return Consts.LIBSSH2_KNOWNHOST_CHECK_NOTFOUND end "C function pointer for `mirror_callback`" diff --git a/stdlib/LibGit2/src/consts.jl b/stdlib/LibGit2/src/consts.jl index 7658b2d47d779..2bc9edaf8950b 100644 --- a/stdlib/LibGit2/src/consts.jl +++ b/stdlib/LibGit2/src/consts.jl @@ -330,11 +330,11 @@ const LIBSSH2_KNOWNHOST_TYPE_CUSTOM = 3 const LIBSSH2_KNOWNHOST_KEYENC_RAW = 1 << 16 const LIBSSH2_KNOWNHOST_KEYENC_BASE64 = 2 << 16 -# internal constants for SSH host verification outcomes -const SSH_HOST_KNOWN = 0 -const SSH_HOST_UNKNOWN = 1 -const SSH_HOST_MISMATCH = 2 -const SSH_HOST_BAD_HASH = 3 +# libssh2 host check return values +const LIBSSH2_KNOWNHOST_CHECK_MATCH = 0 +const LIBSSH2_KNOWNHOST_CHECK_MISMATCH = 1 +const LIBSSH2_KNOWNHOST_CHECK_NOTFOUND = 2 +const LIBSSH2_KNOWNHOST_CHECK_FAILURE = 3 @enum(GIT_SUBMODULE_IGNORE, SUBMODULE_IGNORE_UNSPECIFIED = -1, # use the submodule's configuration SUBMODULE_IGNORE_NONE = 1, # any change or untracked == dirty diff --git a/stdlib/LibGit2/test/libgit2.jl b/stdlib/LibGit2/test/libgit2.jl index 2bf4182841874..bc678b2dc7160 100644 --- a/stdlib/LibGit2/test/libgit2.jl +++ b/stdlib/LibGit2/test/libgit2.jl @@ -2394,35 +2394,17 @@ mktempdir() do dir end @testset "SSH known host checking" begin - key_hashes(sha1::String, sha256::String) = LibGit2.KeyHashes( - Tuple(hex2bytes(sha1)), - Tuple(hex2bytes(sha256)), - ) + CHECK_MATCH = LibGit2.Consts.LIBSSH2_KNOWNHOST_CHECK_MATCH + CHECK_MISMATCH = LibGit2.Consts.LIBSSH2_KNOWNHOST_CHECK_MISMATCH + CHECK_NOTFOUND = LibGit2.Consts.LIBSSH2_KNOWNHOST_CHECK_NOTFOUND + CHECK_FAILURE = LibGit2.Consts.LIBSSH2_KNOWNHOST_CHECK_FAILURE + # randomly generated hashes matching no hosts - random_key_hashes = key_hashes( - "a9971372d02a67bdfea82e2b4808b4cf478b49c0", - "45aac5c20d5c7f8b998fee12fa9b75086c0d3ed6e33063f7ce940409ff4efbbc" - ) + random_key = "\0\0\0\assh-rsa\0\0\0\x01#\0\0\0\x81\0¿\x95\xbe9\xfc9g\n:\xcf&\x06YA\xb5`\x97\xc13A\xbf;T+C\xc9Ut J>\xc5ҍ\xc4_S\x8a \xc1S\xeb\x15FH\xd2a\x04.D\xeeb\xac\x8f\xdb\xcc\xef\xc4l G\x9bR\xafp\x17s<=\x12\xab\x04ڳif\\A\x9ba0\xde%\xdei\x04\xc3\r\xb3\x81w\x88\xec\xc0f\x15A;AÝ\xc0r\xa1\u5fe\xd3\xf6)8\x8e\xa3\xcbc\xee\xdd\$\x04\x0f\xc1\xb4\x1f\xcc\xecK\xe0\x99" |> codeunits |> collect # hashes of the unique github.com fingerprint - github_key_hashes = key_hashes( - "bf6b6825d2977c511a475bbefb88aad54a92ac73", - "9d385b83a9175292561a5ec4d4818e0aca51a264f17420112ef88ac3a139498f" - ) + github_key = "\0\0\0\assh-rsa\0\0\0\x01#\0\0\x01\x01\0\xab`;\x85\x11\xa6vy\xbd\xb5@\xdb;\xd2\x03K\0J\xe96\xd0k\xe3\xd7`\xf0\x8f˪\xdbN\xb4\xedóǑ\xc7\n\xae\x9at\xc9Xi\xe4wD!«\xea\x92\xe5T0_8\xb5\xfdAK2\b\xe5t\xc37\xe3 \x93e\x18F,vRɋ1\xe1n}\xa6R;\xd2\0t*dD\xd8?\xcd^\x172\xd06sǷ\x81\x15UH{U\xf0\xc4IO8)\xec\xe6\x0f\x94%Z\x95˚\xf57\xd7\xfc\x8c\x7f\xe4\x9e\xf3\x18GN\xf2\x92\t\x92\x05\"e\xb0\xa0n\xa6mJ\x16\x7f\xd9\xf3\xa4\x8a\x1aJ0~\xc1\xea\xaaQI\xa9i\xa6\xac]V\xa5\xefb~Q}\x81\xfbdO[t\\OG\x8e\xcd\b*\x94\x92\xf7D\xaa\xd3&\xf7l\x8cM\xc9\x10\vƫyF\x1d&W\xcbo\x06\xde\xc9.kd\xa6V/\xf0\xe3 \x84\xea\x06\xce\x0e\xa9\xd3ZX;\xfb\0\xbaӌ\x9d\x19p codeunits |> collect # hashes of the middle github.com fingerprint - gitlab_key_hashes = key_hashes( - "4db6b9ab0209fcde106cbf0fc4560ad063a962ad", - "1db5b783ccd48cd4a4b056ea4e25163d683606ad71f3174652b9625c5cd29d4c" - ) - - # various key hash collections - partial_hashes(keys::LibGit2.KeyHashes) = [ keys, - LibGit2.KeyHashes(keys.sha1, nothing), - LibGit2.KeyHashes(nothing, keys.sha256), - ] - bad_hashes = LibGit2.KeyHashes(nothing, nothing) - random_hashes = partial_hashes(random_key_hashes) - github_hashes = partial_hashes(github_key_hashes) - gitlab_hashes = partial_hashes(gitlab_key_hashes) + gitlab_key = "\0\0\0\vssh-ed25519\0\0\0 \a\xee\br\x95N:\xae\xc6\xfbz\bέtn\x12.\x9dA\xb6\x7f\xe79\xe1\xc7\x13\x95\x0e\xcd\x17_" |> codeunits |> collect # various known hosts files no_file = tempname() @@ -2439,50 +2421,41 @@ mktempdir() do dir end end - @testset "bad hash errors" begin - hash = bad_hashes - for host in ["github.com", "gitlab.com", "unknown.host"], - files in [[no_file], [empty_file], [known_hosts]] - check = LibGit2.ssh_knownhost_check(files, host, hash) - @test check == LibGit2.Consts.SSH_HOST_BAD_HASH - end - end - - @testset "unknown hosts" begin + @testset "unknown host" begin host = "unknown.host" - for hash in [github_hashes; gitlab_hashes; random_hashes], + for key in [github_key, gitlab_key, random_key], files in [[no_file], [empty_file], [known_hosts]] - check = LibGit2.ssh_knownhost_check(files, host, hash) - @test check == LibGit2.Consts.SSH_HOST_UNKNOWN + check = LibGit2.ssh_knownhost_check(files, host, key) + @test check == CHECK_NOTFOUND end end @testset "known hosts" begin - for (host, hashes) in [ - "github.com" => github_hashes, - "gitlab.com" => gitlab_hashes, - ], hash in hashes + for (host, key) in [ + "github.com" => github_key, + "gitlab.com" => gitlab_key, + ] for files in [[no_file], [empty_file]] - check = LibGit2.ssh_knownhost_check(files, host, hash) - @test check == LibGit2.Consts.SSH_HOST_UNKNOWN + check = LibGit2.ssh_knownhost_check(files, host, key) + @test check == CHECK_NOTFOUND end for files in [ [known_hosts], - [empty_file; known_hosts], - [known_hosts; empty_file], - [known_hosts; wrong_hosts], + [empty_file, known_hosts], + [known_hosts, empty_file], + [known_hosts, wrong_hosts], ] - check = LibGit2.ssh_knownhost_check(files, host, hash) - @test check == LibGit2.Consts.SSH_HOST_KNOWN + check = LibGit2.ssh_knownhost_check(files, host, key) + @test check == CHECK_MATCH end for files in [ [wrong_hosts], - [empty_file; wrong_hosts], - [wrong_hosts; empty_file], - [wrong_hosts; known_hosts], + [empty_file, wrong_hosts], + [wrong_hosts, empty_file], + [wrong_hosts, known_hosts], ] - check = LibGit2.ssh_knownhost_check(files, host, hash) - @test check == LibGit2.Consts.SSH_HOST_MISMATCH + check = LibGit2.ssh_knownhost_check(files, host, key) + @test check == CHECK_MISMATCH end end end diff --git a/stdlib/Pkg.version b/stdlib/Pkg.version index 0b8f32f752597..8aaf812e816af 100644 --- a/stdlib/Pkg.version +++ b/stdlib/Pkg.version @@ -1,2 +1,2 @@ PKG_BRANCH = release-1.6 -PKG_SHA1 = df09a610dad721771243cabcb387324d883ca6c9 +PKG_SHA1 = 9adb32bb8027815dadc266b94201d772ac4c48b1 diff --git a/stdlib/REPL/test/replcompletions.jl b/stdlib/REPL/test/replcompletions.jl index 2478ca3c77720..8a1d2f39a18f4 100644 --- a/stdlib/REPL/test/replcompletions.jl +++ b/stdlib/REPL/test/replcompletions.jl @@ -663,11 +663,14 @@ let s, c, r @test s[r] == "tmp" # This should match things that are inside the tmp directory - if !isdir("/tmp/tmp") - s = "/tmp/" + s = tempdir() + if !endswith(s, "/") + s = string(s, "/") + end + if !isdir(joinpath(s, "tmp")) c,r = test_scomplete(s) @test !("tmp/" in c) - @test r === 6:5 + @test r === length(s) + 1:0 @test s[r] == "" end @@ -699,20 +702,22 @@ let s, c, r end # Tests homedir expansion - let path, s, c, r - path = homedir() - dir = joinpath(path, "tmpfoobar") - mkdir(dir) - s = "\"" * path * "/tmpfoob" - c,r = test_complete(s) - @test "tmpfoobar/" in c - l = 3 + length(path) - @test r == l:l+6 - @test s[r] == "tmpfoob" - s = "\"~" - @test "tmpfoobar/" in c - c,r = test_complete(s) - rm(dir) + mktempdir() do tmphome + withenv("HOME" => tmphome, "USERPROFILE" => tmphome) do + path = homedir() + dir = joinpath(path, "tmpfoobar") + mkdir(dir) + s = "\"" * path * "/tmpfoob" + c,r = test_complete(s) + @test "tmpfoobar/" in c + l = 3 + length(path) + @test r == l:l+6 + @test s[r] == "tmpfoob" + s = "\"~" + @test "tmpfoobar/" in c + c,r = test_complete(s) + rm(dir) + end end # Tests detecting of files in the env path (in shell mode) diff --git a/stdlib/Random/src/normal.jl b/stdlib/Random/src/normal.jl index dc5ac5101e39d..8638d3d62c624 100644 --- a/stdlib/Random/src/normal.jl +++ b/stdlib/Random/src/normal.jl @@ -35,7 +35,26 @@ julia> randn(rng, ComplexF32, (2, 3)) 0.611224+1.56403im 0.355204-0.365563im 0.0905552+1.31012im ``` """ -@inline randn(rng::AbstractRNG=default_rng()) = _randn(rng, rand(rng, UInt52Raw())) +@inline function randn(rng::AbstractRNG=default_rng()) + #= + When defining + `@inline randn(rng::AbstractRNG=default_rng()) = _randn(rng, rand(rng, UInt52Raw()))` + the function call to `_randn` is currently not inlined, resulting in slightly worse + performance for scalar random normal numbers than repeating the code of `_randn` + inside the following function. + =# + @inbounds begin + r = rand(rng, UInt52Raw()) + + # the following code is identical to the one in `_randn(rng::AbstractRNG, r::UInt64)` + r &= 0x000fffffffffffff + rabs = Int64(r>>1) # One bit for the sign + idx = rabs & 0xFF + x = ifelse(r % Bool, -rabs, rabs)*wi[idx+1] + rabs < ki[idx+1] && return x # 99.3% of the time we return here 1st try + return randn_unlikely(rng, idx, rabs, x) + end +end @inline function _randn(rng::AbstractRNG, r::UInt64) @inbounds begin diff --git a/stdlib/SparseArrays/src/linalg.jl b/stdlib/SparseArrays/src/linalg.jl index 37d95b12a8978..25ddb3222f6b2 100644 --- a/stdlib/SparseArrays/src/linalg.jl +++ b/stdlib/SparseArrays/src/linalg.jl @@ -34,10 +34,10 @@ function mul!(C::StridedVecOrMat, A::AbstractSparseMatrixCSC, B::Union{StridedVe if β != 1 β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) end - for k = 1:size(C, 2) - @inbounds for col = 1:size(A, 2) + for k in 1:size(C, 2) + @inbounds for col in 1:size(A, 2) αxj = B[col,k] * α - for j = getcolptr(A)[col]:(getcolptr(A)[col + 1] - 1) + for j in nzrange(A, col) C[rv[j], k] += nzv[j]*αxj end end @@ -49,67 +49,38 @@ end *(A::SparseMatrixCSCUnion{TA}, B::AdjOrTransStridedOrTriangularMatrix{Tx}) where {TA,Tx} = (T = promote_op(matprod, TA, Tx); mul!(similar(B, T, (size(A, 1), size(B, 2))), A, B, true, false)) -function mul!(C::StridedVecOrMat, adjA::Adjoint{<:Any,<:AbstractSparseMatrixCSC}, B::Union{StridedVector,AdjOrTransStridedOrTriangularMatrix}, α::Number, β::Number) - A = adjA.parent - size(A, 2) == size(C, 1) || throw(DimensionMismatch()) - size(A, 1) == size(B, 1) || throw(DimensionMismatch()) - size(B, 2) == size(C, 2) || throw(DimensionMismatch()) - nzv = nonzeros(A) - rv = rowvals(A) - if β != 1 - β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) - end - for k = 1:size(C, 2) - @inbounds for col = 1:size(A, 2) - tmp = zero(eltype(C)) - for j = getcolptr(A)[col]:(getcolptr(A)[col + 1] - 1) - tmp += adjoint(nzv[j])*B[rv[j],k] +for (T, t) in ((Adjoint, adjoint), (Transpose, transpose)) + @eval function mul!(C::StridedVecOrMat, xA::$T{<:Any,<:AbstractSparseMatrixCSC}, B::Union{StridedVector,AdjOrTransStridedOrTriangularMatrix}, α::Number, β::Number) + A = xA.parent + size(A, 2) == size(C, 1) || throw(DimensionMismatch()) + size(A, 1) == size(B, 1) || throw(DimensionMismatch()) + size(B, 2) == size(C, 2) || throw(DimensionMismatch()) + nzv = nonzeros(A) + rv = rowvals(A) + if β != 1 + β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) + end + for k in 1:size(C, 2) + @inbounds for col in 1:size(A, 2) + tmp = zero(eltype(C)) + for j in nzrange(A, col) + tmp += $t(nzv[j])*B[rv[j],k] + end + C[col,k] += tmp * α end - C[col,k] += tmp * α end + C end - C end *(adjA::Adjoint{<:Any,<:AbstractSparseMatrixCSC}, x::StridedVector{Tx}) where {Tx} = (T = promote_op(matprod, eltype(adjA), Tx); mul!(similar(x, T, size(adjA, 1)), adjA, x, true, false)) *(adjA::Adjoint{<:Any,<:AbstractSparseMatrixCSC}, B::AdjOrTransStridedOrTriangularMatrix) = (T = promote_op(matprod, eltype(adjA), eltype(B)); mul!(similar(B, T, (size(adjA, 1), size(B, 2))), adjA, B, true, false)) - -function mul!(C::StridedVecOrMat, transA::Transpose{<:Any,<:AbstractSparseMatrixCSC}, B::Union{StridedVector,AdjOrTransStridedOrTriangularMatrix}, α::Number, β::Number) - A = transA.parent - size(A, 2) == size(C, 1) || throw(DimensionMismatch()) - size(A, 1) == size(B, 1) || throw(DimensionMismatch()) - size(B, 2) == size(C, 2) || throw(DimensionMismatch()) - nzv = nonzeros(A) - rv = rowvals(A) - if β != 1 - β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) - end - for k = 1:size(C, 2) - @inbounds for col = 1:size(A, 2) - tmp = zero(eltype(C)) - for j = getcolptr(A)[col]:(getcolptr(A)[col + 1] - 1) - tmp += transpose(nzv[j])*B[rv[j],k] - end - C[col,k] += tmp * α - end - end - C -end *(transA::Transpose{<:Any,<:AbstractSparseMatrixCSC}, x::StridedVector{Tx}) where {Tx} = (T = promote_op(matprod, eltype(transA), Tx); mul!(similar(x, T, size(transA, 1)), transA, x, true, false)) *(transA::Transpose{<:Any,<:AbstractSparseMatrixCSC}, B::AdjOrTransStridedOrTriangularMatrix) = (T = promote_op(matprod, eltype(transA), eltype(B)); mul!(similar(B, T, (size(transA, 1), size(B, 2))), transA, B, true, false)) -# For compatibility with dense multiplication API. Should be deleted when dense multiplication -# API is updated to follow BLAS API. -mul!(C::StridedVecOrMat, A::AbstractSparseMatrixCSC, B::Union{StridedVector,AdjOrTransStridedOrTriangularMatrix}) = - mul!(C, A, B, true, false) -mul!(C::StridedVecOrMat, adjA::Adjoint{<:Any,<:AbstractSparseMatrixCSC}, B::Union{StridedVector,AdjOrTransStridedOrTriangularMatrix}) = - mul!(C, adjA, B, true, false) -mul!(C::StridedVecOrMat, transA::Transpose{<:Any,<:AbstractSparseMatrixCSC}, B::Union{StridedVector,AdjOrTransStridedOrTriangularMatrix}) = - mul!(C, transA, B, true, false) - function mul!(C::StridedVecOrMat, X::AdjOrTransStridedOrTriangularMatrix, A::AbstractSparseMatrixCSC, α::Number, β::Number) mX, nX = size(X) nX == size(A, 1) || throw(DimensionMismatch()) @@ -120,49 +91,50 @@ function mul!(C::StridedVecOrMat, X::AdjOrTransStridedOrTriangularMatrix, A::Abs if β != 1 β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) end - @inbounds for multivec_row=1:mX, col = 1:size(A, 2), k=getcolptr(A)[col]:(getcolptr(A)[col+1]-1) - C[multivec_row, col] += α * X[multivec_row, rv[k]] * nzv[k] # perhaps suboptimal position of α? + if X isa StridedOrTriangularMatrix + @inbounds for col in 1:size(A, 2), k in nzrange(A, col) + Aiα = nzv[k] * α + rvk = rv[k] + @simd for multivec_row in 1:mX + C[multivec_row, col] += X[multivec_row, rvk] * Aiα + end + end + else # X isa Adjoint or Transpose + for multivec_row in 1:mX, col in 1:size(A, 2) + @inbounds for k in nzrange(A, col) + C[multivec_row, col] += X[multivec_row, rv[k]] * nzv[k] * α + end + end end C end *(X::AdjOrTransStridedOrTriangularMatrix, A::SparseMatrixCSCUnion{TvA}) where {TvA} = (T = promote_op(matprod, eltype(X), TvA); mul!(similar(X, T, (size(X, 1), size(A, 2))), X, A, true, false)) -function mul!(C::StridedVecOrMat, X::AdjOrTransStridedOrTriangularMatrix, adjA::Adjoint{<:Any,<:AbstractSparseMatrixCSC}, α::Number, β::Number) - A = adjA.parent - mX, nX = size(X) - nX == size(A, 2) || throw(DimensionMismatch()) - mX == size(C, 1) || throw(DimensionMismatch()) - size(A, 1) == size(C, 2) || throw(DimensionMismatch()) - rv = rowvals(A) - nzv = nonzeros(A) - if β != 1 - β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) - end - @inbounds for col = 1:size(A, 2), k=getcolptr(A)[col]:(getcolptr(A)[col+1]-1), multivec_col=1:mX - C[multivec_col, rv[k]] += α * X[multivec_col, col] * adjoint(nzv[k]) # perhaps suboptimal position of α? +for (T, t) in ((Adjoint, adjoint), (Transpose, transpose)) + @eval function mul!(C::StridedVecOrMat, X::AdjOrTransStridedOrTriangularMatrix, xA::$T{<:Any,<:AbstractSparseMatrixCSC}, α::Number, β::Number) + A = xA.parent + mX, nX = size(X) + nX == size(A, 2) || throw(DimensionMismatch()) + mX == size(C, 1) || throw(DimensionMismatch()) + size(A, 1) == size(C, 2) || throw(DimensionMismatch()) + rv = rowvals(A) + nzv = nonzeros(A) + if β != 1 + β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) + end + @inbounds for col in 1:size(A, 2), k in nzrange(A, col) + Aiα = $t(nzv[k]) * α + rvk = rv[k] + @simd for multivec_col in 1:mX + C[multivec_col, rvk] += X[multivec_col, col] * Aiα + end + end + C end - C end *(X::AdjOrTransStridedOrTriangularMatrix, adjA::Adjoint{<:Any,<:AbstractSparseMatrixCSC}) = (T = promote_op(matprod, eltype(X), eltype(adjA)); mul!(similar(X, T, (size(X, 1), size(adjA, 2))), X, adjA, true, false)) - -function mul!(C::StridedVecOrMat, X::AdjOrTransStridedOrTriangularMatrix, transA::Transpose{<:Any,<:AbstractSparseMatrixCSC}, α::Number, β::Number) - A = transA.parent - mX, nX = size(X) - nX == size(A, 2) || throw(DimensionMismatch()) - mX == size(C, 1) || throw(DimensionMismatch()) - size(A, 1) == size(C, 2) || throw(DimensionMismatch()) - rv = rowvals(A) - nzv = nonzeros(A) - if β != 1 - β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C))) - end - @inbounds for col = 1:size(A, 2), k=getcolptr(A)[col]:(getcolptr(A)[col+1]-1), multivec_col=1:mX - C[multivec_col, rv[k]] += α * X[multivec_col, col] * transpose(nzv[k]) # perhaps suboptimal position of α? - end - C -end *(X::AdjOrTransStridedOrTriangularMatrix, transA::Transpose{<:Any,<:AbstractSparseMatrixCSC}) = (T = promote_op(matprod, eltype(X), eltype(transA)); mul!(similar(X, T, (size(X, 1), size(transA, 2))), X, transA, true, false)) @@ -896,7 +868,7 @@ function ldiv!(D::Diagonal{T}, A::AbstractSparseMatrixCSC{T}) where {T} for i=1:length(b) iszero(b[i]) && throw(SingularException(i)) end - @inbounds for col = 1:size(A, 2), p = getcolptr(A)[col]:(getcolptr(A)[col + 1] - 1) + @inbounds for col in 1:size(A, 2), p in nzrange(A, col) nonz[p] = b[Arowval[p]] \ nonz[p] end A @@ -916,7 +888,7 @@ function triu(S::AbstractSparseMatrixCSC{Tv,Ti}, k::Integer=0) where {Tv,Ti} colptr[col] = 1 end for col = max(k+1,1) : n - for c1 = getcolptr(S)[col] : getcolptr(S)[col+1]-1 + for c1 in nzrange(S, col) rowvals(S)[c1] > col - k && break nnz += 1 end @@ -927,7 +899,7 @@ function triu(S::AbstractSparseMatrixCSC{Tv,Ti}, k::Integer=0) where {Tv,Ti} A = SparseMatrixCSC(m, n, colptr, rowval, nzval) for col = max(k+1,1) : n c1 = getcolptr(S)[col] - for c2 = getcolptr(A)[col] : getcolptr(A)[col+1]-1 + for c2 in nzrange(A, col) rowvals(A)[c2] = rowvals(S)[c1] nonzeros(A)[c2] = nonzeros(S)[c1] c1 += 1 @@ -981,7 +953,7 @@ function sparse_diff1(S::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti} for col = 1 : n last_row = 0 last_val = 0 - for k = getcolptr(S)[col] : getcolptr(S)[col+1]-1 + for k in nzrange(S, col) row = rowvals(S)[k] val = nonzeros(S)[k] if row > 1 @@ -1124,7 +1096,7 @@ function opnorm(A::AbstractSparseMatrixCSC, p::Real=2) nA::Tsum = 0 for j=1:n colSum::Tsum = 0 - for i = getcolptr(A)[j]:getcolptr(A)[j+1]-1 + for i in nzrange(A, j) colSum += abs(nonzeros(A)[i]) end nA = max(nA, colSum) @@ -1469,7 +1441,7 @@ function mul!(C::AbstractSparseMatrixCSC, A::AbstractSparseMatrixCSC, D::Diagona Cnzval = nonzeros(C) Anzval = nonzeros(A) resize!(Cnzval, length(Anzval)) - for col = 1:n, p = getcolptr(A)[col]:(getcolptr(A)[col+1]-1) + for col in 1:n, p in nzrange(A, col) @inbounds Cnzval[p] = Anzval[p] * b[col] end C @@ -1484,7 +1456,7 @@ function mul!(C::AbstractSparseMatrixCSC, D::Diagonal, A::AbstractSparseMatrixCS Anzval = nonzeros(A) Arowval = rowvals(A) resize!(Cnzval, length(Anzval)) - for col = 1:n, p = getcolptr(A)[col]:(getcolptr(A)[col+1]-1) + for col in 1:n, p in nzrange(A, col) @inbounds Cnzval[p] = b[Arowval[p]] * Anzval[p] end C @@ -1520,7 +1492,7 @@ function rmul!(A::AbstractSparseMatrixCSC, D::Diagonal) m, n = size(A) (n == size(D, 1)) || throw(DimensionMismatch()) Anzval = nonzeros(A) - @inbounds for col = 1:n, p = getcolptr(A)[col]:(getcolptr(A)[col + 1] - 1) + @inbounds for col in 1:n, p in nzrange(A, col) Anzval[p] = Anzval[p] * D.diag[col] end return A @@ -1531,7 +1503,7 @@ function lmul!(D::Diagonal, A::AbstractSparseMatrixCSC) (m == size(D, 2)) || throw(DimensionMismatch()) Anzval = nonzeros(A) Arowval = rowvals(A) - @inbounds for col = 1:n, p = getcolptr(A)[col]:(getcolptr(A)[col + 1] - 1) + @inbounds for col in 1:n, p in nzrange(A, col) Anzval[p] = D.diag[Arowval[p]] * Anzval[p] end return A diff --git a/stdlib/Test/src/Test.jl b/stdlib/Test/src/Test.jl index 4b59dbf4ddde0..d83b7d591eb19 100644 --- a/stdlib/Test/src/Test.jl +++ b/stdlib/Test/src/Test.jl @@ -486,6 +486,10 @@ function get_test_result(ex, source) push!(escaped_kwargs, Expr(:call, :(=>), QuoteNode(a.args[1]), esc(a.args[2]))) elseif isa(a, Expr) && a.head === :... push!(escaped_kwargs, Expr(:..., esc(a.args[1]))) + elseif isa(a, Expr) && a.head === :. + push!(escaped_kwargs, Expr(:call, :(=>), QuoteNode(a.args[2].value), esc(Expr(:., a.args[1], QuoteNode(a.args[2].value))))) + elseif isa(a, Symbol) + push!(escaped_kwargs, Expr(:call, :(=>), QuoteNode(a), esc(a))) end end end diff --git a/stdlib/Test/test/runtests.jl b/stdlib/Test/test/runtests.jl index bb58168599519..862bfabe808a2 100644 --- a/stdlib/Test/test/runtests.jl +++ b/stdlib/Test/test/runtests.jl @@ -8,6 +8,8 @@ using Distributed: RemoteException import Logging: Debug, Info, Warn @testset "@test" begin + atol = 1 + a = (; atol=2) @test true @test 1 == 1 @test 1 != 2 @@ -20,11 +22,16 @@ import Logging: Debug, Info, Warn @test isapprox(1, 1, atol=0.1) @test isapprox(1, 1; atol=0.1) @test isapprox(1, 1; [(:atol, 0)]...) + @test isapprox(1, 2; atol) + @test isapprox(1, 3; a.atol) end @testset "@test keyword precedence" begin + atol = 2 # post-semicolon keyword, suffix keyword, pre-semicolon keyword @test isapprox(1, 2, atol=0) atol=1 @test isapprox(1, 3, atol=0; atol=2) atol=1 + @test isapprox(1, 2, atol=0; atol) + @test isapprox(1, 3, atol=0; atol) atol=1 end @testset "@test should only evaluate the arguments once" begin g = Int[] diff --git a/stdlib/libLLVM_jll/Project.toml b/stdlib/libLLVM_jll/Project.toml index bca396b576cce..3c1ffe0b35e0f 100644 --- a/stdlib/libLLVM_jll/Project.toml +++ b/stdlib/libLLVM_jll/Project.toml @@ -1,6 +1,6 @@ name = "libLLVM_jll" uuid = "8f36deef-c2a5-5394-99ed-8e07531fb29a" -version = "11.0.0+5" +version = "11.0.1+0" [deps] Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb" diff --git a/stdlib/p7zip_jll/src/p7zip_jll.jl b/stdlib/p7zip_jll/src/p7zip_jll.jl index cbefc20803c5e..c3b31cee68435 100644 --- a/stdlib/p7zip_jll/src/p7zip_jll.jl +++ b/stdlib/p7zip_jll/src/p7zip_jll.jl @@ -21,9 +21,51 @@ else const p7zip_exe = "7z" end -# These functions look a little strange, but they're mimicking the JLLWrappers signature -p7zip(f::Function; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true) = f(p7zip_path) -p7zip(; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true) = Cmd([p7zip_path]) +if Sys.iswindows() + const LIBPATH_env = "PATH" + const LIBPATH_default = "" + const pathsep = ';' +elseif Sys.isapple() + const LIBPATH_env = "DYLD_FALLBACK_LIBRARY_PATH" + const LIBPATH_default = "~/lib:/usr/local/lib:/lib:/usr/lib" + const pathsep = ':' +else + const LIBPATH_env = "LD_LIBRARY_PATH" + const LIBPATH_default = "" + const pathsep = ':' +end + +function adjust_ENV!(env::Dict, PATH::String, LIBPATH::String, adjust_PATH::Bool, adjust_LIBPATH::Bool) + if adjust_LIBPATH + LIBPATH_base = get(env, LIBPATH_env, expanduser(LIBPATH_default)) + if !isempty(LIBPATH_base) + env[LIBPATH_env] = string(LIBPATH, pathsep, LIBPATH_base) + else + env[LIBPATH_env] = LIBPATH + end + end + if adjust_PATH && (LIBPATH_env != "PATH" || !adjust_LIBPATH) + if adjust_PATH + if !isempty(get(env, "PATH", "")) + env["PATH"] = string(PATH, pathsep, env["PATH"]) + else + env["PATH"] = PATH + end + end + end + return env +end + +function p7zip(f::Function; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true) + env = adjust_ENV!(copy(ENV), PATH[], LIBPATH[], adjust_PATH, adjust_LIBPATH) + withenv(env...) do + return f(p7zip_path) + end +end +function p7zip(; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true) + env = adjust_ENV!(copy(ENV), PATH[], LIBPATH[], adjust_PATH, adjust_LIBPATH) + return Cmd(Cmd([p7zip_path]); env) +end function init_p7zip_path() # Prefer our own bundled p7zip, but if we don't have one, pick it up off of the PATH diff --git a/test/abstractarray.jl b/test/abstractarray.jl index 804f8ffed468e..bc7c4d646fd8e 100644 --- a/test/abstractarray.jl +++ b/test/abstractarray.jl @@ -678,6 +678,12 @@ function test_cat(::Type{TestAbstractArray}) # 36041 @test_throws MethodError cat(["a"], ["b"], dims=[1, 2]) @test cat([1], [1], dims=[1, 2]) == I(2) + + # inferrability + As = [zeros(2, 2) for _ = 1:2] + @test @inferred(cat(As...; dims=Val(3))) == zeros(2, 2, 2) + cat3v(As) = cat(As...; dims=Val(3)) + @test @inferred(cat3v(As)) == zeros(2, 2, 2) end function test_ind2sub(::Type{TestAbstractArray}) diff --git a/test/bitarray.jl b/test/bitarray.jl index ebc99e5fe9568..23cbeae1ffa5c 100644 --- a/test/bitarray.jl +++ b/test/bitarray.jl @@ -1221,6 +1221,7 @@ timesofar("datamove") end @test count(trues(2, 2), init=0x03) === 0x07 + @test count(trues(2, 2, 2), dims=2) == fill(2, 2, 1, 2) end timesofar("find") diff --git a/test/cmdlineargs.jl b/test/cmdlineargs.jl index 46c21f9bd3346..3a331d406d886 100644 --- a/test/cmdlineargs.jl +++ b/test/cmdlineargs.jl @@ -719,3 +719,6 @@ for yn in ("no", "yes") end @test v[2] end + +# issue #39259, shadowing `ARGS` +@test success(`$(Base.julia_cmd()) --startup-file=no -e 'ARGS=1'`) diff --git a/test/compiler/codegen.jl b/test/compiler/codegen.jl index 9b147fd0b571b..18401288a1c4a 100644 --- a/test/compiler/codegen.jl +++ b/test/compiler/codegen.jl @@ -512,3 +512,13 @@ let a = Core.Intrinsics.trunc_int(UInt24, 3), @test sizeof(Union{UInt8,UInt24}) == 3 @test sizeof(Base.RefValue{Union{UInt8,UInt24}}) == 8 end + +# issue #39232 +function f39232(a) + z = Any[] + for (i, ai) in enumerate(a) + push!(z, ai) + end + return z +end +@test f39232((+, -)) == Any[+, -] diff --git a/test/compiler/inference.jl b/test/compiler/inference.jl index 06aca0584a1a3..8d5f9a2feba4b 100644 --- a/test/compiler/inference.jl +++ b/test/compiler/inference.jl @@ -2980,3 +2980,7 @@ f38888() = S38888(Base.inferencebarrier(3)) @test f38888() isa S38888 g38888() = S38888(Base.inferencebarrier(3), nothing) @test g38888() isa S38888 + +# issue #38971 +f28971() = (1, [2,3]...)::Tuple{Int,Int,Int} +@test @inferred(Tuple{Int,Vararg{Int}}, f28971()) == (1, 2, 3) diff --git a/test/llvmpasses/alloc-opt.jl b/test/llvmpasses/alloc-opt.jl index dd1ff78151f95..e48a85641257b 100644 --- a/test/llvmpasses/alloc-opt.jl +++ b/test/llvmpasses/alloc-opt.jl @@ -5,6 +5,8 @@ isz = sizeof(UInt) == 8 ? "i64" : "i32" println(""" +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" + @tag = external addrspace(10) global {} """) @@ -167,7 +169,7 @@ define void @object_field({} addrspace(10)* %field) { # CHECK-LABEL: }{{$}} # CHECK-LABEL: @memcpy_opt -# CHECK: alloca i128, align 16 +# CHECK: alloca [16 x i8], align 16 # CHECK: call {}*** @julia.ptls_states() # CHECK-NOT: @julia.gc_alloc_obj # CHECK-NOT: @jl_gc_pool_alloc diff --git a/test/llvmpasses/alloc-opt2.jl b/test/llvmpasses/alloc-opt2.jl index 00a4394352fbf..8a3f5aa941feb 100644 --- a/test/llvmpasses/alloc-opt2.jl +++ b/test/llvmpasses/alloc-opt2.jl @@ -79,12 +79,30 @@ L3: """) # CHECK-LABEL: }{{$}} +# CHECK-LABEL: @legal_int_types +# CHECK: alloca [12 x i8] +# CHECK-NOT: alloca i96 +# CHECK: ret void +println(""" +define void @legal_int_types() { + %ptls = call {}*** @julia.ptls_states() + %ptls_i8 = bitcast {}*** %ptls to i8* + %var1 = call {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_i8, $isz 12, {} addrspace(10)* @tag) + %var2 = addrspacecast {} addrspace(10)* %var1 to {} addrspace(11)* + %var3 = call {}* @julia.pointer_from_objref({} addrspace(11)* %var2) + ret void +} +""") +# CHECK-LABEL: }{{$}} + + + println(""" declare void @external_function() declare {} addrspace(10)* @external_function2() declare {}*** @julia.ptls_states() declare noalias {} addrspace(10)* @julia.gc_alloc_obj(i8*, $isz, {} addrspace(10)*) -declare i64 @julia.pointer_from_objref({} addrspace(11)*) +declare {}* @julia.pointer_from_objref({} addrspace(11)*) declare void @llvm.memcpy.p11i8.p0i8.i64(i8 addrspace(11)* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) declare token @llvm.julia.gc_preserve_begin(...) declare void @llvm.julia.gc_preserve_end(token) diff --git a/test/llvmpasses/llvmcall.jl b/test/llvmpasses/llvmcall.jl index 7da2dbec36a8f..687abe0a8cd46 100644 --- a/test/llvmpasses/llvmcall.jl +++ b/test/llvmpasses/llvmcall.jl @@ -13,7 +13,7 @@ end @generated foo(x)=:(ccall("extern foo", llvmcall, $x, ($x,), x)) bar(x) = ntuple(i -> VecElement{Float16}(x[i]), 2) -# CHECK: call half @foo(half zeroext %{{[0-9]+}}) +# CHECK: call half @foo(half %{{[0-9]+}}) emit(foo, Float16) # CHECK: call [2 x half] @foo([2 x half] %{{[0-9]+}}) diff --git a/test/misc.jl b/test/misc.jl index 41b92785fa5b6..db1ba3ee59099 100644 --- a/test/misc.jl +++ b/test/misc.jl @@ -149,7 +149,10 @@ for l in (Threads.SpinLock(), ReentrantLock()) @test get_finalizers_inhibited() == 1 GC.enable_finalizers(true) @test get_finalizers_inhibited() == 0 - @test_warn "WARNING: GC finalizers already enabled on this thread." GC.enable_finalizers(true) + if ccall(:jl_is_debugbuild, Cint, ()) != 0 + # Note this warning only exists in debug builds + @test_warn "WARNING: GC finalizers already enabled on this thread." GC.enable_finalizers(true) + end @test lock(l) === nothing @test try unlock(l) finally end === nothing diff --git a/test/offsetarray.jl b/test/offsetarray.jl index bb0b4b13b8da4..07f2e12999f90 100644 --- a/test/offsetarray.jl +++ b/test/offsetarray.jl @@ -715,6 +715,15 @@ end @test axes(S) == (OffsetArrays.IdOffsetRange(0:1), Base.OneTo(2), OffsetArrays.IdOffsetRange(2:5)) end +@testset "Zero-index indexing" begin + @test OffsetArray([6], 2:2)[] == 6 + @test OffsetArray(fill(6, 1, 1), 2:2, 3:3)[] == 6 + @test OffsetArray(fill(6))[] == 6 + @test_throws BoundsError OffsetArray([6,7], 2:3)[] + @test_throws BoundsError OffsetArray([6 7], 2:2, 2:3)[] + @test_throws BoundsError OffsetArray([], 2:1)[] +end + @testset "IdentityUnitRange indexing" begin a = OffsetVector(3:4, 2:3) ax = IdentityUnitRange(2:3) diff --git a/test/operators.jl b/test/operators.jl index 08f0b0179c81c..fb884d52cbf98 100644 --- a/test/operators.jl +++ b/test/operators.jl @@ -255,3 +255,5 @@ end a = rand(3, 3) @test transpose(a) === a'ᵀ + +@test [Base.afoldl(+, 1:i...) for i = 1:40] == [i * (i + 1) ÷ 2 for i = 1:40] diff --git a/test/path.jl b/test/path.jl index e09a46ef9370e..bbd9159c59295 100644 --- a/test/path.jl +++ b/test/path.jl @@ -262,6 +262,12 @@ res = relpath(filep, startp) idx += 1 @test res == relpath_expected_results[idx] + if Sys.iswindows() + @test relpath("e:$filep", "e:$startp") == relpath_expected_results[idx] + @test relpath("e:$filep", "E:$startp") == relpath_expected_results[idx] + @test relpath("E:$filep", "e:$startp") == relpath_expected_results[idx] + @test relpath("E:$filep", "E:$startp") == relpath_expected_results[idx] + end end end # Additional cases @@ -271,6 +277,20 @@ test_relpath() end + if Sys.iswindows() + @testset "issue #23646" begin + @test lowercase(relpath("E:\\a\\b", "C:\\c")) == "e:\\a\\b" + @test lowercase(relpath("E:\\a\\b", "c:\\c")) == "e:\\a\\b" + @test lowercase(relpath("e:\\a\\b", "C:\\c")) == "e:\\a\\b" + @test lowercase(relpath("e:\\a\\b", "c:\\c")) == "e:\\a\\b" + + @test relpath("C:\\a\\b", "c:\\a\\b") == "." + @test relpath("c:\\a\\b", "C:\\a\\b") == "." + @test lowercase(relpath("C:\\a\\b", "c:\\c\\d")) == "..\\..\\a\\b" + @test lowercase(relpath("c:\\a\\b", "C:\\c\\d")) == "..\\..\\a\\b" + end + end + @testset "type stability" begin @test isa(joinpath(S("a"), S("b")), String) @test isa(joinpath(S(abspath("a")), S("b")), String) diff --git a/test/precompile.jl b/test/precompile.jl index 3358fda58f0e3..22cc2d31db8a0 100644 --- a/test/precompile.jl +++ b/test/precompile.jl @@ -846,3 +846,16 @@ precompile_test_harness("Issue #38312") do load_path pointer_from_objref(eval(Meta.parse(TheType))) === pointer_from_objref((@eval (using Bar38312; Bar38312)).TheType) end + +# issue #39405 +precompile_test_harness("Renamed Imports") do load_path + write(joinpath(load_path, "RenameImports.jl"), + """ + module RenameImports + import Base.Experimental as ex + test() = ex + end + """) + Base.compilecache(Base.PkgId("RenameImports")) + @test (@eval (using RenameImports; RenameImports.test())) isa Module +end diff --git a/test/reduce.jl b/test/reduce.jl index 4f9fc33403282..972a5aeb1aa51 100644 --- a/test/reduce.jl +++ b/test/reduce.jl @@ -608,3 +608,6 @@ x = [j+7 for j in i] Iterators.flatten((1:2, 3:4)), ) == (1, 4) end + +# issue #39281 +@test @inferred(extrema(rand(2), dims=1)) isa Vector{Tuple{Float64,Float64}} diff --git a/test/reinterpretarray.jl b/test/reinterpretarray.jl index ce3202868460a..5c7b35f5a5890 100644 --- a/test/reinterpretarray.jl +++ b/test/reinterpretarray.jl @@ -350,3 +350,10 @@ ars = reinterpret(reshape, Int, a) a = [(k,k+1,k+2) for k = 1:3:4000] ars = reinterpret(reshape, Int, a) @test sum(ars) == 8010003 + +@testset "aliasing" begin + a = reinterpret(NTuple{2,Float64}, rand(Float64, 4, 4)) + @test typeof(Base.unaliascopy(a)) === typeof(a) + a = reinterpret(reshape, NTuple{4,Float64}, rand(Float64, 4, 4)) + @test typeof(Base.unaliascopy(a)) === typeof(a) +end diff --git a/test/show.jl b/test/show.jl index ff8946acb1662..b0bc4455d990a 100644 --- a/test/show.jl +++ b/test/show.jl @@ -634,7 +634,7 @@ end # `where` syntax @test_repr "A where T<:B" @test_repr "A where T<:(Array{T} where T<:Real)" -@test_repr "Array{T} where T<:Array{S} where S<:Real" +@test_repr "Array{T} where {S<:Real, T<:Array{S}}" @test_repr "x::Array{T} where T" @test_repr "(a::b) where T" @test_repr "a::b where T" @@ -1568,12 +1568,12 @@ end end let x = TypeVar(:_), y = TypeVar(:_) - @test repr(UnionAll(x, UnionAll(y, Pair{x,y}))) == "Pair{_1, _2} where _2 where _1" + @test repr(UnionAll(x, UnionAll(y, Pair{x,y}))) == "Pair{_1, _2} where {_1, _2}" @test repr(UnionAll(x, UnionAll(y, Pair{UnionAll(x,Ref{x}),y}))) == "Pair{Ref{_1} where _1, _1} where _1" x = TypeVar(:a) y = TypeVar(:a) z = TypeVar(:a) - @test repr(UnionAll(z, UnionAll(x, UnionAll(y, Tuple{x,y,z})))) == "Tuple{a1, a2, a} where a2 where a1 where a" + @test repr(UnionAll(z, UnionAll(x, UnionAll(y, Tuple{x,y,z})))) == "Tuple{a1, a2, a} where {a, a1, a2}" end @testset "showarg" begin @@ -2070,15 +2070,21 @@ end end module M37012 +export AValue, B2 struct AnInteger{S<:Integer} end struct AStruct{N} end const AValue{S} = Union{AStruct{S}, AnInteger{S}} +struct BStruct{T,S} end +const B2{S,T} = BStruct{T,S} end @test Base.make_typealias(M37012.AStruct{1}) === nothing @test isempty(Base.make_typealiases(M37012.AStruct{1})[1]) @test string(M37012.AStruct{1}) == "$(curmod_prefix)M37012.AStruct{1}" @test string(Union{Nothing, Number, Vector}) == "Union{Nothing, Number, Vector{T} where T}" @test string(Union{Nothing, AbstractVecOrMat}) == "Union{Nothing, AbstractVecOrMat{T} where T}" +@test string(M37012.BStruct{T, T} where T) == "$(curmod_prefix)M37012.B2{T, T} where T" +@test string(M37012.BStruct{T, S} where {T<:Unsigned, S<:Signed}) == "$(curmod_prefix)M37012.B2{S, T} where {T<:Unsigned, S<:Signed}" +@test string(M37012.BStruct{T, S} where {T<:Signed, S<:T}) == "$(curmod_prefix)M37012.B2{S, T} where {T<:Signed, S<:T}" @test sprint(show, :(./)) == ":((./))" @test sprint(show, :((.|).(.&, b))) == ":((.|).((.&), b))" diff --git a/test/subtype.jl b/test/subtype.jl index 47026df924d3b..c99fc780799e6 100644 --- a/test/subtype.jl +++ b/test/subtype.jl @@ -1847,3 +1847,17 @@ let A = Tuple{T, Ref{T}, T} where {T}, @test_broken I <: A @test_broken I <: B end + +# issue #39218 +let A = Int, B = String, U = Union{A, B} + @test issub_strict(Union{Tuple{A, A}, Tuple{B, B}}, Tuple{U, U}) + @test issub_strict(Union{Tuple{A, A}, Tuple{B, B}}, Tuple{Union{A, B}, Union{A, B}}) +end + +struct A39218 end +struct B39218 end +const AB39218 = Union{A39218,B39218} +f39218(::T, ::T) where {T<:AB39218} = false +g39218(a, b) = (@nospecialize; if a isa AB39218 && b isa AB39218; f39218(a, b); end;) +@test g39218(A39218(), A39218()) === false +@test_throws MethodError g39218(A39218(), B39218()) diff --git a/test/worlds.jl b/test/worlds.jl index a6aae68da2ca7..d1072ce6ba918 100644 --- a/test/worlds.jl +++ b/test/worlds.jl @@ -200,6 +200,14 @@ notify(c26506_1) wait(c26506_2) @test result26506[1] == 3 +# issue #38435 +f38435(::Int, ::Any) = 1 +f38435(::Any, ::Int) = 2 +g38435(x) = f38435(x, x) +@test_throws MethodError(f38435, (1, 1), Base.get_world_counter()) g38435(1) +f38435(::Int, ::Int) = 3.0 +@test g38435(1) === 3.0 + ## Invalidation tests