program main
  implicit none
  integer(8) :: n, a, b, res, m
  read (*, *) n, a, b
  m = 1000000007
  res = pow(2_8, n, m) - combi(n, a, m) - combi(n, b, m) - 1
  write(*, "(i0)") modulo(res, 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.aa71880c0a63e13fef30c97aee25734c = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_2358/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 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.aa71880c0a63e13fef30c97aee25734c, i32 4)
  %11 = call i1 @_FortranAioInputInteger(ptr %10, ptr nonnull %9, i32 8)
  %12 = call i1 @_FortranAioInputInteger(ptr %10, ptr nonnull %6, i32 8)
  %13 = call i1 @_FortranAioInputInteger(ptr %10, ptr nonnull %7, i32 8)
  %14 = call i32 @_FortranAioEndIoStatement(ptr %10)
  store i64 1000000007, ptr %8, align 8, !tbaa !3
  store i64 2, ptr %5, align 8, !tbaa !3
  %15 = call i64 @_QFPpow(ptr nonnull %5, ptr nonnull %9, ptr nonnull %8)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4)
  %16 = load i64, ptr %6, align 8, !tbaa !3
  %17 = icmp sgt i64 %16, 0
  br i1 %17, label %.lr.ph.i.i, label %_QFPcombi.exit

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

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

20:                                               ; preds = %20, %.lr.ph.i.i.new
  %21 = phi i64 [ %18, %.lr.ph.i.i.new ], [ %27, %20 ]
  %.05.i.i = phi i64 [ 1, %.lr.ph.i.i.new ], [ %26, %20 ]
  %niter = phi i64 [ 0, %.lr.ph.i.i.new ], [ %niter.next.1, %20 ]
  %22 = mul i64 %.05.i.i, %21
  %23 = srem i64 %22, 1000000007
  %24 = add i64 %21, -1
  %25 = mul i64 %23, %24
  %26 = srem i64 %25, 1000000007
  %27 = add i64 %21, -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.i.preheader.unr-lcssa, label %20

