Skip to content

@noinline confuses @code_typed reporting wrong return type when return value is unused. #52772

Open

Description

Just a small bug in the @code_typed information for a function that calls a no-inlined callee (with side effects), whose return value is unused:

julia> @noinline f() = (println(); true)
f (generic function with 1 method)

julia> f1(x) = (f(); return x+1)
f1 (generic function with 1 method)

julia> @code_typed f1(10)
CodeInfo(
1 ─      invoke Main.f()::Any%2 = Base.add_int(x, 1)::Int64
└──      return %2
) => Int64

The incorrect line is: invoke Main.f()::Any.
This should instead be: invoke Main.f()::Bool.

Of course, since the return value is unused, this isn't very consequential, but it confused me as a red herring for a bit in a more complicated scenario earlier today.

Finally, it's worth noting that the compiler does know the true return type, since @code_llvm shows it return an i8:

julia> @code_llvm f1(10)
; Function Signature: f1(Int64)
;  @ REPL[16]:1 within `f1`
define i64 @julia_f1_2311(i64 signext %"x::Int64") #0 {
top:
  %0 = call i8 @j_f_2314()
; ┌ @ int.jl:87 within `+`
   %1 = add i64 %"x::Int64", 1
; └
  ret i64 %1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    good first issueIndicates a good issue for first-time contributors to Juliaobservabilitymetrics, timing, understandability, reflection, logging, ...

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions