question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Setting cache=True with a recursive function results in Segmentation fault

See original GitHub issue
  • I have tried using the latest released version of Numba
  • I have included below a minimal working reproducer

When using numba with a function that calls itself and caching is set to True, numba crashes hard when the cache is not empty (i.e. if the same file is ran twice). In the minimal example below, the recursion can only ever happen to a depth of 1. I am happy with the workaround of disabling caching on functions with this issue, but I hope this is a bug report that the numba project finds useful.

import numba

@numba.njit(cache=True)
def temperature_effectiveness_plate(R1, NTU1, Np1, Np2, reverse=False):
    if Np1 == 1 and Np2 == 1:
        return 1.1
    if not reverse:
        R2 = 1./R1
        NTU2 = NTU1*R1
        P2 = temperature_effectiveness_plate(R1=R2, NTU1=NTU2, Np1=Np2, Np2=Np1,
                                             reverse=True)
        return 1.3
    raise ValueError('Supported number of passes does not have a formula available')

print(temperature_effectiveness_plate(R1=1/3., NTU1=1., Np1=1, Np2=1))
Full output with NUMBA_DEBUG=1 on the second run (with the crash):
/home/caleb/.local/lib/python3.7/site-packages/numba/__init__.py:188: UserWarning: SVML was not found/could not be loaded.
  warnings.warn("SVML was not found/could not be loaded.")
================================================================================
--------------------------FUNCTION OPTIMIZED DUMP nrt---------------------------
; ModuleID = 'nrt'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.const.picklebuf.139700511148704 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([102 x i8], [102 x i8]* @.const.pickledata.139700511148704, i32 0, i32 0), i32 102 }
@.const.pickledata.139700511148704 = internal constant [102 x i8] c"\80\04\95[\00\00\00\00\00\00\00\8C\08builtins\94\8C\0CRuntimeError\94\93\94\8C6numba jitted function aborted due to unresolved symbol\94\85\94N\87\94."

define i64 @nrt_atomic_add(i64* %.1) {
.3:
  %.4 = atomicrmw add i64* %.1, i64 1 monotonic
  %.5 = add i64 %.4, 1
  ret i64 %.5
}

define i64 @nrt_atomic_sub(i64* %.1) {
.3:
  %.4 = atomicrmw sub i64* %.1, i64 1 monotonic
  %.5 = sub i64 %.4, 1
  ret i64 %.5
}

define i32 @nrt_atomic_cas(i64* %.1, i64 %.2, i64 %.3, i64* %.4) {
.6:
  %.7 = cmpxchg i64* %.1, i64 %.2, i64 %.3 monotonic monotonic
  %.8 = extractvalue { i64, i1 } %.7, 0
  %.9 = extractvalue { i64, i1 } %.7, 1
  store i64 %.8, i64* %.4
  %.11 = zext i1 %.9 to i32
  ret i32 %.11
}

define i8* @NRT_MemInfo_data_fast(i8* %.1) {
.3:
  %.4 = bitcast i8* %.1 to { i64, i8*, i8*, i8*, i64 }*
  %.5 = getelementptr { i64, i8*, i8*, i8*, i64 }, { i64, i8*, i8*, i8*, i64 }* %.4, i32 0, i32 3
  %.6 = load i8*, i8** %.5
  ret i8* %.6
}

; Function Attrs: noinline
define void @NRT_incref(i8* %.1) #0 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3
  ret void

.3.endif:                                         ; preds = %.3
  %.7 = bitcast i8* %.1 to i64*
  %.8 = call i64 @nrt_atomic_add(i64* %.7)
  ret void
}

; Function Attrs: noinline
define void @NRT_decref(i8* %.1) #0 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3.endif.if, %.3.endif, %.3
  ret void

.3.endif:                                         ; preds = %.3
  fence release
  %.8 = bitcast i8* %.1 to i64*
  %.9 = call i64 @nrt_atomic_sub(i64* %.8)
  %.10 = icmp eq i64 %.9, 0
  br i1 %.10, label %.3.endif.if, label %.3.if, !prof !0

.3.endif.if:                                      ; preds = %.3.endif
  fence acquire
  call void @NRT_MemInfo_call_dtor(i8* %.1)
  br label %.3.if
}

declare void @NRT_MemInfo_call_dtor(i8*)

define i32 @nrt_unresolved_abort(i8** %.1, { i8*, i32 }** %.2) {
.4:
  store { i8*, i32 }* @.const.picklebuf.139700511148704, { i8*, i32 }** %.2
  ret i32 1
}

attributes #0 = { noinline }

!0 = !{!"branch_weights", i32 1, i32 99}

================================================================================
================================================================================
-------------------------------OPTIMIZED DUMP nrt-------------------------------
; ModuleID = 'nrt'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.const.picklebuf.139700511148704 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([102 x i8], [102 x i8]* @.const.pickledata.139700511148704, i32 0, i32 0), i32 102 }
@.const.pickledata.139700511148704 = internal constant [102 x i8] c"\80\04\95[\00\00\00\00\00\00\00\8C\08builtins\94\8C\0CRuntimeError\94\93\94\8C6numba jitted function aborted due to unresolved symbol\94\85\94N\87\94."

; Function Attrs: nofree norecurse nounwind
define i64 @nrt_atomic_add(i64* nocapture %.1) local_unnamed_addr #0 {
.3:
  %.4 = atomicrmw add i64* %.1, i64 1 monotonic
  %.5 = add i64 %.4, 1
  ret i64 %.5
}

; Function Attrs: nofree norecurse nounwind
define i64 @nrt_atomic_sub(i64* nocapture %.1) local_unnamed_addr #0 {
.3:
  %.4 = atomicrmw sub i64* %.1, i64 1 monotonic
  %.5 = add i64 %.4, -1
  ret i64 %.5
}

; Function Attrs: nofree norecurse nounwind
define i32 @nrt_atomic_cas(i64* nocapture %.1, i64 %.2, i64 %.3, i64* nocapture %.4) local_unnamed_addr #0 {
.6:
  %.7 = cmpxchg i64* %.1, i64 %.2, i64 %.3 monotonic monotonic
  %.8 = extractvalue { i64, i1 } %.7, 0
  %.9 = extractvalue { i64, i1 } %.7, 1
  store i64 %.8, i64* %.4, align 8
  %.11 = zext i1 %.9 to i32
  ret i32 %.11
}

; Function Attrs: norecurse nounwind readonly
define i8* @NRT_MemInfo_data_fast(i8* nocapture readonly %.1) local_unnamed_addr #1 {
.3:
  %.5 = getelementptr i8, i8* %.1, i64 24
  %0 = bitcast i8* %.5 to i8**
  %.6 = load i8*, i8** %0, align 8
  ret i8* %.6
}

; Function Attrs: nofree noinline norecurse nounwind
define void @NRT_incref(i8* %.1) local_unnamed_addr #2 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3
  ret void

.3.endif:                                         ; preds = %.3
  %.7 = bitcast i8* %.1 to i64*
  %.4.i = atomicrmw add i64* %.7, i64 1 monotonic
  ret void
}

; Function Attrs: noinline
define void @NRT_decref(i8* %.1) local_unnamed_addr #3 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3.endif, %.3
  ret void

.3.endif:                                         ; preds = %.3
  fence release
  %.8 = bitcast i8* %.1 to i64*
  %.4.i = atomicrmw sub i64* %.8, i64 1 monotonic
  %.10 = icmp eq i64 %.4.i, 1
  br i1 %.10, label %.3.endif.if, label %.3.if, !prof !0

.3.endif.if:                                      ; preds = %.3.endif
  fence acquire
  tail call void @NRT_MemInfo_call_dtor(i8* nonnull %.1)
  ret void
}

declare void @NRT_MemInfo_call_dtor(i8*) local_unnamed_addr

; Function Attrs: nofree norecurse nounwind writeonly
define i32 @nrt_unresolved_abort(i8** nocapture readnone %.1, { i8*, i32 }** nocapture %.2) local_unnamed_addr #4 {
.4:
  store { i8*, i32 }* @.const.picklebuf.139700511148704, { i8*, i32 }** %.2, align 8
  ret i32 1
}

; Function Attrs: nounwind
declare void @llvm.stackprotector(i8*, i8**) #5

attributes #0 = { nofree norecurse nounwind }
attributes #1 = { norecurse nounwind readonly }
attributes #2 = { nofree noinline norecurse nounwind }
attributes #3 = { noinline }
attributes #4 = { nofree norecurse nounwind writeonly }
attributes #5 = { nounwind }

!0 = !{!"branch_weights", i32 1, i32 99}

================================================================================
================================================================================
----------------------------------ASSEMBLY nrt----------------------------------
	.text
	.file	"<string>"
	.globl	nrt_atomic_add
	.p2align	4, 0x90
	.type	nrt_atomic_add,@function
nrt_atomic_add:
	movl	$1, %eax
	lock		xaddq	%rax, (%rdi)
	incq	%rax
	retq
.Lfunc_end0:
	.size	nrt_atomic_add, .Lfunc_end0-nrt_atomic_add

	.globl	nrt_atomic_sub
	.p2align	4, 0x90
	.type	nrt_atomic_sub,@function
nrt_atomic_sub:
	movq	$-1, %rax
	lock		xaddq	%rax, (%rdi)
	decq	%rax
	retq
.Lfunc_end1:
	.size	nrt_atomic_sub, .Lfunc_end1-nrt_atomic_sub

	.globl	nrt_atomic_cas
	.p2align	4, 0x90
	.type	nrt_atomic_cas,@function
nrt_atomic_cas:
	movq	%rsi, %rax
	xorl	%esi, %esi
	lock		cmpxchgq	%rdx, (%rdi)
	sete	%sil
	movq	%rax, (%rcx)
	movl	%esi, %eax
	retq
.Lfunc_end2:
	.size	nrt_atomic_cas, .Lfunc_end2-nrt_atomic_cas

	.globl	NRT_MemInfo_data_fast
	.p2align	4, 0x90
	.type	NRT_MemInfo_data_fast,@function
NRT_MemInfo_data_fast:
	movq	24(%rdi), %rax
	retq
.Lfunc_end3:
	.size	NRT_MemInfo_data_fast, .Lfunc_end3-NRT_MemInfo_data_fast

	.globl	NRT_incref
	.p2align	4, 0x90
	.type	NRT_incref,@function
NRT_incref:
	testq	%rdi, %rdi
	je	.LBB4_1
	lock		incq	(%rdi)
	retq
.LBB4_1:
	retq
.Lfunc_end4:
	.size	NRT_incref, .Lfunc_end4-NRT_incref

	.globl	NRT_decref
	.p2align	4, 0x90
	.type	NRT_decref,@function
NRT_decref:
	.cfi_startproc
	testq	%rdi, %rdi
	je	.LBB5_2
	#MEMBARRIER
	lock		decq	(%rdi)
	je	.LBB5_3
.LBB5_2:
	retq
.LBB5_3:
	#MEMBARRIER
	movabsq	$NRT_MemInfo_call_dtor, %rax
	jmpq	*%rax
.Lfunc_end5:
	.size	NRT_decref, .Lfunc_end5-NRT_decref
	.cfi_endproc

	.globl	nrt_unresolved_abort
	.p2align	4, 0x90
	.type	nrt_unresolved_abort,@function
nrt_unresolved_abort:
	movabsq	$.const.picklebuf.139700511148704, %rax
	movq	%rax, (%rsi)
	movl	$1, %eax
	retq
.Lfunc_end6:
	.size	nrt_unresolved_abort, .Lfunc_end6-nrt_unresolved_abort

	.type	.const.picklebuf.139700511148704,@object
	.section	.rodata,"a",@progbits
	.p2align	3
.const.picklebuf.139700511148704:
	.quad	.const.pickledata.139700511148704
	.long	102
	.zero	4
	.size	.const.picklebuf.139700511148704, 16

	.type	.const.pickledata.139700511148704,@object
	.p2align	4
.const.pickledata.139700511148704:
	.ascii	"\200\004\225[\000\000\000\000\000\000\000\214\bbuiltins\224\214\fRuntimeError\224\223\224\2146numba jitted function aborted due to unresolved symbol\224\205\224N\207\224."
	.size	.const.pickledata.139700511148704, 102


	.section	".note.GNU-stack","",@progbits

================================================================================
[cache] index loaded from '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.nbi'
[cache] data loaded from '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.2.nbc'
/home/caleb/.local/lib/python3.7/site-packages/numba/core/codegen.py:309: UserWarning: Inspection disabled for cached code. Invalid result is returned.
  warnings.warn('Inspection disabled for cached code. '
================================================================================
-----------------OPTIMIZED DUMP temperature_effectiveness_plate-----------------
; ModuleID = 'temperature_effectiveness_plate'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

================================================================================
================================================================================
--------------------ASSEMBLY temperature_effectiveness_plate--------------------
	.text
	.file	"<string>"

	.section	".note.GNU-stack","",@progbits

================================================================================
Segmentation fault
Full output with NUMBA_DEBUG=1 on the first run (without the crash):
/home/caleb/.local/lib/python3.7/site-packages/numba/__init__.py:188: UserWarning: SVML was not found/could not be loaded.
  warnings.warn("SVML was not found/could not be loaded.")
================================================================================
--------------------------FUNCTION OPTIMIZED DUMP nrt---------------------------
; ModuleID = 'nrt'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.const.picklebuf.140612176063216 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([102 x i8], [102 x i8]* @.const.pickledata.140612176063216, i32 0, i32 0), i32 102 }
@.const.pickledata.140612176063216 = internal constant [102 x i8] c"\80\04\95[\00\00\00\00\00\00\00\8C\08builtins\94\8C\0CRuntimeError\94\93\94\8C6numba jitted function aborted due to unresolved symbol\94\85\94N\87\94."

define i64 @nrt_atomic_add(i64* %.1) {
.3:
  %.4 = atomicrmw add i64* %.1, i64 1 monotonic
  %.5 = add i64 %.4, 1
  ret i64 %.5
}

define i64 @nrt_atomic_sub(i64* %.1) {
.3:
  %.4 = atomicrmw sub i64* %.1, i64 1 monotonic
  %.5 = sub i64 %.4, 1
  ret i64 %.5
}

define i32 @nrt_atomic_cas(i64* %.1, i64 %.2, i64 %.3, i64* %.4) {
.6:
  %.7 = cmpxchg i64* %.1, i64 %.2, i64 %.3 monotonic monotonic
  %.8 = extractvalue { i64, i1 } %.7, 0
  %.9 = extractvalue { i64, i1 } %.7, 1
  store i64 %.8, i64* %.4
  %.11 = zext i1 %.9 to i32
  ret i32 %.11
}

define i8* @NRT_MemInfo_data_fast(i8* %.1) {
.3:
  %.4 = bitcast i8* %.1 to { i64, i8*, i8*, i8*, i64 }*
  %.5 = getelementptr { i64, i8*, i8*, i8*, i64 }, { i64, i8*, i8*, i8*, i64 }* %.4, i32 0, i32 3
  %.6 = load i8*, i8** %.5
  ret i8* %.6
}

; Function Attrs: noinline
define void @NRT_incref(i8* %.1) #0 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3
  ret void

.3.endif:                                         ; preds = %.3
  %.7 = bitcast i8* %.1 to i64*
  %.8 = call i64 @nrt_atomic_add(i64* %.7)
  ret void
}

; Function Attrs: noinline
define void @NRT_decref(i8* %.1) #0 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3.endif.if, %.3.endif, %.3
  ret void

.3.endif:                                         ; preds = %.3
  fence release
  %.8 = bitcast i8* %.1 to i64*
  %.9 = call i64 @nrt_atomic_sub(i64* %.8)
  %.10 = icmp eq i64 %.9, 0
  br i1 %.10, label %.3.endif.if, label %.3.if, !prof !0

.3.endif.if:                                      ; preds = %.3.endif
  fence acquire
  call void @NRT_MemInfo_call_dtor(i8* %.1)
  br label %.3.if
}

declare void @NRT_MemInfo_call_dtor(i8*)

define i32 @nrt_unresolved_abort(i8** %.1, { i8*, i32 }** %.2) {
.4:
  store { i8*, i32 }* @.const.picklebuf.140612176063216, { i8*, i32 }** %.2
  ret i32 1
}

attributes #0 = { noinline }

!0 = !{!"branch_weights", i32 1, i32 99}

================================================================================
================================================================================
-------------------------------OPTIMIZED DUMP nrt-------------------------------
; ModuleID = 'nrt'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.const.picklebuf.140612176063216 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([102 x i8], [102 x i8]* @.const.pickledata.140612176063216, i32 0, i32 0), i32 102 }
@.const.pickledata.140612176063216 = internal constant [102 x i8] c"\80\04\95[\00\00\00\00\00\00\00\8C\08builtins\94\8C\0CRuntimeError\94\93\94\8C6numba jitted function aborted due to unresolved symbol\94\85\94N\87\94."

; Function Attrs: nofree norecurse nounwind
define i64 @nrt_atomic_add(i64* nocapture %.1) local_unnamed_addr #0 {
.3:
  %.4 = atomicrmw add i64* %.1, i64 1 monotonic
  %.5 = add i64 %.4, 1
  ret i64 %.5
}

; Function Attrs: nofree norecurse nounwind
define i64 @nrt_atomic_sub(i64* nocapture %.1) local_unnamed_addr #0 {
.3:
  %.4 = atomicrmw sub i64* %.1, i64 1 monotonic
  %.5 = add i64 %.4, -1
  ret i64 %.5
}

; Function Attrs: nofree norecurse nounwind
define i32 @nrt_atomic_cas(i64* nocapture %.1, i64 %.2, i64 %.3, i64* nocapture %.4) local_unnamed_addr #0 {
.6:
  %.7 = cmpxchg i64* %.1, i64 %.2, i64 %.3 monotonic monotonic
  %.8 = extractvalue { i64, i1 } %.7, 0
  %.9 = extractvalue { i64, i1 } %.7, 1
  store i64 %.8, i64* %.4, align 8
  %.11 = zext i1 %.9 to i32
  ret i32 %.11
}

; Function Attrs: norecurse nounwind readonly
define i8* @NRT_MemInfo_data_fast(i8* nocapture readonly %.1) local_unnamed_addr #1 {
.3:
  %.5 = getelementptr i8, i8* %.1, i64 24
  %0 = bitcast i8* %.5 to i8**
  %.6 = load i8*, i8** %0, align 8
  ret i8* %.6
}

; Function Attrs: nofree noinline norecurse nounwind
define void @NRT_incref(i8* %.1) local_unnamed_addr #2 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3
  ret void

.3.endif:                                         ; preds = %.3
  %.7 = bitcast i8* %.1 to i64*
  %.4.i = atomicrmw add i64* %.7, i64 1 monotonic
  ret void
}

; Function Attrs: noinline
define void @NRT_decref(i8* %.1) local_unnamed_addr #3 {
.3:
  %.4 = icmp eq i8* %.1, null
  br i1 %.4, label %.3.if, label %.3.endif, !prof !0

.3.if:                                            ; preds = %.3.endif, %.3
  ret void

.3.endif:                                         ; preds = %.3
  fence release
  %.8 = bitcast i8* %.1 to i64*
  %.4.i = atomicrmw sub i64* %.8, i64 1 monotonic
  %.10 = icmp eq i64 %.4.i, 1
  br i1 %.10, label %.3.endif.if, label %.3.if, !prof !0

.3.endif.if:                                      ; preds = %.3.endif
  fence acquire
  tail call void @NRT_MemInfo_call_dtor(i8* nonnull %.1)
  ret void
}

declare void @NRT_MemInfo_call_dtor(i8*) local_unnamed_addr

; Function Attrs: nofree norecurse nounwind writeonly
define i32 @nrt_unresolved_abort(i8** nocapture readnone %.1, { i8*, i32 }** nocapture %.2) local_unnamed_addr #4 {
.4:
  store { i8*, i32 }* @.const.picklebuf.140612176063216, { i8*, i32 }** %.2, align 8
  ret i32 1
}

; Function Attrs: nounwind
declare void @llvm.stackprotector(i8*, i8**) #5

attributes #0 = { nofree norecurse nounwind }
attributes #1 = { norecurse nounwind readonly }
attributes #2 = { nofree noinline norecurse nounwind }
attributes #3 = { noinline }
attributes #4 = { nofree norecurse nounwind writeonly }
attributes #5 = { nounwind }

!0 = !{!"branch_weights", i32 1, i32 99}

================================================================================
================================================================================
----------------------------------ASSEMBLY nrt----------------------------------
	.text
	.file	"<string>"
	.globl	nrt_atomic_add
	.p2align	4, 0x90
	.type	nrt_atomic_add,@function
nrt_atomic_add:
	movl	$1, %eax
	lock		xaddq	%rax, (%rdi)
	incq	%rax
	retq
.Lfunc_end0:
	.size	nrt_atomic_add, .Lfunc_end0-nrt_atomic_add

	.globl	nrt_atomic_sub
	.p2align	4, 0x90
	.type	nrt_atomic_sub,@function
nrt_atomic_sub:
	movq	$-1, %rax
	lock		xaddq	%rax, (%rdi)
	decq	%rax
	retq
.Lfunc_end1:
	.size	nrt_atomic_sub, .Lfunc_end1-nrt_atomic_sub

	.globl	nrt_atomic_cas
	.p2align	4, 0x90
	.type	nrt_atomic_cas,@function
nrt_atomic_cas:
	movq	%rsi, %rax
	xorl	%esi, %esi
	lock		cmpxchgq	%rdx, (%rdi)
	sete	%sil
	movq	%rax, (%rcx)
	movl	%esi, %eax
	retq
