FluxML / IRTools.jl

Mike's Little Intermediate Representation
MIT License
111 stars 35 forks source link

Got `Unreachable reached` error with modified IR #79

Open KDr2 opened 4 years ago

KDr2 commented 4 years ago

The problem is posted at https://discourse.julialang.org/t/got-unreachable-reached-error-while-using-irtools/44860, below is a minimal work example:

using IRTools
using InteractiveUtils

f(x) = x + 1

@show IRTools.@code_ir f(1)

IRTools.@dynamo function test(a...)
    ir = IRTools.IR(a...)
    insert!(ir, IRTools.var(3), :(println("Hi!")))
    return ir
end

@show IRTools.@code_ir test(f, 1)

@code_llvm test(f, 1)

test(f, 1)

The output:

#= /data/zhuoql/Work/julia/i.jl:7 =# IRTools.var"@code_ir"(f(1)) = 1: (%1, %2)
  %3 = %2 + 1
  return %3
#= /data/zhuoql/Work/julia/i.jl:15 =# IRTools.var"@code_ir"(test(f, 1)) = 1: (%1, %2)
  %3 = Base.getfield(%2, 1)
  %4 = Base.getfield(%2, 2)
  %5 = println("Hi!")
  %6 = %4 + 1
  return %6

;  @ /data/zhuoql/.julia/packages/IRTools/5JxlL/src/reflection/dynamo.jl:114 within `test'
; Function Attrs: noreturn
define void @julia_test_17807(i64) #0 {
top:
  %1 = alloca %jl_value_t addrspace(10)*
  %2 = getelementptr %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %1, i32 0
  store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140050782002832 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %$
  %3 = call nonnull %jl_value_t addrspace(10)* @jl_apply_generic(%jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140050873950960 to %jl_value_t*) to %$
l_value_t addrspace(10)*), %jl_value_t addrspace(10)** %1, i32 1)
  call void @llvm.trap()
  unreachable
}
Hi!
Unreachable reached at 0x7f6000b2ca2d

signal (4): Illegal instruction
in expression starting at /data/zhuoql/Work/julia/i.jl:20
test at /data/zhuoql/.julia/packages/IRTools/5JxlL/src/reflection/dynamo.jl:114
unknown function (ip: 0x7f6000b2ca43)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2141 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2305
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1631 [inlined]
do_call at /buildworker/worker/package_linux64/build/src/interpreter.c:328
eval_value at /buildworker/worker/package_linux64/build/src/interpreter.c:417
eval_stmt_value at /buildworker/worker/package_linux64/build/src/interpreter.c:368 [inlined]
eval_body at /buildworker/worker/package_linux64/build/src/interpreter.c:778
jl_interpret_toplevel_thunk_callback at /buildworker/worker/package_linux64/build/src/interpreter.c:888
unknown function (ip: 0xfffffffffffffffe)
unknown function (ip: 0x7f5ffde48a0f)
unknown function (ip: 0xffffffffffffffff)
jl_interpret_toplevel_thunk at /buildworker/worker/package_linux64/build/src/interpreter.c:897
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:814
jl_parse_eval_all at /buildworker/worker/package_linux64/build/src/ast.c:873
jl_load at /buildworker/worker/package_linux64/build/src/toplevel.c:878
include at ./boot.jl:328 [inlined]
include_relative at ./loading.jl:1105
include at ./Base.jl:31
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2135 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2305
exec_options at ./client.jl:287
_start at ./client.jl:460
jfptr__start_2084.clone_1 at /data/zhuoql/programs/julia-1.3.1/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2135 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2305
unknown function (ip: 0x401931)
unknown function (ip: 0x401533)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4015d4)
Allocations: 20385503 (Pool: 20383290; Big: 2213); GC: 23
Illegal instruction (core dumped)
KDr2 commented 4 years ago

pushfirst!(ir, IRTools.xcall(Base, :println, "hello, world")) works.

https://discourse.julialang.org/t/got-unreachable-reached-error-while-using-irtools/44860/2

Maybe we should update the docs.