JuliaLang/julia

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

Open

#52.772 aperta il 5 gen 2024

Vedi su GitHub
 (5 commenti) (0 reazioni) (0 assegnatari)Julia (5773 fork)batch import
good first issueobservability

Metriche repository

Star
 (48.709 star)
Metriche merge PR
 (Merge medio 20g 6h) (157 PR mergiate in 30 g)

Descrizione

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
}

Guida contributor