LOADING LLVM AST INSPECTOR
%cg.state = type { ptr, ptr, ptr, double }
define void @cg_solve(ptr %A, ptr %x, ptr %b) {
entry:
%r0 = call ptr @residual(ptr %A, ptr %x, ptr %b)
%p0 = call ptr @clone(ptr %r0)
br label %cg.loop
cg.loop:
%rho = call double @dot(ptr %r, ptr %r)
%Ap = call ptr @spmv(ptr %A, ptr %p)
%den = call double @dot(ptr %p, ptr %Ap)
%alpha = fdiv double %rho, %den
call void @axpy(double %alpha, ptr %p, ptr %x)
call void @axpy(double -%alpha, ptr %Ap, ptr %r)
%rho.next = call double @dot(ptr %r, ptr %r)
%beta = fdiv double %rho.next, %rho
call void @scale_add(ptr %p, ptr %r, double %beta)
br i1 %done, label %exit, label %cg.loop
exit:
ret void
}
%gmres.krylov = type { ptr, ptr, ptr, i64 }
define void @gmres_restart(ptr %A, ptr %x, ptr %b) {
entry:
call void @arnoldi_init(ptr %b)
br label %arnoldi
arnoldi:
%v = call ptr @basis_vector(i64 %j)
%w = call ptr @spmv(ptr %A, ptr %v)
call void @orthogonalize(ptr %w)
call void @givens_reduce(ptr %w)
br i1 %happy, label %update, label %arnoldi
update:
call void @least_squares(ptr %x)
ret void
}
%cg.state = type { ptr, ptr, ptr, double }
define void @cg_solve(ptr %A, ptr %x, ptr %b) {
entry:
%r0 = call ptr @residual(ptr %A, ptr %x, ptr %b)
%p0 = call ptr @clone(ptr %r0)
br label %cg.loop
cg.loop:
%rho = call double @dot(ptr %r, ptr %r)
%Ap = call ptr @spmv(ptr %A, ptr %p)
%den = call double @dot(ptr %p, ptr %Ap)
%alpha = fdiv double %rho, %den
call void @axpy(double %alpha, ptr %p, ptr %x)
call void @axpy(double -%alpha, ptr %Ap, ptr %r)
%rho.next = call double @dot(ptr %r, ptr %r)
%beta = fdiv double %rho.next, %rho
call void @scale_add(ptr %p, ptr %r, double %beta)
br i1 %done, label %exit, label %cg.loop
exit:
ret void
}
define void @minres_step(ptr %T, ptr %q, ptr %x) {
entry:
%alpha = call double @dot(ptr %q, ptr %T)
%v = call ptr @lanczos_next(ptr %T, ptr %q)
br label %qr.chase
qr.chase:
%c = call double @givens_c(ptr %v)
%s = call double @givens_s(ptr %v)
call void @apply_rotation(double %c, double %s)
call void @update_solution(ptr %x)
br i1 %small, label %exit, label %qr.chase
exit:
ret void
}
define void @bicg_shadow(ptr %A, ptr %x, ptr %b) {
entry:
%r = call ptr @residual(ptr %A, ptr %x, ptr %b)
%rs = call ptr @shadow(ptr %r)
br label %bi.loop
bi.loop:
%rho = call double @dot(ptr %rs, ptr %r)
%v = call ptr @spmv(ptr %A, ptr %p)
%vt = call ptr @spmvt(ptr %A, ptr %ps)
call void @dual_update(ptr %r, ptr %rs)
br i1 %halt, label %exit, label %bi.loop
exit:
ret void
}
define void @minres_step(ptr %T, ptr %q, ptr %x) {
entry:
%alpha = call double @dot(ptr %q, ptr %T)
%v = call ptr @lanczos_next(ptr %T, ptr %q)
br label %qr.chase
qr.chase:
%c = call double @givens_c(ptr %v)
%s = call double @givens_s(ptr %v)
call void @apply_rotation(double %c, double %s)
call void @update_solution(ptr %x)
br i1 %small, label %exit, label %qr.chase
exit:
ret void
}
define void @bicgstab_kernel(ptr %A, ptr %x, ptr %b) {
entry:
%r0 = call ptr @residual(ptr %A, ptr %x, ptr %b)
%rhat = call ptr @clone(ptr %r0)
br label %stab.loop
stab.loop:
%rho = call double @dot(ptr %rhat, ptr %r)
%beta = call double @next_beta(double %rho, double %omega)
%p = call ptr @stabilize(ptr %r, ptr %v, double %beta)
%v = call ptr @spmv(ptr %A, ptr %p)
%alpha = call double @safe_div(ptr %rho, ptr %v)
%s = call ptr @residual_s(ptr %r, ptr %v, double %alpha)
%t = call ptr @spmv(ptr %A, ptr %s)
%omega = call double @minimize(ptr %t, ptr %s)
call void @commit(ptr %x, ptr %p, ptr %s)
br i1 %conv, label %exit, label %stab.loop
exit:
ret void
}
define void @qr_eigen_sweep(ptr %H) {
entry:
br label %shift.loop
shift.loop:
%mu = call double @wilkinson_shift(ptr %H)
call void @subtract_shift(ptr %H, double %mu)
call void @householder_qr(ptr %H)
call void @rq_recompose(ptr %H)
call void @add_shift(ptr %H, double %mu)
br i1 %deflated, label %exit, label %shift.loop
exit:
ret void
}
define void @bicgstab_kernel(ptr %A, ptr %x, ptr %b) {
entry:
%r0 = call ptr @residual(ptr %A, ptr %x, ptr %b)
%rhat = call ptr @clone(ptr %r0)
br label %stab.loop
stab.loop:
%rho = call double @dot(ptr %rhat, ptr %r)
%beta = call double @next_beta(double %rho, double %omega)
%p = call ptr @stabilize(ptr %r, ptr %v, double %beta)
%v = call ptr @spmv(ptr %A, ptr %p)
%alpha = call double @safe_div(ptr %rho, ptr %v)
%s = call ptr @residual_s(ptr %r, ptr %v, double %alpha)
%t = call ptr @spmv(ptr %A, ptr %s)
%omega = call double @minimize(ptr %t, ptr %s)
call void @commit(ptr %x, ptr %p, ptr %s)
br i1 %conv, label %exit, label %stab.loop
exit:
ret void
}
define void @gmres_hessenberg(ptr %A, ptr %V, ptr %H) {
entry:
br label %outer
outer:
%vj = call ptr @load_basis(ptr %V, i64 %j)
%w = call ptr @spmv(ptr %A, ptr %vj)
br label %inner
inner:
%vi = call ptr @load_basis(ptr %V, i64 %i)
%hij = call double @dot(ptr %w, ptr %vi)
call void @store(ptr %H, i64 %i, i64 %j, double %hij)
call void @axpy(double -%hij, ptr %vi, ptr %w)
br i1 %next_i, label %inner, label %normalize
normalize:
%hn = call double @norm2(ptr %w)
call void @scale(ptr %w, double %hn)
br i1 %restart, label %exit, label %outer
exit:
ret void
}
define void @cg_preconditioned(ptr %M, ptr %A, ptr %x) {
entry:
%z = call ptr @solve_lower_upper(ptr %M, ptr %r)
%rz = call double @dot(ptr %r, ptr %z)
br label %pcg.loop
pcg.loop:
%q = call ptr @spmv(ptr %A, ptr %p)
%step = call double @quotient(double %rz, ptr %p, ptr %q)
call void @axpy(double %step, ptr %p, ptr %x)
call void @axpy(double -%step, ptr %q, ptr %r)
br i1 %ok, label %exit, label %pcg.loop
exit:
ret void
}
define void @gmres_hessenberg(ptr %A, ptr %V, ptr %H) {
entry:
br label %outer
outer:
%vj = call ptr @load_basis(ptr %V, i64 %j)
%w = call ptr @spmv(ptr %A, ptr %vj)
br label %inner
inner:
%vi = call ptr @load_basis(ptr %V, i64 %i)
%hij = call double @dot(ptr %w, ptr %vi)
call void @store(ptr %H, i64 %i, i64 %j, double %hij)
call void @axpy(double -%hij, ptr %vi, ptr %w)
br i1 %next_i, label %inner, label %normalize
normalize:
%hn = call double @norm2(ptr %w)
call void @scale(ptr %w, double %hn)
br i1 %restart, label %exit, label %outer
exit:
ret void
}
define void @qr_francis(ptr %A) {
entry:
%bulge = call ptr @make_bulge(ptr %A)
br label %chase
chase:
%g = call ptr @givens_pair(ptr %bulge)
call void @apply_left(ptr %A, ptr %g)
call void @apply_right(ptr %A, ptr %g)
call void @move_bulge(ptr %bulge)
br i1 %fell_off, label %deflate, label %chase
deflate:
call void @split_if_small(ptr %A)
br i1 %done, label %exit, label %entry
exit:
ret void
}
define void @minres_lanczos(ptr %A, ptr %q) {
entry:
%qprev = call ptr @zero_vector()
br label %lanczos
lanczos:
%z = call ptr @spmv(ptr %A, ptr %q)
%alpha = call double @dot(ptr %q, ptr %z)
call void @axpy(double -%alpha, ptr %q, ptr %z)
call void @axpy(double -%beta, ptr %qprev, ptr %z)
%beta.next = call double @norm2(ptr %z)
call void @rotate_tridiagonal(double %alpha, double %beta.next)
br i1 %locked, label %exit, label %lanczos
exit:
ret void
}
define void @qr_francis(ptr %A) {
entry:
%bulge = call ptr @make_bulge(ptr %A)
br label %chase
chase:
%g = call ptr @givens_pair(ptr %bulge)
call void @apply_left(ptr %A, ptr %g)
call void @apply_right(ptr %A, ptr %g)
call void @move_bulge(ptr %bulge)
br i1 %fell_off, label %deflate, label %chase
deflate:
call void @split_if_small(ptr %A)
br i1 %done, label %exit, label %entry
exit:
ret void
}