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

Setjmp handling

Open vchuravy opened this issue 4 years ago • 5 comments

@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)

vchuravy avatar Jul 13 '21 08:07 vchuravy

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

wsmoses avatar Jul 17 '21 03:07 wsmoses

In theory, setjmp could be handled if, as in this case, the return of nonzero always results in an unreachable.

wsmoses avatar Jul 17 '21 03:07 wsmoses

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)

wsmoses avatar Jul 25 '21 03:07 wsmoses

Found the error, we mistakenly run LowerExcHandlers before and after Enzyme, changed this to only run after Enzyme.

wsmoses avatar Jul 25 '21 04:07 wsmoses

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

wsmoses avatar Jul 25 '21 04:07 wsmoses