program main
  implicit none
  integer(8) :: x, y, z, m
  read (*, *) x, y
  if (mod(x + y, 3_8) /= 0) then
    write (*, "(i0)") 0
    return
  end if
  z = (x + y) / 3
  if (x < z .or. y < z) then
    write (*, "(i0)") 0
    return
  end if

  m = 1000000007
  write(*, "(i0)") combi(z, x - z, m)
  contains

  function combi(n, k, m)
    implicit none
    integer(8), intent(in) :: n, k, m
    integer(8) :: combi, numera, denomi
    numera = perm(n, k, m)
    denomi = mod(fact(k, m), m)
    combi = mod(numera * inv(denomi, m), m)
  end function combi

  function perm(n, k, m)
    integer(8), intent(in) :: n, k, m
    integer(8) :: i, perm
    perm = 1
    do i = n, n - k + 1, -1
      perm = mod(perm * i, m)
    end do
  end function perm

  function fact(n, m)
    implicit none
    integer(8), intent(in) :: n, m
    integer(8) :: i, fact
    fact = 1
    do i = 1, n
      fact = mod(fact * i, m)
    end do
  end function fact

  function inv(n, m)
    implicit none
    integer(8), intent(in) :: n, m
    integer(8) :: inv
    inv = pow(n, m - 2, m)
  end function inv

  recursive function pow(n, p, m) result(res)
    implicit none
    integer(8), intent(in) :: n, p, m
    integer(8) :: res
    if (p == 0) then
      res = 1
    else if (mod(p, 2_8) == 0) then
      res = mod(pow(n, p / 2, m) ** 2, m)
    else
      res = mod(pow(n, p - 1, m) * n, m)
    end if
  end function pow
end program main

; ModuleID = 'FIRModule'
source_filename = "FIRModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@_QQcl.8290518184f995062db3612a1b86cd2c = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_3007/source.f\00"
@_QQcl.28693029 = linkonce constant [4 x i8] c"(i0)"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

define void @_QQmain() local_unnamed_addr {
  %1 = alloca i64, align 8
  %2 = alloca i64, align 8
  %3 = alloca i64, align 8
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.8290518184f995062db3612a1b86cd2c, i32 4)
  %7 = call i1 @_FortranAioInputInteger(ptr %6, ptr nonnull %4, i32 8)
  %8 = call i1 @_FortranAioInputInteger(ptr %6, ptr nonnull %5, i32 8)
  %9 = call i32 @_FortranAioEndIoStatement(ptr %6)
  %10 = load i64, ptr %4, align 8, !tbaa !3
  %11 = load i64, ptr %5, align 8, !tbaa !3
  %12 = add i64 %11, %10
  %13 = srem i64 %12, 3
  %14 = sdiv i64 %12, 3
  %.not = icmp eq i64 %13, 0
  br i1 %.not, label %19, label %16

common.ret:                                       ; preds = %_QFPcombi.exit, %23, %16
  %.sink = phi ptr [ %27, %_QFPcombi.exit ], [ %24, %23 ], [ %17, %16 ]
  %15 = call i32 @_FortranAioEndIoStatement(ptr %.sink)
  ret void

16:                                               ; preds = %0
  %17 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.8290518184f995062db3612a1b86cd2c, i32 6)
  %18 = call i1 @_FortranAioOutputInteger32(ptr %17, i32 0)
  br label %common.ret

19:                                               ; preds = %0
  %20 = icmp slt i64 %10, %14
  %21 = icmp slt i64 %11, %14
  %22 = or i1 %20, %21
  br i1 %22, label %23, label %26

23:                                               ; preds = %19
  %24 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.8290518184f995062db3612a1b86cd2c, i32 11)
  %25 = call i1 @_FortranAioOutputInteger32(ptr %24, i32 0)
  br label %common.ret

26:                                               ; preds = %19
  store i64 1000000007, ptr %3, align 8, !tbaa !3
  %27 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.8290518184f995062db3612a1b86cd2c, i32 16)
  %28 = load i64, ptr %4, align 8, !tbaa !3
  %29 = sub i64 %28, %14
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)
  %30 = icmp sgt i64 %29, 0
  br i1 %30, label %.lr.ph.i.i, label %_QFPcombi.exit

