; 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