.lr.ph.i2.i.preheader.unr-lcssa:                  ; preds = %20, %.lr.ph.i.i
  %.lcssa25.ph = phi i64 [ undef, %.lr.ph.i.i ], [ %26, %20 ]
  %.unr26 = phi i64 [ %18, %.lr.ph.i.i ], [ %27, %20 ]
  %.05.i.i.unr = phi i64 [ 1, %.lr.ph.i.i ], [ %26, %20 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph.i2.i.preheader, label %.lr.ph.i2.i.preheader.epilog-lcssa

.lr.ph.i2.i.preheader.epilog-lcssa:               ; preds = %.lr.ph.i2.i.preheader.unr-lcssa
  %28 = mul i64 %.05.i.i.unr, %.unr26
  %29 = srem i64 %28, 1000000007
  br label %.lr.ph.i2.i.preheader

.lr.ph.i2.i.preheader:                            ; preds = %.lr.ph.i2.i.preheader.unr-lcssa, %.lr.ph.i2.i.preheader.epilog-lcssa
  %.lcssa25 = phi i64 [ %.lcssa25.ph, %.lr.ph.i2.i.preheader.unr-lcssa ], [ %29, %.lr.ph.i2.i.preheader.epilog-lcssa ]
  %xtraiter28 = and i64 %16, 3
  %30 = icmp ult i64 %16, 4
  br i1 %30, 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_iter31 = and i64 %16, -4
  br label %.lr.ph.i2.i

.lr.ph.i2.i:                                      ; preds = %.lr.ph.i2.i, %.lr.ph.i2.i.preheader.new
  %31 = phi i64 [ 1, %.lr.ph.i2.i.preheader.new ], [ %43, %.lr.ph.i2.i ]
  %.05.i3.i = phi i64 [ 1, %.lr.ph.i2.i.preheader.new ], [ %42, %.lr.ph.i2.i ]
  %niter32 = phi i64 [ 0, %.lr.ph.i2.i.preheader.new ], [ %niter32.next.3, %.lr.ph.i2.i ]
  %32 = mul i64 %.05.i3.i, %31
  %33 = srem i64 %32, 1000000007
  %34 = add nuw nsw i64 %31, 1
  %35 = mul i64 %33, %34
  %36 = srem i64 %35, 1000000007
  %37 = add nuw nsw i64 %31, 2
  %38 = mul i64 %36, %37
  %39 = srem i64 %38, 1000000007
  %40 = add nuw i64 %31, 3
  %41 = mul i64 %39, %40
  %42 = srem i64 %41, 1000000007
  %43 = add nuw i64 %31, 4
  %niter32.next.3 = add i64 %niter32, 4
  %niter32.ncmp.3 = icmp eq i64 %niter32.next.3, %unroll_iter31
  br i1 %niter32.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
  %.lcssa24.ph = phi i64 [ undef, %.lr.ph.i2.i.preheader ], [ %42, %.lr.ph.i2.i ]
  %.unr = phi i64 [ 1, %.lr.ph.i2.i.preheader ], [ %43, %.lr.ph.i2.i ]
  %.05.i3.i.unr = phi i64 [ 1, %.lr.ph.i2.i.preheader ], [ %42, %.lr.ph.i2.i ]
  %lcmp.mod29.not = icmp eq i64 %xtraiter28, 0
  br i1 %lcmp.mod29.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
  %44 = phi i64 [ %47, %.lr.ph.i2.i.epil ], [ %.unr, %_QFPcombi.exit.loopexit.unr-lcssa ]
  %.05.i3.i.epil = phi i64 [ %46, %.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 ]
  %45 = mul i64 %.05.i3.i.epil, %44
  %46 = srem i64 %45, 1000000007
  %47 = add nuw i64 %44, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter28
  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, %0
  %.0.lcssa.i6.i = phi i64 [ 1, %0 ], [ %.lcssa25, %.lr.ph.i2.i.epil ], [ %.lcssa25, %_QFPcombi.exit.loopexit.unr-lcssa ]
  %.0.lcssa.i4.i = phi i64 [ 1, %0 ], [ %.lcssa24.ph, %_QFPcombi.exit.loopexit.unr-lcssa ], [ %46, %.lr.ph.i2.i.epil ]
  store i64 %.0.lcssa.i4.i, ptr %4, align 8, !tbaa !3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3)
  store i64 1000000005, ptr %3, align 8, !tbaa !3
  %48 = call i64 @_QFPpow(ptr nonnull %4, ptr nonnull %3, ptr nonnull %8)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)
  %49 = load i64, ptr %7, align 8, !tbaa !3
  %50 = icmp sgt i64 %49, 0
  br i1 %50, label %.lr.ph.i.i3, label %_QFPcombi.exit10

.lr.ph.i.i3:                                      ; preds = %_QFPcombi.exit
  %51 = load i64, ptr %9, align 8, !tbaa !3
  %xtraiter34 = and i64 %49, 1
  %52 = icmp eq i64 %49, 1
  br i1 %52, label %.lr.ph.i2.i5.preheader.unr-lcssa, label %.lr.ph.i.i3.new

.lr.ph.i.i3.new:                                  ; preds = %.lr.ph.i.i3
  %unroll_iter40 = and i64 %49, -2
  br label %53

53:                                               ; preds = %53, %.lr.ph.i.i3.new
  %54 = phi i64 [ %51, %.lr.ph.i.i3.new ], [ %60, %53 ]
  %.05.i.i4 = phi i64 [ 1, %.lr.ph.i.i3.new ], [ %59, %53 ]
  %niter41 = phi i64 [ 0, %.lr.ph.i.i3.new ], [ %niter41.next.1, %53 ]
  %55 = mul i64 %.05.i.i4, %54
  %56 = srem i64 %55, 1000000007
  %57 = add i64 %54, -1
  %58 = mul i64 %56, %57
  %59 = srem i64 %58, 1000000007
  %60 = add i64 %54, -2
  %niter41.next.1 = add i64 %niter41, 2
  %niter41.ncmp.1.not = icmp eq i64 %niter41.next.1, %unroll_iter40
  br i1 %niter41.ncmp.1.not, label %.lr.ph.i2.i5.preheader.unr-lcssa, label %53

