Executing this script terminates julia 1.6.0-DEV.369 with
julia: /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:513: std::pair<llvm::Value*, int> FindBaseValue(const State&, llvm::Value*, bool): Assertion `isa<UndefValue>(II->getOperand(3)) && "unimplemented"' failed.
Here is the rr trace https://s3.amazonaws.com/julialang-dumps/reports/2020-07-05T02-06-49-tkf.tar.zst
Rest of stacktrace
signal (6): Aborted
in expression starting at /home/takafumi/.julia/dev/Transducers/test/__test_ir.jl:28
gsignal at /usr/lib/libc.so.6 (unknown line)
abort at /usr/lib/libc.so.6 (unknown line)
__assert_fail_base.cold at /usr/lib/libc.so.6 (unknown line)
__assert_fail at /usr/lib/libc.so.6 (unknown line)
FindBaseValue at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:513
Number at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:794
NoteUse at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:1017
NoteUse at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:1013 [inlined]
NoteUse at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:330 [inlined]
NoteOperandUses at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:1036
LocalScan at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:1515
runOnFunction at /home/takafumi/repos/watch/julia/src/llvm-late-gc-lowering.cpp:2434
_ZN4llvm13FPPassManager13runOnFunctionERNS_8FunctionE at /home/takafumi/repos/watch/julia/usr/bin/../lib/libLLVM-9jl.so (unknown line)
_ZN4llvm13FPPassManager11runOnModuleERNS_6ModuleE at /home/takafumi/repos/watch/julia/usr/bin/../lib/libLLVM-9jl.so (unknown line)
_ZN4llvm6legacy15PassManagerImpl3runERNS_6ModuleE at /home/takafumi/repos/watch/julia/usr/bin/../lib/libLLVM-9jl.so (unknown line)
jl_get_llvmf_defn at /home/takafumi/repos/watch/julia/src/aotcompile.cpp:862
_dump_function_linfo_llvm at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/InteractiveUtils/src/codeview.jl:119 [inlined]
_dump_function at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/InteractiveUtils/src/codeview.jl:87
_dump_function at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/InteractiveUtils/src/codeview.jl:71 [inlined]
code_llvm at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/InteractiveUtils/src/codeview.jl:138 [inlined]
#code_llvm#28 at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/InteractiveUtils/src/codeview.jl:140 [inlined]
code_llvm at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/InteractiveUtils/src/codeview.jl:140
jl_apply at /home/takafumi/repos/watch/julia/src/julia.h:1712 [inlined]
do_apply at /home/takafumi/repos/watch/julia/src/builtins.c:655
#sprint#357 at ./strings/io.jl:105
sprint at ./strings/io.jl:101 [inlined]
llvm_ir at /home/takafumi/.julia/dev/Transducers/test/__test_ir.jl:14
unknown function (ip: 0x7fc44af34605)
jl_apply at /home/takafumi/repos/watch/julia/src/julia.h:1712 [inlined]
do_call at /home/takafumi/repos/watch/julia/src/interpreter.c:117
eval_value at /home/takafumi/repos/watch/julia/src/interpreter.c:206
eval_body at /home/takafumi/repos/watch/julia/src/interpreter.c:436
eval_body at /home/takafumi/repos/watch/julia/src/interpreter.c:491
eval_body at /home/takafumi/repos/watch/julia/src/interpreter.c:491
eval_body at /home/takafumi/repos/watch/julia/src/interpreter.c:491
eval_body at /home/takafumi/repos/watch/julia/src/interpreter.c:491
jl_interpret_toplevel_thunk at /home/takafumi/repos/watch/julia/src/interpreter.c:659
jl_toplevel_eval_flex at /home/takafumi/repos/watch/julia/src/toplevel.c:838
jl_toplevel_eval_flex at /home/takafumi/repos/watch/julia/src/toplevel.c:788
jl_toplevel_eval_in at /home/takafumi/repos/watch/julia/src/toplevel.c:881
eval at ./boot.jl:340 [inlined]
include_string at ./loading.jl:1103
_include at ./loading.jl:1157
include at ./client.jl:444
jl_apply at /home/takafumi/repos/watch/julia/src/julia.h:1712 [inlined]
do_call at /home/takafumi/repos/watch/julia/src/interpreter.c:117
eval_value at /home/takafumi/repos/watch/julia/src/interpreter.c:206
eval_stmt_value at /home/takafumi/repos/watch/julia/src/interpreter.c:157 [inlined]
eval_body at /home/takafumi/repos/watch/julia/src/interpreter.c:547
jl_interpret_toplevel_thunk at /home/takafumi/repos/watch/julia/src/interpreter.c:659
jl_toplevel_eval_flex at /home/takafumi/repos/watch/julia/src/toplevel.c:838
jl_toplevel_eval_flex at /home/takafumi/repos/watch/julia/src/toplevel.c:788
jl_toplevel_eval_in at /home/takafumi/repos/watch/julia/src/toplevel.c:881
eval at ./boot.jl:340
eval_user_input at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:134
repl_backend_loop at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:195
start_repl_backend at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:180
#run_repl#37 at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:306
run_repl at /home/takafumi/repos/watch/julia/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:302
#843 at ./client.jl:387
jfptr_YY.843_21800 at /home/takafumi/repos/watch/julia/usr/lib/julia/sys.so (unknown line)
jl_apply at /home/takafumi/repos/watch/julia/src/julia.h:1712 [inlined]
do_apply at /home/takafumi/repos/watch/julia/src/builtins.c:655
jl_f__apply_latest at /home/takafumi/repos/watch/julia/src/builtins.c:705
#invokelatest#1 at ./essentials.jl:712 [inlined]
invokelatest at ./essentials.jl:711 [inlined]
run_main_repl at ./client.jl:371
exec_options at ./client.jl:301
_start at ./client.jl:485
jfptr__start_25287 at /home/takafumi/repos/watch/julia/usr/lib/julia/sys.so (unknown line)
jl_apply at /home/takafumi/repos/watch/julia/ui/../src/julia.h:1712 [inlined]
true_main at /home/takafumi/repos/watch/julia/ui/repl.c:106
main at /home/takafumi/repos/watch/julia/ui/repl.c:227
__libc_start_main at /usr/lib/libc.so.6 (unknown line)
_start at /home/takafumi/repos/watch/julia/usr/bin/julia (unknown line)
Allocations: 10373962 (Pool: 10370673; Big: 3289); GC: 12
cc @Keno
Thanks, the trace is particularly helpful here, since the vectorizer looks at the hardware you're running on to make vectorization decisions, so it can be hard to reproduce these failures otherwise.
The instruction it's failing on is:
%wide.masked.gather = call <4 x double addrspace(13)*> @llvm.masked.gather.v4p13f64.v4p11p13f64(<4 x double addrspace(13)* addrspace(11)*> %broadcast.splat20, i32 8, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x double addrspace(13)*> zeroinitializer), !dbg !148, !tbaa !72
which is perfectly sensible and just a part of the GC lowering pass where we're missing LLVM instruction coverage. A gather is basically a load and a select fused into one, so in general, it needs to go through the same logic as LiftSelect, using the load mask as the select condition. However, in this case that's not actually required, since the mask is all true, so we can just add that to the select condition.
Try this patch:
diff --git a/src/llvm-late-gc-lowering.cpp b/src/llvm-late-gc-lowering.cpp
index 0abda771ab..a31783dd22 100644
--- a/src/llvm-late-gc-lowering.cpp
+++ b/src/llvm-late-gc-lowering.cpp
@@ -510,7 +510,11 @@ static std::pair<Value*,int> FindBaseValue(const State &S, Value *V, bool UseCac
if (auto VTy = dyn_cast<VectorType>(II->getType())) {
if (auto PtrT = dyn_cast<PointerType>(VTy->getElementType())) {
if (PtrT->getAddressSpace() == AddressSpace::Loaded) {
- assert(isa<UndefValue>(II->getOperand(3)) && "unimplemented");
+ Value *Mask = II->getOperand(2);
+ Value *Passthrough = II->getOperand(3);
+ if (!isa<Constant>(Mask) || !cast<Constant>(Mask)->isAllOnesValue()) {
+ assert(isa<UndefValue>(Passthrough) && "unimplemented");
+ }
CurrentV = II->getOperand(0);
if (II->getIntrinsicID() == Intrinsic::masked_load) {
fld_idx = -1;
(That just kicks the can down the road, eventually somebody should just implement the full version, but maybe good enough for now)?
Thanks! Julia doesn't abort any more after applying your patch.
https://julialang.zulipchat.com/#narrow/stream/225583-appreciation/topic/.40Keno.20and.20rr/near/202907399
Most helpful comment
36540