.Lfunc_end2:
	.size	nrt_atomic_cas, .Lfunc_end2-nrt_atomic_cas

	.globl	NRT_MemInfo_data_fast
	.p2align	4, 0x90
	.type	NRT_MemInfo_data_fast,@function
NRT_MemInfo_data_fast:
	movq	24(%rdi), %rax
	retq
.Lfunc_end3:
	.size	NRT_MemInfo_data_fast, .Lfunc_end3-NRT_MemInfo_data_fast

	.globl	NRT_incref
	.p2align	4, 0x90
	.type	NRT_incref,@function
NRT_incref:
	testq	%rdi, %rdi
	je	.LBB4_1
	lock		incq	(%rdi)
	retq
.LBB4_1:
	retq
.Lfunc_end4:
	.size	NRT_incref, .Lfunc_end4-NRT_incref

	.globl	NRT_decref
	.p2align	4, 0x90
	.type	NRT_decref,@function
NRT_decref:
	.cfi_startproc
	testq	%rdi, %rdi
	je	.LBB5_2
	#MEMBARRIER
	lock		decq	(%rdi)
	je	.LBB5_3
.LBB5_2:
	retq
.LBB5_3:
	#MEMBARRIER
	movabsq	$NRT_MemInfo_call_dtor, %rax
	jmpq	*%rax
.Lfunc_end5:
	.size	NRT_decref, .Lfunc_end5-NRT_decref
	.cfi_endproc

	.globl	nrt_unresolved_abort
	.p2align	4, 0x90
	.type	nrt_unresolved_abort,@function
nrt_unresolved_abort:
	movabsq	$.const.picklebuf.140612176063216, %rax
	movq	%rax, (%rsi)
	movl	$1, %eax
	retq
.Lfunc_end6:
	.size	nrt_unresolved_abort, .Lfunc_end6-nrt_unresolved_abort

	.type	.const.picklebuf.140612176063216,@object
	.section	.rodata,"a",@progbits
	.p2align	3
.const.picklebuf.140612176063216:
	.quad	.const.pickledata.140612176063216
	.long	102
	.zero	4
	.size	.const.picklebuf.140612176063216, 16

	.type	.const.pickledata.140612176063216,@object
	.p2align	4
.const.pickledata.140612176063216:
	.ascii	"\200\004\225[\000\000\000\000\000\000\000\214\bbuiltins\224\214\fRuntimeError\224\223\224\2146numba jitted function aborted due to unresolved symbol\224\205\224N\207\224."
	.size	.const.pickledata.140612176063216, 102


	.section	".note.GNU-stack","",@progbits

================================================================================
[cache] index loaded from '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.nbi'
--------------------IR DUMP: temperature_effectiveness_plate--------------------
label 0:
    R1 = arg(0, name=R1)                     ['R1']
    NTU1 = arg(1, name=NTU1)                 ['NTU1']
    Np1 = arg(2, name=Np1)                   ['Np1']
    Np2 = arg(3, name=Np2)                   ['Np2']
    reverse = arg(4, name=reverse)           ['reverse']
    $const4.1 = const(int, 1)                ['$const4.1']
    $6compare_op.2 = Np1 == $const4.1        ['$6compare_op.2', '$const4.1', 'Np1']
    bool8 = global(bool: <class 'bool'>)     ['bool8']
    $8pred = call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$6compare_op.2', '$8pred', 'bool8']
    branch $8pred, 10, 22                    ['$8pred']
label 10:
    $const12.1 = const(int, 1)               ['$const12.1']
    $14compare_op.2 = Np2 == $const12.1      ['$14compare_op.2', '$const12.1', 'Np2']
    bool16 = global(bool: <class 'bool'>)    ['bool16']
    $16pred = call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$14compare_op.2', '$16pred', 'bool16']
    branch $16pred, 18, 22                   ['$16pred']
label 18:
    $const18.0 = const(float, 1.1)           ['$const18.0']
    $20return_value.1 = cast(value=$const18.0) ['$20return_value.1', '$const18.0']
    return $20return_value.1                 ['$20return_value.1']
label 22:
    bool24 = global(bool: <class 'bool'>)    ['bool24']
    $24pred = call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None) ['$24pred', 'bool24', 'reverse']
    branch $24pred, 64, 26                   ['$24pred']
label 26:
    $const26.0 = const(float, 1.0)           ['$const26.0']
    $30binary_true_divide.2 = $const26.0 / R1 ['$30binary_true_divide.2', '$const26.0', 'R1']
    R2 = $30binary_true_divide.2             ['$30binary_true_divide.2', 'R2']
    $38binary_multiply.5 = NTU1 * R1         ['$38binary_multiply.5', 'NTU1', 'R1']
    NTU2 = $38binary_multiply.5              ['$38binary_multiply.5', 'NTU2']
    $42load_global.6 = global(temperature_effectiveness_plate: CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>)) ['$42load_global.6']
    $const52.11 = const(bool, True)          ['$const52.11']
    $56call_function_kw.13 = call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None) ['$42load_global.6', '$56call_function_kw.13', '$const52.11', 'NTU2', 'Np1', 'Np2', 'R2']
    P2 = $56call_function_kw.13              ['$56call_function_kw.13', 'P2']
    $const60.14 = const(float, 1.3)          ['$const60.14']
    $62return_value.15 = cast(value=$const60.14) ['$62return_value.15', '$const60.14']
    return $62return_value.15                ['$62return_value.15']
label 64:
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    raise $68call_function.2                 ['$68call_function.2']

______________________________________________________________________
REWRITING (RewriteConstRaises):
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    raise $68call_function.2                 ['$68call_function.2']
____________________________________________________________
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    <static> raise <class 'ValueError'>('Supported number of passes does not have a formula available') []
______________________________________________________________________
--------------------IR DUMP: temperature_effectiveness_plate--------------------
label 0:
    R1 = arg(0, name=R1)                     ['R1']
    NTU1 = arg(1, name=NTU1)                 ['NTU1']
    Np1 = arg(2, name=Np1)                   ['Np1']
    Np2 = arg(3, name=Np2)                   ['Np2']
    reverse = arg(4, name=reverse)           ['reverse']
    $const4.1 = const(int, 1)                ['$const4.1']
    $6compare_op.2 = Np1 == $const4.1        ['$6compare_op.2', '$const4.1', 'Np1']
    bool8 = global(bool: <class 'bool'>)     ['bool8']
    $8pred = call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$6compare_op.2', '$8pred', 'bool8']
    branch $8pred, 10, 22                    ['$8pred']
label 10:
    $const12.1 = const(int, 1)               ['$const12.1']
    $14compare_op.2 = Np2 == $const12.1      ['$14compare_op.2', '$const12.1', 'Np2']
    bool16 = global(bool: <class 'bool'>)    ['bool16']
    $16pred = call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$14compare_op.2', '$16pred', 'bool16']
    branch $16pred, 18, 22                   ['$16pred']
label 18:
    $const18.0 = const(float, 1.1)           ['$const18.0']
    $20return_value.1 = cast(value=$const18.0) ['$20return_value.1', '$const18.0']
    return $20return_value.1                 ['$20return_value.1']
label 22:
    bool24 = global(bool: <class 'bool'>)    ['bool24']
    $24pred = call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None) ['$24pred', 'bool24', 'reverse']
    branch $24pred, 64, 26                   ['$24pred']
label 26:
    $const26.0 = const(float, 1.0)           ['$const26.0']
    $30binary_true_divide.2 = $const26.0 / R1 ['$30binary_true_divide.2', '$const26.0', 'R1']
    R2 = $30binary_true_divide.2             ['$30binary_true_divide.2', 'R2']
    $38binary_multiply.5 = NTU1 * R1         ['$38binary_multiply.5', 'NTU1', 'R1']
    NTU2 = $38binary_multiply.5              ['$38binary_multiply.5', 'NTU2']
    $42load_global.6 = global(temperature_effectiveness_plate: CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>)) ['$42load_global.6']
    $const52.11 = const(bool, True)          ['$const52.11']
    $56call_function_kw.13 = call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None) ['$42load_global.6', '$56call_function_kw.13', '$const52.11', 'NTU2', 'Np1', 'Np2', 'R2']
    P2 = $56call_function_kw.13              ['$56call_function_kw.13', 'P2']
    $const60.14 = const(float, 1.3)          ['$const60.14']
    $62return_value.15 = cast(value=$const60.14) ['$62return_value.15', '$const60.14']
    return $62return_value.15                ['$62return_value.15']
label 64:
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    <static> raise <class 'ValueError'>('Supported number of passes does not have a formula available') []

------------------SSA IR DUMP: temperature_effectiveness_plate------------------
label 0:
    R1 = arg(0, name=R1)                     ['R1']
    NTU1 = arg(1, name=NTU1)                 ['NTU1']
    Np1 = arg(2, name=Np1)                   ['Np1']
    Np2 = arg(3, name=Np2)                   ['Np2']
    reverse = arg(4, name=reverse)           ['reverse']
    $const4.1 = const(int, 1)                ['$const4.1']
    $6compare_op.2 = Np1 == $const4.1        ['$6compare_op.2', '$const4.1', 'Np1']
    bool8 = global(bool: <class 'bool'>)     ['bool8']
    $8pred = call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$6compare_op.2', '$8pred', 'bool8']
    branch $8pred, 10, 22                    ['$8pred']
label 10:
    $const12.1 = const(int, 1)               ['$const12.1']
    $14compare_op.2 = Np2 == $const12.1      ['$14compare_op.2', '$const12.1', 'Np2']
    bool16 = global(bool: <class 'bool'>)    ['bool16']
    $16pred = call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$14compare_op.2', '$16pred', 'bool16']
    branch $16pred, 18, 22                   ['$16pred']
label 18:
    $const18.0 = const(float, 1.1)           ['$const18.0']
    $20return_value.1 = cast(value=$const18.0) ['$20return_value.1', '$const18.0']
    return $20return_value.1                 ['$20return_value.1']
label 22:
    bool24 = global(bool: <class 'bool'>)    ['bool24']
    $24pred = call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None) ['$24pred', 'bool24', 'reverse']
    branch $24pred, 64, 26                   ['$24pred']
label 26:
    $const26.0 = const(float, 1.0)           ['$const26.0']
    $30binary_true_divide.2 = $const26.0 / R1 ['$30binary_true_divide.2', '$const26.0', 'R1']
    R2 = $30binary_true_divide.2             ['$30binary_true_divide.2', 'R2']
    $38binary_multiply.5 = NTU1 * R1         ['$38binary_multiply.5', 'NTU1', 'R1']
    NTU2 = $38binary_multiply.5              ['$38binary_multiply.5', 'NTU2']
    $42load_global.6 = global(temperature_effectiveness_plate: CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>)) ['$42load_global.6']
    $const52.11 = const(bool, True)          ['$const52.11']
    $56call_function_kw.13 = call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None) ['$42load_global.6', '$56call_function_kw.13', '$const52.11', 'NTU2', 'Np1', 'Np2', 'R2']
    P2 = $56call_function_kw.13              ['$56call_function_kw.13', 'P2']
    $const60.14 = const(float, 1.3)          ['$const60.14']
    $62return_value.15 = cast(value=$const60.14) ['$62return_value.15', '$const60.14']
    return $62return_value.15                ['$62return_value.15']
label 64:
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    <static> raise <class 'ValueError'>('Supported number of passes does not have a formula available') []

-----------------------------------propagate------------------------------------
[cache] index loaded from '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.nbi'
--------------------IR DUMP: temperature_effectiveness_plate--------------------
label 0:
    R1 = arg(0, name=R1)                     ['R1']
    NTU1 = arg(1, name=NTU1)                 ['NTU1']
    Np1 = arg(2, name=Np1)                   ['Np1']
    Np2 = arg(3, name=Np2)                   ['Np2']
    reverse = arg(4, name=reverse)           ['reverse']
    $const4.1 = const(int, 1)                ['$const4.1']
    $6compare_op.2 = Np1 == $const4.1        ['$6compare_op.2', '$const4.1', 'Np1']
    bool8 = global(bool: <class 'bool'>)     ['bool8']
    $8pred = call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$6compare_op.2', '$8pred', 'bool8']
    branch $8pred, 10, 22                    ['$8pred']
label 10:
    $const12.1 = const(int, 1)               ['$const12.1']
    $14compare_op.2 = Np2 == $const12.1      ['$14compare_op.2', '$const12.1', 'Np2']
    bool16 = global(bool: <class 'bool'>)    ['bool16']
    $16pred = call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$14compare_op.2', '$16pred', 'bool16']
    branch $16pred, 18, 22                   ['$16pred']
label 18:
    $const18.0 = const(float, 1.1)           ['$const18.0']
    $20return_value.1 = cast(value=$const18.0) ['$20return_value.1', '$const18.0']
    return $20return_value.1                 ['$20return_value.1']
label 22:
    bool24 = global(bool: <class 'bool'>)    ['bool24']
    $24pred = call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None) ['$24pred', 'bool24', 'reverse']
    branch $24pred, 64, 26                   ['$24pred']
label 26:
    $const26.0 = const(float, 1.0)           ['$const26.0']
    $30binary_true_divide.2 = $const26.0 / R1 ['$30binary_true_divide.2', '$const26.0', 'R1']
    R2 = $30binary_true_divide.2             ['$30binary_true_divide.2', 'R2']
    $38binary_multiply.5 = NTU1 * R1         ['$38binary_multiply.5', 'NTU1', 'R1']
    NTU2 = $38binary_multiply.5              ['$38binary_multiply.5', 'NTU2']
    $42load_global.6 = global(temperature_effectiveness_plate: CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>)) ['$42load_global.6']
    $const52.11 = const(bool, True)          ['$const52.11']
    $56call_function_kw.13 = call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None) ['$42load_global.6', '$56call_function_kw.13', '$const52.11', 'NTU2', 'Np1', 'Np2', 'R2']
    P2 = $56call_function_kw.13              ['$56call_function_kw.13', 'P2']
    $const60.14 = const(float, 1.3)          ['$const60.14']
    $62return_value.15 = cast(value=$const60.14) ['$62return_value.15', '$const60.14']
    return $62return_value.15                ['$62return_value.15']
label 64:
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    raise $68call_function.2                 ['$68call_function.2']

______________________________________________________________________
REWRITING (RewriteConstRaises):
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    raise $68call_function.2                 ['$68call_function.2']
____________________________________________________________
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    <static> raise <class 'ValueError'>('Supported number of passes does not have a formula available') []
______________________________________________________________________
--------------------IR DUMP: temperature_effectiveness_plate--------------------
label 0:
    R1 = arg(0, name=R1)                     ['R1']
    NTU1 = arg(1, name=NTU1)                 ['NTU1']
    Np1 = arg(2, name=Np1)                   ['Np1']
    Np2 = arg(3, name=Np2)                   ['Np2']
    reverse = arg(4, name=reverse)           ['reverse']
    $const4.1 = const(int, 1)                ['$const4.1']
    $6compare_op.2 = Np1 == $const4.1        ['$6compare_op.2', '$const4.1', 'Np1']
    bool8 = global(bool: <class 'bool'>)     ['bool8']
    $8pred = call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$6compare_op.2', '$8pred', 'bool8']
    branch $8pred, 10, 22                    ['$8pred']
label 10:
    $const12.1 = const(int, 1)               ['$const12.1']
    $14compare_op.2 = Np2 == $const12.1      ['$14compare_op.2', '$const12.1', 'Np2']
    bool16 = global(bool: <class 'bool'>)    ['bool16']
    $16pred = call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$14compare_op.2', '$16pred', 'bool16']
    branch $16pred, 18, 22                   ['$16pred']
label 18:
    $const18.0 = const(float, 1.1)           ['$const18.0']
    $20return_value.1 = cast(value=$const18.0) ['$20return_value.1', '$const18.0']
    return $20return_value.1                 ['$20return_value.1']
label 22:
    bool24 = global(bool: <class 'bool'>)    ['bool24']
    $24pred = call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None) ['$24pred', 'bool24', 'reverse']
    branch $24pred, 64, 26                   ['$24pred']
label 26:
    $const26.0 = const(float, 1.0)           ['$const26.0']
    $30binary_true_divide.2 = $const26.0 / R1 ['$30binary_true_divide.2', '$const26.0', 'R1']
    R2 = $30binary_true_divide.2             ['$30binary_true_divide.2', 'R2']
    $38binary_multiply.5 = NTU1 * R1         ['$38binary_multiply.5', 'NTU1', 'R1']
    NTU2 = $38binary_multiply.5              ['$38binary_multiply.5', 'NTU2']
    $42load_global.6 = global(temperature_effectiveness_plate: CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>)) ['$42load_global.6']
    $const52.11 = const(bool, True)          ['$const52.11']
    $56call_function_kw.13 = call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None) ['$42load_global.6', '$56call_function_kw.13', '$const52.11', 'NTU2', 'Np1', 'Np2', 'R2']
    P2 = $56call_function_kw.13              ['$56call_function_kw.13', 'P2']
    $const60.14 = const(float, 1.3)          ['$const60.14']
    $62return_value.15 = cast(value=$const60.14) ['$62return_value.15', '$const60.14']
    return $62return_value.15                ['$62return_value.15']
label 64:
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    <static> raise <class 'ValueError'>('Supported number of passes does not have a formula available') []

------------------SSA IR DUMP: temperature_effectiveness_plate------------------
label 0:
    R1 = arg(0, name=R1)                     ['R1']
    NTU1 = arg(1, name=NTU1)                 ['NTU1']
    Np1 = arg(2, name=Np1)                   ['Np1']
    Np2 = arg(3, name=Np2)                   ['Np2']
    reverse = arg(4, name=reverse)           ['reverse']
    $const4.1 = const(int, 1)                ['$const4.1']
    $6compare_op.2 = Np1 == $const4.1        ['$6compare_op.2', '$const4.1', 'Np1']
    bool8 = global(bool: <class 'bool'>)     ['bool8']
    $8pred = call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$6compare_op.2', '$8pred', 'bool8']
    branch $8pred, 10, 22                    ['$8pred']
label 10:
    $const12.1 = const(int, 1)               ['$const12.1']
    $14compare_op.2 = Np2 == $const12.1      ['$14compare_op.2', '$const12.1', 'Np2']
    bool16 = global(bool: <class 'bool'>)    ['bool16']
    $16pred = call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None) ['$14compare_op.2', '$16pred', 'bool16']
    branch $16pred, 18, 22                   ['$16pred']
label 18:
    $const18.0 = const(float, 1.1)           ['$const18.0']
    $20return_value.1 = cast(value=$const18.0) ['$20return_value.1', '$const18.0']
    return $20return_value.1                 ['$20return_value.1']
label 22:
    bool24 = global(bool: <class 'bool'>)    ['bool24']
    $24pred = call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None) ['$24pred', 'bool24', 'reverse']
    branch $24pred, 64, 26                   ['$24pred']
label 26:
    $const26.0 = const(float, 1.0)           ['$const26.0']
    $30binary_true_divide.2 = $const26.0 / R1 ['$30binary_true_divide.2', '$const26.0', 'R1']
    R2 = $30binary_true_divide.2             ['$30binary_true_divide.2', 'R2']
    $38binary_multiply.5 = NTU1 * R1         ['$38binary_multiply.5', 'NTU1', 'R1']
    NTU2 = $38binary_multiply.5              ['$38binary_multiply.5', 'NTU2']
    $42load_global.6 = global(temperature_effectiveness_plate: CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>)) ['$42load_global.6']
    $const52.11 = const(bool, True)          ['$const52.11']
    $56call_function_kw.13 = call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None) ['$42load_global.6', '$56call_function_kw.13', '$const52.11', 'NTU2', 'Np1', 'Np2', 'R2']
    P2 = $56call_function_kw.13              ['$56call_function_kw.13', 'P2']
    $const60.14 = const(float, 1.3)          ['$const60.14']
    $62return_value.15 = cast(value=$const60.14) ['$62return_value.15', '$const60.14']
    return $62return_value.15                ['$62return_value.15']
label 64:
    $64load_global.0 = global(ValueError: <class 'ValueError'>) ['$64load_global.0']
    $const66.1 = const(str, Supported number of passes does not have a formula available) ['$const66.1']
    $68call_function.2 = call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None) ['$64load_global.0', '$68call_function.2', '$const66.1']
    <static> raise <class 'ValueError'>('Supported number of passes does not have a formula available') []

-----------------------------------propagate------------------------------------
-----------------------------------propagate------------------------------------
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := <undecided>,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := <undecided>,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := <undecided>,
 arg.Np1 := <undecided>,
 arg.Np2 := <undecided>,
 arg.R1 := <undecided>,
 arg.reverse := <undecided>,
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
-----------------------------------propagate------------------------------------
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := <undecided>,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := <undecided>,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := <undecided>,
 arg.Np1 := <undecided>,
 arg.Np2 := <undecided>,
 arg.R1 := <undecided>,
 arg.reverse := <undecided>,
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := float64,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := float64,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := float64,
 arg.Np1 := int64,
 arg.Np2 := int64,
 arg.R1 := float64,
 arg.reverse := bool,
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
-----------------------------------propagate------------------------------------
-----------------------------------propagate------------------------------------
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := float64,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := float64,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := <undecided>,
 arg.Np1 := <undecided>,
 arg.Np2 := <undecided>,
 arg.R1 := <undecided>,
 arg.reverse := <undecided>,
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
-----------------------------------propagate------------------------------------
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := float64,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := float64,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := <undecided>,
 arg.Np1 := <undecided>,
 arg.Np2 := <undecided>,
 arg.R1 := <undecided>,
 arg.reverse := <undecided>,
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := float64,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := float64,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := float64,
 arg.Np1 := int64,
 arg.Np2 := int64,
 arg.R1 := float64,
 arg.reverse := bool,
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
---------------------------------Variable types---------------------------------
{'$14compare_op.2': bool,
 '$16pred': bool,
 '$20return_value.1': float64,
 '$24pred': bool,
 '$30binary_true_divide.2': float64,
 '$38binary_multiply.5': float64,
 '$42load_global.6': recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 '$56call_function_kw.13': float64,
 '$62return_value.15': float64,
 '$64load_global.0': ValueError,
 '$68call_function.2': ValueError(...),
 '$6compare_op.2': bool,
 '$8pred': bool,
 '$const12.1': Literal[int](1),
 '$const18.0': float64,
 '$const26.0': float64,
 '$const4.1': Literal[int](1),
 '$const52.11': bool,
 '$const60.14': float64,
 '$const66.1': Literal[str](Supported number of passes does not have a formula available),
 'NTU1': float64,
 'NTU2': float64,
 'Np1': int64,
 'Np2': int64,
 'P2': float64,
 'R1': float64,
 'R2': float64,
 'arg.NTU1': float64,
 'arg.Np1': int64,
 'arg.Np2': int64,
 'arg.R1': float64,
 'arg.reverse': bool,
 'bool16': Function(<class 'bool'>),
 'bool24': Function(<class 'bool'>),
 'bool8': Function(<class 'bool'>),
 'reverse': bool}
----------------------------------Return type-----------------------------------
float64
-----------------------------------Call types-----------------------------------
{$const26.0 / R1: (float64, float64) -> float64,
 NTU1 * R1: (float64, float64) -> float64,
 Np1 == $const4.1: (int64, int64) -> bool,
 Np2 == $const12.1: (int64, int64) -> bool,
 call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None): (float64, float64, int64, int64, bool) -> float64,
 call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None): () -> ValueError(...),
 call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None): (bool,) -> bool,
 call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None): (bool,) -> bool,
 call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None): (bool,) -> bool}
------LLVM DUMP <function descriptor 'temperature_effectiveness_plate$2'>-------
; ModuleID = "temperature_effectiveness_plate$2"
target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

@"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb" = common global i8* null
define i32 @"_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double* noalias nocapture %"retptr.1", {i8*, i32}** noalias nocapture %"excinfo.1", double %"arg.R1.1", double %"arg.NTU1.1", i64 %"arg.Np1.1", i64 %"arg.Np2.1", i8 %"arg.reverse.1") 
{
entry:
  %".9" = alloca i1
  store i1 0, i1* %".9"
  %".11" = icmp eq i8 %"arg.reverse.1", 0
  %"R1" = alloca double
  store double 0.0, double* %"R1"
  %"NTU1" = alloca double
  store double 0.0, double* %"NTU1"
  %"Np1" = alloca i64
  store i64 0, i64* %"Np1"
  %"Np2" = alloca i64
  store i64 0, i64* %"Np2"
  %"reverse" = alloca i1
  store i1 0, i1* %"reverse"
  %"$const4.1" = alloca i64
  store i64 0, i64* %"$const4.1"
  %"$6compare_op.2" = alloca i1
  store i1 0, i1* %"$6compare_op.2"
  %"bool8" = alloca i8*
  store i8* null, i8** %"bool8"
  %"$8pred" = alloca i1
  store i1 0, i1* %"$8pred"
  %"$const12.1" = alloca i64
  store i64 0, i64* %"$const12.1"
  %"$14compare_op.2" = alloca i1
  store i1 0, i1* %"$14compare_op.2"
  %"bool16" = alloca i8*
  store i8* null, i8** %"bool16"
  %"$16pred" = alloca i1
  store i1 0, i1* %"$16pred"
  %"$const18.0" = alloca double
  store double 0.0, double* %"$const18.0"
  %"$20return_value.1" = alloca double
  store double 0.0, double* %"$20return_value.1"
  %"bool24" = alloca i8*
  store i8* null, i8** %"bool24"
  %"$24pred" = alloca i1
  store i1 0, i1* %"$24pred"
  %"$const26.0" = alloca double
  store double 0.0, double* %"$const26.0"
  %"try_state" = alloca i64
  store i64 0, i64* %"try_state"
  %"$30binary_true_divide.2" = alloca double
  store double 0.0, double* %"$30binary_true_divide.2"
  %"R2" = alloca double
  store double 0.0, double* %"R2"
  %"$38binary_multiply.5" = alloca double
  store double 0.0, double* %"$38binary_multiply.5"
  %"NTU2" = alloca double
  store double 0.0, double* %"NTU2"
  %"$42load_global.6" = alloca i8*
  store i8* null, i8** %"$42load_global.6"
  %"$const52.11" = alloca i1
  store i1 0, i1* %"$const52.11"
  %".179" = alloca double
  store double 0.0, double* %".179"
  %"excinfo.2" = alloca {i8*, i32}*
  store {i8*, i32}* null, {i8*, i32}** %"excinfo.2"
  %"$56call_function_kw.13" = alloca double
  store double 0.0, double* %"$56call_function_kw.13"
  %"P2" = alloca double
  store double 0.0, double* %"P2"
  %"$const60.14" = alloca double
  store double 0.0, double* %"$const60.14"
  %"$62return_value.15" = alloca double
  store double 0.0, double* %"$62return_value.15"
  %"$64load_global.0" = alloca i8*
  store i8* null, i8** %"$64load_global.0"
  %"$const66.1" = alloca i8*
  store i8* null, i8** %"$const66.1"
  %"$68call_function.2" = alloca i8*
  store i8* null, i8** %"$68call_function.2"
  br i1 %".11", label %"entry.if", label %"entry.else"
entry.if:
  store i1 0, i1* %".9"
  br label %"entry.endif"
entry.else:
  store i1 1, i1* %".9"
  br label %"entry.endif"
entry.endif:
  %".17" = load i1, i1* %".9"
  br label %"B0"
B0:
  %".19" = load double, double* %"R1"
  store double %"arg.R1.1", double* %"R1"
  %".22" = load double, double* %"NTU1"
  store double %"arg.NTU1.1", double* %"NTU1"
  %".25" = load i64, i64* %"Np1"
  store i64 %"arg.Np1.1", i64* %"Np1"
  %".28" = load i64, i64* %"Np2"
  store i64 %"arg.Np2.1", i64* %"Np2"
  %".31" = load i1, i1* %"reverse"
  store i1 %".17", i1* %"reverse"
  %".34" = load i64, i64* %"$const4.1"
  store i64 1, i64* %"$const4.1"
  %".36" = load i64, i64* %"Np1"
  %".37" = load i64, i64* %"$const4.1"
  %".38" = icmp eq i64 %".36", 1
  %".40" = load i1, i1* %"$6compare_op.2"
  store i1 %".38", i1* %"$6compare_op.2"
  %".42" = load i64, i64* %"$const4.1"
  store i64 0, i64* %"$const4.1"
  %".45" = load i8*, i8** %"bool8"
  store i8* null, i8** %"bool8"
  %".47" = load i1, i1* %"$6compare_op.2"
  %".49" = load i1, i1* %"$8pred"
  store i1 %".47", i1* %"$8pred"
  %".51" = load i8*, i8** %"bool8"
  store i8* null, i8** %"bool8"
  %".53" = load i1, i1* %"$6compare_op.2"
  store i1 0, i1* %"$6compare_op.2"
  %".55" = load i1, i1* %"$8pred"
  br i1 %".55", label %"B10", label %"B22"
B10:
  %".57" = load i1, i1* %"$8pred"
  store i1 0, i1* %"$8pred"
  %".60" = load i64, i64* %"$const12.1"
  store i64 1, i64* %"$const12.1"
  %".62" = load i64, i64* %"Np2"
  %".63" = load i64, i64* %"$const12.1"
  %".64" = icmp eq i64 %".62", 1
  %".66" = load i1, i1* %"$14compare_op.2"
  store i1 %".64", i1* %"$14compare_op.2"
  %".68" = load i64, i64* %"$const12.1"
  store i64 0, i64* %"$const12.1"
  %".71" = load i8*, i8** %"bool16"
  store i8* null, i8** %"bool16"
  %".73" = load i1, i1* %"$14compare_op.2"
  %".75" = load i1, i1* %"$16pred"
  store i1 %".73", i1* %"$16pred"
  %".77" = load i8*, i8** %"bool16"
  store i8* null, i8** %"bool16"
  %".79" = load i1, i1* %"$14compare_op.2"
  store i1 0, i1* %"$14compare_op.2"
  %".81" = load i1, i1* %"$16pred"
  br i1 %".81", label %"B18", label %"B22"
B18:
  %".83" = load i1, i1* %"reverse"
  store i1 0, i1* %"reverse"
  %".85" = load double, double* %"R1"
  store double 0.0, double* %"R1"
  %".87" = load i64, i64* %"Np2"
  store i64 0, i64* %"Np2"
  %".89" = load i64, i64* %"Np1"
  store i64 0, i64* %"Np1"
  %".91" = load double, double* %"NTU1"
  store double 0.0, double* %"NTU1"
  %".93" = load i1, i1* %"$16pred"
  store i1 0, i1* %"$16pred"
  %".96" = load double, double* %"$const18.0"
  store double 0x3ff199999999999a, double* %"$const18.0"
  %".98" = load double, double* %"$const18.0"
  %".100" = load double, double* %"$20return_value.1"
  store double %".98", double* %"$20return_value.1"
  %".102" = load double, double* %"$const18.0"
  store double 0.0, double* %"$const18.0"
  %".104" = load double, double* %"$20return_value.1"
  store double %".104", double* %"retptr.1"
  ret i32 0
B22:
  %".107" = load i1, i1* %"$8pred"
  store i1 0, i1* %"$8pred"
  %".109" = load i1, i1* %"$16pred"
  store i1 0, i1* %"$16pred"
  %".112" = load i8*, i8** %"bool24"
  store i8* null, i8** %"bool24"
  %".114" = load i1, i1* %"reverse"
  %".116" = load i1, i1* %"$24pred"
  store i1 %".114", i1* %"$24pred"
  %".118" = load i1, i1* %"reverse"
  store i1 0, i1* %"reverse"
  %".120" = load i8*, i8** %"bool24"
  store i8* null, i8** %"bool24"
  %".122" = load i1, i1* %"$24pred"
  br i1 %".122", label %"B64", label %"B26"
B26:
  %".124" = load i1, i1* %"$24pred"
  store i1 0, i1* %"$24pred"
  %".127" = load double, double* %"$const26.0"
  store double 0x3ff0000000000000, double* %"$const26.0"
  %".129" = load double, double* %"$const26.0"
  %".130" = load double, double* %"R1"
  %".131" = fcmp oeq double %".130",              0x0
  br i1 %".131", label %"B26.if", label %"B26.endif", !prof !0
B64:
  %".239" = load double, double* %"R1"
  store double 0.0, double* %"R1"
  %".241" = load i64, i64* %"Np2"
  store i64 0, i64* %"Np2"
  %".243" = load i64, i64* %"Np1"
  store i64 0, i64* %"Np1"
  %".245" = load double, double* %"NTU1"
  store double 0.0, double* %"NTU1"
  %".247" = load i1, i1* %"$24pred"
  store i1 0, i1* %"$24pred"
  %".250" = load i8*, i8** %"$64load_global.0"
  store i8* null, i8** %"$64load_global.0"
  %".253" = load i8*, i8** %"$const66.1"
  store i8* null, i8** %"$const66.1"
  %".256" = load i8*, i8** %"$68call_function.2"
  store i8* null, i8** %"$68call_function.2"
  %".258" = load i8*, i8** %"$const66.1"
  store i8* null, i8** %"$const66.1"
  %".260" = load i8*, i8** %"$68call_function.2"
  store i8* null, i8** %"$68call_function.2"
  %".262" = load i8*, i8** %"$64load_global.0"
  store i8* null, i8** %"$64load_global.0"
  store {i8*, i32}* @".const.picklebuf.140612147179104", {i8*, i32}** %"excinfo.1"
  %".265" = load i64, i64* %"try_state"
  %".266" = icmp ugt i64 %".265", 0
  %".267" = load {i8*, i32}*, {i8*, i32}** %"excinfo.1"
  ret i32 1
B26.if:
  store {i8*, i32}* @".const.picklebuf.140612147179184", {i8*, i32}** %"excinfo.1"
  store i64 0, i64* %"try_state"
  %".136" = load i64, i64* %"try_state"
  %".137" = icmp ugt i64 %".136", 0
  %".138" = load {i8*, i32}*, {i8*, i32}** %"excinfo.1"
  ret i32 1
B26.endif:
  %".140" = fdiv double %".129", %".130"
  %".142" = load double, double* %"$30binary_true_divide.2"
  store double %".140", double* %"$30binary_true_divide.2"
  %".144" = load double, double* %"$const26.0"
  store double 0.0, double* %"$const26.0"
  %".146" = load double, double* %"$30binary_true_divide.2"
  %".148" = load double, double* %"R2"
  store double %".146", double* %"R2"
  %".150" = load double, double* %"$30binary_true_divide.2"
  store double 0.0, double* %"$30binary_true_divide.2"
  %".152" = load double, double* %"NTU1"
  %".153" = load double, double* %"R1"
  %".154" = fmul double %".152", %".153"
  %".156" = load double, double* %"$38binary_multiply.5"
  store double %".154", double* %"$38binary_multiply.5"
  %".158" = load double, double* %"R1"
  store double 0.0, double* %"R1"
  %".160" = load double, double* %"NTU1"
  store double 0.0, double* %"NTU1"
  %".162" = load double, double* %"$38binary_multiply.5"
  %".164" = load double, double* %"NTU2"
  store double %".162", double* %"NTU2"
  %".166" = load double, double* %"$38binary_multiply.5"
  store double 0.0, double* %"$38binary_multiply.5"
  %".169" = load i8*, i8** %"$42load_global.6"
  store i8* null, i8** %"$42load_global.6"
  %".172" = load i1, i1* %"$const52.11"
  store i1 true, i1* %"$const52.11"
  %".174" = load double, double* %"R2"
  %".175" = load double, double* %"NTU2"
  %".176" = load i64, i64* %"Np2"
  %".177" = load i64, i64* %"Np1"
  %".178" = load i1, i1* %"$const52.11"
  store double 0.0, double* %".179"
  %".183" = zext i1 %".178" to i8
  %".184" = call i32 @"_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double* %".179", {i8*, i32}** %"excinfo.2", double %".174", double %".175", i64 %".176", i64 %".177", i8 %".183")
  %".185" = load {i8*, i32}*, {i8*, i32}** %"excinfo.2"
  %".186" = icmp eq i32 %".184", 0
  %".187" = icmp eq i32 %".184", -2
  %".188" = icmp eq i32 %".184", -1
  %".189" = icmp eq i32 %".184", -3
  %".190" = or i1 %".186", %".187"
  %".191" = xor i1 %".190", -1
  %".192" = icmp sge i32 %".184", 1
  %".193" = select i1 %".192", {i8*, i32}* %".185", {i8*, i32}* undef
  %".194" = load double, double* %".179"
  br i1 %".191", label %"B26.endif.if", label %"B26.endif.endif", !prof !0
B26.endif.if:
  %".196" = load i64, i64* %"try_state"
  %".197" = icmp ugt i64 %".196", 0
  %".198" = load {i8*, i32}*, {i8*, i32}** %"excinfo.1"
  store {i8*, i32}* %".193", {i8*, i32}** %"excinfo.1"
  %".200" = xor i1 %".197", -1
  br i1 %".200", label %"B26.endif.if.if", label %"B26.endif.if.endif"
B26.endif.endif:
  %".205" = load double, double* %"$56call_function_kw.13"
  store double %".194", double* %"$56call_function_kw.13"
  %".207" = load double, double* %"R2"
  store double 0.0, double* %"R2"
  %".209" = load i64, i64* %"Np2"
  store i64 0, i64* %"Np2"
  %".211" = load i64, i64* %"Np1"
  store i64 0, i64* %"Np1"
  %".213" = load double, double* %"NTU2"
  store double 0.0, double* %"NTU2"
  %".215" = load i1, i1* %"$const52.11"
  store i1 0, i1* %"$const52.11"
  %".217" = load i8*, i8** %"$42load_global.6"
  store i8* null, i8** %"$42load_global.6"
  %".219" = load double, double* %"$56call_function_kw.13"
  %".221" = load double, double* %"P2"
  store double %".219", double* %"P2"
  %".223" = load double, double* %"P2"
  store double 0.0, double* %"P2"
  %".225" = load double, double* %"$56call_function_kw.13"
  store double 0.0, double* %"$56call_function_kw.13"
  %".228" = load double, double* %"$const60.14"
  store double 0x3ff4cccccccccccd, double* %"$const60.14"
  %".230" = load double, double* %"$const60.14"
  %".232" = load double, double* %"$62return_value.15"
  store double %".230", double* %"$62return_value.15"
  %".234" = load double, double* %"$const60.14"
  store double 0.0, double* %"$const60.14"
  %".236" = load double, double* %"$62return_value.15"
  store double %".236", double* %"retptr.1"
  ret i32 0
B26.endif.if.if:
  ret i32 %".184"
B26.endif.if.endif:
  br label %"B26.endif.endif"
}

@".const.pickledata.140612147179184" = internal constant [69 x i8] c"\80\04\95:\00\00\00\00\00\00\00\8c\08builtins\94\8c\11ZeroDivisionError\94\93\94\8c\10division by zero\94\85\94N\87\94."
@".const.picklebuf.140612147179184" = internal constant {i8*, i32} {i8* bitcast ([69 x i8]* @".const.pickledata.140612147179184" to i8*), i32 69}
@".const.pickledata.140612147179104" = internal constant [163 x i8] c"\80\04\95\98\00\00\00\00\00\00\00\8c\08builtins\94\8c\0aValueError\94\93\94\8c<Supported number of passes does not have a formula available\94\85\94\8c\1ftemperature_effectiveness_plate\94\8c\11issue2_minimal.py\94K\0d\87\94\87\94."
@".const.picklebuf.140612147179104" = internal constant {i8*, i32} {i8* bitcast ([163 x i8]* @".const.pickledata.140612147179104" to i8*), i32 163}
!0 = !{ !"branch_weights", i32 1, i32 99 }
================================================================================
================================================================================
------------FUNCTION OPTIMIZED DUMP temperature_effectiveness_plate-------------
; ModuleID = 'temperature_effectiveness_plate'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb" = common global i8* null
@.const.picklebuf.140612147179104 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([163 x i8], [163 x i8]* @.const.pickledata.140612147179104, i32 0, i32 0), i32 163 }
@.const.picklebuf.140612147179184 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([69 x i8], [69 x i8]* @.const.pickledata.140612147179184, i32 0, i32 0), i32 69 }
@.const.pickledata.140612147179184 = internal constant [69 x i8] c"\80\04\95:\00\00\00\00\00\00\00\8C\08builtins\94\8C\11ZeroDivisionError\94\93\94\8C\10division by zero\94\85\94N\87\94."
@.const.pickledata.140612147179104 = internal constant [163 x i8] c"\80\04\95\98\00\00\00\00\00\00\00\8C\08builtins\94\8C\0AValueError\94\93\94\8C<Supported number of passes does not have a formula available\94\85\94\8C\1Ftemperature_effectiveness_plate\94\8C\11issue2_minimal.py\94K\0D\87\94\87\94."
@.const.temperature_effectiveness_plate = internal constant [32 x i8] c"temperature_effectiveness_plate\00"
@PyExc_RuntimeError = external global i8
@".const.missing Environment" = internal constant [20 x i8] c"missing Environment\00"
@_Py_NoneStruct = external global i8
@PyExc_StopIteration = external global i8
@PyExc_SystemError = external global i8
@".const.unknown error when calling native function" = internal constant [43 x i8] c"unknown error when calling native function\00"
@".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>" = internal constant [53 x i8] c"<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>\00"
@".const.unknown error when calling native function.1" = internal constant [43 x i8] c"unknown error when calling native function\00"

define i32 @"_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double* noalias nocapture %retptr.1, { i8*, i32 }** noalias nocapture %excinfo.1, double %arg.R1.1, double %arg.NTU1.1, i64 %arg.Np1.1, i64 %arg.Np2.1, i8 %arg.reverse.1) {
entry:
  %.11 = icmp eq i8 %arg.reverse.1, 0
  %.179 = alloca double
  store double 0.000000e+00, double* %.179
  %excinfo.2 = alloca { i8*, i32 }*
  store { i8*, i32 }* null, { i8*, i32 }** %excinfo.2
  br i1 %.11, label %entry.if, label %entry.else

entry.if:                                         ; preds = %entry
  br label %entry.endif

entry.else:                                       ; preds = %entry
  br label %entry.endif

entry.endif:                                      ; preds = %entry.else, %entry.if
  %.9.0 = phi i1 [ false, %entry.if ], [ true, %entry.else ]
  %.38 = icmp eq i64 %arg.Np1.1, 1
  br i1 %.38, label %B10, label %B22

B10:                                              ; preds = %entry.endif
  %.64 = icmp eq i64 %arg.Np2.1, 1
  br i1 %.64, label %B18, label %B22

B18:                                              ; preds = %B10
  store double 1.100000e+00, double* %retptr.1
  ret i32 0

B22:                                              ; preds = %B10, %entry.endif
  br i1 %.9.0, label %B64, label %B26

B26:                                              ; preds = %B22
  %.131 = fcmp oeq double %arg.R1.1, 0.000000e+00
  br i1 %.131, label %B26.if, label %B26.endif, !prof !0

B64:                                              ; preds = %B22
  store { i8*, i32 }* @.const.picklebuf.140612147179104, { i8*, i32 }** %excinfo.1
  ret i32 1

B26.if:                                           ; preds = %B26
  store { i8*, i32 }* @.const.picklebuf.140612147179184, { i8*, i32 }** %excinfo.1
  ret i32 1

B26.endif:                                        ; preds = %B26
  %.140 = fdiv double 1.000000e+00, %arg.R1.1
  %.154 = fmul double %arg.NTU1.1, %arg.R1.1
  store double 0.000000e+00, double* %.179
  %.184 = call i32 @"_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double* %.179, { i8*, i32 }** %excinfo.2, double %.140, double %.154, i64 %arg.Np2.1, i64 %arg.Np1.1, i8 1)
  %.185 = load { i8*, i32 }*, { i8*, i32 }** %excinfo.2
  %.186 = icmp eq i32 %.184, 0
  %.187 = icmp eq i32 %.184, -2
  %.190 = or i1 %.186, %.187
  %.191 = xor i1 %.190, true
  %.192 = icmp sge i32 %.184, 1
  br i1 %.191, label %B26.endif.if, label %B26.endif.endif, !prof !0

B26.endif.if:                                     ; preds = %B26.endif
  store { i8*, i32 }* %.185, { i8*, i32 }** %excinfo.1
  br i1 true, label %B26.endif.if.if, label %B26.endif.endif

B26.endif.endif:                                  ; preds = %B26.endif.if, %B26.endif
  store double 1.300000e+00, double* %retptr.1
  ret i32 0

B26.endif.if.if:                                  ; preds = %B26.endif.if
  ret i32 %.184
}

define i8* @"_ZN7cpython8__main__35temperature_effectiveness_plate$242Eddxxb"(i8* %py_closure, i8* %py_args, i8* %py_kws) {
entry:
  %.5 = alloca i8*
  %.6 = alloca i8*
  %.7 = alloca i8*
  %.8 = alloca i8*
  %.9 = alloca i8*
  %.10 = call i32 (i8*, i8*, i64, i64, ...) @PyArg_UnpackTuple(i8* %py_args, i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.const.temperature_effectiveness_plate, i32 0, i32 0), i64 5, i64 5, i8** %.5, i8** %.6, i8** %.7, i8** %.8, i8** %.9)
  %.11 = icmp eq i32 %.10, 0
  %.82 = alloca double
  store double 0.000000e+00, double* %.82
  %excinfo = alloca { i8*, i32 }*
  store { i8*, i32 }* null, { i8*, i32 }** %excinfo
  br i1 %.11, label %entry.if, label %entry.endif, !prof !0

entry.if:                                         ; preds = %entry.endif.endif.endif.e...endif.endif.endif, %entry.endif.endif.endif.e...endif.endif.if, %entry.endif.endif.endif.e...endif.endif.if.if, %entry.endif.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif, %entry.endif.endif.endif, %entry.endif.endif, %entry.endif.endif.endif.e...endif.endif.endif.if, %entry.endif.endif.endif.e...endif.1, %entry
  ret i8* null

entry.endif:                                      ; preds = %entry
  %.15 = load i8*, i8** @"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb"
  %.16 = ptrtoint i8* %.15 to i64
  %.17 = add i64 %.16, 16
  %.18 = inttoptr i64 %.17 to i8*
  %.20 = icmp eq i8* null, %.15
  br i1 %.20, label %entry.endif.if, label %entry.endif.endif, !prof !0

entry.endif.if:                                   ; preds = %entry.endif
  call void @PyErr_SetString(i8* @PyExc_RuntimeError, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @".const.missing Environment", i32 0, i32 0))
  ret i8* null

entry.endif.endif:                                ; preds = %entry.endif
  %.24 = load i8*, i8** %.5
  %.25 = call i8* @PyNumber_Float(i8* %.24)
  %.26 = call double @PyFloat_AsDouble(i8* %.25)
  call void @Py_DecRef(i8* %.25)
  %.28 = call i8* @PyErr_Occurred()
  %.29 = icmp ne i8* null, %.28
  br i1 %.29, label %entry.if, label %entry.endif.endif.endif, !prof !0

entry.endif.endif.endif:                          ; preds = %entry.endif.endif
  %.33 = load i8*, i8** %.6
  %.34 = call i8* @PyNumber_Float(i8* %.33)
  %.35 = call double @PyFloat_AsDouble(i8* %.34)
  call void @Py_DecRef(i8* %.34)
  %.37 = call i8* @PyErr_Occurred()
  %.38 = icmp ne i8* null, %.37
  br i1 %.38, label %entry.if, label %entry.endif.endif.endif.endif, !prof !0

entry.endif.endif.endif.endif:                    ; preds = %entry.endif.endif.endif
  %.42 = load i8*, i8** %.7
  %.45 = call i8* @PyNumber_Long(i8* %.42)
  %.46 = icmp ne i8* null, %.45
  br i1 %.46, label %entry.endif.endif.endif.endif.if, label %entry.endif.endif.endif.endif.endif, !prof !1

entry.endif.endif.endif.endif.if:                 ; preds = %entry.endif.endif.endif.endif
  %.48 = call i64 @PyLong_AsLongLong(i8* %.45)
  call void @Py_DecRef(i8* %.45)
  br label %entry.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif:              ; preds = %entry.endif.endif.endif.endif.if, %entry.endif.endif.endif.endif
  %.43.0 = phi i64 [ %.48, %entry.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif ]
  %.53 = call i8* @PyErr_Occurred()
  %.54 = icmp ne i8* null, %.53
  br i1 %.54, label %entry.if, label %entry.endif.endif.endif.endif.endif.endif, !prof !0

entry.endif.endif.endif.endif.endif.endif:        ; preds = %entry.endif.endif.endif.endif.endif
  %.58 = load i8*, i8** %.8
  %.61 = call i8* @PyNumber_Long(i8* %.58)
  %.62 = icmp ne i8* null, %.61
  br i1 %.62, label %entry.endif.endif.endif.endif.endif.endif.if, label %entry.endif.endif.endif.endif.endif.endif.endif, !prof !1

entry.endif.endif.endif.endif.endif.endif.if:     ; preds = %entry.endif.endif.endif.endif.endif.endif
  %.64 = call i64 @PyLong_AsLongLong(i8* %.61)
  call void @Py_DecRef(i8* %.61)
  br label %entry.endif.endif.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif.endif.endif:  ; preds = %entry.endif.endif.endif.endif.endif.endif.if, %entry.endif.endif.endif.endif.endif.endif
  %.59.0 = phi i64 [ %.64, %entry.endif.endif.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif.endif.endif ]
  %.69 = call i8* @PyErr_Occurred()
  %.70 = icmp ne i8* null, %.69
  br i1 %.70, label %entry.if, label %entry.endif.endif.endif.endif.endif.endif.endif.endif, !prof !0

entry.endif.endif.endif.endif.endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.endif.endif.endif.endif
  %.74 = load i8*, i8** %.9
  %.75 = call i32 @PyObject_IsTrue(i8* %.74)
  %.76 = icmp ne i32 %.75, 0
  %.77 = call i8* @PyErr_Occurred()
  %.78 = icmp ne i8* null, %.77
  br i1 %.78, label %entry.if, label %entry.endif.endif.endif.e...endif, !prof !0

entry.endif.endif.endif.e...endif:                ; preds = %entry.endif.endif.endif.endif.endif.endif.endif.endif
  store double 0.000000e+00, double* %.82
  %.86 = zext i1 %.76 to i8
  %.87 = call i32 @"_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double* %.82, { i8*, i32 }** %excinfo, double %.26, double %.35, i64 %.43.0, i64 %.59.0, i8 %.86)
  %.88 = load { i8*, i32 }*, { i8*, i32 }** %excinfo
  %.89 = icmp eq i32 %.87, 0
  %.90 = icmp eq i32 %.87, -2
  %.93 = or i1 %.89, %.90
  %.95 = icmp sge i32 %.87, 1
  %.97 = load double, double* %.82
  switch i32 %.87, label %entry.endif.endif.endif.e...endif.endif [
    i32 -2, label %entry.endif.endif.endif.e...endif.if
    i32 0, label %entry.endif.endif.endif.e...endif.if
  ]

entry.endif.endif.endif.e...endif.if:             ; preds = %entry.endif.endif.endif.e...endif, %entry.endif.endif.endif.e...endif
  br i1 %.90, label %entry.endif.endif.endif.e...endif.if.if, label %entry.endif.endif.endif.e...endif.if.endif

entry.endif.endif.endif.e...endif.endif:          ; preds = %entry.endif.endif.endif.e...endif
  br i1 %.95, label %entry.endif.endif.endif.e...endif.endif.if, label %entry.endif.endif.endif.e...endif.endif.endif

entry.endif.endif.endif.e...endif.if.if:          ; preds = %entry.endif.endif.endif.e...endif.if
  call void @Py_IncRef(i8* @_Py_NoneStruct)
  ret i8* @_Py_NoneStruct

entry.endif.endif.endif.e...endif.if.endif:       ; preds = %entry.endif.endif.endif.e...endif.if
  %.102 = call i8* @PyFloat_FromDouble(double %.97)
  ret i8* %.102

entry.endif.endif.endif.e...endif.endif.if:       ; preds = %entry.endif.endif.endif.e...endif.endif
  call void @PyErr_Clear()
  %.107 = load { i8*, i32 }, { i8*, i32 }* %.88
  %.108 = extractvalue { i8*, i32 } %.107, 0
  %.110 = extractvalue { i8*, i32 } %.107, 1
  %.111 = call i8* @numba_unpickle(i8* %.108, i32 %.110)
  %.112 = icmp ne i8* null, %.111
  br i1 %.112, label %entry.endif.endif.endif.e...endif.endif.if.if, label %entry.if, !prof !1

entry.endif.endif.endif.e...endif.endif.endif:    ; preds = %entry.endif.endif.endif.e...endif.endif
  switch i32 %.87, label %entry.endif.endif.endif.e...endif.1 [
    i32 -3, label %entry.endif.endif.endif.e...endif.endif.endif.if
    i32 -1, label %entry.if
  ]

entry.endif.endif.endif.e...endif.endif.if.if:    ; preds = %entry.endif.endif.endif.e...endif.endif.if
  call void @numba_do_raise(i8* %.111)
  br label %entry.if

entry.endif.endif.endif.e...endif.endif.endif.if: ; preds = %entry.endif.endif.endif.e...endif.endif.endif
  call void @PyErr_SetNone(i8* @PyExc_StopIteration)
  br label %entry.if

entry.endif.endif.endif.e...endif.1:              ; preds = %entry.endif.endif.endif.e...endif.endif.endif
  call void @PyErr_SetString(i8* @PyExc_SystemError, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @".const.unknown error when calling native function", i32 0, i32 0))
  br label %entry.if
}

declare i32 @PyArg_UnpackTuple(i8*, i8*, i64, i64, ...)

declare void @PyErr_SetString(i8*, i8*)

declare i8* @PyNumber_Float(i8*)

declare double @PyFloat_AsDouble(i8*)

declare void @Py_DecRef(i8*)

declare i8* @PyErr_Occurred()

declare i8* @PyNumber_Long(i8*)

declare i64 @PyLong_AsLongLong(i8*)

declare i32 @PyObject_IsTrue(i8*)

declare void @Py_IncRef(i8*)

declare i8* @PyFloat_FromDouble(double)

declare void @PyErr_Clear()

declare i8* @numba_unpickle(i8*, i32)

declare void @numba_do_raise(i8*)

declare void @PyErr_SetNone(i8*)

define double @"cfunc._ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double %.1, double %.2, i64 %.3, i64 %.4, i1 %.5) {
entry:
  %.7 = alloca double
  store double 0.000000e+00, double* %.7
  %excinfo = alloca { i8*, i32 }*
  store { i8*, i32 }* null, { i8*, i32 }** %excinfo
  %.11 = zext i1 %.5 to i8
  %.12 = call i32 @"_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double* %.7, { i8*, i32 }** %excinfo, double %.1, double %.2, i64 %.3, i64 %.4, i8 %.11)
  %.13 = load { i8*, i32 }*, { i8*, i32 }** %excinfo
  %.14 = icmp eq i32 %.12, 0
  %.15 = icmp eq i32 %.12, -2
  %.18 = or i1 %.14, %.15
  %.19 = xor i1 %.18, true
  %.20 = icmp sge i32 %.12, 1
  %.22 = load double, double* %.7
  %.24 = alloca i32
  store i32 0, i32* %.24
  br i1 %.19, label %entry.if, label %entry.endif, !prof !0

entry.if:                                         ; preds = %entry
  call void @numba_gil_ensure(i32* %.24)
  br i1 %.20, label %entry.if.if, label %entry.if.endif

entry.endif:                                      ; preds = %.27, %entry
  ret double %.22

.27:                                              ; preds = %entry.if.endif, %entry.if.if, %entry.if.if.if, %entry.if.endif.endif.endif, %entry.if.endif.if
  %.47 = call i8* @PyUnicode_FromString(i8* getelementptr inbounds ([53 x i8], [53 x i8]* @".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>", i32 0, i32 0))
  call void @PyErr_WriteUnraisable(i8* %.47)
  call void @Py_DecRef(i8* %.47)
  call void @numba_gil_release(i32* %.24)
  br label %entry.endif

entry.if.if:                                      ; preds = %entry.if
  call void @PyErr_Clear()
  %.30 = load { i8*, i32 }, { i8*, i32 }* %.13
  %.31 = extractvalue { i8*, i32 } %.30, 0
  %.33 = extractvalue { i8*, i32 } %.30, 1
  %.34 = call i8* @numba_unpickle(i8* %.31, i32 %.33)
  %.35 = icmp ne i8* null, %.34
  br i1 %.35, label %entry.if.if.if, label %.27, !prof !1

entry.if.endif:                                   ; preds = %entry.if
  switch i32 %.12, label %entry.if.endif.endif.endif [
    i32 -3, label %entry.if.endif.if
    i32 -1, label %.27
  ]

entry.if.if.if:                                   ; preds = %entry.if.if
  call void @numba_do_raise(i8* %.34)
  br label %.27

entry.if.endif.if:                                ; preds = %entry.if.endif
  call void @PyErr_SetNone(i8* @PyExc_StopIteration)
  br label %.27

entry.if.endif.endif.endif:                       ; preds = %entry.if.endif
  call void @PyErr_SetString(i8* @PyExc_SystemError, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @".const.unknown error when calling native function.1", i32 0, i32 0))
  br label %.27
}

declare void @numba_gil_ensure(i32*)

declare i8* @PyUnicode_FromString(i8*)

declare void @PyErr_WriteUnraisable(i8*)

declare void @numba_gil_release(i32*)

!0 = !{!"branch_weights", i32 1, i32 99}
!1 = !{!"branch_weights", i32 99, i32 1}

================================================================================
================================================================================
-----------------OPTIMIZED DUMP temperature_effectiveness_plate-----------------
; ModuleID = 'temperature_effectiveness_plate'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb" = common local_unnamed_addr global i8* null
@.const.picklebuf.140612147179104 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([163 x i8], [163 x i8]* @.const.pickledata.140612147179104, i32 0, i32 0), i32 163 }
@.const.picklebuf.140612147179184 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([69 x i8], [69 x i8]* @.const.pickledata.140612147179184, i32 0, i32 0), i32 69 }
@.const.pickledata.140612147179184 = internal constant [69 x i8] c"\80\04\95:\00\00\00\00\00\00\00\8C\08builtins\94\8C\11ZeroDivisionError\94\93\94\8C\10division by zero\94\85\94N\87\94."
@.const.pickledata.140612147179104 = internal constant [163 x i8] c"\80\04\95\98\00\00\00\00\00\00\00\8C\08builtins\94\8C\0AValueError\94\93\94\8C<Supported number of passes does not have a formula available\94\85\94\8C\1Ftemperature_effectiveness_plate\94\8C\11issue2_minimal.py\94K\0D\87\94\87\94."
@.const.temperature_effectiveness_plate = internal constant [32 x i8] c"temperature_effectiveness_plate\00"
@PyExc_RuntimeError = external global i8
@".const.missing Environment" = internal constant [20 x i8] c"missing Environment\00"
@".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>" = internal constant [53 x i8] c"<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>\00"

; Function Attrs: nounwind writeonly
define i32 @"_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double* noalias nocapture %retptr.1, { i8*, i32 }** noalias nocapture %excinfo.1, double %arg.R1.1, double %arg.NTU1.1, i64 %arg.Np1.1, i64 %arg.Np2.1, i8 %arg.reverse.1) local_unnamed_addr #0 {
entry:
  %.38 = icmp eq i64 %arg.Np1.1, 1
  %.64 = icmp eq i64 %arg.Np2.1, 1
  %or.cond = and i1 %.38, %.64
  br i1 %or.cond, label %B18, label %B22

B18:                                              ; preds = %entry
  store double 1.100000e+00, double* %retptr.1, align 8
  ret i32 0

B22:                                              ; preds = %entry
  %.11 = icmp eq i8 %arg.reverse.1, 0
  br i1 %.11, label %B26, label %B64

B26:                                              ; preds = %B22
  %.131 = fcmp oeq double %arg.R1.1, 0.000000e+00
  br i1 %.131, label %B26.if, label %B26.endif.if, !prof !0

B64:                                              ; preds = %B22
  store { i8*, i32 }* @.const.picklebuf.140612147179104, { i8*, i32 }** %excinfo.1, align 8
  ret i32 1

B26.if:                                           ; preds = %B26
  store { i8*, i32 }* @.const.picklebuf.140612147179184, { i8*, i32 }** %excinfo.1, align 8
  ret i32 1

B26.endif.if:                                     ; preds = %B26
  %0 = bitcast { i8*, i32 }** %excinfo.1 to i64*
  store i64 ptrtoint ({ i8*, i32 }* @.const.picklebuf.140612147179104 to i64), i64* %0, align 8
  ret i32 1
}

define i8* @"_ZN7cpython8__main__35temperature_effectiveness_plate$242Eddxxb"(i8* nocapture readnone %py_closure, i8* %py_args, i8* nocapture readnone %py_kws) local_unnamed_addr {
entry:
  %.5 = alloca i8*, align 8
  %.6 = alloca i8*, align 8
  %.7 = alloca i8*, align 8
  %.8 = alloca i8*, align 8
  %.9 = alloca i8*, align 8
  %.10 = call i32 (i8*, i8*, i64, i64, ...) @PyArg_UnpackTuple(i8* %py_args, i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.const.temperature_effectiveness_plate, i64 0, i64 0), i64 5, i64 5, i8** nonnull %.5, i8** nonnull %.6, i8** nonnull %.7, i8** nonnull %.8, i8** nonnull %.9)
  %.11 = icmp eq i32 %.10, 0
  br i1 %.11, label %entry.if, label %entry.endif, !prof !0

entry.if:                                         ; preds = %entry.endif.endif.endif.e...endif.endif.if, %entry.endif.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif, %entry.endif.endif.endif, %entry.endif.endif, %entry.endif.endif.endif.e...endif.endif.if.if, %entry
  ret i8* null

entry.endif:                                      ; preds = %entry
  %.15 = load i8*, i8** @"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb", align 8
  %.20 = icmp eq i8* %.15, null
  br i1 %.20, label %entry.endif.if, label %entry.endif.endif, !prof !0

entry.endif.if:                                   ; preds = %entry.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_RuntimeError, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @".const.missing Environment", i64 0, i64 0))
  ret i8* null

entry.endif.endif:                                ; preds = %entry.endif
  %.24 = load i8*, i8** %.5, align 8
  %.25 = call i8* @PyNumber_Float(i8* %.24)
  %.26 = call double @PyFloat_AsDouble(i8* %.25)
  call void @Py_DecRef(i8* %.25)
  %.28 = call i8* @PyErr_Occurred()
  %.29 = icmp eq i8* %.28, null
  br i1 %.29, label %entry.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif:                          ; preds = %entry.endif.endif
  %.33 = load i8*, i8** %.6, align 8
  %.34 = call i8* @PyNumber_Float(i8* %.33)
  %.35 = call double @PyFloat_AsDouble(i8* %.34)
  call void @Py_DecRef(i8* %.34)
  %.37 = call i8* @PyErr_Occurred()
  %.38 = icmp eq i8* %.37, null
  br i1 %.38, label %entry.endif.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif.endif:                    ; preds = %entry.endif.endif.endif
  %.42 = load i8*, i8** %.7, align 8
  %.45 = call i8* @PyNumber_Long(i8* %.42)
  %.46 = icmp eq i8* %.45, null
  br i1 %.46, label %entry.endif.endif.endif.endif.endif, label %entry.endif.endif.endif.endif.if, !prof !0

entry.endif.endif.endif.endif.if:                 ; preds = %entry.endif.endif.endif.endif
  %.48 = call i64 @PyLong_AsLongLong(i8* nonnull %.45)
  call void @Py_DecRef(i8* nonnull %.45)
  br label %entry.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif:              ; preds = %entry.endif.endif.endif.endif, %entry.endif.endif.endif.endif.if
  %.43.0 = phi i64 [ %.48, %entry.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif ]
  %.53 = call i8* @PyErr_Occurred()
  %.54 = icmp eq i8* %.53, null
  br i1 %.54, label %entry.endif.endif.endif.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif.endif.endif.endif:        ; preds = %entry.endif.endif.endif.endif.endif
  %.58 = load i8*, i8** %.8, align 8
  %.61 = call i8* @PyNumber_Long(i8* %.58)
  %.62 = icmp eq i8* %.61, null
  br i1 %.62, label %entry.endif.endif.endif.endif.endif.endif.endif, label %entry.endif.endif.endif.endif.endif.endif.if, !prof !0

entry.endif.endif.endif.endif.endif.endif.if:     ; preds = %entry.endif.endif.endif.endif.endif.endif
  %.64 = call i64 @PyLong_AsLongLong(i8* nonnull %.61)
  call void @Py_DecRef(i8* nonnull %.61)
  br label %entry.endif.endif.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif.endif.endif:  ; preds = %entry.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif.endif.if
  %.59.0 = phi i64 [ %.64, %entry.endif.endif.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif.endif.endif ]
  %.69 = call i8* @PyErr_Occurred()
  %.70 = icmp eq i8* %.69, null
  br i1 %.70, label %entry.endif.endif.endif.endif.endif.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif.endif.endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.endif.endif.endif.endif
  %.74 = load i8*, i8** %.9, align 8
  %.75 = call i32 @PyObject_IsTrue(i8* %.74)
  %.77 = call i8* @PyErr_Occurred()
  %.78 = icmp eq i8* %.77, null
  br i1 %.78, label %entry.endif.endif.endif.e...endif, label %entry.if, !prof !1

entry.endif.endif.endif.e...endif:                ; preds = %entry.endif.endif.endif.endif.endif.endif.endif.endif
  %.38.i = icmp eq i64 %.43.0, 1
  %.64.i = icmp eq i64 %.59.0, 1
  %or.cond.i = and i1 %.38.i, %.64.i
  br i1 %or.cond.i, label %entry.endif.endif.endif.e...endif.if.endif, label %B22.i

B22.i:                                            ; preds = %entry.endif.endif.endif.e...endif
  %.76 = icmp eq i32 %.75, 0
  br i1 %.76, label %B26.i, label %entry.endif.endif.endif.e...endif.endif.if

B26.i:                                            ; preds = %B22.i
  %.131.i = fcmp oeq double %.26, 0.000000e+00
  br i1 %.131.i, label %entry.endif.endif.endif.e...endif.endif.if, label %B26.endif.if.i, !prof !0

B26.endif.if.i:                                   ; preds = %B26.i
  br label %entry.endif.endif.endif.e...endif.endif.if

entry.endif.endif.endif.e...endif.if.endif:       ; preds = %entry.endif.endif.endif.e...endif
  %.102 = call i8* @PyFloat_FromDouble(double 1.100000e+00)
  ret i8* %.102

entry.endif.endif.endif.e...endif.endif.if:       ; preds = %B26.i, %B22.i, %B26.endif.if.i
  %excinfo.sroa.0.0.ph = phi i64 [ ptrtoint ({ i8*, i32 }* @.const.picklebuf.140612147179184 to i64), %B26.i ], [ ptrtoint ({ i8*, i32 }* @.const.picklebuf.140612147179104 to i64), %B22.i ], [ ptrtoint ({ i8*, i32 }* @.const.picklebuf.140612147179104 to i64), %B26.endif.if.i ]
  %0 = inttoptr i64 %excinfo.sroa.0.0.ph to { i8*, i32 }*
  call void @PyErr_Clear()
  %.107 = load { i8*, i32 }, { i8*, i32 }* %0, align 8
  %.108 = extractvalue { i8*, i32 } %.107, 0
  %.110 = extractvalue { i8*, i32 } %.107, 1
  %.111 = call i8* @numba_unpickle(i8* %.108, i32 %.110)
  %.112 = icmp eq i8* %.111, null
  br i1 %.112, label %entry.if, label %entry.endif.endif.endif.e...endif.endif.if.if, !prof !0

entry.endif.endif.endif.e...endif.endif.if.if:    ; preds = %entry.endif.endif.endif.e...endif.endif.if
  call void @numba_do_raise(i8* nonnull %.111)
  br label %entry.if
}

declare i32 @PyArg_UnpackTuple(i8*, i8*, i64, i64, ...) local_unnamed_addr

declare void @PyErr_SetString(i8*, i8*) local_unnamed_addr

declare i8* @PyNumber_Float(i8*) local_unnamed_addr

declare double @PyFloat_AsDouble(i8*) local_unnamed_addr

declare void @Py_DecRef(i8*) local_unnamed_addr

declare i8* @PyErr_Occurred() local_unnamed_addr

declare i8* @PyNumber_Long(i8*) local_unnamed_addr

declare i64 @PyLong_AsLongLong(i8*) local_unnamed_addr

declare i32 @PyObject_IsTrue(i8*) local_unnamed_addr

declare i8* @PyFloat_FromDouble(double) local_unnamed_addr

declare void @PyErr_Clear() local_unnamed_addr

declare i8* @numba_unpickle(i8*, i32) local_unnamed_addr

declare void @numba_do_raise(i8*) local_unnamed_addr

define double @"cfunc._ZN8__main__35temperature_effectiveness_plate$242Eddxxb"(double %.1, double %.2, i64 %.3, i64 %.4, i1 %.5) local_unnamed_addr {
entry:
  %.38.i = icmp eq i64 %.3, 1
  %.64.i = icmp eq i64 %.4, 1
  %or.cond.i = and i1 %.38.i, %.64.i
  br i1 %or.cond.i, label %entry.endif, label %B22.i

B22.i:                                            ; preds = %entry
  br i1 %.5, label %entry.if.if, label %B26.i

B26.i:                                            ; preds = %B22.i
  %.131.i = fcmp oeq double %.1, 0.000000e+00
  br i1 %.131.i, label %entry.if.if, label %B26.endif.if.i, !prof !0

B26.endif.if.i:                                   ; preds = %B26.i
  br label %entry.if.if

entry.endif:                                      ; preds = %entry, %.27
  %.7.06 = phi double [ 0.000000e+00, %.27 ], [ 1.100000e+00, %entry ]
  ret double %.7.06

.27:                                              ; preds = %entry.if.if, %entry.if.if.if
  %.47 = call i8* @PyUnicode_FromString(i8* getelementptr inbounds ([53 x i8], [53 x i8]* @".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>", i64 0, i64 0))
  call void @PyErr_WriteUnraisable(i8* %.47)
  call void @Py_DecRef(i8* %.47)
  call void @numba_gil_release(i32* nonnull %.245)
  br label %entry.endif

entry.if.if:                                      ; preds = %B22.i, %B26.i, %B26.endif.if.i
  %excinfo.sroa.0.0.ph = phi i64 [ ptrtoint ({ i8*, i32 }* @.const.picklebuf.140612147179184 to i64), %B26.i ], [ ptrtoint ({ i8*, i32 }* @.const.picklebuf.140612147179104 to i64), %B22.i ], [ ptrtoint ({ i8*, i32 }* @.const.picklebuf.140612147179104 to i64), %B26.endif.if.i ]
  %0 = inttoptr i64 %excinfo.sroa.0.0.ph to { i8*, i32 }*
  %.245 = alloca i32, align 4
  store i32 0, i32* %.245, align 4
  call void @numba_gil_ensure(i32* nonnull %.245)
  call void @PyErr_Clear()
  %.30 = load { i8*, i32 }, { i8*, i32 }* %0, align 8
  %.31 = extractvalue { i8*, i32 } %.30, 0
  %.33 = extractvalue { i8*, i32 } %.30, 1
  %.34 = call i8* @numba_unpickle(i8* %.31, i32 %.33)
  %.35 = icmp eq i8* %.34, null
  br i1 %.35, label %.27, label %entry.if.if.if, !prof !0

entry.if.if.if:                                   ; preds = %entry.if.if
  call void @numba_do_raise(i8* nonnull %.34)
  br label %.27
}

declare void @numba_gil_ensure(i32*) local_unnamed_addr

declare i8* @PyUnicode_FromString(i8*) local_unnamed_addr

declare void @PyErr_WriteUnraisable(i8*) local_unnamed_addr

declare void @numba_gil_release(i32*) local_unnamed_addr

; Function Attrs: nounwind
declare void @llvm.stackprotector(i8*, i8**) #1

attributes #0 = { nounwind writeonly }
attributes #1 = { nounwind }

!0 = !{!"branch_weights", i32 1, i32 99}
!1 = !{!"branch_weights", i32 99, i32 1}

================================================================================
================================================================================
--------------------ASSEMBLY temperature_effectiveness_plate--------------------
	.text
	.file	"<string>"
	.globl	_ZN8__main__35temperature_effectiveness_plate$242Eddxxb
	.p2align	4, 0x90
	.type	_ZN8__main__35temperature_effectiveness_plate$242Eddxxb,@function
_ZN8__main__35temperature_effectiveness_plate$242Eddxxb:
	cmpq	$1, %rdx
	jne	.LBB0_2
	cmpq	$1, %rcx
	jne	.LBB0_2
	movabsq	$4607632778762754458, %rax
	movq	%rax, (%rdi)
	xorl	%eax, %eax
	retq
.LBB0_2:
	testb	%r8b, %r8b
	jne	.LBB0_5
	vxorps	%xmm1, %xmm1, %xmm1
	vucomisd	%xmm1, %xmm0
	jne	.LBB0_5
	jnp	.LBB0_4
.LBB0_5:
	movabsq	$.const.picklebuf.140612147179104, %rax
	movq	%rax, (%rsi)
	movl	$1, %eax
	retq
.LBB0_4:
	movabsq	$.const.picklebuf.140612147179184, %rax
	movq	%rax, (%rsi)
	movl	$1, %eax
	retq
.Lfunc_end0:
	.size	_ZN8__main__35temperature_effectiveness_plate$242Eddxxb, .Lfunc_end0-_ZN8__main__35temperature_effectiveness_plate$242Eddxxb

	.section	.rodata.cst8,"aM",@progbits,8
	.p2align	3
.LCPI1_0:
	.quad	4607632778762754458
	.text
	.globl	_ZN7cpython8__main__35temperature_effectiveness_plate$242Eddxxb
	.p2align	4, 0x90
	.type	_ZN7cpython8__main__35temperature_effectiveness_plate$242Eddxxb,@function
_ZN7cpython8__main__35temperature_effectiveness_plate$242Eddxxb:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	pushq	%r15
	.cfi_def_cfa_offset 24
	pushq	%r14
	.cfi_def_cfa_offset 32
	pushq	%r13
	.cfi_def_cfa_offset 40
	pushq	%r12
	.cfi_def_cfa_offset 48
	pushq	%rbx
	.cfi_def_cfa_offset 56
	subq	$56, %rsp
	.cfi_def_cfa_offset 112
	.cfi_offset %rbx, -56
	.cfi_offset %r12, -48
	.cfi_offset %r13, -40
	.cfi_offset %r14, -32
	.cfi_offset %r15, -24
	.cfi_offset %rbp, -16
	movq	%rsi, %rdi
	subq	$8, %rsp
	.cfi_adjust_cfa_offset 8
	leaq	24(%rsp), %rbp
	leaq	32(%rsp), %rbx
	leaq	40(%rsp), %r10
	movabsq	$.const.temperature_effectiveness_plate, %rsi
	movabsq	$PyArg_UnpackTuple, %r11
	leaq	56(%rsp), %r8
	leaq	48(%rsp), %r9
	movl	$5, %edx
	movl	$5, %ecx
	movl	$0, %eax
	pushq	%rbp
	.cfi_adjust_cfa_offset 8
	pushq	%rbx
	.cfi_adjust_cfa_offset 8
	pushq	%r10
	.cfi_adjust_cfa_offset 8
	callq	*%r11
	addq	$32, %rsp
	.cfi_adjust_cfa_offset -32
	testl	%eax, %eax
	je	.LBB1_1
	movabsq	$_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb, %rax
	cmpq	$0, (%rax)
	je	.LBB1_4
	movq	48(%rsp), %rdi
	movabsq	$PyNumber_Float, %r14
	callq	*%r14
	movq	%rax, %rbx
	movabsq	$PyFloat_AsDouble, %rbp
	movq	%rax, %rdi
	callq	*%rbp
	vmovsd	%xmm0, 8(%rsp)
	movabsq	$Py_DecRef, %r12
	movq	%rbx, %rdi
	callq	*%r12
	movabsq	$PyErr_Occurred, %r15
	callq	*%r15
	testq	%rax, %rax
	jne	.LBB1_1
	movq	40(%rsp), %rdi
	callq	*%r14
	movq	%rax, %rbx
	movq	%rax, %rdi
	callq	*%rbp
	movq	%rbx, %rdi
	callq	*%r12
	callq	*%r15
	testq	%rax, %rax
	jne	.LBB1_1
	movq	32(%rsp), %rdi
	movabsq	$PyNumber_Long, %rbp
	callq	*%rbp
	movabsq	$PyLong_AsLongLong, %r13
	testq	%rax, %rax
	je	.LBB1_8
	movq	%rax, %rbx
	movq	%rax, %rdi
	callq	*%r13
	movq	%rax, %r14
	movq	%rbx, %rdi
	callq	*%r12
	callq	*%r15
	testq	%rax, %rax
	jne	.LBB1_1
.LBB1_11:
	movq	24(%rsp), %rdi
	callq	*%rbp
	testq	%rax, %rax
	je	.LBB1_12
	movq	%rax, %rbp
	movq	%rax, %rdi
	callq	*%r13
	movq	%rax, %rbx
	movq	%rbp, %rdi
	callq	*%r12
	callq	*%r15
	testq	%rax, %rax
	jne	.LBB1_1
.LBB1_15:
	movq	16(%rsp), %rdi
	movabsq	$PyObject_IsTrue, %rax
	callq	*%rax
	movl	%eax, %ebp
	callq	*%r15
	testq	%rax, %rax
	jne	.LBB1_1
	cmpq	$1, %r14
	jne	.LBB1_18
	cmpq	$1, %rbx
	jne	.LBB1_18
	movabsq	$PyFloat_FromDouble, %rax
	movabsq	$.LCPI1_0, %rcx
	vmovsd	(%rcx), %xmm0
	callq	*%rax
	jmp	.LBB1_2
.LBB1_18:
	movabsq	$.const.picklebuf.140612147179104, %rbx
	testl	%ebp, %ebp
	jne	.LBB1_21
	vxorps	%xmm0, %xmm0, %xmm0
	vmovsd	8(%rsp), %xmm1
	vucomisd	%xmm0, %xmm1
	jne	.LBB1_21
	jnp	.LBB1_20
.LBB1_21:
	movabsq	$PyErr_Clear, %rax
	callq	*%rax
	movl	8(%rbx), %esi
	movq	(%rbx), %rdi
	movabsq	$numba_unpickle, %rax
	callq	*%rax
	testq	%rax, %rax
	je	.LBB1_1
	movabsq	$numba_do_raise, %rcx
	movq	%rax, %rdi
	callq	*%rcx
.LBB1_1:
	xorl	%eax, %eax
.LBB1_2:
	addq	$56, %rsp
	.cfi_def_cfa_offset 56
	popq	%rbx
	.cfi_def_cfa_offset 48
	popq	%r12
	.cfi_def_cfa_offset 40
	popq	%r13
	.cfi_def_cfa_offset 32
	popq	%r14
	.cfi_def_cfa_offset 24
	popq	%r15
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	retq
.LBB1_4:
	.cfi_def_cfa_offset 112
	movabsq	$PyExc_RuntimeError, %rdi
	movabsq	$".const.missing Environment", %rsi
	movabsq	$PyErr_SetString, %rax
	callq	*%rax
	jmp	.LBB1_1
.LBB1_8:
	xorl	%r14d, %r14d
	callq	*%r15
	testq	%rax, %rax
	je	.LBB1_11
	jmp	.LBB1_1
.LBB1_12:
	xorl	%ebx, %ebx
	callq	*%r15
	testq	%rax, %rax
	je	.LBB1_15
	jmp	.LBB1_1
.LBB1_20:
	movabsq	$.const.picklebuf.140612147179184, %rbx
	jmp	.LBB1_21
.Lfunc_end1:
	.size	_ZN7cpython8__main__35temperature_effectiveness_plate$242Eddxxb, .Lfunc_end1-_ZN7cpython8__main__35temperature_effectiveness_plate$242Eddxxb
	.cfi_endproc

	.section	.rodata.cst8,"aM",@progbits,8
	.p2align	3
.LCPI2_0:
	.quad	4607632778762754458
	.text
	.globl	cfunc._ZN8__main__35temperature_effectiveness_plate$242Eddxxb
	.p2align	4, 0x90
	.type	cfunc._ZN8__main__35temperature_effectiveness_plate$242Eddxxb,@function
cfunc._ZN8__main__35temperature_effectiveness_plate$242Eddxxb:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset %rbp, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register %rbp
	pushq	%r14
	pushq	%rbx
	.cfi_offset %rbx, -32
	.cfi_offset %r14, -24
	cmpq	$1, %rdi
	jne	.LBB2_3
	cmpq	$1, %rsi
	jne	.LBB2_3
	movabsq	$.LCPI2_0, %rax
	vmovsd	(%rax), %xmm0
	jmp	.LBB2_8
.LBB2_3:
	movabsq	$.const.picklebuf.140612147179104, %rbx
	testb	$1, %dl
	jne	.LBB2_6
	vxorps	%xmm1, %xmm1, %xmm1
	vucomisd	%xmm1, %xmm0
	jne	.LBB2_6
	jnp	.LBB2_5
.LBB2_6:
	movq	%rsp, %rax
	leaq	-16(%rax), %r14
	movq	%r14, %rsp
	movl	$0, -16(%rax)
	movabsq	$numba_gil_ensure, %rax
	movq	%r14, %rdi
	callq	*%rax
	movabsq	$PyErr_Clear, %rax
	callq	*%rax
	movl	8(%rbx), %esi
	movq	(%rbx), %rdi
	movabsq	$numba_unpickle, %rax
	callq	*%rax
	testq	%rax, %rax
	je	.LBB2_7
	movabsq	$numba_do_raise, %rcx
	movq	%rax, %rdi
	callq	*%rcx
.LBB2_7:
	movabsq	$".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>", %rdi
	movabsq	$PyUnicode_FromString, %rax
	callq	*%rax
	movq	%rax, %rbx
	movabsq	$PyErr_WriteUnraisable, %rax
	movq	%rbx, %rdi
	callq	*%rax
	movabsq	$Py_DecRef, %rax
	movq	%rbx, %rdi
	callq	*%rax
	movabsq	$numba_gil_release, %rax
	movq	%r14, %rdi
	callq	*%rax
	vxorps	%xmm0, %xmm0, %xmm0
.LBB2_8:
	leaq	-16(%rbp), %rsp
	popq	%rbx
	popq	%r14
	popq	%rbp
	.cfi_def_cfa %rsp, 8
	retq
.LBB2_5:
	.cfi_def_cfa %rbp, 16
	movabsq	$.const.picklebuf.140612147179184, %rbx
	jmp	.LBB2_6
.Lfunc_end2:
	.size	cfunc._ZN8__main__35temperature_effectiveness_plate$242Eddxxb, .Lfunc_end2-cfunc._ZN8__main__35temperature_effectiveness_plate$242Eddxxb
	.cfi_endproc

	.type	_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb,@object
	.comm	_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$242Eddxxb,8,8
	.type	.const.picklebuf.140612147179104,@object
	.section	.rodata,"a",@progbits
	.p2align	3
.const.picklebuf.140612147179104:
	.quad	.const.pickledata.140612147179104
	.long	163
	.zero	4
	.size	.const.picklebuf.140612147179104, 16

	.type	.const.picklebuf.140612147179184,@object
	.p2align	3
.const.picklebuf.140612147179184:
	.quad	.const.pickledata.140612147179184
	.long	69
	.zero	4
	.size	.const.picklebuf.140612147179184, 16

	.type	.const.pickledata.140612147179184,@object
	.p2align	4
.const.pickledata.140612147179184:
	.ascii	"\200\004\225:\000\000\000\000\000\000\000\214\bbuiltins\224\214\021ZeroDivisionError\224\223\224\214\020division by zero\224\205\224N\207\224."
	.size	.const.pickledata.140612147179184, 69

	.type	.const.pickledata.140612147179104,@object
	.p2align	4
.const.pickledata.140612147179104:
	.ascii	"\200\004\225\230\000\000\000\000\000\000\000\214\bbuiltins\224\214\nValueError\224\223\224\214<Supported number of passes does not have a formula available\224\205\224\214\037temperature_effectiveness_plate\224\214\021issue2_minimal.py\224K\r\207\224\207\224."
	.size	.const.pickledata.140612147179104, 163

	.type	.const.temperature_effectiveness_plate,@object
	.p2align	4
.const.temperature_effectiveness_plate:
	.asciz	"temperature_effectiveness_plate"
	.size	.const.temperature_effectiveness_plate, 32

	.type	".const.missing Environment",@object
	.p2align	4
".const.missing Environment":
	.asciz	"missing Environment"
	.size	".const.missing Environment", 20

	.type	".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>",@object
	.p2align	4
".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>":
	.asciz	"<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>"
	.size	".const.<numba.core.cpu.CPUContext object at 0x7fe2d115e6d0>", 53


	.section	".note.GNU-stack","",@progbits

================================================================================
[cache] index loaded from '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.nbi'
[cache] index saved to '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.nbi'
[cache] data saved to '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.1.nbc'
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := float64,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := float64,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := float64,
 arg.Np1 := int64,
 arg.Np2 := int64,
 arg.R1 := float64,
 arg.reverse := omitted(default=False),
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
-----------------------------------propagate------------------------------------
---- type variables ----
[$14compare_op.2 := bool,
 $16pred := bool,
 $20return_value.1 := float64,
 $24pred := bool,
 $30binary_true_divide.2 := float64,
 $38binary_multiply.5 := float64,
 $42load_global.6 := recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 $56call_function_kw.13 := float64,
 $62return_value.15 := float64,
 $64load_global.0 := ValueError,
 $68call_function.2 := ValueError(...),
 $6compare_op.2 := bool,
 $8pred := bool,
 $const12.1 := Literal[int](1),
 $const18.0 := float64,
 $const26.0 := float64,
 $const4.1 := Literal[int](1),
 $const52.11 := bool,
 $const60.14 := float64,
 $const66.1 := Literal[str](Supported number of passes does not have a formula available),
 NTU1 := float64,
 NTU2 := float64,
 Np1 := int64,
 Np2 := int64,
 P2 := float64,
 R1 := float64,
 R2 := float64,
 arg.NTU1 := float64,
 arg.Np1 := int64,
 arg.Np2 := int64,
 arg.R1 := float64,
 arg.reverse := omitted(default=False),
 bool16 := Function(<class 'bool'>),
 bool24 := Function(<class 'bool'>),
 bool8 := Function(<class 'bool'>),
 reverse := bool]
---------------------------------Variable types---------------------------------
{'$14compare_op.2': bool,
 '$16pred': bool,
 '$20return_value.1': float64,
 '$24pred': bool,
 '$30binary_true_divide.2': float64,
 '$38binary_multiply.5': float64,
 '$42load_global.6': recursive(type(CPUDispatcher(<function temperature_effectiveness_plate at 0x7fe2e32c4ef0>))),
 '$56call_function_kw.13': float64,
 '$62return_value.15': float64,
 '$64load_global.0': ValueError,
 '$68call_function.2': ValueError(...),
 '$6compare_op.2': bool,
 '$8pred': bool,
 '$const12.1': Literal[int](1),
 '$const18.0': float64,
 '$const26.0': float64,
 '$const4.1': Literal[int](1),
 '$const52.11': bool,
 '$const60.14': float64,
 '$const66.1': Literal[str](Supported number of passes does not have a formula available),
 'NTU1': float64,
 'NTU2': float64,
 'Np1': int64,
 'Np2': int64,
 'P2': float64,
 'R1': float64,
 'R2': float64,
 'arg.NTU1': float64,
 'arg.Np1': int64,
 'arg.Np2': int64,
 'arg.R1': float64,
 'arg.reverse': omitted(default=False),
 'bool16': Function(<class 'bool'>),
 'bool24': Function(<class 'bool'>),
 'bool8': Function(<class 'bool'>),
 'reverse': bool}
----------------------------------Return type-----------------------------------
float64
-----------------------------------Call types-----------------------------------
{$const26.0 / R1: (float64, float64) -> float64,
 NTU1 * R1: (float64, float64) -> float64,
 Np1 == $const4.1: (int64, int64) -> bool,
 Np2 == $const12.1: (int64, int64) -> bool,
 call $42load_global.6(func=$42load_global.6, args=[], kws=[('R1', Var(R2, issue2_minimal.py:8)), ('NTU1', Var(NTU2, issue2_minimal.py:9)), ('Np1', Var(Np2, issue2_minimal.py:5)), ('Np2', Var(Np1, issue2_minimal.py:5)), ('reverse', Var($const52.11, issue2_minimal.py:11))], vararg=None): (float64, float64, int64, int64, bool) -> float64,
 call $64load_global.0($const66.1, func=$64load_global.0, args=[Var($const66.1, issue2_minimal.py:13)], kws=(), vararg=None): () -> ValueError(...),
 call bool16($14compare_op.2, func=bool16, args=(Var($14compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None): (bool,) -> bool,
 call bool24(reverse, func=bool24, args=(Var(reverse, issue2_minimal.py:5),), kws=(), vararg=None): (bool,) -> bool,
 call bool8($6compare_op.2, func=bool8, args=(Var($6compare_op.2, issue2_minimal.py:5),), kws=(), vararg=None): (bool,) -> bool}
------LLVM DUMP <function descriptor 'temperature_effectiveness_plate$1'>-------
; ModuleID = "temperature_effectiveness_plate$1"
target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

@"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29" = common global i8* null
define i32 @"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"(double* noalias nocapture %"retptr", {i8*, i32}** noalias nocapture %"excinfo", double %"arg.R1", double %"arg.NTU1", i64 %"arg.Np1", i64 %"arg.Np2") 
{
entry:
  %"R1" = alloca double
  store double 0.0, double* %"R1"
  %"NTU1" = alloca double
  store double 0.0, double* %"NTU1"
  %"Np1" = alloca i64
  store i64 0, i64* %"Np1"
  %"Np2" = alloca i64
  store i64 0, i64* %"Np2"
  %"reverse" = alloca i1
  store i1 0, i1* %"reverse"
  %"$const4.1" = alloca i64
  store i64 0, i64* %"$const4.1"
  %"$6compare_op.2" = alloca i1
  store i1 0, i1* %"$6compare_op.2"
  %"bool8" = alloca i8*
  store i8* null, i8** %"bool8"
  %"$8pred" = alloca i1
  store i1 0, i1* %"$8pred"
  %"$const12.1" = alloca i64
  store i64 0, i64* %"$const12.1"
  %"$14compare_op.2" = alloca i1
  store i1 0, i1* %"$14compare_op.2"
  %"bool16" = alloca i8*
  store i8* null, i8** %"bool16"
  %"$16pred" = alloca i1
  store i1 0, i1* %"$16pred"
  %"$const18.0" = alloca double
  store double 0.0, double* %"$const18.0"
  %"$20return_value.1" = alloca double
  store double 0.0, double* %"$20return_value.1"
  %"bool24" = alloca i8*
  store i8* null, i8** %"bool24"
  %"$24pred" = alloca i1
  store i1 0, i1* %"$24pred"
  %"$const26.0" = alloca double
  store double 0.0, double* %"$const26.0"
  %"try_state" = alloca i64
  store i64 0, i64* %"try_state"
  %"$30binary_true_divide.2" = alloca double
  store double 0.0, double* %"$30binary_true_divide.2"
  %"R2" = alloca double
  store double 0.0, double* %"R2"
  %"$38binary_multiply.5" = alloca double
  store double 0.0, double* %"$38binary_multiply.5"
  %"NTU2" = alloca double
  store double 0.0, double* %"NTU2"
  %"$42load_global.6" = alloca i8*
  store i8* null, i8** %"$42load_global.6"
  %"$const52.11" = alloca i1
  store i1 0, i1* %"$const52.11"
  %".171" = alloca double
  store double 0.0, double* %".171"
  %"excinfo.1" = alloca {i8*, i32}*
  store {i8*, i32}* null, {i8*, i32}** %"excinfo.1"
  %"$56call_function_kw.13" = alloca double
  store double 0.0, double* %"$56call_function_kw.13"
  %"P2" = alloca double
  store double 0.0, double* %"P2"
  %"$const60.14" = alloca double
  store double 0.0, double* %"$const60.14"
  %"$62return_value.15" = alloca double
  store double 0.0, double* %"$62return_value.15"
  %"$64load_global.0" = alloca i8*
  store i8* null, i8** %"$64load_global.0"
  %"$const66.1" = alloca i8*
  store i8* null, i8** %"$const66.1"
  %"$68call_function.2" = alloca i8*
  store i8* null, i8** %"$68call_function.2"
  br label %"B0"
B0:
  %".9" = load double, double* %"R1"
  store double %"arg.R1", double* %"R1"
  %".12" = load double, double* %"NTU1"
  store double %"arg.NTU1", double* %"NTU1"
  %".15" = load i64, i64* %"Np1"
  store i64 %"arg.Np1", i64* %"Np1"
  %".18" = load i64, i64* %"Np2"
  store i64 %"arg.Np2", i64* %"Np2"
  %".21" = load i1, i1* %"reverse"
  store i1 false, i1* %"reverse"
  %".24" = load i64, i64* %"$const4.1"
  store i64 1, i64* %"$const4.1"
  %".26" = load i64, i64* %"Np1"
  %".27" = load i64, i64* %"$const4.1"
  %".28" = icmp eq i64 %".26", 1
  %".30" = load i1, i1* %"$6compare_op.2"
  store i1 %".28", i1* %"$6compare_op.2"
  %".32" = load i64, i64* %"$const4.1"
  store i64 0, i64* %"$const4.1"
  %".35" = load i8*, i8** %"bool8"
  store i8* null, i8** %"bool8"
  %".37" = load i1, i1* %"$6compare_op.2"
  %".39" = load i1, i1* %"$8pred"
  store i1 %".37", i1* %"$8pred"
  %".41" = load i8*, i8** %"bool8"
  store i8* null, i8** %"bool8"
  %".43" = load i1, i1* %"$6compare_op.2"
  store i1 0, i1* %"$6compare_op.2"
  %".45" = load i1, i1* %"$8pred"
  br i1 %".45", label %"B10", label %"B22"
B10:
  %".47" = load i1, i1* %"$8pred"
  store i1 0, i1* %"$8pred"
  %".50" = load i64, i64* %"$const12.1"
  store i64 1, i64* %"$const12.1"
  %".52" = load i64, i64* %"Np2"
  %".53" = load i64, i64* %"$const12.1"
  %".54" = icmp eq i64 %".52", 1
  %".56" = load i1, i1* %"$14compare_op.2"
  store i1 %".54", i1* %"$14compare_op.2"
  %".58" = load i64, i64* %"$const12.1"
  store i64 0, i64* %"$const12.1"
  %".61" = load i8*, i8** %"bool16"
  store i8* null, i8** %"bool16"
  %".63" = load i1, i1* %"$14compare_op.2"
  %".65" = load i1, i1* %"$16pred"
  store i1 %".63", i1* %"$16pred"
  %".67" = load i8*, i8** %"bool16"
  store i8* null, i8** %"bool16"
  %".69" = load i1, i1* %"$14compare_op.2"
  store i1 0, i1* %"$14compare_op.2"
  %".71" = load i1, i1* %"$16pred"
  br i1 %".71", label %"B18", label %"B22"
B18:
  %".73" = load i1, i1* %"reverse"
  store i1 0, i1* %"reverse"
  %".75" = load double, double* %"R1"
  store double 0.0, double* %"R1"
  %".77" = load i64, i64* %"Np2"
  store i64 0, i64* %"Np2"
  %".79" = load i64, i64* %"Np1"
  store i64 0, i64* %"Np1"
  %".81" = load double, double* %"NTU1"
  store double 0.0, double* %"NTU1"
  %".83" = load i1, i1* %"$16pred"
  store i1 0, i1* %"$16pred"
  %".86" = load double, double* %"$const18.0"
  store double 0x3ff199999999999a, double* %"$const18.0"
  %".88" = load double, double* %"$const18.0"
  %".90" = load double, double* %"$20return_value.1"
  store double %".88", double* %"$20return_value.1"
  %".92" = load double, double* %"$const18.0"
  store double 0.0, double* %"$const18.0"
  %".94" = load double, double* %"$20return_value.1"
  store double %".94", double* %"retptr"
  ret i32 0
B22:
  %".97" = load i1, i1* %"$8pred"
  store i1 0, i1* %"$8pred"
  %".99" = load i1, i1* %"$16pred"
  store i1 0, i1* %"$16pred"
  %".102" = load i8*, i8** %"bool24"
  store i8* null, i8** %"bool24"
  %".104" = load i1, i1* %"reverse"
  %".106" = load i1, i1* %"$24pred"
  store i1 %".104", i1* %"$24pred"
  %".108" = load i1, i1* %"reverse"
  store i1 0, i1* %"reverse"
  %".110" = load i8*, i8** %"bool24"
  store i8* null, i8** %"bool24"
  %".112" = load i1, i1* %"$24pred"
  br i1 %".112", label %"B64", label %"B26"
B26:
  %".114" = load i1, i1* %"$24pred"
  store i1 0, i1* %"$24pred"
  %".117" = load double, double* %"$const26.0"
  store double 0x3ff0000000000000, double* %"$const26.0"
  %".119" = load double, double* %"$const26.0"
  %".120" = load double, double* %"R1"
  %".121" = fcmp oeq double %".120",              0x0
  br i1 %".121", label %"B26.if", label %"B26.endif", !prof !0
B64:
  %".231" = load double, double* %"R1"
  store double 0.0, double* %"R1"
  %".233" = load i64, i64* %"Np2"
  store i64 0, i64* %"Np2"
  %".235" = load i64, i64* %"Np1"
  store i64 0, i64* %"Np1"
  %".237" = load double, double* %"NTU1"
  store double 0.0, double* %"NTU1"
  %".239" = load i1, i1* %"$24pred"
  store i1 0, i1* %"$24pred"
  %".242" = load i8*, i8** %"$64load_global.0"
  store i8* null, i8** %"$64load_global.0"
  %".245" = load i8*, i8** %"$const66.1"
  store i8* null, i8** %"$const66.1"
  %".248" = load i8*, i8** %"$68call_function.2"
  store i8* null, i8** %"$68call_function.2"
  %".250" = load i8*, i8** %"$const66.1"
  store i8* null, i8** %"$const66.1"
  %".252" = load i8*, i8** %"$68call_function.2"
  store i8* null, i8** %"$68call_function.2"
  %".254" = load i8*, i8** %"$64load_global.0"
  store i8* null, i8** %"$64load_global.0"
  store {i8*, i32}* @".const.picklebuf.140612146881952", {i8*, i32}** %"excinfo"
  %".257" = load i64, i64* %"try_state"
  %".258" = icmp ugt i64 %".257", 0
  %".259" = load {i8*, i32}*, {i8*, i32}** %"excinfo"
  ret i32 1
B26.if:
  store {i8*, i32}* @".const.picklebuf.140612146880992", {i8*, i32}** %"excinfo"
  store i64 0, i64* %"try_state"
  %".126" = load i64, i64* %"try_state"
  %".127" = icmp ugt i64 %".126", 0
  %".128" = load {i8*, i32}*, {i8*, i32}** %"excinfo"
  ret i32 1
B26.endif:
  %".130" = fdiv double %".119", %".120"
  %".132" = load double, double* %"$30binary_true_divide.2"
  store double %".130", double* %"$30binary_true_divide.2"
  %".134" = load double, double* %"$const26.0"
  store double 0.0, double* %"$const26.0"
  %".136" = load double, double* %"$30binary_true_divide.2"
  %".138" = load double, double* %"R2"
  store double %".136", double* %"R2"
  %".140" = load double, double* %"$30binary_true_divide.2"
  store double 0.0, double* %"$30binary_true_divide.2"
  %".142" = load double, double* %"NTU1"
  %".143" = load double, double* %"R1"
  %".144" = fmul double %".142", %".143"
  %".146" = load double, double* %"$38binary_multiply.5"
  store double %".144", double* %"$38binary_multiply.5"
  %".148" = load double, double* %"R1"
  store double 0.0, double* %"R1"
  %".150" = load double, double* %"NTU1"
  store double 0.0, double* %"NTU1"
  %".152" = load double, double* %"$38binary_multiply.5"
  %".154" = load double, double* %"NTU2"
  store double %".152", double* %"NTU2"
  %".156" = load double, double* %"$38binary_multiply.5"
  store double 0.0, double* %"$38binary_multiply.5"
  %".159" = load i8*, i8** %"$42load_global.6"
  store i8* null, i8** %"$42load_global.6"
  %".162" = load i1, i1* %"$const52.11"
  store i1 true, i1* %"$const52.11"
  %".164" = load double, double* %"R2"
  %".165" = load double, double* %"NTU2"
  %".166" = load i64, i64* %"Np2"
  %".167" = load i64, i64* %"Np1"
  %".168" = load i1, i1* %"$const52.11"
  %".169" = load i8*, i8** @".numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"
  %".170" = bitcast i8* %".169" to i32 (double*, {i8*, i32}**, double, double, i64, i64, i8)*
  store double 0.0, double* %".171"
  %".175" = zext i1 %".168" to i8
  %".176" = call i32 %".170"(double* %".171", {i8*, i32}** %"excinfo.1", double %".164", double %".165", i64 %".166", i64 %".167", i8 %".175")
  %".177" = load {i8*, i32}*, {i8*, i32}** %"excinfo.1"
  %".178" = icmp eq i32 %".176", 0
  %".179" = icmp eq i32 %".176", -2
  %".180" = icmp eq i32 %".176", -1
  %".181" = icmp eq i32 %".176", -3
  %".182" = or i1 %".178", %".179"
  %".183" = xor i1 %".182", -1
  %".184" = icmp sge i32 %".176", 1
  %".185" = select i1 %".184", {i8*, i32}* %".177", {i8*, i32}* undef
  %".186" = load double, double* %".171"
  br i1 %".183", label %"B26.endif.if", label %"B26.endif.endif", !prof !0
B26.endif.if:
  %".188" = load i64, i64* %"try_state"
  %".189" = icmp ugt i64 %".188", 0
  %".190" = load {i8*, i32}*, {i8*, i32}** %"excinfo"
  store {i8*, i32}* %".185", {i8*, i32}** %"excinfo"
  %".192" = xor i1 %".189", -1
  br i1 %".192", label %"B26.endif.if.if", label %"B26.endif.if.endif"
B26.endif.endif:
  %".197" = load double, double* %"$56call_function_kw.13"
  store double %".186", double* %"$56call_function_kw.13"
  %".199" = load double, double* %"R2"
  store double 0.0, double* %"R2"
  %".201" = load i64, i64* %"Np2"
  store i64 0, i64* %"Np2"
  %".203" = load i64, i64* %"Np1"
  store i64 0, i64* %"Np1"
  %".205" = load double, double* %"NTU2"
  store double 0.0, double* %"NTU2"
  %".207" = load i1, i1* %"$const52.11"
  store i1 0, i1* %"$const52.11"
  %".209" = load i8*, i8** %"$42load_global.6"
  store i8* null, i8** %"$42load_global.6"
  %".211" = load double, double* %"$56call_function_kw.13"
  %".213" = load double, double* %"P2"
  store double %".211", double* %"P2"
  %".215" = load double, double* %"P2"
  store double 0.0, double* %"P2"
  %".217" = load double, double* %"$56call_function_kw.13"
  store double 0.0, double* %"$56call_function_kw.13"
  %".220" = load double, double* %"$const60.14"
  store double 0x3ff4cccccccccccd, double* %"$const60.14"
  %".222" = load double, double* %"$const60.14"
  %".224" = load double, double* %"$62return_value.15"
  store double %".222", double* %"$62return_value.15"
  %".226" = load double, double* %"$const60.14"
  store double 0.0, double* %"$const60.14"
  %".228" = load double, double* %"$62return_value.15"
  store double %".228", double* %"retptr"
  ret i32 0
B26.endif.if.if:
  ret i32 %".176"
B26.endif.if.endif:
  br label %"B26.endif.endif"
}

@".const.pickledata.140612146880992" = internal constant [69 x i8] c"\80\04\95:\00\00\00\00\00\00\00\8c\08builtins\94\8c\11ZeroDivisionError\94\93\94\8c\10division by zero\94\85\94N\87\94."
@".const.picklebuf.140612146880992" = internal constant {i8*, i32} {i8* bitcast ([69 x i8]* @".const.pickledata.140612146880992" to i8*), i32 69}
@".numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb" = external global i8*
@".const.pickledata.140612146881952" = internal constant [163 x i8] c"\80\04\95\98\00\00\00\00\00\00\00\8c\08builtins\94\8c\0aValueError\94\93\94\8c<Supported number of passes does not have a formula available\94\85\94\8c\1ftemperature_effectiveness_plate\94\8c\11issue2_minimal.py\94K\0d\87\94\87\94."
@".const.picklebuf.140612146881952" = internal constant {i8*, i32} {i8* bitcast ([163 x i8]* @".const.pickledata.140612146881952" to i8*), i32 163}
!0 = !{ !"branch_weights", i32 1, i32 99 }
================================================================================
================================================================================
------------FUNCTION OPTIMIZED DUMP temperature_effectiveness_plate-------------
; ModuleID = 'temperature_effectiveness_plate'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29" = common global i8* null
@.const.picklebuf.140612146881952 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([163 x i8], [163 x i8]* @.const.pickledata.140612146881952, i32 0, i32 0), i32 163 }
@.const.picklebuf.140612146880992 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([69 x i8], [69 x i8]* @.const.pickledata.140612146880992, i32 0, i32 0), i32 69 }
@".numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb" = external global i8*
@.const.pickledata.140612146880992 = internal constant [69 x i8] c"\80\04\95:\00\00\00\00\00\00\00\8C\08builtins\94\8C\11ZeroDivisionError\94\93\94\8C\10division by zero\94\85\94N\87\94."
@.const.pickledata.140612146881952 = internal constant [163 x i8] c"\80\04\95\98\00\00\00\00\00\00\00\8C\08builtins\94\8C\0AValueError\94\93\94\8C<Supported number of passes does not have a formula available\94\85\94\8C\1Ftemperature_effectiveness_plate\94\8C\11issue2_minimal.py\94K\0D\87\94\87\94."
@.const.temperature_effectiveness_plate = internal constant [32 x i8] c"temperature_effectiveness_plate\00"
@PyExc_RuntimeError = external global i8
@".const.missing Environment" = internal constant [20 x i8] c"missing Environment\00"
@_Py_NoneStruct = external global i8
@PyExc_StopIteration = external global i8
@PyExc_SystemError = external global i8
@".const.unknown error when calling native function" = internal constant [43 x i8] c"unknown error when calling native function\00"

define i32 @"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"(double* noalias nocapture %retptr, { i8*, i32 }** noalias nocapture %excinfo, double %arg.R1, double %arg.NTU1, i64 %arg.Np1, i64 %arg.Np2) {
entry:
  %.171 = alloca double
  store double 0.000000e+00, double* %.171
  %excinfo.1 = alloca { i8*, i32 }*
  store { i8*, i32 }* null, { i8*, i32 }** %excinfo.1
  %.28 = icmp eq i64 %arg.Np1, 1
  br i1 %.28, label %B10, label %B22

B10:                                              ; preds = %entry
  %.54 = icmp eq i64 %arg.Np2, 1
  br i1 %.54, label %B18, label %B22

B18:                                              ; preds = %B10
  store double 1.100000e+00, double* %retptr
  ret i32 0

B22:                                              ; preds = %B10, %entry
  br i1 false, label %B64, label %B26

B26:                                              ; preds = %B22
  %.121 = fcmp oeq double %arg.R1, 0.000000e+00
  br i1 %.121, label %B26.if, label %B26.endif, !prof !0

B64:                                              ; preds = %B22
  store { i8*, i32 }* @.const.picklebuf.140612146881952, { i8*, i32 }** %excinfo
  ret i32 1

B26.if:                                           ; preds = %B26
  store { i8*, i32 }* @.const.picklebuf.140612146880992, { i8*, i32 }** %excinfo
  ret i32 1

B26.endif:                                        ; preds = %B26
  %.130 = fdiv double 1.000000e+00, %arg.R1
  %.144 = fmul double %arg.NTU1, %arg.R1
  %.169 = load i8*, i8** @".numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb"
  %.170 = bitcast i8* %.169 to i32 (double*, { i8*, i32 }**, double, double, i64, i64, i8)*
  store double 0.000000e+00, double* %.171
  %.176 = call i32 %.170(double* %.171, { i8*, i32 }** %excinfo.1, double %.130, double %.144, i64 %arg.Np2, i64 %arg.Np1, i8 1)
  %.177 = load { i8*, i32 }*, { i8*, i32 }** %excinfo.1
  %.178 = icmp eq i32 %.176, 0
  %.179 = icmp eq i32 %.176, -2
  %.182 = or i1 %.178, %.179
  %.183 = xor i1 %.182, true
  %.184 = icmp sge i32 %.176, 1
  br i1 %.183, label %B26.endif.if, label %B26.endif.endif, !prof !0

B26.endif.if:                                     ; preds = %B26.endif
  store { i8*, i32 }* %.177, { i8*, i32 }** %excinfo
  br i1 true, label %B26.endif.if.if, label %B26.endif.endif

B26.endif.endif:                                  ; preds = %B26.endif.if, %B26.endif
  store double 1.300000e+00, double* %retptr
  ret i32 0

B26.endif.if.if:                                  ; preds = %B26.endif.if
  ret i32 %.176
}

define i8* @"_ZN7cpython8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"(i8* %py_closure, i8* %py_args, i8* %py_kws) {
entry:
  %.5 = alloca i8*
  %.6 = alloca i8*
  %.7 = alloca i8*
  %.8 = alloca i8*
  %.9 = alloca i8*
  %.10 = call i32 (i8*, i8*, i64, i64, ...) @PyArg_UnpackTuple(i8* %py_args, i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.const.temperature_effectiveness_plate, i32 0, i32 0), i64 5, i64 5, i8** %.5, i8** %.6, i8** %.7, i8** %.8, i8** %.9)
  %.11 = icmp eq i32 %.10, 0
  %.74 = alloca double
  store double 0.000000e+00, double* %.74
  %excinfo = alloca { i8*, i32 }*
  store { i8*, i32 }* null, { i8*, i32 }** %excinfo
  br i1 %.11, label %entry.if, label %entry.endif, !prof !0

entry.if:                                         ; preds = %entry.endif.endif.endif.e...endif.endif, %entry.endif.endif.endif.e...endif.if, %entry.endif.endif.endif.e...endif.if.if, %entry.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif, %entry.endif.endif.endif, %entry.endif.endif, %entry.endif.endif.endif.e...endif.endif.if, %entry.endif.endif.endif.e...endif.endif.endif.endif, %entry
  ret i8* null

entry.endif:                                      ; preds = %entry
  %.15 = load i8*, i8** @"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"
  %.16 = ptrtoint i8* %.15 to i64
  %.17 = add i64 %.16, 16
  %.18 = inttoptr i64 %.17 to i8*
  %.20 = icmp eq i8* null, %.15
  br i1 %.20, label %entry.endif.if, label %entry.endif.endif, !prof !0

entry.endif.if:                                   ; preds = %entry.endif
  call void @PyErr_SetString(i8* @PyExc_RuntimeError, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @".const.missing Environment", i32 0, i32 0))
  ret i8* null

entry.endif.endif:                                ; preds = %entry.endif
  %.24 = load i8*, i8** %.5
  %.25 = call i8* @PyNumber_Float(i8* %.24)
  %.26 = call double @PyFloat_AsDouble(i8* %.25)
  call void @Py_DecRef(i8* %.25)
  %.28 = call i8* @PyErr_Occurred()
  %.29 = icmp ne i8* null, %.28
  br i1 %.29, label %entry.if, label %entry.endif.endif.endif, !prof !0

entry.endif.endif.endif:                          ; preds = %entry.endif.endif
  %.33 = load i8*, i8** %.6
  %.34 = call i8* @PyNumber_Float(i8* %.33)
  %.35 = call double @PyFloat_AsDouble(i8* %.34)
  call void @Py_DecRef(i8* %.34)
  %.37 = call i8* @PyErr_Occurred()
  %.38 = icmp ne i8* null, %.37
  br i1 %.38, label %entry.if, label %entry.endif.endif.endif.endif, !prof !0

entry.endif.endif.endif.endif:                    ; preds = %entry.endif.endif.endif
  %.42 = load i8*, i8** %.7
  %.45 = call i8* @PyNumber_Long(i8* %.42)
  %.46 = icmp ne i8* null, %.45
  br i1 %.46, label %entry.endif.endif.endif.endif.if, label %entry.endif.endif.endif.endif.endif, !prof !1

entry.endif.endif.endif.endif.if:                 ; preds = %entry.endif.endif.endif.endif
  %.48 = call i64 @PyLong_AsLongLong(i8* %.45)
  call void @Py_DecRef(i8* %.45)
  br label %entry.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif:              ; preds = %entry.endif.endif.endif.endif.if, %entry.endif.endif.endif.endif
  %.43.0 = phi i64 [ %.48, %entry.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif ]
  %.53 = call i8* @PyErr_Occurred()
  %.54 = icmp ne i8* null, %.53
  br i1 %.54, label %entry.if, label %entry.endif.endif.endif.endif.endif.endif, !prof !0

entry.endif.endif.endif.endif.endif.endif:        ; preds = %entry.endif.endif.endif.endif.endif
  %.58 = load i8*, i8** %.8
  %.61 = call i8* @PyNumber_Long(i8* %.58)
  %.62 = icmp ne i8* null, %.61
  br i1 %.62, label %entry.endif.endif.endif.endif.endif.endif.if, label %entry.endif.endif.endif.endif.endif.endif.endif, !prof !1

entry.endif.endif.endif.endif.endif.endif.if:     ; preds = %entry.endif.endif.endif.endif.endif.endif
  %.64 = call i64 @PyLong_AsLongLong(i8* %.61)
  call void @Py_DecRef(i8* %.61)
  br label %entry.endif.endif.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif.endif.endif:  ; preds = %entry.endif.endif.endif.endif.endif.endif.if, %entry.endif.endif.endif.endif.endif.endif
  %.59.0 = phi i64 [ %.64, %entry.endif.endif.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif.endif.endif ]
  %.69 = call i8* @PyErr_Occurred()
  %.70 = icmp ne i8* null, %.69
  br i1 %.70, label %entry.if, label %entry.endif.endif.endif.endif.endif.endif.endif.endif, !prof !0

entry.endif.endif.endif.endif.endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.endif.endif.endif.endif
  store double 0.000000e+00, double* %.74
  %.78 = call i32 @"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"(double* %.74, { i8*, i32 }** %excinfo, double %.26, double %.35, i64 %.43.0, i64 %.59.0)
  %.79 = load { i8*, i32 }*, { i8*, i32 }** %excinfo
  %.80 = icmp eq i32 %.78, 0
  %.81 = icmp eq i32 %.78, -2
  %.84 = or i1 %.80, %.81
  %.86 = icmp sge i32 %.78, 1
  %.88 = load double, double* %.74
  switch i32 %.78, label %entry.endif.endif.endif.e...endif [
    i32 -2, label %entry.endif.endif.endif.e...if
    i32 0, label %entry.endif.endif.endif.e...if
  ]

entry.endif.endif.endif.e...if:                   ; preds = %entry.endif.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif.endif.endif.endif
  br i1 %.81, label %entry.endif.endif.endif.e...if.if, label %entry.endif.endif.endif.e...if.endif

entry.endif.endif.endif.e...endif:                ; preds = %entry.endif.endif.endif.endif.endif.endif.endif.endif
  br i1 %.86, label %entry.endif.endif.endif.e...endif.if, label %entry.endif.endif.endif.e...endif.endif

entry.endif.endif.endif.e...if.if:                ; preds = %entry.endif.endif.endif.e...if
  call void @Py_IncRef(i8* @_Py_NoneStruct)
  ret i8* @_Py_NoneStruct

entry.endif.endif.endif.e...if.endif:             ; preds = %entry.endif.endif.endif.e...if
  %.93 = call i8* @PyFloat_FromDouble(double %.88)
  ret i8* %.93

entry.endif.endif.endif.e...endif.if:             ; preds = %entry.endif.endif.endif.e...endif
  call void @PyErr_Clear()
  %.98 = load { i8*, i32 }, { i8*, i32 }* %.79
  %.99 = extractvalue { i8*, i32 } %.98, 0
  %.101 = extractvalue { i8*, i32 } %.98, 1
  %.102 = call i8* @numba_unpickle(i8* %.99, i32 %.101)
  %.103 = icmp ne i8* null, %.102
  br i1 %.103, label %entry.endif.endif.endif.e...endif.if.if, label %entry.if, !prof !1

entry.endif.endif.endif.e...endif.endif:          ; preds = %entry.endif.endif.endif.e...endif
  switch i32 %.78, label %entry.endif.endif.endif.e...endif.endif.endif.endif [
    i32 -3, label %entry.endif.endif.endif.e...endif.endif.if
    i32 -1, label %entry.if
  ]

entry.endif.endif.endif.e...endif.if.if:          ; preds = %entry.endif.endif.endif.e...endif.if
  call void @numba_do_raise(i8* %.102)
  br label %entry.if

entry.endif.endif.endif.e...endif.endif.if:       ; preds = %entry.endif.endif.endif.e...endif.endif
  call void @PyErr_SetNone(i8* @PyExc_StopIteration)
  br label %entry.if

entry.endif.endif.endif.e...endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.endif
  call void @PyErr_SetString(i8* @PyExc_SystemError, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @".const.unknown error when calling native function", i32 0, i32 0))
  br label %entry.if
}

declare i32 @PyArg_UnpackTuple(i8*, i8*, i64, i64, ...)

declare void @PyErr_SetString(i8*, i8*)

declare i8* @PyNumber_Float(i8*)

declare double @PyFloat_AsDouble(i8*)

declare void @Py_DecRef(i8*)

declare i8* @PyErr_Occurred()

declare i8* @PyNumber_Long(i8*)

declare i64 @PyLong_AsLongLong(i8*)

declare void @Py_IncRef(i8*)

declare i8* @PyFloat_FromDouble(double)

declare void @PyErr_Clear()

declare i8* @numba_unpickle(i8*, i32)

declare void @numba_do_raise(i8*)

declare void @PyErr_SetNone(i8*)

!0 = !{!"branch_weights", i32 1, i32 99}
!1 = !{!"branch_weights", i32 99, i32 1}

================================================================================
================================================================================
-----------------OPTIMIZED DUMP temperature_effectiveness_plate-----------------
; ModuleID = 'temperature_effectiveness_plate'
source_filename = "<string>"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29" = common local_unnamed_addr global i8* null
@.const.picklebuf.140612146880992 = internal constant { i8*, i32 } { i8* getelementptr inbounds ([69 x i8], [69 x i8]* @.const.pickledata.140612146880992, i32 0, i32 0), i32 69 }
@".numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb" = external local_unnamed_addr global i8*
@.const.pickledata.140612146880992 = internal constant [69 x i8] c"\80\04\95:\00\00\00\00\00\00\00\8C\08builtins\94\8C\11ZeroDivisionError\94\93\94\8C\10division by zero\94\85\94N\87\94."
@.const.temperature_effectiveness_plate = internal constant [32 x i8] c"temperature_effectiveness_plate\00"
@PyExc_RuntimeError = external global i8
@".const.missing Environment" = internal constant [20 x i8] c"missing Environment\00"
@PyExc_StopIteration = external global i8
@PyExc_SystemError = external global i8
@".const.unknown error when calling native function" = internal constant [43 x i8] c"unknown error when calling native function\00"

define i32 @"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"(double* noalias nocapture %retptr, { i8*, i32 }** noalias nocapture %excinfo, double %arg.R1, double %arg.NTU1, i64 %arg.Np1, i64 %arg.Np2) local_unnamed_addr {
entry:
  %.171 = alloca double, align 8
  store double 0.000000e+00, double* %.171, align 8
  %excinfo.1 = alloca { i8*, i32 }*, align 8
  store { i8*, i32 }* null, { i8*, i32 }** %excinfo.1, align 8
  %.28 = icmp eq i64 %arg.Np1, 1
  %.54 = icmp eq i64 %arg.Np2, 1
  %or.cond = and i1 %.28, %.54
  br i1 %or.cond, label %B18, label %B26

B18:                                              ; preds = %entry
  store double 1.100000e+00, double* %retptr, align 8
  ret i32 0

B26:                                              ; preds = %entry
  %.121 = fcmp oeq double %arg.R1, 0.000000e+00
  br i1 %.121, label %B26.if, label %B26.endif, !prof !0

B26.if:                                           ; preds = %B26
  store { i8*, i32 }* @.const.picklebuf.140612146880992, { i8*, i32 }** %excinfo, align 8
  ret i32 1

B26.endif:                                        ; preds = %B26
  %.130 = fdiv double 1.000000e+00, %arg.R1
  %.144 = fmul double %arg.R1, %arg.NTU1
  %.1691 = load i32 (double*, { i8*, i32 }**, double, double, i64, i64, i8)*, i32 (double*, { i8*, i32 }**, double, double, i64, i64, i8)** bitcast (i8** @".numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb" to i32 (double*, { i8*, i32 }**, double, double, i64, i64, i8)**), align 8
  store double 0.000000e+00, double* %.171, align 8
  %.176 = call i32 %.1691(double* nonnull %.171, { i8*, i32 }** nonnull %excinfo.1, double %.130, double %.144, i64 %arg.Np2, i64 %arg.Np1, i8 1)
  switch i32 %.176, label %B26.endif.if [
    i32 -2, label %B26.endif.endif
    i32 0, label %B26.endif.endif
  ]

B26.endif.if:                                     ; preds = %B26.endif
  %0 = bitcast { i8*, i32 }** %excinfo.1 to i64*
  %.1772 = load i64, i64* %0, align 8
  %1 = bitcast { i8*, i32 }** %excinfo to i64*
  store i64 %.1772, i64* %1, align 8
  ret i32 %.176

B26.endif.endif:                                  ; preds = %B26.endif, %B26.endif
  store double 1.300000e+00, double* %retptr, align 8
  ret i32 0
}

define i8* @"_ZN7cpython8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"(i8* nocapture readnone %py_closure, i8* %py_args, i8* nocapture readnone %py_kws) local_unnamed_addr {
entry:
  %.171.i = alloca double, align 8
  %excinfo.1.i = alloca { i8*, i32 }*, align 8
  %.5 = alloca i8*, align 8
  %.6 = alloca i8*, align 8
  %.7 = alloca i8*, align 8
  %.8 = alloca i8*, align 8
  %.9 = alloca i8*, align 8
  %.10 = call i32 (i8*, i8*, i64, i64, ...) @PyArg_UnpackTuple(i8* %py_args, i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.const.temperature_effectiveness_plate, i64 0, i64 0), i64 5, i64 5, i8** nonnull %.5, i8** nonnull %.6, i8** nonnull %.7, i8** nonnull %.8, i8** nonnull %.9)
  %.11 = icmp eq i32 %.10, 0
  br i1 %.11, label %entry.if, label %entry.endif, !prof !0

entry.if:                                         ; preds = %entry.endif.endif.endif.e...endif.if, %entry.endif.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif, %entry.endif.endif.endif, %entry.endif.endif, %entry.endif.endif.endif.e...endif.endif, %entry.endif.endif.endif.e...endif.if.if, %entry.endif.endif.endif.e...endif.endif.if, %entry.endif.endif.endif.e...endif.endif.endif.endif, %entry
  ret i8* null

entry.endif:                                      ; preds = %entry
  %.15 = load i8*, i8** @"_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29", align 8
  %.20 = icmp eq i8* %.15, null
  br i1 %.20, label %entry.endif.if, label %entry.endif.endif, !prof !0

entry.endif.if:                                   ; preds = %entry.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_RuntimeError, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @".const.missing Environment", i64 0, i64 0))
  ret i8* null

entry.endif.endif:                                ; preds = %entry.endif
  %.24 = load i8*, i8** %.5, align 8
  %.25 = call i8* @PyNumber_Float(i8* %.24)
  %.26 = call double @PyFloat_AsDouble(i8* %.25)
  call void @Py_DecRef(i8* %.25)
  %.28 = call i8* @PyErr_Occurred()
  %.29 = icmp eq i8* %.28, null
  br i1 %.29, label %entry.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif:                          ; preds = %entry.endif.endif
  %.33 = load i8*, i8** %.6, align 8
  %.34 = call i8* @PyNumber_Float(i8* %.33)
  %.35 = call double @PyFloat_AsDouble(i8* %.34)
  call void @Py_DecRef(i8* %.34)
  %.37 = call i8* @PyErr_Occurred()
  %.38 = icmp eq i8* %.37, null
  br i1 %.38, label %entry.endif.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif.endif:                    ; preds = %entry.endif.endif.endif
  %.42 = load i8*, i8** %.7, align 8
  %.45 = call i8* @PyNumber_Long(i8* %.42)
  %.46 = icmp eq i8* %.45, null
  br i1 %.46, label %entry.endif.endif.endif.endif.endif, label %entry.endif.endif.endif.endif.if, !prof !0

entry.endif.endif.endif.endif.if:                 ; preds = %entry.endif.endif.endif.endif
  %.48 = call i64 @PyLong_AsLongLong(i8* nonnull %.45)
  call void @Py_DecRef(i8* nonnull %.45)
  br label %entry.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif:              ; preds = %entry.endif.endif.endif.endif, %entry.endif.endif.endif.endif.if
  %.43.0 = phi i64 [ %.48, %entry.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif ]
  %.53 = call i8* @PyErr_Occurred()
  %.54 = icmp eq i8* %.53, null
  br i1 %.54, label %entry.endif.endif.endif.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif.endif.endif.endif:        ; preds = %entry.endif.endif.endif.endif.endif
  %.58 = load i8*, i8** %.8, align 8
  %.61 = call i8* @PyNumber_Long(i8* %.58)
  %.62 = icmp eq i8* %.61, null
  br i1 %.62, label %entry.endif.endif.endif.endif.endif.endif.endif, label %entry.endif.endif.endif.endif.endif.endif.if, !prof !0

entry.endif.endif.endif.endif.endif.endif.if:     ; preds = %entry.endif.endif.endif.endif.endif.endif
  %.64 = call i64 @PyLong_AsLongLong(i8* nonnull %.61)
  call void @Py_DecRef(i8* nonnull %.61)
  br label %entry.endif.endif.endif.endif.endif.endif.endif

entry.endif.endif.endif.endif.endif.endif.endif:  ; preds = %entry.endif.endif.endif.endif.endif.endif, %entry.endif.endif.endif.endif.endif.endif.if
  %.59.0 = phi i64 [ %.64, %entry.endif.endif.endif.endif.endif.endif.if ], [ 0, %entry.endif.endif.endif.endif.endif.endif ]
  %.69 = call i8* @PyErr_Occurred()
  %.70 = icmp eq i8* %.69, null
  br i1 %.70, label %entry.endif.endif.endif.endif.endif.endif.endif.endif, label %entry.if, !prof !1

entry.endif.endif.endif.endif.endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.endif.endif.endif.endif
  %0 = bitcast double* %.171.i to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %0)
  %1 = bitcast { i8*, i32 }** %excinfo.1.i to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %1)
  store double 0.000000e+00, double* %.171.i, align 8, !noalias !2
  store { i8*, i32 }* null, { i8*, i32 }** %excinfo.1.i, align 8, !noalias !2
  %.28.i = icmp eq i64 %.43.0, 1
  %.54.i = icmp eq i64 %.59.0, 1
  %or.cond.i = and i1 %.28.i, %.54.i
  br i1 %or.cond.i, label %entry.endif.endif.endif.e...if.endif, label %B26.i

B26.i:                                            ; preds = %entry.endif.endif.endif.endif.endif.endif.endif.endif
  %.121.i = fcmp oeq double %.26, 0.000000e+00
  br i1 %.121.i, label %entry.endif.endif.endif.e...endif.thread, label %B26.endif.i, !prof !0

entry.endif.endif.endif.e...endif.thread:         ; preds = %B26.i
  %2 = bitcast { i8*, i32 }** %excinfo.1.i to i8*
  %3 = bitcast double* %.171.i to i8*
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %3)
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %2)
  br label %entry.endif.endif.endif.e...endif.if

