Skip to content

Commit

Permalink
separate module context for Compiler.jl tests
Browse files Browse the repository at this point in the history
xref: <#56632 (review)>

This also allows us to execute each file standalone, which might be
useful for debugging.
  • Loading branch information
aviatesk committed Nov 22, 2024
1 parent e624440 commit dc105dc
Show file tree
Hide file tree
Showing 19 changed files with 121 additions and 116 deletions.
2 changes: 1 addition & 1 deletion Compiler/src/ssair/verify.jl
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ function verify_ir(ir::IRCode, print::Bool=true,
error_args = Any["IR verification failed."]
if isdefined(Core, :Main) && isdefined(Core.Main, :Base)
# ensure we use I/O that does not yield, as this gets called during compilation
firstline = invokelatest(Core.Main.Base.IRShow.debuginfo_firstline, ir.debuginfo)
firstline = invokelatest(IRShow.debuginfo_firstline, ir.debuginfo)
else
firstline = nothing
end
Expand Down
12 changes: 4 additions & 8 deletions Compiler/test/AbstractInterpreter.jl
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
# This file is a part of Julia. License is MIT: https://julialang.org/license

using Test
module test_AbstractInterpreter

if !@isdefined(Compiler)
if Base.identify_package("Compiler") === nothing
import Base.Compiler: Compiler
else
import Compiler
end
end
using Test

include("irutils.jl")
include("newinterp.jl")
Expand Down Expand Up @@ -542,3 +536,5 @@ let interp = DebugInterp()
end
@test found
end

end # module test_AbstractInterpreter
18 changes: 6 additions & 12 deletions Compiler/test/EAUtils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,7 @@ module EAUtils

export code_escapes, @code_escapes, __clear_cache!

if !@isdefined(Compiler)
if Base.identify_package("Compiler") === nothing
import Base.Compiler: Compiler
else
import Compiler
end
end
include("setup_Compiler.jl")

using ..EscapeAnalysis
const EA = EscapeAnalysis
Expand Down Expand Up @@ -267,22 +261,22 @@ end

function print_with_info(preprint, postprint, io::IO, ir::IRCode, source::Bool)
io = IOContext(io, :displaysize=>displaysize(io))
used = Base.IRShow.stmts_used(io, ir)
used = Compiler.IRShow.stmts_used(io, ir)
if source
line_info_preprinter = function (io::IO, indent::String, idx::Int)
r = Base.IRShow.inline_linfo_printer(ir)(io, indent, idx)
r = Compiler.IRShow.inline_linfo_printer(ir)(io, indent, idx)
idx 0 && preprint(io, idx)
return r
end
else
line_info_preprinter = Base.IRShow.lineinfo_disabled
line_info_preprinter = Compiler.IRShow.lineinfo_disabled
end
line_info_postprinter = Base.IRShow.default_expr_type_printer
line_info_postprinter = Compiler.IRShow.default_expr_type_printer
preprint(io)
bb_idx_prev = bb_idx = 1
for idx = 1:length(ir.stmts)
preprint(io, idx)
bb_idx = Base.IRShow.show_ir_stmt(io, ir, idx, line_info_preprinter, line_info_postprinter, ir.sptypes, used, ir.cfg, bb_idx)
bb_idx = Compiler.IRShow.show_ir_stmt(io, ir, idx, line_info_preprinter, line_info_postprinter, ir.sptypes, used, ir.cfg, bb_idx)
postprint(io, idx, bb_idx != bb_idx_prev)
bb_idx_prev = bb_idx
end
Expand Down
13 changes: 6 additions & 7 deletions Compiler/test/codegen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@

# tests for codegen and optimizations

module test_codegen

using Random
using InteractiveUtils
using Libdl
using Test

if !@isdefined(Compiler)
if Base.identify_package("Compiler") === nothing
import Base.Compiler: Compiler
else
import Compiler
end
end
include("setup_Compiler.jl")

const opt_level = Base.JLOptions().opt_level
const coverage = (Base.JLOptions().code_coverage > 0) || (Base.JLOptions().malloc_log > 0)
Expand Down Expand Up @@ -1032,3 +1029,5 @@ for a in ((@noinline Ref{Int}(2)),
@test ex === a
end
end

end # test_codegen
16 changes: 9 additions & 7 deletions Compiler/test/compact.jl
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
if !@isdefined(Compiler)
if Base.identify_package("Compiler") === nothing
import Base.Compiler: Compiler
else
import Compiler
end
end
# This file is a part of Julia. License is MIT: https://julialang.org/license

module test_compact

using Test

include("irutils.jl")

using .Compiler: IncrementalCompact, insert_node_here!, finish,
NewInstruction, verify_ir, ReturnNode, SSAValue
Expand Down Expand Up @@ -57,3 +57,5 @@ end
verify_ir(new_ir)
@test length(new_ir.cfg.blocks) == 1
end

end # module test_compact
13 changes: 5 additions & 8 deletions Compiler/test/contextual.jl
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
# This file is a part of Julia. License is MIT: https://julialang.org/license

module test_contextual

# N.B.: This file is also run from interpreter.jl, so needs to be standalone-executable
using Test

if !@isdefined(Compiler)
if Base.identify_package("Compiler") === nothing
import Base.Compiler: Compiler
else
import Compiler
end
end
include("setup_Compiler.jl")

# Cassette
# ========
Expand Down Expand Up @@ -131,3 +126,5 @@ f() = 2
foo(i) = i+bar(Val(1))

@test @inferred(overdub(Ctx(), foo, 1)) == 43

end # module test_contextual
10 changes: 2 additions & 8 deletions Compiler/test/datastructures.jl
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
using Test
# This file is a part of Julia. License is MIT: https://julialang.org/license

if !@isdefined(Compiler)
if Base.identify_package("Compiler") === nothing
import Base.Compiler: Compiler
else
import Compiler
end
end
include("setup_Compiler.jl")

@testset "CachedMethodTable" begin
# cache result should be separated per `limit` and `sig`
Expand Down
4 changes: 4 additions & 0 deletions Compiler/test/effects.jl
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
module test_effects

using Test
include("irutils.jl")

Expand Down Expand Up @@ -1382,3 +1384,5 @@ end |> Compiler.is_nothrow
@test Base.infer_effects() do
@ccall unsafecall()::Cvoid
end == Compiler.EFFECTS_UNKNOWN

end # module test_effects
55 changes: 30 additions & 25 deletions Compiler/test/inference.jl
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
# This file is a part of Julia. License is MIT: https://julialang.org/license

module test_inference

using Test

include("irutils.jl")

# tests for Compiler correctness and precision
import .Compiler: Const, Conditional, , ReturnNode, GotoIfNot
using .Compiler: Conditional,
isdispatchelem(@nospecialize x) = !isa(x, Type) || Compiler.isdispatchelem(x)

using Random, Core.IR
Expand Down Expand Up @@ -823,7 +827,7 @@ end

# Issue 19641
foo19641() = let a = 1.0
Compiler.return_type(x -> x + a, Tuple{Float64})
Base.Compiler.return_type(x -> x + a, Tuple{Float64})
end
@inferred foo19641()

Expand Down Expand Up @@ -977,15 +981,15 @@ test_no_apply(::Any) = true

# issue #20033
# check return_type_tfunc for calls where no method matches
bcast_eltype_20033(f, A) = Compiler.return_type(f, Tuple{eltype(A)})
bcast_eltype_20033(f, A) = Base.Compiler.return_type(f, Tuple{eltype(A)})
err20033(x::Float64...) = prod(x)
@test bcast_eltype_20033(err20033, [1]) === Union{}
@test Base.return_types(bcast_eltype_20033, (typeof(err20033), Vector{Int},)) == Any[Type{Union{}}]
# return_type on builtins
@test Compiler.return_type(tuple, Tuple{Int,Int8,Int}) === Tuple{Int,Int8,Int}
@test Base.Compiler.return_type(tuple, Tuple{Int,Int8,Int}) === Tuple{Int,Int8,Int}

# issue #21088
@test Compiler.return_type(typeof, Tuple{Int}) == Type{Int}
@test Base.Compiler.return_type(typeof, Tuple{Int}) == Type{Int}

# Inference of constant svecs
@eval fsvecinf() = $(QuoteNode(Core.svec(Tuple{Int,Int}, Int)))[1]
Expand Down Expand Up @@ -1535,7 +1539,7 @@ let nfields_tfunc(@nospecialize xs...) =
@test sizeof_nothrow(String)
@test !sizeof_nothrow(Type{String})
@test sizeof_tfunc(Type{Union{Int64, Int32}}) == Const(Core.sizeof(Union{Int64, Int32}))
let PT = Core.PartialStruct(Base.Compiler.fallback_lattice, Tuple{Int64,UInt64}, Any[Const(10), UInt64])
let PT = Core.PartialStruct(Compiler.fallback_lattice, Tuple{Int64,UInt64}, Any[Const(10), UInt64])
@test sizeof_tfunc(PT) === Const(16)
@test nfields_tfunc(PT) === Const(2)
@test sizeof_nothrow(PT)
Expand Down Expand Up @@ -1721,7 +1725,7 @@ g_test_constant() = (f_constant(3) == 3 && f_constant(4) == 4 ? true : "BAD")
f_pure_add() = (1 + 1 == 2) ? true : "FAIL"
@test @inferred f_pure_add()

import Core: Const
using Core: Const
mutable struct ARef{T}
@atomic x::T
end
Expand Down Expand Up @@ -1762,7 +1766,7 @@ let getfield_tfunc(@nospecialize xs...) =
@test getfield_tfunc(ARef{Int},Const(:x),Bool,Bool) === Union{}
end

import .Compiler: Const
using Core: Const
mutable struct XY{X,Y}
x::X
y::Y
Expand Down Expand Up @@ -2235,7 +2239,7 @@ end
end |> only == Int
# the `fargs = nothing` edge case
@test Base.return_types((Any,)) do a
Compiler.return_type(invoke, Tuple{typeof(ispositive), Type{Tuple{Any}}, Any})
Base.Compiler.return_type(invoke, Tuple{typeof(ispositive), Type{Tuple{Any}}, Any})
end |> only == Type{Bool}

# `InterConditional` handling: `abstract_call_opaque_closure`
Expand Down Expand Up @@ -2765,8 +2769,6 @@ end |> only === Int

# `apply_type_tfunc` accuracy for constrained type construction
# https://github.com/JuliaLang/julia/issues/47089
import Core: Const
import .Compiler: apply_type_tfunc
struct Issue47089{A<:Number,B<:Number} end
let 𝕃 = Compiler.fallback_lattice
A = Type{<:Integer}
Expand Down Expand Up @@ -3324,8 +3326,8 @@ _rttf_test(::Int16) = 0
_rttf_test(::Int32) = 0
_rttf_test(::Int64) = 0
_rttf_test(::Int128) = 0
_call_rttf_test() = Compiler.return_type(_rttf_test, Tuple{Any})
@test Compiler.return_type(_rttf_test, Tuple{Any}) === Int
_call_rttf_test() = Base.Compiler.return_type(_rttf_test, Tuple{Any})
@test Base.Compiler.return_type(_rttf_test, Tuple{Any}) === Int
@test _call_rttf_test() === Int

f_with_Type_arg(::Type{T}) where {T} = T
Expand Down Expand Up @@ -3379,9 +3381,9 @@ struct FooPartial
b::Int
c::Int
end
let PT1 = PartialStruct(Base.Compiler.fallback_lattice, FooPartial, Any[Const(1), Const(2), Int]),
PT2 = PartialStruct(Base.Compiler.fallback_lattice, FooPartial, Any[Const(1), Int, Int]),
PT3 = PartialStruct(Base.Compiler.fallback_lattice, FooPartial, Any[Const(1), Int, Const(3)])
let PT1 = PartialStruct(Compiler.fallback_lattice, FooPartial, Any[Const(1), Const(2), Int]),
PT2 = PartialStruct(Compiler.fallback_lattice, FooPartial, Any[Const(1), Int, Int]),
PT3 = PartialStruct(Compiler.fallback_lattice, FooPartial, Any[Const(1), Int, Const(3)])

@test PT1 PT2
@test !(PT1 PT3) && !(PT2 PT1)
Expand Down Expand Up @@ -4554,7 +4556,8 @@ end |> only == Tuple{Int,Int}
end |> only == Int

# form PartialStruct for mutables with `const` field
import .Compiler: Const,
using Core: Const
using .Compiler:
mutable struct PartialMutable{S,T}
const s::S
t::T
Expand Down Expand Up @@ -4787,7 +4790,7 @@ end
# at top level.
@test let
Base.Experimental.@force_compile
Compiler.return_type(+, NTuple{2, Rational})
Base.Compiler.return_type(+, NTuple{2, Rational})
end == Rational

# vararg-tuple comparison within `Compiler.PartialStruct`
Expand Down Expand Up @@ -5185,9 +5188,9 @@ end |> only === Tuple{Int,Symbol}
end
end) == Type{Nothing}

# Test that Compiler.return_type inference works for the 1-arg version
# Test that Base.Compiler.return_type inference works for the 1-arg version
@test Base.return_types() do
Compiler.return_type(Tuple{typeof(+), Int, Int})
Base.Compiler.return_type(Tuple{typeof(+), Int, Int})
end |> only == Type{Int}

# Test that NamedTuple abstract iteration works for PartialStruct/Const
Expand Down Expand Up @@ -5723,7 +5726,7 @@ end
@eval function has_tuin()
$(Expr(:throw_undef_if_not, :x, false))
end
@test Compiler.return_type(has_tuin, Tuple{}) === Union{}
@test Base.infer_return_type(has_tuin, Tuple{}) === Union{}
@test_throws UndefVarError has_tuin()

function gen_tuin_from_arg(world::UInt, source, _, _)
Expand Down Expand Up @@ -5778,7 +5781,7 @@ end

# We want to make sure that both this returns `Tuple` and that
# it doesn't infinite loop inside inference.
@test Compiler.return_type(gen_infinite_loop_ssa, Tuple{}) === Tuple
@test Base.infer_return_type(gen_infinite_loop_ssa, Tuple{}) === Tuple

# inference local cache lookup with extended lattice elements that may be transformed
# by `matching_cache_argtypes`
Expand Down Expand Up @@ -5814,7 +5817,7 @@ function foo54341(a, b, c, d, args...)
end
bar54341(args...) = foo54341(4, args...)

@test Compiler.return_type(bar54341, Tuple{Vararg{Int}}) === Int
@test Base.infer_return_type(bar54341, Tuple{Vararg{Int}}) === Int

# `PartialStruct` for partially initialized structs:
struct PartiallyInitialized1
Expand Down Expand Up @@ -5951,7 +5954,7 @@ end
# InterConditional rt with Vararg argtypes
fcondvarargs(a, b, c, d) = isa(d, Int64)
gcondvarargs(a, x...) = return fcondvarargs(a, x...) ? isa(a, Int64) : !isa(a, Int64)
@test Compiler.return_type(gcondvarargs, Tuple{Vararg{Any}}) === Bool
@test Base.infer_return_type(gcondvarargs, Tuple{Vararg{Any}}) === Bool

# JuliaLang/julia#55627: argtypes check in `abstract_call_opaque_closure`
issue55627_make_oc() = Base.Experimental.@opaque (x::Int) -> 2x
Expand Down Expand Up @@ -6098,4 +6101,6 @@ function func_swapglobal!_must_throw(x)
swapglobal!(@__MODULE__, :swapglobal!_must_throw, x)
end
@test Base.infer_return_type(func_swapglobal!_must_throw, (Int,); interp=SwapGlobalInterp()) === Union{}
@test !Base.Compiler.is_effect_free(Base.infer_effects(func_swapglobal!_must_throw, (Int,); interp=SwapGlobalInterp()) )
@test !Compiler.is_effect_free(Base.infer_effects(func_swapglobal!_must_throw, (Int,); interp=SwapGlobalInterp()) )

end # test_inference
8 changes: 6 additions & 2 deletions Compiler/test/inline.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# This file is a part of Julia. License is MIT: https://julialang.org/license

module test_inline

using Test
using Base.Meta
using Core: ReturnNode
Expand Down Expand Up @@ -1857,7 +1859,7 @@ let i::Int, continue_::Bool
ir = Compiler.ssa_inlining_pass!(ir, inlining, false)
@test findfirst(isinvoke(:func_mul_int), ir.stmts.stmt) === nothing
@test (i = findfirst(iscall((ir, Core.Intrinsics.mul_int)), ir.stmts.stmt)) !== nothing
lins = Base.IRShow.buildLineInfoNode(ir.debuginfo, nothing, i)
lins = Compiler.IRShow.buildLineInfoNode(ir.debuginfo, nothing, i)
@test (continue_ = length(lins) == 2) # :multi_inlining1 -> :func_mul_int
if continue_
def1 = lins[1].method
Expand All @@ -1881,7 +1883,7 @@ let i::Int, continue_::Bool
ir = Compiler.ssa_inlining_pass!(ir, inlining, false)
@test findfirst(isinvoke(:func_mul_int), ir.stmts.stmt) === nothing
@test (i = findfirst(iscall((ir, Core.Intrinsics.mul_int)), ir.stmts.stmt)) !== nothing
lins = Base.IRShow.buildLineInfoNode(ir.debuginfo, nothing, i)
lins = Compiler.IRShow.buildLineInfoNode(ir.debuginfo, nothing, i)
@test_broken (continue_ = length(lins) == 3) # see TODO in `ir_inline_linetable!`
if continue_
def1 = lins[1].method
Expand Down Expand Up @@ -2309,3 +2311,5 @@ g_noinline_invoke(x) = f_noinline_invoke(x)
let src = code_typed1(g_noinline_invoke, (Union{Symbol,Nothing},))
@test !any(@nospecialize(x)->isa(x,GlobalRef), src.code)
end

end # module test_inline
Loading

0 comments on commit dc105dc

Please sign in to comment.