-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
IBMQJulia's test suite raises internal error #47687
Comments
This is invalid IR |
@KristofferC this is the PkgEval failure reason, if you want to track it |
Even though this is invalid IR, we may want to consider dealing with this differently, or fixing Cassette as (1) Traceur also runs into this, (2) it used to work fine on 1.8, and (3) it makes the PkgEval reports look bad. A MWE that used to work on 1.8 (reduction in progress, so messy code): using Core: SlotNumber
struct Context{N, M}
name::N
metadata::M
end
function Context(name; metadata)
Context(name, metadata)
end
macro context(_Ctx)
CtxName = Symbol()
Ctx = esc(_Ctx)
quote
struct $CtxName end
$Ctx{M} = Context{$CtxName}
$Ctx(; kwargs...) = Context($CtxName(); kwargs...)
end
end
function insert_statements!(code, codelocs, stmtcount, newstmts)
ssachangemap = labelchangemap = fill(0, length(code))
worklist = []
for i in 1:length(code)
stmt = code[i]
nstmts = stmtcount(stmt, i)
if nstmts != nothing
addedstmts = nstmts - 1
push!(worklist, (i, addedstmts))
ssachangemap[i] = if i < length(code)
addedstmts
end
end
end
Core.Compiler.renumber_ir_elements!(code, labelchangemap)
for (i, addedstmts) in worklist
i += ssachangemap[i] - addedstmts
stmts = newstmts(code[i], i)
code[i] = stmts
for j in 1:length(stmts) - 1
insert!(code, i, stmts[j])
insert!(codelocs, i, codelocs[i])
end
end
end
specialize_method(method, metharg, methsp, world, preexisting) = Core.Compiler.specialize_method(method, metharg, methsp)
function reflect(sigtypes, world=typemax(UInt64))
S = Tuple{map(s -> s, sigtypes)...}
_methods = Base._methods_by_ftype(S, 1, world)
type_signature, raw_static_params, method = _methods[]
method_instance = specialize_method(method, type_signature, raw_static_params, world, false)
code_info = Core.Compiler.retrieve_code_info(method_instance)
(; method, code_info)
end
function generator(self, context_type, args)
reflection = reflect(args)
method = reflection.method
code_info = reflection.code_info
code_info.slotnames = [:overdub, gensym(), gensym(), code_info.slotnames...]
code_info.slotflags = [0, 0, 0, code_info.slotflags...]
n_prepended_slots = 3
overdub_ctx_slot = SlotNumber(2)
overdub_args_slot = SlotNumber(3)
overdubbed_code = []
overdubbed_codelocs = []
n_method_args = method.nargs
offset = 1
for i in 1:n_method_args
slot = i + n_prepended_slots
actual_argument = Expr(:call, getfield, overdub_args_slot, offset)
push!(overdubbed_code, :($(SlotNumber(slot)) = $actual_argument))
push!(overdubbed_codelocs, code_info.codelocs[1])
end
Meta.partially_inline!(code_info.code, [], method, [],
n_prepended_slots, length(overdubbed_code), :propagate)
original_code_start_index = length(overdubbed_code) + 1
append!(overdubbed_code, code_info.code)
append!(overdubbed_codelocs, code_info.codelocs)
stmtcount = (x, i) -> begin
i >= original_code_start_index || return
isassign = Meta.isexpr(x, :(=))
stmt = isassign ? x.args[2] : x
if Meta.isexpr(stmt, :call)
4
end
end
newstmts = (x, i) -> begin
callstmt = Meta.isexpr(x, :(=)) ? x.args[2] : x
Expr,
Expr(:call, overdub, overdub_ctx_slot, callstmt.args...),
Expr,
0
end
insert_statements!(overdubbed_code, overdubbed_codelocs, stmtcount, newstmts)
code_info.code = overdubbed_code
code_info.codelocs = overdubbed_codelocs
code_info.ssavaluetypes = length(overdubbed_code)
code_info.ssaflags = [0 for _ in overdubbed_code]
code_info
end
@eval begin
function overdub(Context, args...)
$(Expr(:meta,
:generated,
Expr(:new,
Core.GeneratedFunctionStub,
:generator,
[],
[],
0,
QuoteNode(Symbol()),
true)))
end
function recurse(Context, args...)
$(Expr(:meta,
:generated,
Expr(:new,
Core.GeneratedFunctionStub,
:generator,
[],
[],
0,
QuoteNode(Symbol()),
true)))
end
end
@context TraceurCtx
function overdub(ctx::TraceurCtx, f, args...)
tra = ctx.metadata
if tra > typemax(Int)
invoke(overdub, Tuple{Context, typeof(f), typeof.(args)...}, ctx, f, args...)
end
end
recurse(TraceurCtx(metadata=0), BigInt) I'll blacklist IBMQJulia and Traceur for now, but that's not ideal of course. |
It looks like the package generates code containing nested
:call
expression via Cassette.jl:How do we want to support this case? Abstract interpretation doesn't error on it (it just infers such nested
:call
to beAny
) but optimization does (because ofargextype
's assumption).The text was updated successfully, but these errors were encountered: