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 21, 2024
1 parent 00bc3e8 commit b4acc79
Show file tree
Hide file tree
Showing 18 changed files with 107 additions and 99 deletions.
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
26 changes: 17 additions & 9 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})
Core.Compiler.return_type(x -> x + a, Tuple{Float64})
end
@inferred foo19641()

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 @@ -2765,10 +2769,10 @@ 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
let apply_type_tfunc = Compiler.apply_type_tfunc
𝕃 = Compiler.fallback_lattice
Const = Core.Const
A = Type{<:Integer}
@test apply_type_tfunc(𝕃, Const(Issue47089), A, A) <: (Type{Issue47089{A,B}} where {A<:Integer, B<:Integer})
@test apply_type_tfunc(𝕃, Const(Issue47089), Const(Int), Const(Int), Const(Int)) === Union{}
Expand Down Expand Up @@ -4554,7 +4558,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 @@ -5698,7 +5703,8 @@ let x = 1, _Any = Any
end

# Issue #51927
let 𝕃 = Compiler.fallback_lattice
let apply_type_tfunc = Compiler.apply_type_tfunc
𝕃 = Compiler.fallback_lattice
@test apply_type_tfunc(𝕃, Const(Tuple{Vararg{Any,N}} where N), Int) == Type{NTuple{_A, Any}} where _A
end

Expand Down Expand Up @@ -6071,3 +6077,5 @@ function issue56387(nt::NamedTuple, field::Symbol=:a)
types[index]
end
@test Base.infer_return_type(issue56387, (typeof((;a=1)),)) == Type{Int}

end # module 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
10 changes: 2 additions & 8 deletions Compiler/test/interpreter_exec.jl
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
# This file is a part of Julia. License is MIT: https://julialang.org/license

# tests that interpreter matches codegen
include("setup_Compiler.jl")

using Test
using Core.IR

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

# test that interpreter correctly handles PhiNodes (#29262)
let m = Meta.@lower 1 + 1
@assert Meta.isexpr(m, :thunk)
Expand Down
10 changes: 7 additions & 3 deletions Compiler/test/invalidation.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_invalidation

# setup
# -----

Expand Down Expand Up @@ -104,7 +106,7 @@ begin
let rt = only(Base.return_types(pr48932_callee, (Any,)))
@test rt === Any
effects = Base.infer_effects(pr48932_callee, (Any,))
@test Compiler.Effects(effects) == Compiler.Effects()
@test effects == Compiler.Effects()
end

# run inference on both `pr48932_caller` and `pr48932_callee`
Expand Down Expand Up @@ -171,7 +173,7 @@ begin take!(GLOBAL_BUFFER)
let rt = only(Base.return_types(pr48932_callee_inferable, (Any,)))
@test rt === Int
effects = Base.infer_effects(pr48932_callee_inferable, (Any,))
@test Compiler.Effects(effects) == Compiler.Effects()
@test effects == Compiler.Effects()
end

# run inference on both `pr48932_caller` and `pr48932_callee`:
Expand Down Expand Up @@ -233,7 +235,7 @@ begin take!(GLOBAL_BUFFER)
let rt = only(Base.return_types(pr48932_callee_inlined, (Any,)))
@test rt === Any
effects = Base.infer_effects(pr48932_callee_inlined, (Any,))
@test Compiler.Effects(effects) == Compiler.Effects()
@test effects == Compiler.Effects()
end

# run inference on `pr48932_caller_inlined` and `pr48932_callee_inlined`
Expand Down Expand Up @@ -283,3 +285,5 @@ begin take!(GLOBAL_BUFFER)
@test isnothing(pr48932_caller_inlined(42))
@test "42" == String(take!(GLOBAL_BUFFER))
end

end # module test_invalidation
4 changes: 4 additions & 0 deletions Compiler/test/irpasses.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_irpasses

using Test
using Base.Meta
using Core.IR
Expand Down Expand Up @@ -1996,3 +1998,5 @@ let code = Any[
ir = Compiler.domsort_ssa!(ir, domtree)
Compiler.verify_ir(ir)
end

end # module test_irpasses
10 changes: 2 additions & 8 deletions Compiler/test/irutils.jl
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
# 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")

using Core.IR
using .Compiler: IRCode, IncrementalCompact, singleton_type, VarState
Expand Down Expand Up @@ -68,7 +62,7 @@ macro fully_eliminated(ex0...)
end

let m = Meta.@lower 1 + 1
@assert Meta.isexpr(m, :thunk)
@assert isexpr(m, :thunk)
orig_src = m.args[1]::CodeInfo
global function make_codeinfo(code::Vector{Any};
ssavaluetypes::Union{Nothing,Vector{Any}}=nothing,
Expand Down
9 changes: 6 additions & 3 deletions Compiler/test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ using Test, Compiler
using InteractiveUtils: @activate
@activate Compiler

for file in readlines(joinpath(@__DIR__, "testgroups"))
file == "special_loading" && continue # Only applicable to Base.Compiler
include(file * ".jl")
@testset "Compiler.jl" begin
for file in readlines(joinpath(@__DIR__, "testgroups"))
file == "special_loading" && continue # Only applicable to Base.Compiler
testfile = file * ".jl"
@eval @testset $testfile include($testfile)
end
end
Loading

0 comments on commit b4acc79

Please sign in to comment.