module prime_factorization
  implicit none
  integer :: num, p(1000)
contains
  subroutine prime_factor(n,f,m)
    implicit none
    integer, intent(in) :: n
    integer, intent(inout) :: f(:), m
    integer :: i, k, x, y
    m = 0
    f = 0
    k = 1
    x = n
    do
      y = x
      do i = k, num
        if (mod(x,p(i)).eq.0) then
          m = m+1
          f(m) = p(i)
          k = i
          x = x/p(i)
          exit
        end if
      end do
      if (x.eq.1) exit
      if (x.eq.y) then
        m = m+1
        f(m) = x
        exit
      end if
    end do
    return
  end subroutine prime_factor
  subroutine primes(n)
    implicit none
    integer, intent(in) :: n
    integer :: i, j
    logical :: s(n)
    s = .false.
    s(1) = .true.
    do i = 1, n
      if (s(i)) cycle
      do j = 2*i, n, i
        s(j) = .true.
      end do
    end do
    num = 0
    p = 0
    do i = 1, n
      if (i*i.gt.n) exit
      if (s(i)) cycle
      num = num+1
      p(num) = i
    end do
    return
  end subroutine primes
end module prime_factorization
program factors_of_factorial
  use prime_factorization
  implicit none
  integer(8), parameter :: md = 1000000007_8
  integer(8) :: cnt(1000) = 0_8, m = 1_8
  integer :: n, i, j, s, f(50) = 0
  read(*,*) n
  call primes(n)
  do i = 2, n
    call prime_factor(i,f,s)
    do j = 1, s
      cnt(f(j)) = cnt(f(j))+1_8
    end do
  end do
  do i = 1, n
    m = mod(m*(cnt(i)+1_8),md)
  end do
  write(*,'(i0)') m
  stop
end program factors_of_factorial
; 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"

@_QMprime_factorizationEnum = local_unnamed_addr global i32 undef
@_QMprime_factorizationEp = local_unnamed_addr global [1000 x i32] undef
@_QFEcnt = internal unnamed_addr global [1000 x i64] zeroinitializer
@_QFEf = internal unnamed_addr global [50 x i32] zeroinitializer
@_QFEm = internal unnamed_addr global i64 1
@_QQcl.4a941a546af5762d96442d0b6ac1bcd3 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_7565/source.f\00"
@_QQcl.28693029 = linkonce constant [4 x i8] c"(i0)"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none)
define void @_QMprime_factorizationPprime_factor(ptr nocapture readonly %0, ptr nocapture readonly %1, ptr nocapture %2) local_unnamed_addr #0 {
  store i32 0, ptr %2, align 4, !tbaa !3
  %4 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 1
  %5 = load i64, ptr %4, align 8, !tbaa !7
  %6 = icmp sgt i64 %5, 0
  br i1 %6, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %3
  %7 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  %8 = load i64, ptr %7, align 8, !tbaa !7
  %9 = load ptr, ptr %1, align 8, !tbaa !7
  %xtraiter = and i64 %5, 3
  %10 = icmp ult i64 %5, 4
  br i1 %10, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.new

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

11:                                               ; preds = %11, %.lr.ph.new
  %12 = phi i64 [ 0, %.lr.ph.new ], [ %22, %11 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.3, %11 ]
  %13 = or i64 %12, 1
  %14 = mul i64 %8, %12
  %15 = getelementptr i8, ptr %9, i64 %14
  store i32 0, ptr %15, align 4, !tbaa !3
  %16 = or i64 %12, 2
  %17 = mul i64 %8, %13
  %18 = getelementptr i8, ptr %9, i64 %17
  store i32 0, ptr %18, align 4, !tbaa !3
  %19 = or i64 %12, 3
  %20 = mul i64 %8, %16
  %21 = getelementptr i8, ptr %9, i64 %20
  store i32 0, ptr %21, align 4, !tbaa !3
  %22 = add nuw nsw i64 %12, 4
  %23 = mul i64 %8, %19
  %24 = getelementptr i8, ptr %9, i64 %23
  store i32 0, ptr %24, align 4, !tbaa !3
  %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 %11