.lr.ph.i.i:                                       ; preds = %26, %.lr.ph.i.i
  %31 = phi i64 [ %36, %.lr.ph.i.i ], [ %29, %26 ]
  %32 = phi i64 [ %35, %.lr.ph.i.i ], [ %14, %26 ]
  %.05.i.i = phi i64 [ %34, %.lr.ph.i.i ], [ 1, %26 ]
  %33 = mul i64 %.05.i.i, %32
  %34 = srem i64 %33, 1000000007
  %35 = add i64 %32, -1
  %36 = add nsw i64 %31, -1
  %37 = icmp ugt i64 %31, 1
  br i1 %37, label %.lr.ph.i.i, label %.lr.ph.i2.i.preheader

.lr.ph.i2.i.preheader:                            ; preds = %.lr.ph.i.i
  %38 = xor i64 %14, -1
  %39 = add i64 %28, %38
  %xtraiter = and i64 %29, 3
  %40 = icmp ult i64 %39, 3
  br i1 %40, label %_QFPcombi.exit.loopexit.unr-lcssa, label %.lr.ph.i2.i.preheader.new

.lr.ph.i2.i.preheader.new:                        ; preds = %.lr.ph.i2.i.preheader
  %unroll_iter = and i64 %29, -4
  br label %.lr.ph.i2.i

.lr.ph.i2.i:                                      ; preds = %.lr.ph.i2.i, %.lr.ph.i2.i.preheader.new
  %41 = phi i64 [ 1, %.lr.ph.i2.i.preheader.new ], [ %53, %.lr.ph.i2.i ]
  %.05.i3.i = phi i64 [ 1, %.lr.ph.i2.i.preheader.new ], [ %52, %.lr.ph.i2.i ]
  %niter = phi i64 [ 0, %.lr.ph.i2.i.preheader.new ], [ %niter.next.3, %.lr.ph.i2.i ]
  %42 = mul i64 %.05.i3.i, %41
  %43 = srem i64 %42, 1000000007
  %44 = add nuw nsw i64 %41, 1
  %45 = mul i64 %43, %44
  %46 = srem i64 %45, 1000000007
  %47 = add nuw nsw i64 %41, 2
  %48 = mul i64 %46, %47
  %49 = srem i64 %48, 1000000007
  %50 = add nuw i64 %41, 3
  %51 = mul i64 %49, %50
  %52 = srem i64 %51, 1000000007
  %53 = add nuw i64 %41, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %_QFPcombi.exit.loopexit.unr-lcssa, label %.lr.ph.i2.i

_QFPcombi.exit.loopexit.unr-lcssa:                ; preds = %.lr.ph.i2.i, %.lr.ph.i2.i.preheader
  %.lcssa.ph = phi i64 [ undef, %.lr.ph.i2.i.preheader ], [ %52, %.lr.ph.i2.i ]
  %.unr = phi i64 [ 1, %.lr.ph.i2.i.preheader ], [ %53, %.lr.ph.i2.i ]
  %.05.i3.i.unr = phi i64 [ 1, %.lr.ph.i2.i.preheader ], [ %52, %.lr.ph.i2.i ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %_QFPcombi.exit, label %.lr.ph.i2.i.epil

.lr.ph.i2.i.epil:                                 ; preds = %_QFPcombi.exit.loopexit.unr-lcssa, %.lr.ph.i2.i.epil
  %54 = phi i64 [ %57, %.lr.ph.i2.i.epil ], [ %.unr, %_QFPcombi.exit.loopexit.unr-lcssa ]
  %.05.i3.i.epil = phi i64 [ %56, %.lr.ph.i2.i.epil ], [ %.05.i3.i.unr, %_QFPcombi.exit.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph.i2.i.epil ], [ 0, %_QFPcombi.exit.loopexit.unr-lcssa ]
  %55 = mul i64 %.05.i3.i.epil, %54
  %56 = srem i64 %55, 1000000007
  %57 = add nuw i64 %54, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %_QFPcombi.exit, label %.lr.ph.i2.i.epil, !llvm.loop !7

_QFPcombi.exit:                                   ; preds = %_QFPcombi.exit.loopexit.unr-lcssa, %.lr.ph.i2.i.epil, %26
  %.0.lcssa.i6.i = phi i64 [ 1, %26 ], [ %34, %.lr.ph.i2.i.epil ], [ %34, %_QFPcombi.exit.loopexit.unr-lcssa ]
  %.0.lcssa.i4.i = phi i64 [ 1, %26 ], [ %.lcssa.ph, %_QFPcombi.exit.loopexit.unr-lcssa ], [ %56, %.lr.ph.i2.i.epil ]
  store i64 %.0.lcssa.i4.i, ptr %2, align 8, !tbaa !3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %1)
  store i64 1000000005, ptr %1, align 8, !tbaa !3
  %58 = call i64 @_QFPpow(ptr nonnull %2, ptr nonnull %1, ptr nonnull %3)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %1)
  %59 = mul i64 %58, %.0.lcssa.i6.i
  %60 = srem i64 %59, 1000000007
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)
  %61 = call i1 @_FortranAioOutputInteger64(ptr %27, i64 %60)
  br label %common.ret
}

