Enzyme.jl
Enzyme.jl copied to clipboard
Setjmp handling
@aviatesk asked me what happens when Enzyme tries to differentiate through exceptional control flow
Version: Enzyme v0.6.2.
using Enzyme
function f(cond, x)
try
x = x*x
if cond
error("Why")
end
x = x*x
catch
end
x
end
f (generic function with 1 method)
julia> autodiff(f, Const(false), Active(2.0))
inlinable function call in a function with debug info must have a !dbg location
%2 = call fastcc double @julia_f_1802.inner(i8 %0, double %1)
define double @preprocess_julia_f_1802(i8 zeroext %0, double %1) local_unnamed_addr !dbg !56 {
entry:
%2 = call fastcc double @julia_f_1802.inner(i8 %0, double %1)
ret double %2
}
ERROR: LLVM error: function failed verification (1)
As of master this error longer occurs [presumably from the returnstwice fix].
However, the actual error with exceptional control flow is below:
mod: ; ModuleID = 'text'
source_filename = "text"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13"
target triple = "x86_64-apple-darwin18.7.0"
@exception = private unnamed_addr constant [10 x i8] c"exception\00", align 1
; Function Attrs: noreturn
define internal fastcc noalias nonnull align 536870912 dereferenceable(4294967295) {} addrspace(10)* @julia_error_1673() unnamed_addr #0 !dbg !38 {
top:
%0 = call {}*** @julia.ptls_states()
call void @llvm.trap() #0, !dbg !40
unreachable, !dbg !40
}
; Function Attrs: readnone
declare {}*** @julia.ptls_states() local_unnamed_addr #1
; Function Attrs: allocsize(1)
declare noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj(i8*, i64, {} addrspace(10)*) local_unnamed_addr #2
; Function Attrs: cold noreturn nounwind
declare void @llvm.trap() #3
declare i64 @jl_excstack_state() local_unnamed_addr
; Function Attrs: returns_twice
declare i32 @julia.except_enter() local_unnamed_addr #4
declare void @jl_pop_handler(i32) local_unnamed_addr
declare void @jl_restore_excstack(i64) local_unnamed_addr
define double @julia_f_1670(i8 zeroext %0, double %1) local_unnamed_addr !dbg !41 {
entry:
%2 = alloca [208 x i8], align 16
%phic.i = alloca double, align 8
%.sub = getelementptr inbounds [208 x i8], [208 x i8]* %2, i64 0, i64 0
%phic.i.0.sroa_cast = bitcast double* %phic.i to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull align 8 %phic.i.0.sroa_cast) #6
%3 = call {}*** @julia.ptls_states() #7
%4 = call i64 @jl_excstack_state(), !dbg !42
call void @llvm.lifetime.start.p0i8(i64 208, i8* nonnull %.sub)
call void @jl_enter_handler(i8* nonnull %.sub), !dbg !42
%5 = call i32 @sigsetjmp(i8* nonnull %.sub, i32 0) #4, !dbg !42
%6 = icmp eq i32 %5, 0, !dbg !42
br i1 %6, label %try.i, label %L13.i, !dbg !42
L7.i: ; preds = %try.i
%7 = call fastcc nonnull {} addrspace(10)* @julia_error_1673() #0, !dbg !43
unreachable, !dbg !43
L9.i: ; preds = %try.i
%8 = fmul double %9, %9, !dbg !44
store volatile double %8, double* %phic.i, align 8, !dbg !47, !tbaa !48
call void @jl_pop_handler(i32 1), !dbg !47
call void @llvm.lifetime.end.p0i8(i64 208, i8* nonnull %.sub)
br label %julia_f_1670.inner.exit, !dbg !47
L13.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !47
call void @jl_pop_handler(i32 1), !dbg !47
call void @llvm.lifetime.end.p0i8(i64 208, i8* nonnull %.sub)
call void @jl_restore_excstack(i64 %4), !dbg !47
br label %julia_f_1670.inner.exit, !dbg !47
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !42, !tbaa !48
%9 = fmul double %1, %1, !dbg !52
store volatile double %9, double* %phic.i, align 8, !dbg !53, !tbaa !48
%10 = and i8 %0, 1, !dbg !54
%.not = icmp eq i8 %10, 0, !dbg !54
br i1 %.not, label %L9.i, label %L7.i, !dbg !54
julia_f_1670.inner.exit: ; preds = %L9.i, %L13.i
%value_phi.i = phi double [ %8, %L9.i ], [ %phic.i.0.phic.i.0.phic.i.0., %L13.i ]
call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %phic.i.0.sroa_cast), !dbg !55
ret double %value_phi.i
}
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #5
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #5
declare void @jl_enter_handler(i8*)
; Function Attrs: returns_twice
declare i32 @sigsetjmp(i8*, i32) #4
define double @preprocess_julia_f_1670(i8 zeroext %0, double %1) local_unnamed_addr !dbg !56 {
entry:
%2 = alloca [208 x i8], align 16
%phic.i = alloca double, align 8
%.sub = getelementptr inbounds [208 x i8], [208 x i8]* %2, i64 0, i64 0
%phic.i.0.sroa_cast = bitcast double* %phic.i to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %phic.i.0.sroa_cast)
%3 = call {}*** @julia.ptls_states() #7
%4 = call i64 @jl_excstack_state(), !dbg !57
call void @llvm.lifetime.start.p0i8(i64 208, i8* nonnull %.sub)
call void @jl_enter_handler(i8* nonnull %.sub), !dbg !57
%5 = call i32 @sigsetjmp(i8* nonnull %.sub, i32 0) #4, !dbg !57
%6 = icmp eq i32 %5, 0, !dbg !57
br i1 %6, label %try.i, label %L13.i, !dbg !57
L7.i: ; preds = %try.i
%7 = call fastcc nonnull {} addrspace(10)* @julia_error_1673() #0, !dbg !58
unreachable, !dbg !58
L9.i: ; preds = %try.i
%8 = fmul double %9, %9, !dbg !59
store volatile double %8, double* %phic.i, align 8, !dbg !60, !tbaa !48
call void @jl_pop_handler(i32 1), !dbg !60
call void @llvm.lifetime.end.p0i8(i64 208, i8* nonnull %.sub)
br label %julia_f_1670.inner.exit, !dbg !60
L13.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !60
call void @jl_pop_handler(i32 1), !dbg !60
call void @llvm.lifetime.end.p0i8(i64 208, i8* nonnull %.sub)
call void @jl_restore_excstack(i64 %4), !dbg !60
br label %julia_f_1670.inner.exit, !dbg !60
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !57, !tbaa !48
%9 = fmul double %1, %1, !dbg !61
store volatile double %9, double* %phic.i, align 8, !dbg !62, !tbaa !48
%10 = and i8 %0, 1, !dbg !63
%.not = icmp eq i8 %10, 0, !dbg !63
br i1 %.not, label %L9.i, label %L7.i, !dbg !63
julia_f_1670.inner.exit: ; preds = %L13.i, %L9.i
%value_phi.i = phi double [ %8, %L9.i ], [ %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0., %L13.i ]
%phic.i.0.sroa_cast3 = bitcast double* %phic.i to i8*, !dbg !64
call void @llvm.lifetime.end.p0i8(i64 8, i8* %phic.i.0.sroa_cast3), !dbg !64
ret double %value_phi.i
}
define internal { double } @diffejulia_f_1670(i8 zeroext %0, double %1, double %differeturn) local_unnamed_addr !dbg !65 {
entry:
%"'ipa" = alloca [208 x i8], align 16
store [208 x i8] zeroinitializer, [208 x i8]* %"'ipa", align 16
%2 = alloca [208 x i8], align 16
%phic.i = alloca double, align 8
%".sub'ipg" = getelementptr inbounds [208 x i8], [208 x i8]* %"'ipa", i64 0, i64 0
%.sub = getelementptr inbounds [208 x i8], [208 x i8]* %2, i64 0, i64 0
%phic.i.0.sroa_cast = bitcast double* %phic.i to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %phic.i.0.sroa_cast)
%3 = call {}*** @julia.ptls_states() #7
%4 = call i64 @jl_excstack_state(), !dbg !66
%"'ip_phi" = phi i64
call void @llvm.lifetime.start.p0i8(i64 208, i8* nonnull %.sub)
call void @jl_enter_handler(i8* nonnull %.sub), !dbg !66
%5 = call i32 @sigsetjmp(i8* nonnull %.sub, i32 0) #4, !dbg !66
%"'ip_phi1" = phi i32 , !dbg !66
%6 = icmp eq i32 %5, 0, !dbg !66
br i1 %6, label %try.i, label %L13.i, !dbg !66
L7.i: ; preds = %try.i
%7 = call fastcc nonnull {} addrspace(10)* @julia_error_1673() #0, !dbg !67
unreachable, !dbg !67
L9.i: ; preds = %try.i
%8 = fmul double %9, %9, !dbg !68
store volatile double %8, double* %phic.i, align 8, !dbg !69, !tbaa !48
call void @jl_pop_handler(i32 1), !dbg !69
call void @llvm.lifetime.end.p0i8(i64 208, i8* nonnull %.sub)
br label %julia_f_1670.inner.exit, !dbg !69
L13.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !69
call void @jl_pop_handler(i32 1), !dbg !69
call void @llvm.lifetime.end.p0i8(i64 208, i8* nonnull %.sub)
call void @jl_restore_excstack(i64 %4), !dbg !69
br label %julia_f_1670.inner.exit, !dbg !69
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !66, !tbaa !48
%9 = fmul double %1, %1, !dbg !70
store volatile double %9, double* %phic.i, align 8, !dbg !71, !tbaa !48
%10 = and i8 %0, 1, !dbg !72
%.not = icmp eq i8 %10, 0, !dbg !72
br i1 %.not, label %L9.i, label %L7.i, !dbg !72
julia_f_1670.inner.exit: ; preds = %L13.i, %L9.i
%value_phi.i = phi double [ %8, %L9.i ], [ %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0., %L13.i ]
%phic.i.0.sroa_cast3 = bitcast double* %phic.i to i8*, !dbg !73
call void @llvm.lifetime.end.p0i8(i64 8, i8* %phic.i.0.sroa_cast3), !dbg !73
br label %invertjulia_f_1670.inner.exit
allocsForInversion: ; No predecessors!
%"value_phi.i'de" = alloca double, align 8
store double 0.000000e+00, double* %"value_phi.i'de", align 8
invertentry: ; No predecessors!
invertL7.i: ; No predecessors!
invertL9.i: ; No predecessors!
invertL13.i: ; No predecessors!
inverttry.i: ; No predecessors!
invertjulia_f_1670.inner.exit: ; preds = %julia_f_1670.inner.exit
store double %differeturn, double* %"value_phi.i'de", align 8
}
attributes #0 = { noreturn }
attributes #1 = { readnone "enzyme_inactive" }
attributes #2 = { allocsize(1) }
attributes #3 = { cold noreturn nounwind }
attributes #4 = { returns_twice }
attributes #5 = { argmemonly nounwind willreturn }
attributes #6 = { willreturn }
attributes #7 = { readnone }
!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2, !5, !7, !9, !10, !11, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31, !32, !33, !34, !35, !36, !37}
!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 1, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!3 = !DIFile(filename: "error.jl", directory: ".")
!4 = !{}
!5 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !6, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!6 = !DIFile(filename: "REPL[3]", directory: ".")
!7 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!8 = !DIFile(filename: "/Users/wmoses/.julia/packages/GPUCompiler/wHjqZ/src/runtime.jl", directory: ".")
!9 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!10 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!11 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!12 = !DIFile(filename: "/Users/wmoses/.julia/packages/Enzyme/irM5R/src/compiler.jl", directory: ".")
!13 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!14 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!15 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!16 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!17 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!18 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!19 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!20 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!21 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!22 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!23 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!24 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!25 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!26 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!27 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!28 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!29 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!30 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!31 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!32 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!33 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!34 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!35 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!36 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!37 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!38 = distinct !DISubprogram(name: "error", linkageName: "julia_error_1673", scope: null, file: !3, line: 33, type: !39, scopeLine: 33, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !4)
!39 = !DISubroutineType(types: !4)
!40 = !DILocation(line: 33, scope: !38)
!41 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1670", scope: null, file: !6, line: 1, type: !39, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !4)
!42 = !DILocation(line: 2, scope: !41)
!43 = !DILocation(line: 5, scope: !41)
!44 = !DILocation(line: 332, scope: !45, inlinedAt: !47)
!45 = distinct !DISubprogram(name: "*;", linkageName: "*", scope: !46, file: !46, type: !39, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !4)
!46 = !DIFile(filename: "float.jl", directory: ".")
!47 = !DILocation(line: 7, scope: !41)
!48 = !{!49, !49, i64 0}
!49 = !{!"jtbaa_stack", !50, i64 0}
!50 = !{!"jtbaa", !51, i64 0}
!51 = !{!"jtbaa"}
!52 = !DILocation(line: 332, scope: !45, inlinedAt: !53)
!53 = !DILocation(line: 3, scope: !41)
!54 = !DILocation(line: 4, scope: !41)
!55 = !DILocation(line: 10, scope: !41)
!56 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1670", scope: null, file: !6, line: 1, type: !39, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !4)
!57 = !DILocation(line: 2, scope: !56)
!58 = !DILocation(line: 5, scope: !56)
!59 = !DILocation(line: 332, scope: !45, inlinedAt: !60)
!60 = !DILocation(line: 7, scope: !56)
!61 = !DILocation(line: 332, scope: !45, inlinedAt: !62)
!62 = !DILocation(line: 3, scope: !56)
!63 = !DILocation(line: 4, scope: !56)
!64 = !DILocation(line: 10, scope: !56)
!65 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1670", scope: null, file: !6, line: 1, type: !39, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !4)
!66 = !DILocation(line: 2, scope: !65)
!67 = !DILocation(line: 5, scope: !65)
!68 = !DILocation(line: 332, scope: !45, inlinedAt: !69)
!69 = !DILocation(line: 7, scope: !65)
!70 = !DILocation(line: 332, scope: !45, inlinedAt: !71)
!71 = !DILocation(line: 3, scope: !65)
!72 = !DILocation(line: 4, scope: !65)
!73 = !DILocation(line: 10, scope: !65)
; Function Attrs: returns_twice
declare i32 @sigsetjmp(i8*, i32) #4
Assertion failed: (0 && "attempting to differentiate function without definition"), function CreateAugmentedPrimal, file /workspace/srcdir/Enzyme/enzyme/Enzyme/EnzymeLogic.cpp, line 1457.
signal (6): Abort trap: 6
In theory, setjmp could be handled if, as in this case, the return of nonzero always results in an unreachable.
Doing a test differentiation by marking various things as inactive yields the following internal error, which perhaps you can shed some light on:
mod = ; ModuleID = 'text'
source_filename = "text"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13"
target triple = "x86_64-linux-gnu"
@exception = private unnamed_addr constant [10 x i8] c"exception\00", align 1
@di_func = private unnamed_addr constant [6 x i8] c"error\00", align 1
@di_file = private unnamed_addr constant [11 x i8] c"./error.jl\00", align 1
@di_func.1 = private unnamed_addr constant [2 x i8] c"f\00", align 1
@di_file.2 = private unnamed_addr constant [34 x i8] c"/mnt/Data/git/Enzyme.jl/setjmp.jl\00", align 1
; Function Attrs: noreturn
define internal fastcc noalias nonnull align 536870912 dereferenceable(4294967295) {} addrspace(10)* @julia_error_1464() unnamed_addr #0 !dbg !38 {
top:
%0 = call {}*** @julia.ptls_states()
call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !49, metadata !DIExpression(DW_OP_deref)), !dbg !50
call void @llvm.dbg.value(metadata !4, metadata !49, metadata !DIExpression(DW_OP_deref)), !dbg !50
call void @llvm.trap() #0, !dbg !51
unreachable, !dbg !51
}
; Function Attrs: readnone
declare {}*** @julia.ptls_states() local_unnamed_addr #1
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata) #2
; Function Attrs: allocsize(1)
declare noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj(i8*, i64, {} addrspace(10)*) local_unnamed_addr #3
; Function Attrs: cold noreturn nounwind
declare void @llvm.trap() #4
declare i64 @jl_excstack_state() local_unnamed_addr #5
; Function Attrs: returns_twice
declare i32 @julia.except_enter() local_unnamed_addr #6
declare void @jl_pop_handler(i32) local_unnamed_addr #5
declare void @jl_restore_excstack(i64) local_unnamed_addr #5
define double @julia_f_1461(i8 zeroext %0, double %1) local_unnamed_addr !dbg !52 {
entry:
%2 = alloca [256 x i8], align 16
%phic.i = alloca double, align 8
%.sub = getelementptr inbounds [256 x i8], [256 x i8]* %2, i64 0, i64 0
%phic.i.0.phic.i.0.phic.i.0..sroa_cast = bitcast double* %phic.i to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull align 8 %phic.i.0.phic.i.0.phic.i.0..sroa_cast) #9
%3 = call {}*** @julia.ptls_states() #10
call void @llvm.dbg.value(metadata i8 %0, metadata !60, metadata !DIExpression()), !dbg !62
call void @llvm.dbg.value(metadata double %1, metadata !61, metadata !DIExpression()), !dbg !62
%4 = call i64 @jl_excstack_state(), !dbg !63
call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull %.sub)
call void @jl_enter_handler(i8* nonnull %.sub), !dbg !63
%5 = call i32 @__sigsetjmp(i8* nonnull %.sub, i32 0) #6, !dbg !63
%6 = icmp eq i32 %5, 0, !dbg !63
br i1 %6, label %try.i, label %L11.i, !dbg !63
L5.i: ; preds = %try.i
%7 = call fastcc nonnull {} addrspace(10)* @julia_error_1464() #0, !dbg !64
unreachable, !dbg !64
L7.i: ; preds = %try.i
%8 = fmul double %1, %1, !dbg !65
store volatile double %8, double* %phic.i, align 8, !dbg !69, !tbaa !70
call void @jl_pop_handler(i32 1), !dbg !69
call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %.sub)
br label %julia_f_1461.inner.exit, !dbg !69
L11.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !69
call void @jl_pop_handler(i32 1), !dbg !69
call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %.sub)
call void @jl_restore_excstack(i64 %4), !dbg !69
br label %julia_f_1461.inner.exit, !dbg !69
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !63, !tbaa !70
%9 = and i8 %0, 1, !dbg !74
%.not = icmp eq i8 %9, 0, !dbg !74
br i1 %.not, label %L7.i, label %L5.i, !dbg !74
julia_f_1461.inner.exit: ; preds = %L7.i, %L11.i
%value_phi.i = phi double [ %8, %L7.i ], [ %phic.i.0.phic.i.0.phic.i.0., %L11.i ]
call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %phic.i.0.phic.i.0.phic.i.0..sroa_cast), !dbg !75
ret double %value_phi.i
}
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #7
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #7
declare void @jl_enter_handler(i8*) #5
; Function Attrs: returns_twice
declare i32 @__sigsetjmp(i8*, i32) #8
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.value(metadata, metadata, metadata) #2
define double @preprocess_julia_f_1461(i8 zeroext %0, double %1) local_unnamed_addr !dbg !76 {
entry:
%2 = alloca [256 x i8], align 16
%phic.i = alloca double, align 8
%.sub = getelementptr inbounds [256 x i8], [256 x i8]* %2, i64 0, i64 0
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast = bitcast double* %phic.i to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast)
%3 = call {}*** @julia.ptls_states() #10
call void @llvm.dbg.value(metadata i8 %0, metadata !79, metadata !DIExpression()), !dbg !81
call void @llvm.dbg.value(metadata double %1, metadata !80, metadata !DIExpression()), !dbg !81
%4 = call i64 @jl_excstack_state(), !dbg !82
call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull %.sub)
call void @jl_enter_handler(i8* nonnull %.sub), !dbg !82
%5 = call i32 @__sigsetjmp(i8* nonnull %.sub, i32 0) #6, !dbg !82
%6 = icmp eq i32 %5, 0, !dbg !82
br i1 %6, label %try.i, label %L11.i, !dbg !82
L5.i: ; preds = %try.i
%7 = call fastcc nonnull {} addrspace(10)* @julia_error_1464() #0, !dbg !83
unreachable, !dbg !83
L7.i: ; preds = %try.i
%8 = fmul double %1, %1, !dbg !84
store volatile double %8, double* %phic.i, align 8, !dbg !85, !tbaa !70
call void @jl_pop_handler(i32 1), !dbg !85
call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %.sub)
br label %julia_f_1461.inner.exit, !dbg !85
L11.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !85
call void @jl_pop_handler(i32 1), !dbg !85
call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %.sub)
call void @jl_restore_excstack(i64 %4), !dbg !85
br label %julia_f_1461.inner.exit, !dbg !85
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !82, !tbaa !70
%9 = and i8 %0, 1, !dbg !86
%.not = icmp eq i8 %9, 0, !dbg !86
br i1 %.not, label %L7.i, label %L5.i, !dbg !86
julia_f_1461.inner.exit: ; preds = %L11.i, %L7.i
%value_phi.i = phi double [ %8, %L7.i ], [ %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0., %L11.i ]
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast2 = bitcast double* %phic.i to i8*, !dbg !87
call void @llvm.lifetime.end.p0i8(i64 8, i8* %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast2), !dbg !87
ret double %value_phi.i
}
define internal { double } @diffejulia_f_1461(i8 zeroext %0, double %1, double %differeturn) local_unnamed_addr !dbg !88 {
entry:
%"value_phi.i'de" = alloca double, align 8
store double 0.000000e+00, double* %"value_phi.i'de", align 8
%"'de" = alloca double, align 8
store double 0.000000e+00, double* %"'de", align 8
%"'de1" = alloca double, align 8
store double 0.000000e+00, double* %"'de1", align 8
%"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de" = alloca double, align 8
store double 0.000000e+00, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%2 = alloca [256 x i8], align 16
%"phic.i'ipa" = alloca double, align 8
store double 0.000000e+00, double* %"phic.i'ipa", align 8
%phic.i = alloca double, align 8
%.sub = getelementptr inbounds [256 x i8], [256 x i8]* %2, i64 0, i64 0
%3 = call i64 @jl_excstack_state(), !dbg !93
call void @jl_enter_handler(i8* nonnull %.sub), !dbg !93
%4 = call i32 @__sigsetjmp(i8* nonnull %.sub, i32 0) #6, !dbg !93
%5 = icmp eq i32 %4, 0, !dbg !93
br i1 %5, label %try.i, label %L11.i, !dbg !93
L5.i: ; preds = %try.i
%6 = call fastcc nonnull {} addrspace(10)* @julia_error_1464() #0, !dbg !94
unreachable
L7.i: ; preds = %try.i
%7 = fmul double %1, %1, !dbg !95
store volatile double %7, double* %phic.i, align 8, !dbg !96, !tbaa !70
call void @jl_pop_handler(i32 1), !dbg !96
br label %julia_f_1461.inner.exit, !dbg !96
L11.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !96
call void @jl_pop_handler(i32 1), !dbg !96
call void @jl_restore_excstack(i64 %3), !dbg !96
br label %julia_f_1461.inner.exit, !dbg !96
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !93, !tbaa !70
%8 = and i8 %0, 1, !dbg !97
%.not = icmp eq i8 %8, 0, !dbg !97
br i1 %.not, label %L7.i, label %L5.i, !dbg !97
julia_f_1461.inner.exit: ; preds = %L11.i, %L7.i
br label %invertjulia_f_1461.inner.exit
invertentry: ; preds = %inverttry.i, %invertL11.i
%9 = load double, double* %"'de", align 8
%10 = insertvalue { double } undef, double %9, 0
ret { double } %10
invertL7.i: ; preds = %invertjulia_f_1461.inner.exit
%11 = load double, double* %"phic.i'ipa", align 8
store volatile double 0.000000e+00, double* %"phic.i'ipa", align 8
%12 = load double, double* %"'de1", align 8
%13 = fadd fast double %12, %11
store double %13, double* %"'de1", align 8
%14 = load double, double* %"'de1", align 8
%m0diffe = fmul fast double %14, %1
%m1diffe = fmul fast double %14, %1
store double 0.000000e+00, double* %"'de1", align 8
%15 = load double, double* %"'de", align 8
%16 = fadd fast double %15, %m0diffe
store double %16, double* %"'de", align 8
%17 = load double, double* %"'de", align 8
%18 = fadd fast double %17, %m1diffe
store double %18, double* %"'de", align 8
br label %inverttry.i
invertL11.i: ; preds = %invertjulia_f_1461.inner.exit
%19 = load double, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
store double 0.000000e+00, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%20 = load double, double* %"phic.i'ipa", align 8
%21 = fadd fast double %20, %19
store double %21, double* %"phic.i'ipa", align 8
br label %invertentry
inverttry.i: ; preds = %invertL7.i
%22 = load double, double* %"phic.i'ipa", align 8
store volatile double 0.000000e+00, double* %"phic.i'ipa", align 8
%23 = load double, double* %"'de", align 8
%24 = fadd fast double %23, %22
store double %24, double* %"'de", align 8
br label %invertentry
invertjulia_f_1461.inner.exit: ; preds = %julia_f_1461.inner.exit
store double %differeturn, double* %"value_phi.i'de", align 8
%25 = load double, double* %"value_phi.i'de", align 8
store double 0.000000e+00, double* %"value_phi.i'de", align 8
%26 = xor i1 %5, true
%27 = select fast i1 %26, double %25, double 0.000000e+00
%28 = load double, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%29 = fadd fast double %28, %25
%30 = select fast i1 %5, double %28, double %29
store double %30, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%31 = select fast i1 %5, double %25, double 0.000000e+00
%32 = load double, double* %"'de1", align 8
%33 = fadd fast double %32, %25
%34 = select fast i1 %5, double %33, double %32
store double %34, double* %"'de1", align 8
br i1 %5, label %invertL7.i, label %invertL11.i
}
attributes #0 = { noreturn }
attributes #1 = { readnone "enzyme_inactive" }
attributes #2 = { nounwind readnone speculatable willreturn }
attributes #3 = { allocsize(1) }
attributes #4 = { cold noreturn nounwind }
attributes #5 = { "enzyme_inactive" }
attributes #6 = { returns_twice }
attributes #7 = { argmemonly nounwind willreturn }
attributes #8 = { returns_twice "enzyme_inactive" }
attributes #9 = { willreturn }
attributes #10 = { readnone }
!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2, !5, !7, !9, !10, !11, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31, !32, !33, !34, !35, !36, !37}
!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 1, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, nameTableKind: None)
!3 = !DIFile(filename: "error.jl", directory: ".")
!4 = !{}
!5 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !6, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, nameTableKind: None)
!6 = !DIFile(filename: "/mnt/Data/git/Enzyme.jl/setjmp.jl", directory: ".")
!7 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!8 = !DIFile(filename: "/home/wmoses/.julia/packages/GPUCompiler/OyOEp/src/runtime.jl", directory: ".")
!9 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!10 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!11 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!12 = !DIFile(filename: "/mnt/Data/git/Enzyme.jl/src/compiler.jl", directory: ".")
!13 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!14 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!15 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!16 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!17 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!18 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!19 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!20 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!21 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!22 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!23 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!24 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!25 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!26 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!27 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!28 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!29 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!30 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!31 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!32 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!33 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!34 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!35 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!36 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!37 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!38 = distinct !DISubprogram(name: "error", linkageName: "julia_error_1464", scope: null, file: !3, line: 33, type: !39, scopeLine: 33, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !47)
!39 = !DISubroutineType(types: !40)
!40 = !{!41, !45, !46}
!41 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !42, size: 64, align: 64)
!42 = !DICompositeType(tag: DW_TAG_structure_type, name: "jl_value_t", file: !43, line: 71, align: 64, elements: !44)
!43 = !DIFile(filename: "julia.h", directory: "")
!44 = !{!41}
!45 = !DICompositeType(tag: DW_TAG_structure_type, name: "#error", align: 8, elements: !4, runtimeLang: DW_LANG_Julia, identifier: "140075152462304")
!46 = !DIDerivedType(tag: DW_TAG_typedef, name: "String", baseType: !41)
!47 = !{!48, !49}
!48 = !DILocalVariable(name: "#self#", arg: 1, scope: !38, file: !3, line: 33, type: !45)
!49 = !DILocalVariable(name: "s", arg: 2, scope: !38, file: !3, line: 33, type: !46)
!50 = !DILocation(line: 0, scope: !38)
!51 = !DILocation(line: 33, scope: !38)
!52 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1461", scope: null, file: !6, line: 3, type: !53, scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !58)
!53 = !DISubroutineType(types: !54)
!54 = !{!55, !56, !57, !55}
!55 = !DIBasicType(name: "Float64", size: 64, encoding: DW_ATE_unsigned)
!56 = !DICompositeType(tag: DW_TAG_structure_type, name: "#f", align: 8, elements: !4, runtimeLang: DW_LANG_Julia, identifier: "140073431743120")
!57 = !DIBasicType(name: "Bool", size: 8, encoding: DW_ATE_unsigned)
!58 = !{!59, !60, !61}
!59 = !DILocalVariable(name: "#self#", arg: 1, scope: !52, file: !6, line: 3, type: !56)
!60 = !DILocalVariable(name: "cond", arg: 2, scope: !52, file: !6, line: 3, type: !57)
!61 = !DILocalVariable(name: "x", arg: 3, scope: !52, file: !6, line: 3, type: !55)
!62 = !DILocation(line: 0, scope: !52)
!63 = !DILocation(line: 4, scope: !52)
!64 = !DILocation(line: 6, scope: !52)
!65 = !DILocation(line: 332, scope: !66, inlinedAt: !69)
!66 = distinct !DISubprogram(name: "*;", linkageName: "*", scope: !67, file: !67, type: !68, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !4)
!67 = !DIFile(filename: "float.jl", directory: ".")
!68 = !DISubroutineType(types: !4)
!69 = !DILocation(line: 9, scope: !52)
!70 = !{!71, !71, i64 0}
!71 = !{!"jtbaa_stack", !72, i64 0}
!72 = !{!"jtbaa", !73, i64 0}
!73 = !{!"jtbaa"}
!74 = !DILocation(line: 5, scope: !52)
!75 = !DILocation(line: 12, scope: !52)
!76 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1461", scope: null, file: !6, line: 3, type: !53, scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !77)
!77 = !{!78, !79, !80}
!78 = !DILocalVariable(name: "#self#", arg: 1, scope: !76, file: !6, line: 3, type: !56)
!79 = !DILocalVariable(name: "cond", arg: 2, scope: !76, file: !6, line: 3, type: !57)
!80 = !DILocalVariable(name: "x", arg: 3, scope: !76, file: !6, line: 3, type: !55)
!81 = !DILocation(line: 0, scope: !76)
!82 = !DILocation(line: 4, scope: !76)
!83 = !DILocation(line: 6, scope: !76)
!84 = !DILocation(line: 332, scope: !66, inlinedAt: !85)
!85 = !DILocation(line: 9, scope: !76)
!86 = !DILocation(line: 5, scope: !76)
!87 = !DILocation(line: 12, scope: !76)
!88 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1461", scope: null, file: !6, line: 3, type: !53, scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !89)
!89 = !{!90, !91, !92}
!90 = !DILocalVariable(name: "#self#", arg: 1, scope: !88, file: !6, line: 3, type: !56)
!91 = !DILocalVariable(name: "cond", arg: 2, scope: !88, file: !6, line: 3, type: !57)
!92 = !DILocalVariable(name: "x", arg: 3, scope: !88, file: !6, line: 3, type: !55)
!93 = !DILocation(line: 4, scope: !88)
!94 = !DILocation(line: 6, scope: !88)
!95 = !DILocation(line: 332, scope: !66, inlinedAt: !96)
!96 = !DILocation(line: 9, scope: !88)
!97 = !DILocation(line: 5, scope: !88)
julia: /mnt/Data/git/Enzyme.jl/julia/src/llvm-lower-handlers.cpp:169: virtual bool LowerExcHandlers::runOnFunction(llvm::Function&): Assertion `Depth >= 0' failed.
signal (6): Aborted
in expression starting at /mnt/Data/git/Enzyme.jl/setjmp.jl:15
gsignal at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x7f65d8fec489)
__assert_fail at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
runOnFunction at /mnt/Data/git/Enzyme.jl/julia/src/llvm-lower-handlers.cpp:169
runOnFunction at /mnt/Data/git/Enzyme.jl/julia/deps/srccache/llvm-11.0.1/lib/IR/LegacyPassManager.cpp:1516
runOnModule at /mnt/Data/git/Enzyme.jl/julia/deps/srccache/llvm-11.0.1/lib/IR/LegacyPassManager.cpp:1552
runOnModule at /mnt/Data/git/Enzyme.jl/julia/deps/srccache/llvm-11.0.1/lib/IR/LegacyPassManager.cpp:1617 [inlined]
run at /mnt/Data/git/Enzyme.jl/julia/deps/srccache/llvm-11.0.1/lib/IR/LegacyPassManager.cpp:614
LLVMRunPassManager at /mnt/Data/git/Enzyme.jl/julia/deps/srccache/llvm-11.0.1/lib/IR/Core.cpp:4107
LLVMRunPassManager at /home/wmoses/.julia/packages/LLVM/vYEzc/lib/11/libLLVM_h.jl:4437 [inlined]
run! at /home/wmoses/.julia/packages/LLVM/vYEzc/src/passmanager.jl:39 [inlined]
#21 at /mnt/Data/git/Enzyme.jl/src/compiler/optimize.jl:220
#ModulePassManager#43 at /home/wmoses/.julia/packages/LLVM/vYEzc/src/passmanager.jl:33
unknown function (ip: 0x7f65c0145902)
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2237
jl_apply_generic at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2419
ModulePassManager at /home/wmoses/.julia/packages/LLVM/vYEzc/src/passmanager.jl:31
jl_fptr_args at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2006
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2218
jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2244
post_optimze! at /mnt/Data/git/Enzyme.jl/src/compiler/optimize.jl:217 [inlined]
_thunk at /mnt/Data/git/Enzyme.jl/src/compiler.jl:1981
unknown function (ip: 0x7f65c00d64d1)
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2237
jl_apply_generic at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2419
cached_compilation at /home/wmoses/.julia/packages/GPUCompiler/wHjqZ/src/cache.jl:89
jl_fptr_args at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2006
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2237
jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2244
thunk at /mnt/Data/git/Enzyme.jl/src/compiler.jl:2012
autodiff at /mnt/Data/git/Enzyme.jl/src/Enzyme.jl:169 [inlined]
autodiff at /mnt/Data/git/Enzyme.jl/src/Enzyme.jl:188
unknown function (ip: 0x7f65c00c284a)
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2237
jl_apply_generic at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2419
jl_apply at /mnt/Data/git/Enzyme.jl/julia/src/julia.h:1703
do_call at /mnt/Data/git/Enzyme.jl/julia/src/interpreter.c:115
eval_value at /mnt/Data/git/Enzyme.jl/julia/src/interpreter.c:204
eval_stmt_value at /mnt/Data/git/Enzyme.jl/julia/src/interpreter.c:155
eval_body at /mnt/Data/git/Enzyme.jl/julia/src/interpreter.c:558
jl_interpret_toplevel_thunk at /mnt/Data/git/Enzyme.jl/julia/src/interpreter.c:670
jl_toplevel_eval_flex at /mnt/Data/git/Enzyme.jl/julia/src/toplevel.c:877
jl_toplevel_eval_flex at /mnt/Data/git/Enzyme.jl/julia/src/toplevel.c:825
jl_toplevel_eval at /mnt/Data/git/Enzyme.jl/julia/src/toplevel.c:886
jl_toplevel_eval_in at /mnt/Data/git/Enzyme.jl/julia/src/toplevel.c:929
eval at ./boot.jl:360 [inlined]
include_string at ./loading.jl:1094
jl_fptr_args at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2006
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2218
jl_apply_generic at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2419
_include at ./loading.jl:1148
include at ./Base.jl:386
jl_fptr_args at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2006
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2218
jl_apply_generic at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2419
exec_options at ./client.jl:285
_start at ./client.jl:485
jfptr__start_36490 at /mnt/Data/git/Enzyme.jl/julia/usr/lib/julia/sys-debug.so (unknown line)
_jl_invoke at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2218
jl_apply_generic at /mnt/Data/git/Enzyme.jl/julia/src/gf.c:2419
jl_apply at /mnt/Data/git/Enzyme.jl/julia/src/julia.h:1703
true_main at /mnt/Data/git/Enzyme.jl/julia/src/jlapi.c:560
repl_entrypoint at /mnt/Data/git/Enzyme.jl/julia/src/jlapi.c:702
jl_load_repl at /mnt/Data/git/Enzyme.jl/julia/cli/loader_lib.c:199
main at /mnt/Data/git/Enzyme.jl/julia/cli/loader_exe.c:51
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_start at ./julia/julia (unknown line)
Allocations: 26166892 (Pool: 26156864; Big: 10028); GC: 33
Aborted (core dumped)
Found the error, we mistakenly run LowerExcHandlers before and after Enzyme, changed this to only run after Enzyme.
Okay, going through exceptions is now okay if the exception is not taken. But taking it causes an illegal instruction (and I'm not sure why, IR below):
mod = ; ModuleID = 'text'
source_filename = "text"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13"
target triple = "x86_64-linux-gnu"
@exception = private unnamed_addr constant [10 x i8] c"exception\00", align 1
@di_func = private unnamed_addr constant [6 x i8] c"error\00", align 1
@di_file = private unnamed_addr constant [11 x i8] c"./error.jl\00", align 1
@di_func.1 = private unnamed_addr constant [2 x i8] c"f\00", align 1
@di_file.2 = private unnamed_addr constant [34 x i8] c"/mnt/Data/git/Enzyme.jl/setjmp.jl\00", align 1
; Function Attrs: noreturn
define internal fastcc noalias nonnull align 536870912 dereferenceable(4294967295) {} addrspace(10)* @julia_error_1464() unnamed_addr #0 !dbg !38 {
top:
%0 = call {}*** @julia.ptls_states()
call void @llvm.dbg.value(metadata {} addrspace(10)* null, metadata !49, metadata !DIExpression(DW_OP_deref)), !dbg !50
call void @llvm.dbg.value(metadata !4, metadata !49, metadata !DIExpression(DW_OP_deref)), !dbg !50
call void @llvm.trap() #0, !dbg !51
unreachable, !dbg !51
}
; Function Attrs: readnone
declare {}*** @julia.ptls_states() local_unnamed_addr #1
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata) #2
; Function Attrs: allocsize(1)
declare noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj(i8*, i64, {} addrspace(10)*) local_unnamed_addr #3
; Function Attrs: cold noreturn nounwind
declare void @llvm.trap() #4
declare i64 @jl_excstack_state() local_unnamed_addr #5
; Function Attrs: returns_twice
declare i32 @julia.except_enter() local_unnamed_addr #6
declare void @jl_pop_handler(i32) local_unnamed_addr #5
declare void @jl_restore_excstack(i64) local_unnamed_addr #5
define double @julia_f_1461(i8 zeroext %0, double %1) local_unnamed_addr !dbg !52 {
entry:
%phic.i = alloca double, align 8
%phic.i.0.phic.i.0.phic.i.0..sroa_cast = bitcast double* %phic.i to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull align 8 %phic.i.0.phic.i.0.phic.i.0..sroa_cast) #8
%2 = call {}*** @julia.ptls_states() #9
call void @llvm.dbg.value(metadata i8 %0, metadata !60, metadata !DIExpression()), !dbg !62
call void @llvm.dbg.value(metadata double %1, metadata !61, metadata !DIExpression()), !dbg !62
%3 = call i64 @jl_excstack_state(), !dbg !63
%4 = call i32 @julia.except_enter() #10, !dbg !63
%5 = icmp eq i32 %4, 0, !dbg !63
br i1 %5, label %try.i, label %L11.i, !dbg !63
L5.i: ; preds = %try.i
%6 = call fastcc nonnull {} addrspace(10)* @julia_error_1464() #0, !dbg !64
unreachable, !dbg !64
L7.i: ; preds = %try.i
%7 = fmul double %1, %1, !dbg !65
store volatile double %7, double* %phic.i, align 8, !dbg !69, !tbaa !70
call void @jl_pop_handler(i32 1), !dbg !69
br label %julia_f_1461.inner.exit, !dbg !69
L11.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !69
call void @jl_pop_handler(i32 1), !dbg !69
call void @jl_restore_excstack(i64 %3), !dbg !69
br label %julia_f_1461.inner.exit, !dbg !69
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !63, !tbaa !70
%8 = and i8 %0, 1, !dbg !74
%.not = icmp eq i8 %8, 0, !dbg !74
br i1 %.not, label %L7.i, label %L5.i, !dbg !74
julia_f_1461.inner.exit: ; preds = %L7.i, %L11.i
%value_phi.i = phi double [ %7, %L7.i ], [ %phic.i.0.phic.i.0.phic.i.0., %L11.i ]
call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %phic.i.0.phic.i.0.phic.i.0..sroa_cast), !dbg !75
ret double %value_phi.i
}
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #7
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #7
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.value(metadata, metadata, metadata) #2
define double @preprocess_julia_f_1461(i8 zeroext %0, double %1) local_unnamed_addr !dbg !76 {
entry:
%phic.i = alloca double, align 8
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast = bitcast double* %phic.i to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast)
%2 = call {}*** @julia.ptls_states() #9
call void @llvm.dbg.value(metadata i8 %0, metadata !79, metadata !DIExpression()), !dbg !81
call void @llvm.dbg.value(metadata double %1, metadata !80, metadata !DIExpression()), !dbg !81
%3 = call i64 @jl_excstack_state(), !dbg !82
%4 = call i32 @julia.except_enter() #10, !dbg !82
%5 = icmp eq i32 %4, 0, !dbg !82
br i1 %5, label %try.i, label %L11.i, !dbg !82
L5.i: ; preds = %try.i
%6 = call fastcc nonnull {} addrspace(10)* @julia_error_1464() #0, !dbg !83
unreachable, !dbg !83
L7.i: ; preds = %try.i
%7 = fmul double %1, %1, !dbg !84
store volatile double %7, double* %phic.i, align 8, !dbg !85, !tbaa !70
call void @jl_pop_handler(i32 1), !dbg !85
br label %julia_f_1461.inner.exit, !dbg !85
L11.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !85
call void @jl_pop_handler(i32 1), !dbg !85
call void @jl_restore_excstack(i64 %3), !dbg !85
br label %julia_f_1461.inner.exit, !dbg !85
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !82, !tbaa !70
%8 = and i8 %0, 1, !dbg !86
%.not = icmp eq i8 %8, 0, !dbg !86
br i1 %.not, label %L7.i, label %L5.i, !dbg !86
julia_f_1461.inner.exit: ; preds = %L11.i, %L7.i
%value_phi.i = phi double [ %7, %L7.i ], [ %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0., %L11.i ]
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast2 = bitcast double* %phic.i to i8*, !dbg !87
call void @llvm.lifetime.end.p0i8(i64 8, i8* %phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0..sroa_cast2), !dbg !87
ret double %value_phi.i
}
define internal { double } @diffejulia_f_1461(i8 zeroext %0, double %1, double %differeturn) local_unnamed_addr !dbg !88 {
entry:
%"value_phi.i'de" = alloca double, align 8
store double 0.000000e+00, double* %"value_phi.i'de", align 8
%"'de" = alloca double, align 8
store double 0.000000e+00, double* %"'de", align 8
%"'de1" = alloca double, align 8
store double 0.000000e+00, double* %"'de1", align 8
%"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de" = alloca double, align 8
store double 0.000000e+00, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%"phic.i'ipa" = alloca double, align 8
store double 0.000000e+00, double* %"phic.i'ipa", align 8
%phic.i = alloca double, align 8
%2 = call i64 @jl_excstack_state(), !dbg !93
%3 = call i32 @julia.except_enter() #10, !dbg !93
%4 = icmp eq i32 %3, 0, !dbg !93
br i1 %4, label %try.i, label %L11.i, !dbg !93
L5.i: ; preds = %try.i
%5 = call fastcc nonnull {} addrspace(10)* @julia_error_1464() #0, !dbg !94
unreachable
L7.i: ; preds = %try.i
%6 = fmul double %1, %1, !dbg !95
store volatile double %6, double* %phic.i, align 8, !dbg !96, !tbaa !70
call void @jl_pop_handler(i32 1), !dbg !96
br label %julia_f_1461.inner.exit, !dbg !96
L11.i: ; preds = %entry
%phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0. = load volatile double, double* %phic.i, align 8, !dbg !96
call void @jl_pop_handler(i32 1), !dbg !96
call void @jl_restore_excstack(i64 %2), !dbg !96
br label %julia_f_1461.inner.exit, !dbg !96
try.i: ; preds = %entry
store volatile double %1, double* %phic.i, align 8, !dbg !93, !tbaa !70
%7 = and i8 %0, 1, !dbg !97
%.not = icmp eq i8 %7, 0, !dbg !97
br i1 %.not, label %L7.i, label %L5.i, !dbg !97
julia_f_1461.inner.exit: ; preds = %L11.i, %L7.i
br label %invertjulia_f_1461.inner.exit
invertentry: ; preds = %inverttry.i, %invertL11.i
%8 = load double, double* %"'de", align 8
%9 = insertvalue { double } undef, double %8, 0
ret { double } %9
invertL7.i: ; preds = %invertjulia_f_1461.inner.exit
%10 = load double, double* %"phic.i'ipa", align 8
store volatile double 0.000000e+00, double* %"phic.i'ipa", align 8
%11 = load double, double* %"'de1", align 8
%12 = fadd fast double %11, %10
store double %12, double* %"'de1", align 8
%13 = load double, double* %"'de1", align 8
%m0diffe = fmul fast double %13, %1
%m1diffe = fmul fast double %13, %1
store double 0.000000e+00, double* %"'de1", align 8
%14 = load double, double* %"'de", align 8
%15 = fadd fast double %14, %m0diffe
store double %15, double* %"'de", align 8
%16 = load double, double* %"'de", align 8
%17 = fadd fast double %16, %m1diffe
store double %17, double* %"'de", align 8
br label %inverttry.i
invertL11.i: ; preds = %invertjulia_f_1461.inner.exit
%18 = load double, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
store double 0.000000e+00, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%19 = load double, double* %"phic.i'ipa", align 8
%20 = fadd fast double %19, %18
store double %20, double* %"phic.i'ipa", align 8
br label %invertentry
inverttry.i: ; preds = %invertL7.i
%21 = load double, double* %"phic.i'ipa", align 8
store volatile double 0.000000e+00, double* %"phic.i'ipa", align 8
%22 = load double, double* %"'de", align 8
%23 = fadd fast double %22, %21
store double %23, double* %"'de", align 8
br label %invertentry
invertjulia_f_1461.inner.exit: ; preds = %julia_f_1461.inner.exit
store double %differeturn, double* %"value_phi.i'de", align 8
%24 = load double, double* %"value_phi.i'de", align 8
store double 0.000000e+00, double* %"value_phi.i'de", align 8
%25 = xor i1 %4, true
%26 = select fast i1 %25, double %24, double 0.000000e+00
%27 = load double, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%28 = fadd fast double %27, %24
%29 = select fast i1 %4, double %27, double %28
store double %29, double* %"phic.i.0.phic.i.0.phic.i.0.phic.i.0.phic.i.0.'de", align 8
%30 = select fast i1 %4, double %24, double 0.000000e+00
%31 = load double, double* %"'de1", align 8
%32 = fadd fast double %31, %24
%33 = select fast i1 %4, double %32, double %31
store double %33, double* %"'de1", align 8
br i1 %4, label %invertL7.i, label %invertL11.i
}
attributes #0 = { noreturn }
attributes #1 = { readnone "enzyme_inactive" }
attributes #2 = { nounwind readnone speculatable willreturn }
attributes #3 = { allocsize(1) }
attributes #4 = { cold noreturn nounwind }
attributes #5 = { "enzyme_inactive" }
attributes #6 = { returns_twice "enzyme_inactive" }
attributes #7 = { argmemonly nounwind willreturn }
attributes #8 = { willreturn }
attributes #9 = { readnone }
attributes #10 = { returns_twice }
!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2, !5, !7, !9, !10, !11, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31, !32, !33, !34, !35, !36, !37}
!0 = !{i32 2, !"Dwarf Version", i32 4}
!1 = !{i32 1, !"Debug Info Version", i32 3}
!2 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !3, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, nameTableKind: None)
!3 = !DIFile(filename: "error.jl", directory: ".")
!4 = !{}
!5 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !6, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, nameTableKind: None)
!6 = !DIFile(filename: "/mnt/Data/git/Enzyme.jl/setjmp.jl", directory: ".")
!7 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!8 = !DIFile(filename: "/home/wmoses/.julia/packages/GPUCompiler/OyOEp/src/runtime.jl", directory: ".")
!9 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!10 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!11 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!12 = !DIFile(filename: "/mnt/Data/git/Enzyme.jl/src/compiler.jl", directory: ".")
!13 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!14 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!15 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!16 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!17 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!18 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!19 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!20 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!21 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!22 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!23 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!24 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!25 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!26 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!27 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!28 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!29 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!30 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!31 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!32 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!33 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!34 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!35 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !8, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!36 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!37 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !12, producer: "julia", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !4, nameTableKind: None)
!38 = distinct !DISubprogram(name: "error", linkageName: "julia_error_1464", scope: null, file: !3, line: 33, type: !39, scopeLine: 33, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !47)
!39 = !DISubroutineType(types: !40)
!40 = !{!41, !45, !46}
!41 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !42, size: 64, align: 64)
!42 = !DICompositeType(tag: DW_TAG_structure_type, name: "jl_value_t", file: !43, line: 71, align: 64, elements: !44)
!43 = !DIFile(filename: "julia.h", directory: "")
!44 = !{!41}
!45 = !DICompositeType(tag: DW_TAG_structure_type, name: "#error", align: 8, elements: !4, runtimeLang: DW_LANG_Julia, identifier: "139716853936608")
!46 = !DIDerivedType(tag: DW_TAG_typedef, name: "String", baseType: !41)
!47 = !{!48, !49}
!48 = !DILocalVariable(name: "#self#", arg: 1, scope: !38, file: !3, line: 33, type: !45)
!49 = !DILocalVariable(name: "s", arg: 2, scope: !38, file: !3, line: 33, type: !46)
!50 = !DILocation(line: 0, scope: !38)
!51 = !DILocation(line: 33, scope: !38)
!52 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1461", scope: null, file: !6, line: 3, type: !53, scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !58)
!53 = !DISubroutineType(types: !54)
!54 = !{!55, !56, !57, !55}
!55 = !DIBasicType(name: "Float64", size: 64, encoding: DW_ATE_unsigned)
!56 = !DICompositeType(tag: DW_TAG_structure_type, name: "#f", align: 8, elements: !4, runtimeLang: DW_LANG_Julia, identifier: "139715133263344")
!57 = !DIBasicType(name: "Bool", size: 8, encoding: DW_ATE_unsigned)
!58 = !{!59, !60, !61}
!59 = !DILocalVariable(name: "#self#", arg: 1, scope: !52, file: !6, line: 3, type: !56)
!60 = !DILocalVariable(name: "cond", arg: 2, scope: !52, file: !6, line: 3, type: !57)
!61 = !DILocalVariable(name: "x", arg: 3, scope: !52, file: !6, line: 3, type: !55)
!62 = !DILocation(line: 0, scope: !52)
!63 = !DILocation(line: 4, scope: !52)
!64 = !DILocation(line: 6, scope: !52)
!65 = !DILocation(line: 332, scope: !66, inlinedAt: !69)
!66 = distinct !DISubprogram(name: "*;", linkageName: "*", scope: !67, file: !67, type: !68, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !4)
!67 = !DIFile(filename: "float.jl", directory: ".")
!68 = !DISubroutineType(types: !4)
!69 = !DILocation(line: 9, scope: !52)
!70 = !{!71, !71, i64 0}
!71 = !{!"jtbaa_stack", !72, i64 0}
!72 = !{!"jtbaa", !73, i64 0}
!73 = !{!"jtbaa"}
!74 = !DILocation(line: 5, scope: !52)
!75 = !DILocation(line: 12, scope: !52)
!76 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1461", scope: null, file: !6, line: 3, type: !53, scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !77)
!77 = !{!78, !79, !80}
!78 = !DILocalVariable(name: "#self#", arg: 1, scope: !76, file: !6, line: 3, type: !56)
!79 = !DILocalVariable(name: "cond", arg: 2, scope: !76, file: !6, line: 3, type: !57)
!80 = !DILocalVariable(name: "x", arg: 3, scope: !76, file: !6, line: 3, type: !55)
!81 = !DILocation(line: 0, scope: !76)
!82 = !DILocation(line: 4, scope: !76)
!83 = !DILocation(line: 6, scope: !76)
!84 = !DILocation(line: 332, scope: !66, inlinedAt: !85)
!85 = !DILocation(line: 9, scope: !76)
!86 = !DILocation(line: 5, scope: !76)
!87 = !DILocation(line: 12, scope: !76)
!88 = distinct !DISubprogram(name: "f", linkageName: "julia_f_1461", scope: null, file: !6, line: 3, type: !53, scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !5, retainedNodes: !89)
!89 = !{!90, !91, !92}
!90 = !DILocalVariable(name: "#self#", arg: 1, scope: !88, file: !6, line: 3, type: !56)
!91 = !DILocalVariable(name: "cond", arg: 2, scope: !88, file: !6, line: 3, type: !57)
!92 = !DILocalVariable(name: "x", arg: 3, scope: !88, file: !6, line: 3, type: !55)
!93 = !DILocation(line: 4, scope: !88)
!94 = !DILocation(line: 6, scope: !88)
!95 = !DILocation(line: 332, scope: !66, inlinedAt: !96)
!96 = !DILocation(line: 9, scope: !88)
!97 = !DILocation(line: 5, scope: !88)
autodiff(f, Const(false), Active(2.0)) = (4.0,)
Unreachable reached at 0x7f126d58e000