._crit_edge.loopexit.unr-lcssa:                   ; preds = %11, %.lr.ph
  %.unr = phi i64 [ 0, %.lr.ph ], [ %22, %11 ]
  %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
  %25 = phi i64 [ %26, %.epil.preheader ], [ %.unr, %._crit_edge.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge.loopexit.unr-lcssa ]
  %26 = add nuw nsw i64 %25, 1
  %27 = mul i64 %8, %25
  %28 = getelementptr i8, ptr %9, i64 %27
  store i32 0, ptr %28, align 4, !tbaa !3
  %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 !9

._crit_edge:                                      ; preds = %._crit_edge.loopexit.unr-lcssa, %.epil.preheader, %3
  %29 = load i32, ptr %0, align 4, !tbaa !3
  %30 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  %.pre31 = load i32, ptr @_QMprime_factorizationEnum, align 4, !tbaa !3
  br label %31

31:                                               ; preds = %58, %._crit_edge
  %32 = phi i32 [ %.pre31, %._crit_edge ], [ %56, %58 ]
  %.016 = phi i32 [ 1, %._crit_edge ], [ %.117, %58 ]
  %.015 = phi i32 [ %29, %._crit_edge ], [ %.1, %58 ]
  %33 = sub i32 1, %.016
  %34 = add i32 %33, %32
  %35 = icmp sgt i32 %34, 0
  br i1 %35, label %.lr.ph26, label %.loopexit

.lr.ph26:                                         ; preds = %31, %54
  %.01823 = phi i32 [ %55, %54 ], [ %.016, %31 ]
  %36 = sext i32 %.01823 to i64
  %37 = add nsw i64 %36, -1
  %38 = getelementptr [1000 x i32], ptr @_QMprime_factorizationEp, i64 0, i64 %37
  %39 = load i32, ptr %38, align 4, !tbaa !3
  %40 = srem i32 %.015, %39
  %41 = icmp eq i32 %40, 0
  br i1 %41, label %42, label %54

42:                                               ; preds = %.lr.ph26
  %43 = load i32, ptr %2, align 4, !tbaa !3
  %44 = add i32 %43, 1
  store i32 %44, ptr %2, align 4, !tbaa !3
  %45 = load i32, ptr %38, align 4, !tbaa !3
  %46 = sext i32 %44 to i64
  %47 = add nsw i64 %46, -1
  %48 = load ptr, ptr %1, align 8, !tbaa !7
  %49 = load i64, ptr %30, align 8, !tbaa !7
  %50 = mul i64 %49, %47
  %51 = getelementptr i8, ptr %48, i64 %50
  store i32 %45, ptr %51, align 4, !tbaa !3
  %52 = load i32, ptr %38, align 4, !tbaa !3
  %53 = sdiv i32 %.015, %52
  %.pre = load i32, ptr @_QMprime_factorizationEnum, align 4, !tbaa !3
  br label %.loopexit

54:                                               ; preds = %.lr.ph26
  %55 = add i32 %.01823, 1
  %exitcond30.not = icmp eq i32 %.01823, %32
  br i1 %exitcond30.not, label %.loopexit, label %.lr.ph26

.loopexit:                                        ; preds = %54, %31, %42
  %56 = phi i32 [ %.pre, %42 ], [ %32, %31 ], [ %32, %54 ]
  %.117 = phi i32 [ %.01823, %42 ], [ %.016, %31 ], [ %.016, %54 ]
  %.1 = phi i32 [ %53, %42 ], [ %.015, %31 ], [ %.015, %54 ]
  %57 = icmp eq i32 %.1, 1
  br i1 %57, label %.loopexit20, label %58

58:                                               ; preds = %.loopexit
  %59 = icmp eq i32 %.1, %.015
  br i1 %59, label %60, label %31

60:                                               ; preds = %58
  %61 = load i32, ptr %2, align 4, !tbaa !3
  %62 = add i32 %61, 1
  store i32 %62, ptr %2, align 4, !tbaa !3
  %63 = sext i32 %62 to i64
  %64 = add nsw i64 %63, -1
  %65 = load ptr, ptr %1, align 8, !tbaa !7
  %66 = load i64, ptr %30, align 8, !tbaa !7
  %67 = mul i64 %64, %66
  %68 = getelementptr i8, ptr %65, i64 %67
  store i32 %.015, ptr %68, align 4, !tbaa !3
  br label %.loopexit20

.loopexit20:                                      ; preds = %.loopexit, %60
  ret void
}

; Function Attrs: nofree nosync nounwind memory(readwrite, argmem: read, inaccessiblemem: none)
define void @_QMprime_factorizationPprimes(ptr nocapture readonly %0) local_unnamed_addr #1 {
  %2 = load i32, ptr %0, align 4, !tbaa !3
  %3 = tail call i32 @llvm.smax.i32(i32 %2, i32 0)
  %4 = zext i32 %3 to i64
  %5 = alloca i32, i64 %4, align 4
  %.not28 = icmp slt i32 %2, 1
  br i1 %.not28, label %._crit_edge, label %.lr.ph20.preheader

._crit_edge:                                      ; preds = %1
  store i32 1, ptr %5, align 4, !tbaa !3
  br label %._crit_edge21

.lr.ph20.preheader:                               ; preds = %1
  %6 = tail call i64 @llvm.smax.i64(i64 %4, i64 1)
  %7 = shl nuw nsw i64 %6, 2
  call void @llvm.memset.p0.i64(ptr nonnull align 4 %5, i8 0, i64 %7, i1 false), !tbaa !3
  store i32 1, ptr %5, align 4, !tbaa !3
  %8 = zext i32 %2 to i64
  br label %.lr.ph20

.lr.ph20:                                         ; preds = %.lr.ph20.preheader, %.loopexit
  %indvars.iv = phi i64 [ 1, %.lr.ph20.preheader ], [ %indvars.iv.next, %.loopexit ]
  %9 = add nsw i64 %indvars.iv, -1
  %10 = getelementptr i32, ptr %5, i64 %9
  %11 = load i32, ptr %10, align 4, !tbaa !3
  %.not16 = icmp eq i32 %11, 0
  br i1 %.not16, label %12, label %.loopexit

12:                                               ; preds = %.lr.ph20
  %indvars.iv.tr = trunc i64 %indvars.iv to i32
  %13 = shl i32 %indvars.iv.tr, 1
  %14 = sext i32 %13 to i64
  %15 = add nuw nsw i64 %indvars.iv, %8
  %16 = sub nsw i64 %15, %14
  %17 = sdiv i64 %16, %indvars.iv
  %18 = icmp sgt i64 %17, 0
  br i1 %18, label %.lr.ph18.preheader, label %.loopexit

.lr.ph18.preheader:                               ; preds = %12
  %19 = trunc i64 %indvars.iv to i32
  %xtraiter = and i64 %17, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph18.prol.loopexit, label %.lr.ph18.prol

.lr.ph18.prol:                                    ; preds = %.lr.ph18.preheader, %.lr.ph18.prol
  %20 = phi i64 [ %26, %.lr.ph18.prol ], [ %17, %.lr.ph18.preheader ]
  %21 = phi i32 [ %25, %.lr.ph18.prol ], [ %13, %.lr.ph18.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph18.prol ], [ 0, %.lr.ph18.preheader ]
  %22 = sext i32 %21 to i64
  %23 = add nsw i64 %22, -1
  %24 = getelementptr i32, ptr %5, i64 %23
  store i32 1, ptr %24, align 4, !tbaa !3
  %25 = add i32 %21, %19
  %26 = add nsw i64 %20, -1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph18.prol.loopexit, label %.lr.ph18.prol, !llvm.loop !11

.lr.ph18.prol.loopexit:                           ; preds = %.lr.ph18.prol, %.lr.ph18.preheader
  %.unr = phi i64 [ %17, %.lr.ph18.preheader ], [ %26, %.lr.ph18.prol ]
  %.unr35 = phi i32 [ %13, %.lr.ph18.preheader ], [ %25, %.lr.ph18.prol ]
  %27 = icmp ult i64 %17, 4
  br i1 %27, label %.loopexit, label %.lr.ph18

.lr.ph18:                                         ; preds = %.lr.ph18.prol.loopexit, %.lr.ph18
  %28 = phi i64 [ %46, %.lr.ph18 ], [ %.unr, %.lr.ph18.prol.loopexit ]
  %29 = phi i32 [ %45, %.lr.ph18 ], [ %.unr35, %.lr.ph18.prol.loopexit ]
  %30 = sext i32 %29 to i64
  %31 = add nsw i64 %30, -1
  %32 = getelementptr i32, ptr %5, i64 %31
  store i32 1, ptr %32, align 4, !tbaa !3
  %33 = add i32 %29, %19
  %34 = sext i32 %33 to i64
  %35 = add nsw i64 %34, -1
  %36 = getelementptr i32, ptr %5, i64 %35
  store i32 1, ptr %36, align 4, !tbaa !3
  %37 = add i32 %33, %19
  %38 = sext i32 %37 to i64
  %39 = add nsw i64 %38, -1
  %40 = getelementptr i32, ptr %5, i64 %39
  store i32 1, ptr %40, align 4, !tbaa !3
  %41 = add i32 %37, %19
  %42 = sext i32 %41 to i64
  %43 = add nsw i64 %42, -1
  %44 = getelementptr i32, ptr %5, i64 %43
  store i32 1, ptr %44, align 4, !tbaa !3
  %45 = add i32 %41, %19
  %46 = add nsw i64 %28, -4
  %47 = add i64 %28, -5
  %48 = icmp ult i64 %47, -2
  br i1 %48, label %.lr.ph18, label %.loopexit