; Function Attrs: nofree nosync nounwind memory(argmem: read)
define i64 @_QFPcombi(ptr nocapture readonly %0, ptr nocapture readonly %1, ptr %2) local_unnamed_addr #0 {
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = load i64, ptr %1, align 8, !tbaa !3
  %7 = icmp sgt i64 %6, 0
  br i1 %7, label %.lr.ph.i, label %._QFPfact.exit_crit_edge

._QFPfact.exit_crit_edge:                         ; preds = %3
  %.pre = load i64, ptr %2, align 8, !tbaa !3
  br label %_QFPfact.exit

.lr.ph.i:                                         ; preds = %3
  %8 = load i64, ptr %0, align 8, !tbaa !3
  %9 = load i64, ptr %2, align 8, !tbaa !3
  %xtraiter = and i64 %6, 1
  %10 = icmp eq i64 %6, 1
  br i1 %10, label %.lr.ph.i2.preheader.unr-lcssa, label %.lr.ph.i.new

.lr.ph.i.new:                                     ; preds = %.lr.ph.i
  %unroll_iter = and i64 %6, -2
  br label %11

11:                                               ; preds = %11, %.lr.ph.i.new
  %12 = phi i64 [ %8, %.lr.ph.i.new ], [ %18, %11 ]
  %.05.i = phi i64 [ 1, %.lr.ph.i.new ], [ %17, %11 ]
  %niter = phi i64 [ 0, %.lr.ph.i.new ], [ %niter.next.1, %11 ]
  %13 = mul i64 %.05.i, %12
  %14 = srem i64 %13, %9
  %15 = add i64 %12, -1
  %16 = mul i64 %14, %15
  %17 = srem i64 %16, %9
  %18 = add i64 %12, -2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1.not = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1.not, label %.lr.ph.i2.preheader.unr-lcssa, label %11

