Skip to content
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

Invalid conversion between floating-point tuples #45485

Closed
serenity4 opened this issue May 27, 2022 · 2 comments
Closed

Invalid conversion between floating-point tuples #45485

serenity4 opened this issue May 27, 2022 · 2 comments
Labels
compiler:codegen Generation of LLVM IR and native code regression Regression in behavior compared to a previous version

Comments

@serenity4
Copy link
Contributor

serenity4 commented May 27, 2022

I stumbled upon a pretty surprising behavior on nightly:

julia> struct ReproStruct
         val::Union{Nothing, NTuple{4,Float32}}
       end

julia> ReproStruct((0.0, 0.0, 0.0, 0.1))
ReproStruct((0.0f0, 0.0f0, 4.5866f-41, 0.0f0))

julia> versioninfo()
Julia Version 1.9.0-DEV.667
Commit 762561c3057 (2022-05-27 04:05 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 8 × Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-13.0.1 (ORCJIT, skylake)
  Threads: 8 on 8 virtual cores

while removing the Nothing in the field type results in the correct behavior:

julia> struct ReproStruct2
         val::NTuple{4,Float32}
       end

julia> ReproStruct2((0.0, 0.0, 0.0, 0.1))
ReproStruct2((0.0f0, 0.0f0, 0.0f0, 0.1f0))

Whether I @show internal variables in Base.convert seems to have an impact on the result, I believe the root issue might be about some data not being preserved (in absence of side-effects like printing).

Note that convert(Union{Nothing, NTuple{4, Float32}}, (0.0, 0.0, 0.0, 1.0)) seems to work fine as well.

@inkydragon
Copy link
Sponsor Member

inkydragon commented Jul 2, 2022

Confirmed on 1.9.0-DEV.875 (2022-07-01).

test code

VERSION
struct MaybeTuple
    val::Union{Nothing, Tuple{Float32}}
end
MaybeTuple((0,))

test result

Looks like a regression.

1.7.3

julia> VERSION
v"1.7.3"

julia> struct MaybeTuple
           val::Union{Nothing, Tuple{Float32}}
       end

julia> MaybeTuple((0,))
MaybeTuple((0.0f0,))

1.8.0-rc1

julia> VERSION
v"1.8.0-rc1"

julia> struct MaybeTuple
           val::Union{Nothing, Tuple{Float32}}
       end

julia> MaybeTuple((0,))
MaybeTuple((0.0f0,))

https://github.com/JuliaLang/julia/tree/bf2c2e8b211d648d0b477596cab75ba6cb978319 works fine.

1.9.0-DEV.552

julia> VERSION
v"1.9.0-DEV.552"

julia> struct MaybeTuple
           val::Union{Nothing, Tuple{Float32}}
       end

julia> MaybeTuple((0,))
MaybeTuple((0.0f0,))

Maybe related to: #45153

By using CI build (debug version), I got an "Assertion failed".

1.9.0-DEV.856 package_win64

julia> versioninfo()
Julia Version 1.9.0-DEV.856
Commit a8d1d366f6 (2022-06-28 14:36 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: 6 × Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-14.0.5 (ORCJIT, skylake)
  Threads: 1 on 6 virtual cores

julia> VERSION
v"1.9.0-DEV.856"

julia> struct MaybeTuple
           val::Union{Nothing, Tuple{Float32}}
       end

julia> MaybeTuple((0,))
Assertion failed: !field_promotable, file /cygdrive/c/buildbot/worker/package_win64/build/src/cgutils.cpp, line 3697

signal (22): SIGABRT
in expression starting at REPL[3]:1
crt_sig_handler at /cygdrive/c/buildbot/worker/package_win64/build/src\signals-win.c:93
raise at C:\WINDOWS\System32\msvcrt.dll (unknown line)
abort at C:\WINDOWS\System32\msvcrt.dll (unknown line)
assert at C:\WINDOWS\System32\msvcrt.dll (unknown line)
emit_new_struct at /cygdrive/c/buildbot/worker/package_win64/build/src\cgutils.cpp:3697
emit_expr at /cygdrive/c/buildbot/worker/package_win64/build/src\codegen.cpp:5134
emit_ssaval_assign at /cygdrive/c/buildbot/worker/package_win64/build/src\codegen.cpp:4585
emit_stmtpos at /cygdrive/c/buildbot/worker/package_win64/build/src\codegen.cpp:4795
emit_function at /cygdrive/c/buildbot/worker/package_win64/build/src\codegen.cpp:7825
jl_emit_code at /cygdrive/c/buildbot/worker/package_win64/build/src\codegen.cpp:8186
jl_emit_codeinst at /cygdrive/c/buildbot/worker/package_win64/build/src\codegen.cpp:8234
_jl_compile_codeinst at /cygdrive/c/buildbot/worker/package_win64/build/src\jitlayers.cpp:128
jl_generate_fptr_impl at /cygdrive/c/buildbot/worker/package_win64/build/src\jitlayers.cpp:358
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2107
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2051 [inlined]
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2385 [inlined]
ijl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2575
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1845 [inlined]
do_call at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:126
eval_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:215
eval_stmt_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:166 [inlined]
eval_body at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:612
jl_interpret_toplevel_thunk at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:750
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:912
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:856
ijl_toplevel_eval at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:921 [inlined]
ijl_toplevel_eval_in at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:971
eval at .\boot.jl:370 [inlined]
eval_user_input at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.9\REPL\src\REPL.jl:152
repl_backend_loop at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.9\REPL\src\REPL.jl:248
#start_repl_backend#46 at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.9\REPL\src\REPL.jl:233
start_repl_backend##kw at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.9\REPL\src\REPL.jl:230 [inlined]
#run_repl#59 at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.9\REPL\src\REPL.jl:372
run_repl at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.9\REPL\src\REPL.jl:357
jfptr_run_repl_53404.clone_1 at C:\Users\woclass\Downloads\julia-a8d1d366f6-win64\julia-a8d1d366f6\lib\julia\sys.dll (unknown line)
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2393 [inlined]
ijl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2575
#988 at .\client.jl:415
jfptr_YY.988_32487.clone_1 at C:\Users\woclass\Downloads\julia-a8d1d366f6-win64\julia-a8d1d366f6\lib\julia\sys.dll (unknown line)
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2393 [inlined]
ijl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2575
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1845 [inlined]
jl_f__call_latest at /cygdrive/c/buildbot/worker/package_win64/build/src\builtins.c:774
run_main_repl at .\client.jl:400
exec_options at .\client.jl:314
_start at .\client.jl:516
jfptr__start_27830.clone_1 at C:\Users\woclass\Downloads\julia-a8d1d366f6-win64\julia-a8d1d366f6\lib\julia\sys.dll (unknown line)
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2393 [inlined]
ijl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2575
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1845 [inlined]
true_main at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:567
jl_repl_entrypoint at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:711
mainCRTStartup at /cygdrive/c/buildbot/worker/package_win64/build/cli\loader_exe.c:59
BaseThreadInitThunk at C:\WINDOWS\System32\KERNEL32.DLL (unknown line)
RtlUserThreadStart at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line)
Allocations: 2870 (Pool: 2859; Big: 11); GC: 0

1.9.0-DEV.875

julia> VERSION
v"1.9.0-DEV.875"

julia> struct MaybeTuple
           val::Union{Nothing, Tuple{Float32}}
       end

julia> MaybeTuple((0,))
MaybeTuple((-5.8949936f-16,))

Other test

test code
VERSION
struct MaybeTuple64
    val::Union{Nothing, Tuple{Float64}}
end
MaybeTuple64((0,))
MaybeTuple64((0f0,))
MaybeTuple64((Float16(0),))

struct MaybeTuple32
    val::Union{Nothing, Tuple{Float32}}
end
MaybeTuple32((0,))
MaybeTuple32((0f0,))
MaybeTuple32((Float16(0),))

struct MaybeTuple16
    val::Union{Nothing, Tuple{Float16}}
end
MaybeTuple16((0,))
MaybeTuple16((0f0,))
MaybeTuple16((Float16(0),))
julia> VERSION
v"1.9.0-DEV.875"

julia> struct MaybeTuple64
           val::Union{Nothing, Tuple{Float64}}
       end

julia> MaybeTuple64((0,))
MaybeTuple64((1.5132e-319,))

julia> MaybeTuple64((0f0,))
MaybeTuple64((1.5132e-319,))

julia> MaybeTuple64((Float16(0),))
MaybeTuple64((1.5132e-319,))

julia> struct MaybeTuple32
           val::Union{Nothing, Tuple{Float32}}
       end

julia> MaybeTuple32((0,))
MaybeTuple32((-4.0105147f30,))

julia> MaybeTuple32((0f0,))
MaybeTuple32((0.0f0,))

julia> MaybeTuple32((Float16(0),))
MaybeTuple32((-4.011182f30,))

julia> struct MaybeTuple16
           val::Union{Nothing, Tuple{Float16}}
       end

julia> MaybeTuple16((0,))
MaybeTuple16((Float16(-5.72e-5),))

julia> MaybeTuple16((0f0,))
MaybeTuple16((Float16(-0.0002594),))

julia> MaybeTuple16((Float16(0),))
MaybeTuple16((Float16(0.0),))

@inkydragon inkydragon added regression Regression in behavior compared to a previous version compiler:codegen Generation of LLVM IR and native code labels Jul 3, 2022
@inkydragon
Copy link
Sponsor Member

Closed by #45476,

Commit 6009ae9

julia> versioninfo()
Julia Version 1.9.0-DEV.1027
Commit 6009ae9ca2 (2022-07-21 23:21 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: 12 × Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-14.0.5 (ORCJIT, skylake)
  Threads: 1 on 12 virtual cores

julia>

julia> VERSION
v"1.9.0-DEV.1027"

julia> struct MaybeTuple
           val::Union{Nothing, Tuple{Float32}}
       end

julia> MaybeTuple((0,))
MaybeTuple((0.0f0,))

julia> struct ReproStruct
                val::Union{Nothing, NTuple{4,Float32}}
              end

julia> ReproStruct((0.0, 0.0, 0.0, 0.1))
ReproStruct((0.0f0, 0.0f0, 0.0f0, 0.1f0))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler:codegen Generation of LLVM IR and native code regression Regression in behavior compared to a previous version
Projects
None yet
Development

No branches or pull requests

2 participants