.loopexit:                                        ; preds = %.lr.ph18.prol.loopexit, %.lr.ph18, %12, %.lr.ph20
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv, %8
  br i1 %exitcond.not, label %._crit_edge21, label %.lr.ph20

._crit_edge21:                                    ; preds = %.loopexit, %._crit_edge
  store i32 0, ptr @_QMprime_factorizationEnum, align 4, !tbaa !3
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(4000) @_QMprime_factorizationEp, i8 0, i64 4000, i1 false), !tbaa !3
  %49 = load i32, ptr %0, align 4, !tbaa !3
  %50 = icmp sgt i32 %49, 0
  br i1 %50, label %.lr.ph25.preheader, label %._crit_edge26

.lr.ph25.preheader:                               ; preds = %._crit_edge21
  %51 = add nuw i32 %49, 1
  %wide.trip.count = zext i32 %51 to i64
  br label %.lr.ph25

.lr.ph25:                                         ; preds = %.lr.ph25.preheader, %65
  %52 = phi i32 [ 0, %.lr.ph25.preheader ], [ %66, %65 ]
  %53 = phi i32 [ %49, %.lr.ph25.preheader ], [ %67, %65 ]
  %indvars.iv30 = phi i64 [ 1, %.lr.ph25.preheader ], [ %indvars.iv.next31, %65 ]
  %indvars32 = trunc i64 %indvars.iv30 to i32
  %54 = mul i32 %indvars32, %indvars32
  %55 = icmp sgt i32 %54, %53
  br i1 %55, label %._crit_edge26, label %56

56:                                               ; preds = %.lr.ph25
  %57 = add nsw i64 %indvars.iv30, -1
  %58 = getelementptr i32, ptr %5, i64 %57
  %59 = load i32, ptr %58, align 4, !tbaa !3
  %.not = icmp eq i32 %59, 0
  br i1 %.not, label %60, label %65

60:                                               ; preds = %56
  %61 = add i32 %52, 1
  store i32 %61, ptr @_QMprime_factorizationEnum, align 4, !tbaa !3
  %62 = sext i32 %61 to i64
  %63 = add nsw i64 %62, -1
  %64 = getelementptr [1000 x i32], ptr @_QMprime_factorizationEp, i64 0, i64 %63
  store i32 %indvars32, ptr %64, align 4, !tbaa !3
  %.pre = load i32, ptr %0, align 4, !tbaa !3
  br label %65

65:                                               ; preds = %60, %56
  %66 = phi i32 [ %61, %60 ], [ %52, %56 ]
  %67 = phi i32 [ %.pre, %60 ], [ %53, %56 ]
  %indvars.iv.next31 = add nuw nsw i64 %indvars.iv30, 1
  %exitcond33.not = icmp eq i64 %indvars.iv.next31, %wide.trip.count
  br i1 %exitcond33.not, label %._crit_edge26, label %.lr.ph25

._crit_edge26:                                    ; preds = %65, %.lr.ph25, %._crit_edge21
  ret void
}

; Function Attrs: noreturn
define void @_QQmain() local_unnamed_addr #2 {
  %1 = alloca i32, align 4
  %2 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.4a941a546af5762d96442d0b6ac1bcd3, i32 64)
  %3 = call i1 @_FortranAioInputInteger(ptr %2, ptr nonnull %1, i32 4)
  %4 = call i32 @_FortranAioEndIoStatement(ptr %2)
  call void @_QMprime_factorizationPprimes(ptr nonnull %1)
  %5 = load i32, ptr %1, align 4, !tbaa !3
  %6 = sext i32 %5 to i64
  %7 = icmp sgt i32 %5, 1
  br i1 %7, label %.lr.ph.i.preheader.lr.ph, label %.preheader