.lr.ph.i2.preheader.unr-lcssa:                    ; preds = %11, %.lr.ph.i
  %.lcssa11.ph = phi i64 [ undef, %.lr.ph.i ], [ %17, %11 ]
  %.unr12 = phi i64 [ %8, %.lr.ph.i ], [ %18, %11 ]
  %.05.i.unr = phi i64 [ 1, %.lr.ph.i ], [ %17, %11 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph.i2.preheader, label %.lr.ph.i2.preheader.epilog-lcssa

.lr.ph.i2.preheader.epilog-lcssa:                 ; preds = %.lr.ph.i2.preheader.unr-lcssa
  %19 = mul i64 %.05.i.unr, %.unr12
  %20 = srem i64 %19, %9
  br label %.lr.ph.i2.preheader

.lr.ph.i2.preheader:                              ; preds = %.lr.ph.i2.preheader.unr-lcssa, %.lr.ph.i2.preheader.epilog-lcssa
  %.lcssa11 = phi i64 [ %.lcssa11.ph, %.lr.ph.i2.preheader.unr-lcssa ], [ %20, %.lr.ph.i2.preheader.epilog-lcssa ]
  %xtraiter14 = and i64 %6, 3
  %21 = icmp ult i64 %6, 4
  br i1 %21, label %_QFPfact.exit.loopexit.unr-lcssa, label %.lr.ph.i2.preheader.new

.lr.ph.i2.preheader.new:                          ; preds = %.lr.ph.i2.preheader
  %unroll_iter17 = and i64 %6, -4
  br label %.lr.ph.i2

.lr.ph.i2:                                        ; preds = %.lr.ph.i2, %.lr.ph.i2.preheader.new
  %22 = phi i64 [ 1, %.lr.ph.i2.preheader.new ], [ %34, %.lr.ph.i2 ]
  %.05.i3 = phi i64 [ 1, %.lr.ph.i2.preheader.new ], [ %33, %.lr.ph.i2 ]
  %niter18 = phi i64 [ 0, %.lr.ph.i2.preheader.new ], [ %niter18.next.3, %.lr.ph.i2 ]
  %23 = mul i64 %.05.i3, %22
  %24 = srem i64 %23, %9
  %25 = add nuw nsw i64 %22, 1
  %26 = mul i64 %24, %25
  %27 = srem i64 %26, %9
  %28 = add nuw nsw i64 %22, 2
  %29 = mul i64 %27, %28
  %30 = srem i64 %29, %9
  %31 = add nuw i64 %22, 3
  %32 = mul i64 %30, %31
  %33 = srem i64 %32, %9
  %34 = add nuw i64 %22, 4
  %niter18.next.3 = add i64 %niter18, 4
  %niter18.ncmp.3 = icmp eq i64 %niter18.next.3, %unroll_iter17
  br i1 %niter18.ncmp.3, label %_QFPfact.exit.loopexit.unr-lcssa, label %.lr.ph.i2

_QFPfact.exit.loopexit.unr-lcssa:                 ; preds = %.lr.ph.i2, %.lr.ph.i2.preheader
  %.lcssa.ph = phi i64 [ undef, %.lr.ph.i2.preheader ], [ %33, %.lr.ph.i2 ]
  %.unr = phi i64 [ 1, %.lr.ph.i2.preheader ], [ %34, %.lr.ph.i2 ]
  %.05.i3.unr = phi i64 [ 1, %.lr.ph.i2.preheader ], [ %33, %.lr.ph.i2 ]
  %lcmp.mod15.not = icmp eq i64 %xtraiter14, 0
  br i1 %lcmp.mod15.not, label %_QFPfact.exit, label %.lr.ph.i2.epil

.lr.ph.i2.epil:                                   ; preds = %_QFPfact.exit.loopexit.unr-lcssa, %.lr.ph.i2.epil
  %35 = phi i64 [ %38, %.lr.ph.i2.epil ], [ %.unr, %_QFPfact.exit.loopexit.unr-lcssa ]
  %.05.i3.epil = phi i64 [ %37, %.lr.ph.i2.epil ], [ %.05.i3.unr, %_QFPfact.exit.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph.i2.epil ], [ 0, %_QFPfact.exit.loopexit.unr-lcssa ]
  %36 = mul i64 %.05.i3.epil, %35
  %37 = srem i64 %36, %9
  %38 = add nuw i64 %35, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter14
  br i1 %epil.iter.cmp.not, label %_QFPfact.exit, label %.lr.ph.i2.epil, !llvm.loop !9

_QFPfact.exit:                                    ; preds = %_QFPfact.exit.loopexit.unr-lcssa, %.lr.ph.i2.epil, %._QFPfact.exit_crit_edge
  %39 = phi i64 [ %.pre, %._QFPfact.exit_crit_edge ], [ %9, %.lr.ph.i2.epil ], [ %9, %_QFPfact.exit.loopexit.unr-lcssa ]
  %.0.lcssa.i6 = phi i64 [ 1, %._QFPfact.exit_crit_edge ], [ %.lcssa11, %.lr.ph.i2.epil ], [ %.lcssa11, %_QFPfact.exit.loopexit.unr-lcssa ]
  %.0.lcssa.i4 = phi i64 [ 1, %._QFPfact.exit_crit_edge ], [ %.lcssa.ph, %_QFPfact.exit.loopexit.unr-lcssa ], [ %37, %.lr.ph.i2.epil ]
  %40 = srem i64 %.0.lcssa.i4, %39
  store i64 %40, ptr %5, align 8, !tbaa !3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4)
  %41 = add i64 %39, -2
  store i64 %41, ptr %4, align 8, !tbaa !3
  %42 = call i64 @_QFPpow(ptr nonnull %5, ptr nonnull %4, ptr nonnull %2)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4)
  %43 = mul i64 %42, %.0.lcssa.i6
  %44 = srem i64 %43, %39
  ret i64 %44
}

