diffsl 0.9.1

A compiler for a domain-specific language for ordinary differential equations (ODE).
Documentation
; RUN: %opt < %s %newLoadEnzyme -passes="print-activity-analysis" -activity-analysis-func=_Z8simulatef -S | FileCheck %s

declare {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)*, i64)

declare void @ijl_bounds_error_ints({} addrspace(12)*, i64*, i64)

define double @_Z8simulatef(i1 %cmp, i64 %val) {
entry:
  br i1 %cmp, label %b1, label %b2

b1:
  %alloc1 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 123962498842016 to {}*) to {} addrspace(10)*), i64 2)
  br label %end

b2:
  %alloc2 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 123962498842016 to {}*) to {} addrspace(10)*), i64 2)
  br label %end

end:
  %phi = phi {} addrspace(10)* [ %alloc1, %b1 ], [ %alloc2, %b2 ]
  %ac = addrspacecast {} addrspace(10)* %phi to double addrspace(13)* addrspace(11)*
  %arrayptr189517 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %ac, align 8
  %gep = getelementptr inbounds double, double addrspace(13)* %arrayptr189517, i64 0
  %si = sitofp i64 %val to double
  store double %si, double addrspace(13)* %gep, align 8
  br i1 %cmp, label %oob, label %exit

oob:
  %errorbox186 = alloca i64
  %ei = addrspacecast {} addrspace(10)* %phi to {} addrspace(12)*
  call void @ijl_bounds_error_ints({} addrspace(12)* %ei, i64* noundef nonnull align 8 %errorbox186, i64 noundef 1)
  unreachable

exit:
  %res = load double, double addrspace(13)* %gep
  ret double %res
}

; CHECK: entry
; CHECK-NEXT:   br i1 %cmp, label %b1, label %b2: icv:1 ici:1
; CHECK-NEXT: b1
; CHECK-NEXT:   %alloc1 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 123962498842016 to {}*) to {} addrspace(10)*), i64 2): icv:1 ici:1
; CHECK-NEXT:   br label %end: icv:1 ici:1
; CHECK-NEXT: b2
; CHECK-NEXT:   %alloc2 = call noalias nonnull {} addrspace(10)* @ijl_alloc_array_1d({} addrspace(10)* noundef addrspacecast ({}* inttoptr (i64 123962498842016 to {}*) to {} addrspace(10)*), i64 2): icv:1 ici:1
; CHECK-NEXT:   br label %end: icv:1 ici:1
; CHECK-NEXT: end
; CHECK-NEXT:   %phi = phi {} addrspace(10)* [ %alloc1, %b1 ], [ %alloc2, %b2 ]: icv:1 ici:1
; CHECK-NEXT:   %ac = addrspacecast {} addrspace(10)* %phi to double addrspace(13)* addrspace(11)*: icv:1 ici:1
; CHECK-NEXT:   %arrayptr189517 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %ac, align 8: icv:1 ici:1
; CHECK-NEXT:   %gep = getelementptr inbounds double, double addrspace(13)* %arrayptr189517, i64 0: icv:1 ici:1
; CHECK-NEXT:   %si = sitofp i64 %val to double: icv:1 ici:1
; CHECK-NEXT:   store double %si, double addrspace(13)* %gep, align 8: icv:1 ici:1
; CHECK-NEXT:   br i1 %cmp, label %oob, label %exit: icv:1 ici:1
; CHECK-NEXT: oob
; CHECK-NEXT:   %errorbox186 = alloca i64, align 8: icv:1 ici:1
; CHECK-NEXT:   %ei = addrspacecast {} addrspace(10)* %phi to {} addrspace(12)*: icv:1 ici:1
; CHECK-NEXT:   call void @ijl_bounds_error_ints({} addrspace(12)* %ei, i64* noundef nonnull align 8 %errorbox186, i64 noundef 1): icv:1 ici:1
; CHECK-NEXT:   unreachable: icv:1 ici:1
; CHECK-NEXT: exit
; CHECK-NEXT:   %res = load double, double addrspace(13)* %gep, align 8: icv:1 ici:1
; CHECK-NEXT:   ret double %res: icv:1 ici:1