B26.endif.i:                                      ; preds = %B26.i
  %.130.i = fdiv double 1.000000e+00, %.26
  %.144.i = fmul double %.26, %.35
  %.1691.i = load i32 (double*, { i8*, i32 }**, double, double, i64, i64, i8)*, i32 (double*, { i8*, i32 }**, double, double, i64, i64, i8)** bitcast (i8** @".numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb" to i32 (double*, { i8*, i32 }**, double, double, i64, i64, i8)**), align 8, !noalias !2
  store double 0.000000e+00, double* %.171.i, align 8, !noalias !2
  %.176.i = call i32 %.1691.i(double* nonnull %.171.i, { i8*, i32 }** nonnull %excinfo.1.i, double %.130.i, double %.144.i, i64 %.59.0, i64 %.43.0, i8 1), !noalias !2
  switch i32 %.176.i, label %"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29.exit" [
    i32 -2, label %entry.endif.endif.endif.e...if.endif
    i32 0, label %entry.endif.endif.endif.e...if.endif
  ]

"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29.exit": ; preds = %B26.endif.i
  %4 = bitcast { i8*, i32 }** %excinfo.1.i to i8*
  %5 = bitcast double* %.171.i to i8*
  %.1772.i13 = load { i8*, i32 }*, { i8*, i32 }** %excinfo.1.i, align 8, !noalias !2
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %5)
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %4)
  %.86 = icmp sgt i32 %.176.i, 0
  br i1 %.86, label %entry.endif.endif.endif.e...endif.if, label %entry.endif.endif.endif.e...endif.endif

entry.endif.endif.endif.e...if.endif:             ; preds = %B26.endif.i, %B26.endif.i, %entry.endif.endif.endif.endif.endif.endif.endif.endif
  %.74.05 = phi double [ 1.100000e+00, %entry.endif.endif.endif.endif.endif.endif.endif.endif ], [ 1.300000e+00, %B26.endif.i ], [ 1.300000e+00, %B26.endif.i ]
  %6 = bitcast { i8*, i32 }** %excinfo.1.i to i8*
  %7 = bitcast double* %.171.i to i8*
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %7)
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %6)
  %.93 = call i8* @PyFloat_FromDouble(double %.74.05)
  ret i8* %.93

entry.endif.endif.endif.e...endif.if:             ; preds = %entry.endif.endif.endif.e...endif.thread, %"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29.exit"
  %8 = phi { i8*, i32 }* [ @.const.picklebuf.140612146880992, %entry.endif.endif.endif.e...endif.thread ], [ %.1772.i13, %"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29.exit" ]
  call void @PyErr_Clear()
  %.98 = load { i8*, i32 }, { i8*, i32 }* %8, align 8
  %.99 = extractvalue { i8*, i32 } %.98, 0
  %.101 = extractvalue { i8*, i32 } %.98, 1
  %.102 = call i8* @numba_unpickle(i8* %.99, i32 %.101)
  %.103 = icmp eq i8* %.102, null
  br i1 %.103, label %entry.if, label %entry.endif.endif.endif.e...endif.if.if, !prof !0

entry.endif.endif.endif.e...endif.endif:          ; preds = %"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29.exit"
  switch i32 %.176.i, label %entry.endif.endif.endif.e...endif.endif.endif.endif [
    i32 -3, label %entry.endif.endif.endif.e...endif.endif.if
    i32 -1, label %entry.if
  ]

entry.endif.endif.endif.e...endif.if.if:          ; preds = %entry.endif.endif.endif.e...endif.if
  call void @numba_do_raise(i8* nonnull %.102)
  br label %entry.if

entry.endif.endif.endif.e...endif.endif.if:       ; preds = %entry.endif.endif.endif.e...endif.endif
  call void @PyErr_SetNone(i8* nonnull @PyExc_StopIteration)
  br label %entry.if

entry.endif.endif.endif.e...endif.endif.endif.endif: ; preds = %entry.endif.endif.endif.e...endif.endif
  call void @PyErr_SetString(i8* nonnull @PyExc_SystemError, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @".const.unknown error when calling native function", i64 0, i64 0))
  br label %entry.if
}

declare i32 @PyArg_UnpackTuple(i8*, i8*, i64, i64, ...) local_unnamed_addr

declare void @PyErr_SetString(i8*, i8*) local_unnamed_addr

declare i8* @PyNumber_Float(i8*) local_unnamed_addr

declare double @PyFloat_AsDouble(i8*) local_unnamed_addr

declare void @Py_DecRef(i8*) local_unnamed_addr

declare i8* @PyErr_Occurred() local_unnamed_addr

declare i8* @PyNumber_Long(i8*) local_unnamed_addr

declare i64 @PyLong_AsLongLong(i8*) local_unnamed_addr

declare i8* @PyFloat_FromDouble(double) local_unnamed_addr

declare void @PyErr_Clear() local_unnamed_addr

declare i8* @numba_unpickle(i8*, i32) local_unnamed_addr

declare void @numba_do_raise(i8*) local_unnamed_addr

declare void @PyErr_SetNone(i8*) local_unnamed_addr

; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #0

; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #0

; Function Attrs: nounwind
declare void @llvm.stackprotector(i8*, i8**) #1

attributes #0 = { argmemonly nounwind }
attributes #1 = { nounwind }

!0 = !{!"branch_weights", i32 1, i32 99}
!1 = !{!"branch_weights", i32 99, i32 1}
!2 = !{!3, !5}
!3 = distinct !{!3, !4, !"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29: %retptr"}
!4 = distinct !{!4, !"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29"}
!5 = distinct !{!5, !4, !"_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29: %excinfo"}

================================================================================
================================================================================
--------------------ASSEMBLY temperature_effectiveness_plate--------------------
	.text
	.file	"<string>"
	.section	.rodata.cst8,"aM",@progbits,8
	.p2align	3
.LCPI0_0:
	.quad	4607182418800017408
	.text
	.globl	_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29
	.p2align	4, 0x90
	.type	_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29,@function
_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29:
	.cfi_startproc
	pushq	%r14
	.cfi_def_cfa_offset 16
	pushq	%rbx
	.cfi_def_cfa_offset 24
	subq	$24, %rsp
	.cfi_def_cfa_offset 48
	.cfi_offset %rbx, -24
	.cfi_offset %r14, -16
	movq	%rdx, %rax
	movq	%rsi, %r14
	movq	%rdi, %rbx
	movq	$0, 16(%rsp)
	movq	$0, 8(%rsp)
	cmpq	$1, %rdx
	jne	.LBB0_5
	cmpq	$1, %rcx
	jne	.LBB0_5
	movabsq	$4607632778762754458, %rax
	jmp	.LBB0_3
.LBB0_5:
	vxorps	%xmm2, %xmm2, %xmm2
	vucomisd	%xmm2, %xmm0
	jne	.LBB0_7
	jnp	.LBB0_6
.LBB0_7:
	movabsq	$.LCPI0_0, %rdx
	vmovsd	(%rdx), %xmm2
	vdivsd	%xmm0, %xmm2, %xmm2
	vmulsd	%xmm1, %xmm0, %xmm1
	movabsq	$.numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb, %r9
	movq	$0, 16(%rsp)
	leaq	16(%rsp), %rdi
	leaq	8(%rsp), %rsi
	vmovapd	%xmm2, %xmm0
	movq	%rcx, %rdx
	movq	%rax, %rcx
	movl	$1, %r8d
	callq	*(%r9)
	cmpl	$-2, %eax
	je	.LBB0_10
	testl	%eax, %eax
	jne	.LBB0_9
.LBB0_10:
	movabsq	$4608533498688228557, %rax
.LBB0_3:
	movq	%rax, (%rbx)
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%r14
	.cfi_def_cfa_offset 8
	retq
.LBB0_9:
	.cfi_def_cfa_offset 48
	movq	8(%rsp), %rcx
	movq	%rcx, (%r14)
	addq	$24, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%r14
	.cfi_def_cfa_offset 8
	retq
.LBB0_6:
	.cfi_def_cfa_offset 48
	movabsq	$.const.picklebuf.140612146880992, %rax
	movq	%rax, (%r14)
	movl	$1, %eax
	addq	$24, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%r14
	.cfi_def_cfa_offset 8
	retq
.Lfunc_end0:
	.size	_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29, .Lfunc_end0-_ZN8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29
	.cfi_endproc

	.section	.rodata.cst8,"aM",@progbits,8
	.p2align	3
.LCPI1_0:
	.quad	4607632778762754458
.LCPI1_1:
	.quad	4607182418800017408
.LCPI1_2:
	.quad	4608533498688228557
	.text
	.globl	_ZN7cpython8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29
	.p2align	4, 0x90
	.type	_ZN7cpython8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29,@function
_ZN7cpython8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	pushq	%r15
	.cfi_def_cfa_offset 24
	pushq	%r14
	.cfi_def_cfa_offset 32
	pushq	%r13
	.cfi_def_cfa_offset 40
	pushq	%r12
	.cfi_def_cfa_offset 48
	pushq	%rbx
	.cfi_def_cfa_offset 56
	subq	$72, %rsp
	.cfi_def_cfa_offset 128
	.cfi_offset %rbx, -56
	.cfi_offset %r12, -48
	.cfi_offset %r13, -40
	.cfi_offset %r14, -32
	.cfi_offset %r15, -24
	.cfi_offset %rbp, -16
	movq	%rsi, %rdi
	subq	$8, %rsp
	.cfi_adjust_cfa_offset 8
	leaq	72(%rsp), %rbp
	leaq	40(%rsp), %rbx
	leaq	48(%rsp), %r10
	movabsq	$.const.temperature_effectiveness_plate, %rsi
	movabsq	$PyArg_UnpackTuple, %r11
	leaq	64(%rsp), %r8
	leaq	56(%rsp), %r9
	movl	$5, %edx
	movl	$5, %ecx
	movl	$0, %eax
	pushq	%rbp
	.cfi_adjust_cfa_offset 8
	pushq	%rbx
	.cfi_adjust_cfa_offset 8
	pushq	%r10
	.cfi_adjust_cfa_offset 8
	callq	*%r11
	addq	$32, %rsp
	.cfi_adjust_cfa_offset -32
	testl	%eax, %eax
	je	.LBB1_1
	movabsq	$_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29, %rax
	cmpq	$0, (%rax)
	je	.LBB1_4
	movq	56(%rsp), %rdi
	movabsq	$PyNumber_Float, %r14
	callq	*%r14
	movq	%rax, %rbx
	movabsq	$PyFloat_AsDouble, %rbp
	movq	%rax, %rdi
	callq	*%rbp
	vmovsd	%xmm0, 24(%rsp)
	movabsq	$Py_DecRef, %r13
	movq	%rbx, %rdi
	callq	*%r13
	movabsq	$PyErr_Occurred, %r12
	callq	*%r12
	testq	%rax, %rax
	jne	.LBB1_1
	movq	48(%rsp), %rdi
	callq	*%r14
	movq	%rax, %rbx
	movq	%rax, %rdi
	callq	*%rbp
	vmovsd	%xmm0, 16(%rsp)
	movq	%rbx, %rdi
	callq	*%r13
	callq	*%r12
	testq	%rax, %rax
	jne	.LBB1_1
	movq	40(%rsp), %rdi
	movabsq	$PyNumber_Long, %rbp
	callq	*%rbp
	movabsq	$PyLong_AsLongLong, %r15
	testq	%rax, %rax
	je	.LBB1_9
	movq	%rax, %rbx
	movq	%rax, %rdi
	callq	*%r15
	movq	%rax, %r14
	movq	%rbx, %rdi
	callq	*%r13
	callq	*%r12
	testq	%rax, %rax
	jne	.LBB1_1
.LBB1_12:
	movq	32(%rsp), %rdi
	callq	*%rbp
	testq	%rax, %rax
	je	.LBB1_13
	movq	%rax, %rbx
	movq	%rax, %rdi
	callq	*%r15
	movq	%rax, %r15
	movq	%rbx, %rdi
	callq	*%r13
	callq	*%r12
	testq	%rax, %rax
	jne	.LBB1_1
.LBB1_16:
	movq	$0, 8(%rsp)
	movq	$0, (%rsp)
	cmpq	$1, %r14
	jne	.LBB1_20
	cmpq	$1, %r15
	jne	.LBB1_20
	movabsq	$.LCPI1_0, %rax
	vmovsd	(%rax), %xmm0
	jmp	.LBB1_19
.LBB1_20:
	vxorps	%xmm0, %xmm0, %xmm0
	vmovsd	24(%rsp), %xmm1
	vucomisd	%xmm0, %xmm1
	jne	.LBB1_22
	jnp	.LBB1_21
.LBB1_22:
	movabsq	$.LCPI1_1, %rax
	vmovsd	(%rax), %xmm0
	vdivsd	%xmm1, %xmm0, %xmm0
	vmulsd	16(%rsp), %xmm1, %xmm1
	movabsq	$.numba.unresolved$_ZN8__main__35temperature_effectiveness_plate$242Eddxxb, %rax
	movq	$0, 8(%rsp)
	leaq	8(%rsp), %rdi
	movq	%rsp, %rsi
	movq	%r15, %rdx
	movq	%r14, %rcx
	movl	$1, %r8d
	callq	*(%rax)
	movabsq	$.LCPI1_2, %rcx
	vmovsd	(%rcx), %xmm0
	cmpl	$-2, %eax
	je	.LBB1_19
	testl	%eax, %eax
	jne	.LBB1_24
.LBB1_19:
	movabsq	$PyFloat_FromDouble, %rax
	callq	*%rax
	jmp	.LBB1_2
.LBB1_24:
	jle	.LBB1_28
	movq	(%rsp), %rbx
.LBB1_26:
	movabsq	$PyErr_Clear, %rax
	callq	*%rax
	movl	8(%rbx), %esi
	movq	(%rbx), %rdi
	movabsq	$numba_unpickle, %rax
	callq	*%rax
	testq	%rax, %rax
	je	.LBB1_1
	movabsq	$numba_do_raise, %rcx
	movq	%rax, %rdi
	callq	*%rcx
	jmp	.LBB1_1
.LBB1_28:
	cmpl	$-3, %eax
	je	.LBB1_31
	cmpl	$-1, %eax
	je	.LBB1_1
	movabsq	$PyExc_SystemError, %rdi
	movabsq	$".const.unknown error when calling native function", %rsi
	jmp	.LBB1_5
.LBB1_31:
	movabsq	$PyExc_StopIteration, %rdi
	movabsq	$PyErr_SetNone, %rax
	callq	*%rax
	jmp	.LBB1_1
.LBB1_4:
	movabsq	$PyExc_RuntimeError, %rdi
	movabsq	$".const.missing Environment", %rsi
.LBB1_5:
	movabsq	$PyErr_SetString, %rax
	callq	*%rax
.LBB1_1:
	xorl	%eax, %eax
.LBB1_2:
	addq	$72, %rsp
	.cfi_def_cfa_offset 56
	popq	%rbx
	.cfi_def_cfa_offset 48
	popq	%r12
	.cfi_def_cfa_offset 40
	popq	%r13
	.cfi_def_cfa_offset 32
	popq	%r14
	.cfi_def_cfa_offset 24
	popq	%r15
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	retq
.LBB1_9:
	.cfi_def_cfa_offset 128
	xorl	%r14d, %r14d
	callq	*%r12
	testq	%rax, %rax
	je	.LBB1_12
	jmp	.LBB1_1
.LBB1_13:
	xorl	%r15d, %r15d
	callq	*%r12
	testq	%rax, %rax
	je	.LBB1_16
	jmp	.LBB1_1
.LBB1_21:
	movabsq	$.const.picklebuf.140612146880992, %rbx
	jmp	.LBB1_26
.Lfunc_end1:
	.size	_ZN7cpython8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29, .Lfunc_end1-_ZN7cpython8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29
	.cfi_endproc

	.type	_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29,@object
	.comm	_ZN08NumbaEnv8__main__35temperature_effectiveness_plate$241Eddxx28omitted$28default$3dFalse$29,8,8
	.type	.const.picklebuf.140612146880992,@object
	.section	.rodata,"a",@progbits
	.p2align	3
.const.picklebuf.140612146880992:
	.quad	.const.pickledata.140612146880992
	.long	69
	.zero	4
	.size	.const.picklebuf.140612146880992, 16

	.type	.const.pickledata.140612146880992,@object
	.p2align	4
.const.pickledata.140612146880992:
	.ascii	"\200\004\225:\000\000\000\000\000\000\000\214\bbuiltins\224\214\021ZeroDivisionError\224\223\224\214\020division by zero\224\205\224N\207\224."
	.size	.const.pickledata.140612146880992, 69

	.type	.const.temperature_effectiveness_plate,@object
	.p2align	4
.const.temperature_effectiveness_plate:
	.asciz	"temperature_effectiveness_plate"
	.size	.const.temperature_effectiveness_plate, 32

	.type	".const.missing Environment",@object
	.p2align	4
".const.missing Environment":
	.asciz	"missing Environment"
	.size	".const.missing Environment", 20

	.type	".const.unknown error when calling native function",@object
	.p2align	4
".const.unknown error when calling native function":
	.asciz	"unknown error when calling native function"
	.size	".const.unknown error when calling native function", 43


	.section	".note.GNU-stack","",@progbits

================================================================================
[cache] index loaded from '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.nbi'
[cache] index saved to '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.nbi'
[cache] data saved to '__pycache__/issue2_minimal.temperature_effectiveness_plate-3.py37m.2.nbc'
1.1

Issue Analytics

  • State:open
  • Created 3 years ago
  • Comments:7 (3 by maintainers)

github_iconTop GitHub Comments

1reaction
yoni-wolfcommented, Feb 24, 2022

found a workaround if you don’t want to turn your recursive function into iterative one - use inline. unfortunately it is not always applicable, only works if you know the max depth the inline function will need. (limit inline depth)

this worked fine for me as long as inline depth wasn’t more than 5: @numba.njit(cache=True, inline=CostModel(5))

0reactions
gmarkallcommented, Aug 16, 2022

From https://numba.discourse.group/t/cacheing-specific-numba-function-causes-sigabrt/1497, it looks like the problem is with the unresolved symbols generated during the compilation of mutual / type-varying recursion. For example, the error there is:

LLVM ERROR: Symbol not found: _.numba.unresolved$_ZN6search7negamaxB3v29B38c8tJTIcFHzwl2ILiXkcBV0KBSgP9CGZpAgA_3dEN5numba1051SearchStructType_28_28_27max_depth_27_2c_20uint16_29_2c_20_28_27max_qdepth_27_2c_20uint16_29_2c_20_28_27min_depth_27_2c_20uint16_29_2c_20_28_27current_search_depth_27_2c_20int16_29_2c_20_28_27ply_27_2c_20int16_29_2c_20_28_27max_time_27_2c_20uint64_29_2c_20_28_27start_time_27_2c_20float64_29_2c_20_28_27node_count_27_2c_20uint64_29_2c_20_28_27pv_table_27_2c_20array_28uint32_2c_202d_2c_20C_29_29_2c_20_28_27pv_length_27_2c_20array_28uint16_2c_201d_2c_20C_29_29_2c_20_28_27killer_moves_27_2c_20array_28uint32_2c_202d_2c_20C_29_29_2c_20_28_27history_moves_27_2c_20array_28uint32_2c_202d_2c_20C_29_29_2c_20_28_27transposition_table_27_2c_20unaligned_20array_28Record_28key_5btype_3duint64_3boffset_3d0_5d_2cscore_5btype_3dint32_3boffset_3d8_5d_2cflag_5btype_3duint8_3boffset_3d12_5d_2cmove_5btype_3duint32_3boffset_3d13_5d_2cdepth_5btype_3dint8_3boffset_3d17_5d_3b18_3bFalse_29_2c_201d_2c_20C_29_29_2c_20_28_27repetition_table_27_2c_20array_28uint64_2c_201d_2c_20C_29_29_2c_20_28_27repetition_index_27_2c_20uint16_29_2c_20_28_27stopped_27_2c_20bool_29_29EN5numba435PositionStructType_28_28_27board_27_2c_20array_28uint8_2c_201d_2c_20C_29_29_2c_20_28_27white_pieces_27_2c_20list_28int64_29_3civ_3dNone_3e_29_2c_20_28_27black_pieces_27_2c_20list_28int64_29_3civ_3dNone_3e_29_2c_20_28_27king_positions_27_2c_20array_28uint8_2c_201d_2c_20C_29_29_2c_20_28_27castle_ability_bits_27_2c_20uint8_29_2c_20_28_27ep_square_27_2c_20int8_29_2c_20_28_27side_27_2c_20uint8_29_2c_20_28_27hash_key_27_2c_20uint64_29_29Exxx

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
Read more comments on GitHub >

github_iconTop Results From Across the Web

Segmentation fault due to recursion - Stack Overflow
I'd make your rearange function iterative - do while added, and recursive call removed:
Read more >
Cacheing specific Numba function causes SIGABRT - Support
I just found this Setting cache=True with a recursive function results in Segmentation fault · Issue #6061 · numba/numba · GitHub.
Read more >
Segmentation fault on recursive function - C Board
Hey guys, I am having segmentation fault on recursive function @ int fill_array(). If I enter number like 0 to 16100, the program...
Read more >
Getting segmentation fault on recursive function - Reddit
I'm trying to write this memoized version of the Ackermann function but when I pass in m = 3 and n = 16,...
Read more >
Release Notes — Numba 0.56.4+0.g288a38bbd.dirty-py3.7 ...
Self-recursive device functions. ... PR #8037: CUDA self-recursion tests (Graham Markall) ... PR #5602: Fix segfault caused by pop from numba.typed.List.
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found