Enzyme.jl icon indicating copy to clipboard operation
Enzyme.jl copied to clipboard

Type Check Not Eliminated

Open wsmoses opened this issue 3 years ago • 1 comments

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

wsmoses avatar Apr 19 '22 05:04 wsmoses

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.

wsmoses avatar Apr 19 '22 05:04 wsmoses