; Function Attrs: nofree norecurse nosync nounwind memory(argmem: read)
define i64 @_QFPperm(ptr nocapture readonly %0, ptr nocapture readonly %1, ptr nocapture readonly %2) local_unnamed_addr #1 {
  %4 = load i64, ptr %1, align 8, !tbaa !3
  %5 = icmp sgt i64 %4, 0
  br i1 %5, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %3
  %6 = load i64, ptr %0, align 8, !tbaa !3
  %7 = load i64, ptr %2, align 8, !tbaa !3
  %xtraiter = and i64 %4, 1
  %8 = icmp eq i64 %4, 1
  br i1 %8, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %4, -2
  br label %9

9:                                                ; preds = %9, %.lr.ph.new
  %10 = phi i64 [ %6, %.lr.ph.new ], [ %16, %9 ]
  %.05 = phi i64 [ 1, %.lr.ph.new ], [ %15, %9 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.1, %9 ]
  %11 = mul i64 %10, %.05
  %12 = srem i64 %11, %7
  %13 = add i64 %10, -1
  %14 = mul i64 %13, %12
  %15 = srem i64 %14, %7
  %16 = add i64 %10, -2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1.not = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1.not, label %._crit_edge.loopexit.unr-lcssa, label %9

._crit_edge.loopexit.unr-lcssa:                   ; preds = %9, %.lr.ph
  %.lcssa.ph = phi i64 [ undef, %.lr.ph ], [ %15, %9 ]
  %.unr6 = phi i64 [ %6, %.lr.ph ], [ %16, %9 ]
  %.05.unr = phi i64 [ 1, %.lr.ph ], [ %15, %9 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %._crit_edge.loopexit.epilog-lcssa

._crit_edge.loopexit.epilog-lcssa:                ; preds = %._crit_edge.loopexit.unr-lcssa
  %17 = mul i64 %.unr6, %.05.unr
  %18 = srem i64 %17, %7
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit.epilog-lcssa, %._crit_edge.loopexit.unr-lcssa, %3
  %.0.lcssa = phi i64 [ 1, %3 ], [ %.lcssa.ph, %._crit_edge.loopexit.unr-lcssa ], [ %18, %._crit_edge.loopexit.epilog-lcssa ]
  ret i64 %.0.lcssa
}

; Function Attrs: nofree norecurse nosync nounwind memory(argmem: read)
define i64 @_QFPfact(ptr nocapture readonly %0, ptr nocapture readonly %1) local_unnamed_addr #1 {
  %3 = load i64, ptr %0, align 8, !tbaa !3
  %4 = icmp sgt i64 %3, 0
  br i1 %4, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %2
  %5 = load i64, ptr %1, align 8, !tbaa !3
  %xtraiter = and i64 %3, 3
  %6 = icmp ult i64 %3, 4
  br i1 %6, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %3, -4
  br label %7

7:                                                ; preds = %7, %.lr.ph.new
  %8 = phi i64 [ 1, %.lr.ph.new ], [ %20, %7 ]
  %.05 = phi i64 [ 1, %.lr.ph.new ], [ %19, %7 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.3, %7 ]
  %9 = mul i64 %8, %.05
  %10 = srem i64 %9, %5
  %11 = add nuw nsw i64 %8, 1
  %12 = mul i64 %11, %10
  %13 = srem i64 %12, %5
  %14 = add nuw nsw i64 %8, 2
  %15 = mul i64 %14, %13
  %16 = srem i64 %15, %5
  %17 = add nuw i64 %8, 3
  %18 = mul i64 %17, %16
  %19 = srem i64 %18, %5
  %20 = add nuw i64 %8, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge.loopexit.unr-lcssa, label %7