.lr.ph.i.preheader.lr.ph:                         ; preds = %0
  %.pre31.i = load i32, ptr @_QMprime_factorizationEnum, align 4, !tbaa !3
  %8 = add i32 %.pre31.i, 1
  br label %.lr.ph.i.preheader

.lr.ph.i.preheader:                               ; preds = %.lr.ph.i.preheader.lr.ph, %._crit_edge
  %.in = phi i64 [ %6, %.lr.ph.i.preheader.lr.ph ], [ %10, %._crit_edge ]
  %9 = phi i32 [ 2, %.lr.ph.i.preheader.lr.ph ], [ %64, %._crit_edge ]
  %10 = add nsw i64 %.in, -1
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(200) @_QFEf, i8 0, i64 200, i1 false), !tbaa !3
  br label %._crit_edge.i

.preheader:                                       ; preds = %._crit_edge, %0
  %11 = icmp sgt i32 %5, 0
  br i1 %11, label %.lr.ph17.preheader, label %84

.lr.ph17.preheader:                               ; preds = %.preheader
  %_QFEm.promoted = load i64, ptr @_QFEm, align 8, !tbaa !3
  %xtraiter45 = and i64 %6, 1
  %12 = icmp eq i32 %5, 1
  br i1 %12, label %._crit_edge18.unr-lcssa, label %.lr.ph17.preheader.new

.lr.ph17.preheader.new:                           ; preds = %.lr.ph17.preheader
  %unroll_iter48 = and i64 %6, -2
  br label %.lr.ph17

._crit_edge.i:                                    ; preds = %.lr.ph.i.preheader, %31
  %.0 = phi i32 [ %.1, %31 ], [ 0, %.lr.ph.i.preheader ]
  %.016.i = phi i32 [ %.117.i, %31 ], [ 1, %.lr.ph.i.preheader ]
  %.015.i = phi i32 [ %.1.i, %31 ], [ %9, %.lr.ph.i.preheader ]
  %13 = sub i32 %8, %.016.i
  %14 = icmp sgt i32 %13, 0
  br i1 %14, label %.lr.ph26.i, label %.loopexit.i

.lr.ph26.i:                                       ; preds = %._crit_edge.i, %28
  %.01823.i = phi i32 [ %29, %28 ], [ %.016.i, %._crit_edge.i ]
  %15 = sext i32 %.01823.i to i64
  %16 = add nsw i64 %15, -1
  %17 = getelementptr [1000 x i32], ptr @_QMprime_factorizationEp, i64 0, i64 %16
  %18 = load i32, ptr %17, align 4, !tbaa !3
  %19 = srem i32 %.015.i, %18
  %20 = sdiv i32 %.015.i, %18
  %21 = icmp eq i32 %19, 0
  br i1 %21, label %22, label %28

22:                                               ; preds = %.lr.ph26.i
  %23 = add i32 %.0, 1
  %24 = sext i32 %23 to i64
  %25 = shl nsw i64 %24, 2
  %26 = add nsw i64 %25, -4
  %27 = getelementptr i8, ptr @_QFEf, i64 %26
  store i32 %18, ptr %27, align 4, !tbaa !3
  br label %.loopexit.i

28:                                               ; preds = %.lr.ph26.i
  %29 = add i32 %.01823.i, 1
  %exitcond30.not.i = icmp eq i32 %.01823.i, %.pre31.i
  br i1 %exitcond30.not.i, label %.loopexit.i, label %.lr.ph26.i

.loopexit.i:                                      ; preds = %28, %22, %._crit_edge.i
  %.1 = phi i32 [ %23, %22 ], [ %.0, %._crit_edge.i ], [ %.0, %28 ]
  %.117.i = phi i32 [ %.01823.i, %22 ], [ %.016.i, %._crit_edge.i ], [ %.016.i, %28 ]
  %.1.i = phi i32 [ %20, %22 ], [ %.015.i, %._crit_edge.i ], [ %.015.i, %28 ]
  %30 = icmp eq i32 %.1.i, 1
  br i1 %30, label %_QMprime_factorizationPprime_factor.exit.loopexit, label %31

31:                                               ; preds = %.loopexit.i
  %32 = icmp eq i32 %.1.i, %.015.i
  br i1 %32, label %33, label %._crit_edge.i