.lr.ph.i2.i5.preheader.unr-lcssa:                 ; preds = %53, %.lr.ph.i.i3
  %.lcssa23.ph = phi i64 [ undef, %.lr.ph.i.i3 ], [ %59, %53 ]
  %.unr37 = phi i64 [ %51, %.lr.ph.i.i3 ], [ %60, %53 ]
  %.05.i.i4.unr = phi i64 [ 1, %.lr.ph.i.i3 ], [ %59, %53 ]
  %lcmp.mod38.not = icmp eq i64 %xtraiter34, 0
  br i1 %lcmp.mod38.not, label %.lr.ph.i2.i5.preheader, label %.lr.ph.i2.i5.preheader.epilog-lcssa

.lr.ph.i2.i5.preheader.epilog-lcssa:              ; preds = %.lr.ph.i2.i5.preheader.unr-lcssa
  %61 = mul i64 %.05.i.i4.unr, %.unr37
  %62 = srem i64 %61, 1000000007
  br label %.lr.ph.i2.i5.preheader

.lr.ph.i2.i5.preheader:                           ; preds = %.lr.ph.i2.i5.preheader.unr-lcssa, %.lr.ph.i2.i5.preheader.epilog-lcssa
  %.lcssa23 = phi i64 [ %.lcssa23.ph, %.lr.ph.i2.i5.preheader.unr-lcssa ], [ %62, %.lr.ph.i2.i5.preheader.epilog-lcssa ]
  %xtraiter42 = and i64 %49, 3
  %63 = icmp ult i64 %49, 4
  br i1 %63, label %_QFPcombi.exit10.loopexit.unr-lcssa, label %.lr.ph.i2.i5.preheader.new

.lr.ph.i2.i5.preheader.new:                       ; preds = %.lr.ph.i2.i5.preheader
  %unroll_iter47 = and i64 %49, -4
  br label %.lr.ph.i2.i5

.lr.ph.i2.i5:                                     ; preds = %.lr.ph.i2.i5, %.lr.ph.i2.i5.preheader.new
  %64 = phi i64 [ 1, %.lr.ph.i2.i5.preheader.new ], [ %76, %.lr.ph.i2.i5 ]
  %.05.i3.i6 = phi i64 [ 1, %.lr.ph.i2.i5.preheader.new ], [ %75, %.lr.ph.i2.i5 ]
  %niter48 = phi i64 [ 0, %.lr.ph.i2.i5.preheader.new ], [ %niter48.next.3, %.lr.ph.i2.i5 ]
  %65 = mul i64 %.05.i3.i6, %64
  %66 = srem i64 %65, 1000000007
  %67 = add nuw nsw i64 %64, 1
  %68 = mul i64 %66, %67
  %69 = srem i64 %68, 1000000007
  %70 = add nuw nsw i64 %64, 2
  %71 = mul i64 %69, %70
  %72 = srem i64 %71, 1000000007
  %73 = add nuw i64 %64, 3
  %74 = mul i64 %72, %73
  %75 = srem i64 %74, 1000000007
  %76 = add nuw i64 %64, 4
  %niter48.next.3 = add i64 %niter48, 4
  %niter48.ncmp.3 = icmp eq i64 %niter48.next.3, %unroll_iter47
  br i1 %niter48.ncmp.3, label %_QFPcombi.exit10.loopexit.unr-lcssa, label %.lr.ph.i2.i5