._crit_edge.loopexit.unr-lcssa:                   ; preds = %7, %.lr.ph
  %.lcssa.ph = phi i64 [ undef, %.lr.ph ], [ %19, %7 ]
  %.unr = phi i64 [ 1, %.lr.ph ], [ %20, %7 ]
  %.05.unr = phi i64 [ 1, %.lr.ph ], [ %19, %7 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge.loopexit.unr-lcssa, %.epil.preheader
  %21 = phi i64 [ %24, %.epil.preheader ], [ %.unr, %._crit_edge.loopexit.unr-lcssa ]
  %.05.epil = phi i64 [ %23, %.epil.preheader ], [ %.05.unr, %._crit_edge.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge.loopexit.unr-lcssa ]
  %22 = mul i64 %21, %.05.epil
  %23 = srem i64 %22, %5
  %24 = add nuw i64 %21, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge, label %.epil.preheader, !llvm.loop !10

._crit_edge:                                      ; preds = %._crit_edge.loopexit.unr-lcssa, %.epil.preheader, %2
  %.0.lcssa = phi i64 [ 1, %2 ], [ %.lcssa.ph, %._crit_edge.loopexit.unr-lcssa ], [ %23, %.epil.preheader ]
  ret i64 %.0.lcssa
}

; Function Attrs: nofree nosync nounwind memory(argmem: read)
define i64 @_QFPinv(ptr readonly %0, ptr readonly %1) local_unnamed_addr #0 {
  %3 = alloca i64, align 8
  %4 = load i64, ptr %1, align 8, !tbaa !3
  %5 = add i64 %4, -2
  store i64 %5, ptr %3, align 8, !tbaa !3
  %6 = call i64 @_QFPpow(ptr %0, ptr nonnull %3, ptr nonnull %1)
  ret i64 %6
}

; Function Attrs: nofree nosync nounwind memory(argmem: read)
define i64 @_QFPpow(ptr %0, ptr nocapture readonly %1, ptr %2) local_unnamed_addr #0 {
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = load i64, ptr %1, align 8, !tbaa !3
  %7 = icmp eq i64 %6, 0
  br i1 %7, label %22, label %8

8:                                                ; preds = %3
  %9 = and i64 %6, 1
  %10 = icmp eq i64 %9, 0
  br i1 %10, label %11, label %15

11:                                               ; preds = %8
  %12 = sdiv i64 %6, 2
  store i64 %12, ptr %5, align 8, !tbaa !3
  %13 = call i64 @_QFPpow(ptr %0, ptr nonnull %5, ptr %2)
  %14 = mul i64 %13, %13
  br label %.sink.split

15:                                               ; preds = %8
  %16 = add i64 %6, -1
  store i64 %16, ptr %4, align 8, !tbaa !3
  %17 = call i64 @_QFPpow(ptr %0, ptr nonnull %4, ptr %2)
  %18 = load i64, ptr %0, align 8, !tbaa !3
  %19 = mul i64 %18, %17
  br label %.sink.split

.sink.split:                                      ; preds = %15, %11
  %.sink = phi i64 [ %14, %11 ], [ %19, %15 ]
  %20 = load i64, ptr %2, align 8, !tbaa !3
  %21 = srem i64 %.sink, %20
  br label %22

22:                                               ; preds = %.sink.split, %3
  %.0 = phi i64 [ 1, %3 ], [ %21, %.sink.split ]
  ret i64 %.0
}

declare ptr @_FortranAioBeginExternalListInput(i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioInputInteger(ptr, ptr, i32) local_unnamed_addr

declare i32 @_FortranAioEndIoStatement(ptr) local_unnamed_addr

declare ptr @_FortranAioBeginExternalFormattedOutput(ptr, i64, ptr, i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioOutputInteger32(ptr, i32) local_unnamed_addr

declare i1 @_FortranAioOutputInteger64(ptr, i64) local_unnamed_addr

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2

attributes #0 = { nofree nosync nounwind memory(argmem: read) }
attributes #1 = { nofree norecurse nosync nounwind memory(argmem: read) }
attributes #2 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }

!llvm.module.flags = !{!0, !1, !2}

!0 = !{i32 2, !"Debug Info Version", i32 3}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{!4, !4, i64 0}
!4 = !{!"any data access", !5, i64 0}
!5 = !{!"any access", !6, i64 0}
!6 = !{!"Flang Type TBAA Root"}
!7 = distinct !{!7, !8}
!8 = !{!"llvm.loop.unroll.disable"}
!9 = distinct !{!9, !8}
!10 = distinct !{!10, !8}
