Enzyme.jl
Enzyme.jl copied to clipboard
Type Check Not Eliminated
vec2num_3(x) = sum([ifelse(i > 0, i, 0) for i in x])
using Enzyme
Enzyme.API.printall!(true)
Enzyme.API.printtype!(true)
x = Float64[i for i in 1:10]
vec2num_3(x)
os = Float64[0 for i in 1:10]
os[1] = 1
@show Enzyme.autodiff(Forward, vec2num_3, Duplicated(x, os))
after simplification :
; Function Attrs: willreturn mustprogress
define nonnull {} addrspace(10)* @preprocess_julia_vec2num_3_1291.inner.1({} addrspace(10)* nonnull align 16 dereferenceable(40) %0) local_unnamed_addr #16 {
entry:
%1 = alloca { {} addrspace(10)* }, align 8
%2 = bitcast { {} addrspace(10)* }* %1 to i8*
call void @llvm.lifetime.start.p0i8(i64 noundef 8, i8* noundef nonnull align 8 dereferenceable(8) %2) #17
%3 = call {}*** @julia.get_pgcstack() #17
%.fca.0.gep = getelementptr inbounds { {} addrspace(10)* }, { {} addrspace(10)* }* %1, i64 0, i32 0, !dbg !699
store {} addrspace(10)* %0, {} addrspace(10)** %.fca.0.gep, align 8, !dbg !699
%4 = addrspacecast { {} addrspace(10)* }* %1 to { {} addrspace(10)* } addrspace(11)*, !dbg !699
%5 = call fastcc nonnull {} addrspace(10)* @julia_collect_1311({ {} addrspace(10)* } addrspace(11)* nocapture noundef nonnull readonly align 8 dereferenceable(8) %4) #16, !dbg !699
%6 = call {} addrspace(10)* @julia.typeof({} addrspace(10)* nonnull %5) #18, !dbg !699
%.not = icmp eq {} addrspace(10)* %6, addrspacecast ({}* inttoptr (i64 140684880045408 to {}*) to {} addrspace(10)*), !dbg !699
br i1 %.not, label %L5.i, label %L49.i, !dbg !699
L5.i: ; preds = %entry
%7 = bitcast {} addrspace(10)* %5 to {} addrspace(10)* addrspace(10)*, !dbg !702
%8 = addrspacecast {} addrspace(10)* addrspace(10)* %7 to {} addrspace(10)* addrspace(11)*, !dbg !702
%9 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %8, i64 3, !dbg !702
%10 = bitcast {} addrspace(10)* addrspace(11)* %9 to i64 addrspace(11)*, !dbg !702
%11 = load i64, i64 addrspace(11)* %10, align 8, !dbg !702, !tbaa !110, !range !112
switch i64 %11, label %L18.i [
i64 0, label %L38.i
i64 1, label %L16.i
], !dbg !729
L16.i: ; preds = %L5.i
%12 = bitcast {} addrspace(10)* %5 to double addrspace(13)* addrspace(10)*, !dbg !730
%13 = addrspacecast double addrspace(13)* addrspace(10)* %12 to double addrspace(13)* addrspace(11)*, !dbg !730
%14 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %13, align 8, !dbg !730, !tbaa !33, !nonnull !4
%15 = load double, double addrspace(13)* %14, align 8, !dbg !730, !tbaa !227
br label %L38.i, !dbg !733
L18.i: ; preds = %L5.i
%16 = icmp ugt i64 %11, 15, !dbg !734
br i1 %16, label %L34.i, label %L20.i, !dbg !737
L20.i: ; preds = %L18.i
%17 = bitcast {} addrspace(10)* %5 to double addrspace(13)* addrspace(10)*, !dbg !738
%18 = addrspacecast double addrspace(13)* addrspace(10)* %17 to double addrspace(13)* addrspace(11)*, !dbg !738
%19 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %18, align 8, !dbg !738, !tbaa !33, !nonnull !4
%20 = load double, double addrspace(13)* %19, align 8, !dbg !738, !tbaa !227
%21 = getelementptr inbounds double, double addrspace(13)* %19, i64 1, !dbg !740
%22 = load double, double addrspace(13)* %21, align 8, !dbg !740, !tbaa !227
%23 = fadd double %20, %22, !dbg !742
%.not814 = icmp ugt i64 %11, 2, !dbg !747
br i1 %.not814, label %L29.i.preheader, label %L38.i, !dbg !749
L29.i.preheader: ; preds = %L20.i
br label %L29.i, !dbg !749
L29.i: ; preds = %L29.i.preheader, %L29.i
%iv1 = phi i64 [ %iv.next2, %L29.i ], [ 0, %L29.i.preheader ]
%value_phi2.i15 = phi double [ %28, %L29.i ], [ %23, %L29.i.preheader ]
%24 = add i64 %iv1, 2, !dbg !750
%iv.next2 = add nuw nsw i64 %iv1, 1, !dbg !750
%25 = add nuw nsw i64 %24, 1, !dbg !750
%26 = getelementptr inbounds double, double addrspace(13)* %19, i64 %24, !dbg !753
%27 = load double, double addrspace(13)* %26, align 8, !dbg !753, !tbaa !227
%28 = fadd double %value_phi2.i15, %27, !dbg !754
%exitcond.not = icmp eq i64 %25, %11, !dbg !747
br i1 %exitcond.not, label %L38.i.loopexit, label %L29.i, !dbg !749
L34.i: ; preds = %L18.i
%29 = call fastcc double @julia_mapreduce_impl_1308({} addrspace(10)* nocapture nonnull readonly align 16 dereferenceable(40) %5, i64 noundef signext 1, i64 signext %11) #19, !dbg !757
br label %L38.i, !dbg !760
L38.i.loopexit: ; preds = %L29.i
br label %L38.i
L38.i: ; preds = %L38.i.loopexit, %L34.i, %L20.i, %L16.i, %L5.i
%value_phi.i = phi double [ %15, %L16.i ], [ %29, %L34.i ], [ 0.000000e+00, %L5.i ], [ %23, %L20.i ], [ %28, %L38.i.loopexit ]
%ptls_field.i4 = getelementptr inbounds {}**, {}*** %3, i64 2305843009213693954
%30 = bitcast {}*** %ptls_field.i4 to i8**
%ptls_load.i56 = load i8*, i8** %30, align 8, !tbaa !139
%31 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj(i8* %ptls_load.i56, i64 noundef 8, {} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 140684875105696 to {}*) to {} addrspace(10)*)) #20, !dbg !699
%32 = bitcast {} addrspace(10)* %31 to double addrspace(10)*
store double %value_phi.i, double addrspace(10)* %32, align 8, !tbaa !141
br label %julia_vec2num_3_1291.inner.exit, !dbg !699
L49.i: ; preds = %entry
%.not9 = icmp eq {} addrspace(10)* %6, addrspacecast ({}* inttoptr (i64 140684875030800 to {}*) to {} addrspace(10)*), !dbg !699
br i1 %.not9, label %L51.i, label %L95.i, !dbg !699
L51.i: ; preds = %L49.i
%33 = bitcast {} addrspace(10)* %5 to {} addrspace(10)* addrspace(10)*, !dbg !702
%34 = addrspacecast {} addrspace(10)* addrspace(10)* %33 to {} addrspace(10)* addrspace(11)*, !dbg !702
%35 = getelementptr inbounds {} addrspace(10)*, {} addrspace(10)* addrspace(11)* %34, i64 3, !dbg !702
%36 = bitcast {} addrspace(10)* addrspace(11)* %35 to i64 addrspace(11)*, !dbg !702
%37 = load i64, i64 addrspace(11)* %36, align 8, !dbg !702, !tbaa !110, !range !112
switch i64 %37, label %L64.i [
i64 0, label %L84.i
i64 1, label %L62.i
], !dbg !729
L62.i: ; preds = %L51.i
%38 = bitcast {} addrspace(10)* %5 to i64 addrspace(13)* addrspace(10)*, !dbg !730
%39 = addrspacecast i64 addrspace(13)* addrspace(10)* %38 to i64 addrspace(13)* addrspace(11)*, !dbg !730
%40 = load i64 addrspace(13)*, i64 addrspace(13)* addrspace(11)* %39, align 8, !dbg !730, !tbaa !33, !nonnull !4
%41 = load i64, i64 addrspace(13)* %40, align 8, !dbg !730, !tbaa !227
br label %L84.i, !dbg !733
L64.i: ; preds = %L51.i
%42 = icmp ugt i64 %37, 15, !dbg !734
br i1 %42, label %L80.i, label %L66.i, !dbg !737
L66.i: ; preds = %L64.i
%43 = bitcast {} addrspace(10)* %5 to i64 addrspace(13)* addrspace(10)*, !dbg !738
%44 = addrspacecast i64 addrspace(13)* addrspace(10)* %43 to i64 addrspace(13)* addrspace(11)*, !dbg !738
%45 = load i64 addrspace(13)*, i64 addrspace(13)* addrspace(11)* %44, align 8, !dbg !738, !tbaa !33, !nonnull !4
%46 = load i64, i64 addrspace(13)* %45, align 8, !dbg !738, !tbaa !227
%47 = getelementptr inbounds i64, i64 addrspace(13)* %45, i64 1, !dbg !740
%48 = load i64, i64 addrspace(13)* %47, align 8, !dbg !740, !tbaa !227
%49 = add i64 %48, %46, !dbg !761
%.not1217 = icmp ugt i64 %37, 2, !dbg !747
br i1 %.not1217, label %L75.i.preheader, label %L84.i, !dbg !749
L75.i.preheader: ; preds = %L66.i
br label %L75.i, !dbg !749
L75.i: ; preds = %L75.i.preheader, %L75.i
%iv = phi i64 [ %iv.next, %L75.i ], [ 0, %L75.i.preheader ]
%value_phi5.i18 = phi i64 [ %54, %L75.i ], [ %49, %L75.i.preheader ]
%50 = add i64 %iv, 2, !dbg !750
%iv.next = add nuw nsw i64 %iv, 1, !dbg !750
%51 = add nuw nsw i64 %50, 1, !dbg !750
%52 = getelementptr inbounds i64, i64 addrspace(13)* %45, i64 %50, !dbg !753
%53 = load i64, i64 addrspace(13)* %52, align 8, !dbg !753, !tbaa !227
%54 = add i64 %53, %value_phi5.i18, !dbg !762
%exitcond22.not = icmp eq i64 %51, %37, !dbg !747
br i1 %exitcond22.not, label %L84.i.loopexit, label %L75.i, !dbg !749
L80.i: ; preds = %L64.i
%55 = call fastcc i64 @julia_mapreduce_impl_1305({} addrspace(10)* nocapture nonnull readonly align 16 dereferenceable(40) %5, i64 noundef signext 1, i64 signext %37) #19, !dbg !757
br label %L84.i, !dbg !760
L84.i.loopexit: ; preds = %L75.i
br label %L84.i, !dbg !699
L84.i: ; preds = %L84.i.loopexit, %L80.i, %L66.i, %L62.i, %L51.i
%value_phi4.i = phi i64 [ %41, %L62.i ], [ %55, %L80.i ], [ 0, %L51.i ], [ %49, %L66.i ], [ %54, %L84.i.loopexit ]
%56 = call noalias nonnull {} addrspace(10)* @jl_box_int64(i64 signext %value_phi4.i) #17, !dbg !699
br label %julia_vec2num_3_1291.inner.exit, !dbg !699
L95.i: ; preds = %L49.i
%.not13 = icmp eq {} addrspace(10)* %6, addrspacecast ({}* inttoptr (i64 140685094972208 to {}*) to {} addrspace(10)*), !dbg !699
br i1 %.not13, label %L97.i, label %L102.i, !dbg !699
L97.i: ; preds = %L95.i
%57 = call fastcc nonnull {} addrspace(10)* @julia__mapreduce_1297({} addrspace(10)* nocapture nonnull readonly align 16 dereferenceable(40) %5) #16, !dbg !763
br label %julia_vec2num_3_1291.inner.exit, !dbg !699
L102.i: ; preds = %L95.i
call void @jl_throw({} addrspace(12)* noundef addrspacecast ({}* inttoptr (i64 140684876314368 to {}*) to {} addrspace(12)*)) #21, !dbg !699
unreachable, !dbg !699
julia_vec2num_3_1291.inner.exit: ; preds = %L97.i, %L84.i, %L38.i
%value_phi1.i = phi {} addrspace(10)* [ %31, %L38.i ], [ %56, %L84.i ], [ %57, %L97.i ]
call void @llvm.lifetime.end.p0i8(i64 noundef 8, i8* noundef nonnull %2) #17, !dbg !699
ret {} addrspace(10)* %value_phi1.i
}
self: Float@double RHS: Float@double Op: 13
Unknown ConcreteType::binopIn
UNREACHABLE executed at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/../TypeAnalysis/ConcreteType.h:496!
signal (6): Aborted
in expression starting at /mnt/Data/git/Enzyme.jl/badrep2.jl:18
gsignal at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_ZN4llvm25llvm_unreachable_internalEPKcS1_j at /mnt/Data/git/Enzyme.jl/julia-1.7.2/bin/../lib/julia/libLLVM-12jl.so (unknown line)
binopIn at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/../TypeAnalysis/ConcreteType.h:496
binopIn at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/TypeTree.h:1084
visitBinaryOperation at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/TypeAnalysis.cpp:2386
visitBinaryOperator at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/TypeAnalysis.cpp:2557
visitAdd at /mnt/sabrent/wmoses/.julia/artifacts/8f2360be2c9c10c33d49eebc75d61a874d4ed029/include/llvm/IR/Instruction.def:147
visit at /mnt/sabrent/wmoses/.julia/artifacts/8f2360be2c9c10c33d49eebc75d61a874d4ed029/include/llvm/IR/Instruction.def:147
visitValue at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/TypeAnalysis.cpp:1153
run at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/TypeAnalysis.cpp:1098
analyzeFunction at /home/wmoses/git/Enzyme/enzyme/Enzyme/TypeAnalysis/TypeAnalysis.cpp:4785
CreateForwardDiff at /home/wmoses/git/Enzyme/enzyme/Enzyme/EnzymeLogic.cpp:4037
EnzymeCreateForwardDiff at /home/wmoses/git/Enzyme/enzyme/Enzyme/CApi.cpp:414
EnzymeCreateForwardDiff at /mnt/Data/git/Enzyme.jl/src/api.jl:124
enzyme! at /mnt/Data/git/Enzyme.jl/src/compiler.jl:2821
unknown function (ip: 0x7ff3b5c22c08)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
#codegen#73 at /mnt/Data/git/Enzyme.jl/src/compiler.jl:3522
codegen##kw at /mnt/Data/git/Enzyme.jl/src/compiler.jl:3310 [inlined]
_thunk at /mnt/Data/git/Enzyme.jl/src/compiler.jl:3902
unknown function (ip: 0x7ff3b5bb4abd)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
cached_compilation at /mnt/Data/git/Enzyme.jl/src/compiler.jl:3940
unknown function (ip: 0x7ff3b5b9bd85)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
#s386#92 at /mnt/Data/git/Enzyme.jl/src/compiler.jl:3996 [inlined]
#s386#92 at ./none:0
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
GeneratedFunctionStub at ./boot.jl:580
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined]
jl_call_staged at /buildworker/worker/package_linux64/build/src/method.c:431
jl_code_for_staged at /buildworker/worker/package_linux64/build/src/method.c:482
get_staged at ./compiler/utilities.jl:111
retrieve_code_info at ./compiler/utilities.jl:123 [inlined]
InferenceState at ./compiler/inferencestate.jl:234
typeinf_edge at ./compiler/typeinfer.jl:814 [inlined]
abstract_call_method at ./compiler/abstractinterpretation.jl:504
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:105
abstract_call_known at ./compiler/abstractinterpretation.jl:1342
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_call at ./compiler/abstractinterpretation.jl:1382
abstract_eval_statement at ./compiler/abstractinterpretation.jl:1534
typeinf_local at ./compiler/abstractinterpretation.jl:1918
typeinf_nocycle at ./compiler/abstractinterpretation.jl:2014
_typeinf at ./compiler/typeinfer.jl:226
typeinf at ./compiler/typeinfer.jl:209
typeinf_edge at ./compiler/typeinfer.jl:823 [inlined]
abstract_call_method at ./compiler/abstractinterpretation.jl:504
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:105
abstract_call_known at ./compiler/abstractinterpretation.jl:1342
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_call at ./compiler/abstractinterpretation.jl:1382
abstract_eval_statement at ./compiler/abstractinterpretation.jl:1534
typeinf_local at ./compiler/abstractinterpretation.jl:1900
typeinf_nocycle at ./compiler/abstractinterpretation.jl:2014
_typeinf at ./compiler/typeinfer.jl:226
typeinf at ./compiler/typeinfer.jl:209
typeinf_edge at ./compiler/typeinfer.jl:823 [inlined]
abstract_call_method at ./compiler/abstractinterpretation.jl:504
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:105
abstract_call_known at ./compiler/abstractinterpretation.jl:1342
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_apply at ./compiler/abstractinterpretation.jl:987
abstract_call_known at ./compiler/abstractinterpretation.jl:1249
abstract_call at ./compiler/abstractinterpretation.jl:1397
abstract_call at ./compiler/abstractinterpretation.jl:1382
abstract_eval_statement at ./compiler/abstractinterpretation.jl:1534
typeinf_local at ./compiler/abstractinterpretation.jl:1918
typeinf_nocycle at ./compiler/abstractinterpretation.jl:2014
_typeinf at ./compiler/typeinfer.jl:226
typeinf at ./compiler/typeinfer.jl:209
typeinf_ext at ./compiler/typeinfer.jl:909
typeinf_ext_toplevel at ./compiler/typeinfer.jl:942
typeinf_ext_toplevel at ./compiler/typeinfer.jl:938
jfptr_typeinf_ext_toplevel_10577.clone_1 at /mnt/Data/git/Enzyme.jl/julia-1.7.2/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined]
jl_type_infer at /buildworker/worker/package_linux64/build/src/gf.c:295
jl_generate_fptr at /buildworker/worker/package_linux64/build/src/jitlayers.cpp:338
jl_compile_method_internal at /buildworker/worker/package_linux64/build/src/gf.c:1980
jl_compile_method_internal at /buildworker/worker/package_linux64/build/src/gf.c:2246 [inlined]
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2239 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined]
do_call at /buildworker/worker/package_linux64/build/src/interpreter.c:126
eval_value at /buildworker/worker/package_linux64/build/src/interpreter.c:215
eval_stmt_value at /buildworker/worker/package_linux64/build/src/interpreter.c:166 [inlined]
eval_body at /buildworker/worker/package_linux64/build/src/interpreter.c:587
jl_interpret_toplevel_thunk at /buildworker/worker/package_linux64/build/src/interpreter.c:731
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:885
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:830
jl_toplevel_eval_in at /buildworker/worker/package_linux64/build/src/toplevel.c:944
eval at ./boot.jl:373 [inlined]
include_string at ./loading.jl:1196
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
_include at ./loading.jl:1253
include at ./Base.jl:418
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
exec_options at ./client.jl:292
_start at ./client.jl:495
jfptr__start_38732.clone_1 at /mnt/Data/git/Enzyme.jl/julia-1.7.2/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined]
true_main at /buildworker/worker/package_linux64/build/src/jlapi.c:559
jl_repl_entrypoint at /buildworker/worker/package_linux64/build/src/jlapi.c:701
main at /buildworker/worker/package_linux64/build/cli/loader_exe.c:42
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_start at ./julia-1.7.2/bin/julia (unknown line)
Allocations: 29231379 (Pool: 29216304; Big: 15075); GC: 35
With strict aliasing set to the default, this fails since the return array of the collect is used as both an integer and a float, which type analysis deduces illegal. In this case the correct thing to do is disable strict aliasing, but it's also odd that this has the type failure.