_QFPcombi.exit10.loopexit.unr-lcssa:              ; preds = %.lr.ph.i2.i5, %.lr.ph.i2.i5.preheader
  %.lcssa.ph = phi i64 [ undef, %.lr.ph.i2.i5.preheader ], [ %75, %.lr.ph.i2.i5 ]
  %.unr44 = phi i64 [ 1, %.lr.ph.i2.i5.preheader ], [ %76, %.lr.ph.i2.i5 ]
  %.05.i3.i6.unr = phi i64 [ 1, %.lr.ph.i2.i5.preheader ], [ %75, %.lr.ph.i2.i5 ]
  %lcmp.mod45.not = icmp eq i64 %xtraiter42, 0
  br i1 %lcmp.mod45.not, label %_QFPcombi.exit10, label %.lr.ph.i2.i5.epil

.lr.ph.i2.i5.epil:                                ; preds = %_QFPcombi.exit10.loopexit.unr-lcssa, %.lr.ph.i2.i5.epil
  %77 = phi i64 [ %80, %.lr.ph.i2.i5.epil ], [ %.unr44, %_QFPcombi.exit10.loopexit.unr-lcssa ]
  %.05.i3.i6.epil = phi i64 [ %79, %.lr.ph.i2.i5.epil ], [ %.05.i3.i6.unr, %_QFPcombi.exit10.loopexit.unr-lcssa ]
  %epil.iter43 = phi i64 [ %epil.iter43.next, %.lr.ph.i2.i5.epil ], [ 0, %_QFPcombi.exit10.loopexit.unr-lcssa ]
  %78 = mul i64 %.05.i3.i6.epil, %77
  %79 = srem i64 %78, 1000000007
  %80 = add nuw i64 %77, 1
  %epil.iter43.next = add i64 %epil.iter43, 1
  %epil.iter43.cmp.not = icmp eq i64 %epil.iter43.next, %xtraiter42
  br i1 %epil.iter43.cmp.not, label %_QFPcombi.exit10, label %.lr.ph.i2.i5.epil, !llvm.loop !9

_QFPcombi.exit10:                                 ; preds = %_QFPcombi.exit10.loopexit.unr-lcssa, %.lr.ph.i2.i5.epil, %_QFPcombi.exit
  %.0.lcssa.i6.i8 = phi i64 [ 1, %_QFPcombi.exit ], [ %.lcssa23, %.lr.ph.i2.i5.epil ], [ %.lcssa23, %_QFPcombi.exit10.loopexit.unr-lcssa ]
  %.0.lcssa.i4.i9 = phi i64 [ 1, %_QFPcombi.exit ], [ %.lcssa.ph, %_QFPcombi.exit10.loopexit.unr-lcssa ], [ %79, %.lr.ph.i2.i5.epil ]
  %81 = mul i64 %48, %.0.lcssa.i6.i
  %82 = srem i64 %81, 1000000007
  store i64 %.0.lcssa.i4.i9, 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
  %83 = call i64 @_QFPpow(ptr nonnull %2, ptr nonnull %1, ptr nonnull %8)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %1)
  %84 = mul i64 %83, %.0.lcssa.i6.i8
  %85 = srem i64 %84, 1000000007
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)
  %86 = add nsw i64 %85, %82
  %87 = xor i64 %86, -1
  %88 = add i64 %15, %87
  %89 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.aa71880c0a63e13fef30c97aee25734c, i32 7)
  %90 = load i64, ptr %8, align 8, !tbaa !3
  %91 = srem i64 %88, %90
  %92 = xor i64 %88, %90
  %93 = icmp slt i64 %92, 0
  %94 = icmp ne i64 %91, 0
  %95 = and i1 %94, %93
  %96 = select i1 %95, i64 %90, i64 0
  %97 = add i64 %96, %91
  %98 = call i1 @_FortranAioOutputInteger64(ptr %89, i64 %97)
  %99 = call i32 @_FortranAioEndIoStatement(ptr %89)
  ret void
}

; 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 !10

_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 !11

._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 @_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}
!11 = distinct !{!11, !8}