33:                                               ; preds = %31
  %34 = add i32 %.1, 1
  %35 = sext i32 %34 to i64
  %36 = shl nsw i64 %35, 2
  %37 = add nsw i64 %36, -4
  %38 = getelementptr i8, ptr @_QFEf, i64 %37
  store i32 %.015.i, ptr %38, align 4, !tbaa !3
  br label %_QMprime_factorizationPprime_factor.exit

_QMprime_factorizationPprime_factor.exit.loopexit: ; preds = %.loopexit.i
  %.pre = sext i32 %.1 to i64
  br label %_QMprime_factorizationPprime_factor.exit

_QMprime_factorizationPprime_factor.exit:         ; preds = %_QMprime_factorizationPprime_factor.exit.loopexit, %33
  %.pre-phi = phi i64 [ %.pre, %_QMprime_factorizationPprime_factor.exit.loopexit ], [ %35, %33 ]
  %.2 = phi i32 [ %.1, %_QMprime_factorizationPprime_factor.exit.loopexit ], [ %34, %33 ]
  %39 = icmp sgt i32 %.2, 0
  br i1 %39, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %_QMprime_factorizationPprime_factor.exit
  %xtraiter = and i64 %.pre-phi, 1
  %40 = icmp eq i64 %.pre-phi, 1
  br i1 %40, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.preheader.new

.lr.ph.preheader.new:                             ; preds = %.lr.ph.preheader
  %unroll_iter = and i64 %.pre-phi, -2
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph, %.lr.ph.preheader.new
  %indvars.iv = phi i64 [ 1, %.lr.ph.preheader.new ], [ %indvars.iv.next.1, %.lr.ph ]
  %niter = phi i64 [ 0, %.lr.ph.preheader.new ], [ %niter.next.1, %.lr.ph ]
  %41 = add nsw i64 %indvars.iv, -1
  %42 = getelementptr [50 x i32], ptr @_QFEf, i64 0, i64 %41
  %43 = load i32, ptr %42, align 4, !tbaa !3
  %44 = sext i32 %43 to i64
  %45 = add nsw i64 %44, -1
  %46 = getelementptr [1000 x i64], ptr @_QFEcnt, i64 0, i64 %45
  %47 = load i64, ptr %46, align 8, !tbaa !3
  %48 = add i64 %47, 1
  store i64 %48, ptr %46, align 8, !tbaa !3
  %49 = getelementptr [50 x i32], ptr @_QFEf, i64 0, i64 %indvars.iv
  %50 = load i32, ptr %49, align 4, !tbaa !3
  %51 = sext i32 %50 to i64
  %52 = add nsw i64 %51, -1
  %53 = getelementptr [1000 x i64], ptr @_QFEcnt, i64 0, i64 %52
  %54 = load i64, ptr %53, align 8, !tbaa !3
  %55 = add i64 %54, 1
  store i64 %55, ptr %53, align 8, !tbaa !3
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph

._crit_edge.loopexit.unr-lcssa:                   ; preds = %.lr.ph, %.lr.ph.preheader
  %indvars.iv.unr = phi i64 [ 1, %.lr.ph.preheader ], [ %indvars.iv.next.1, %.lr.ph ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %.lr.ph.epil

.lr.ph.epil:                                      ; preds = %._crit_edge.loopexit.unr-lcssa
  %56 = add nsw i64 %indvars.iv.unr, -1
  %57 = getelementptr [50 x i32], ptr @_QFEf, i64 0, i64 %56
  %58 = load i32, ptr %57, align 4, !tbaa !3
  %59 = sext i32 %58 to i64
  %60 = add nsw i64 %59, -1
  %61 = getelementptr [1000 x i64], ptr @_QFEcnt, i64 0, i64 %60
  %62 = load i64, ptr %61, align 8, !tbaa !3
  %63 = add i64 %62, 1
  store i64 %63, ptr %61, align 8, !tbaa !3
  br label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph.epil, %._crit_edge.loopexit.unr-lcssa, %_QMprime_factorizationPprime_factor.exit
  %64 = add nuw i32 %9, 1
  %65 = icmp sgt i64 %.in, 2
  br i1 %65, label %.lr.ph.i.preheader, label %.preheader

.lr.ph17:                                         ; preds = %.lr.ph17, %.lr.ph17.preheader.new
  %indvars.iv26 = phi i64 [ 1, %.lr.ph17.preheader.new ], [ %indvars.iv.next27.1, %.lr.ph17 ]
  %66 = phi i64 [ %_QFEm.promoted, %.lr.ph17.preheader.new ], [ %77, %.lr.ph17 ]
  %niter49 = phi i64 [ 0, %.lr.ph17.preheader.new ], [ %niter49.next.1, %.lr.ph17 ]
  %67 = add nsw i64 %indvars.iv26, -1
  %68 = getelementptr [1000 x i64], ptr @_QFEcnt, i64 0, i64 %67
  %69 = load i64, ptr %68, align 8, !tbaa !3
  %70 = add i64 %69, 1
  %71 = mul i64 %70, %66
  %72 = srem i64 %71, 1000000007
  %73 = getelementptr [1000 x i64], ptr @_QFEcnt, i64 0, i64 %indvars.iv26
  %74 = load i64, ptr %73, align 8, !tbaa !3
  %75 = add i64 %74, 1
  %76 = mul i64 %75, %72
  %77 = srem i64 %76, 1000000007
  %indvars.iv.next27.1 = add nuw nsw i64 %indvars.iv26, 2
  %niter49.next.1 = add i64 %niter49, 2
  %niter49.ncmp.1 = icmp eq i64 %niter49.next.1, %unroll_iter48
  br i1 %niter49.ncmp.1, label %._crit_edge18.unr-lcssa.loopexit, label %.lr.ph17

._crit_edge18.unr-lcssa.loopexit:                 ; preds = %.lr.ph17
  %78 = add nuw nsw i64 %indvars.iv26, 1
  br label %._crit_edge18.unr-lcssa

._crit_edge18.unr-lcssa:                          ; preds = %._crit_edge18.unr-lcssa.loopexit, %.lr.ph17.preheader
  %.lcssa.ph = phi i64 [ undef, %.lr.ph17.preheader ], [ %77, %._crit_edge18.unr-lcssa.loopexit ]
  %indvars.iv26.unr = phi i64 [ 0, %.lr.ph17.preheader ], [ %78, %._crit_edge18.unr-lcssa.loopexit ]
  %.unr = phi i64 [ %_QFEm.promoted, %.lr.ph17.preheader ], [ %77, %._crit_edge18.unr-lcssa.loopexit ]
  %lcmp.mod46.not = icmp eq i64 %xtraiter45, 0
  br i1 %lcmp.mod46.not, label %._crit_edge18, label %.lr.ph17.epil

.lr.ph17.epil:                                    ; preds = %._crit_edge18.unr-lcssa
  %79 = getelementptr [1000 x i64], ptr @_QFEcnt, i64 0, i64 %indvars.iv26.unr
  %80 = load i64, ptr %79, align 8, !tbaa !3
  %81 = add i64 %80, 1
  %82 = mul i64 %81, %.unr
  %83 = srem i64 %82, 1000000007
  br label %._crit_edge18

._crit_edge18:                                    ; preds = %._crit_edge18.unr-lcssa, %.lr.ph17.epil
  %.lcssa = phi i64 [ %.lcssa.ph, %._crit_edge18.unr-lcssa ], [ %83, %.lr.ph17.epil ]
  store i64 %.lcssa, ptr @_QFEm, align 8, !tbaa !3
  br label %84

84:                                               ; preds = %._crit_edge18, %.preheader
  %85 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.4a941a546af5762d96442d0b6ac1bcd3, i32 75)
  %86 = load i64, ptr @_QFEm, align 8, !tbaa !3
  %87 = call i1 @_FortranAioOutputInteger64(ptr %85, i64 %86)
  %88 = call i32 @_FortranAioEndIoStatement(ptr %85)
  %89 = call {} @_FortranAStopStatement(i32 0, i1 false, i1 false)
  unreachable
}

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

declare {} @_FortranAStopStatement(i32, i1, i1) local_unnamed_addr

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smax.i64(i64, i64) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #3

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #4

attributes #0 = { nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) }
attributes #1 = { nofree nosync nounwind memory(readwrite, argmem: read, inaccessiblemem: none) }
attributes #2 = { noreturn }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }

!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 = !{!8, !8, i64 0}
!8 = !{!"descriptor member", !5, i64 0}
!9 = distinct !{!9, !10}
!10 = !{!"llvm.loop.unroll.disable"}
!11 = distinct !{!11, !10}
