program name
    implicit none
    integer(8):: n,m
    integer(8),allocatable:: a(:),b(:),c(:),change(:)
    integer(8):: i,ci

    read*, n,m
    allocate(a(n), b(m), c(m))
    read*, a(:)

    do i=1_8, m
        read*, b(i), c(i)
    end do

    call merge_sort(a, 1_8, n)
    call double_sort(c,b, 1_8,m)

    do i=2,m
        b(i) = b(i)+b(i-1)
    end do

    allocate(change(n))
    change(:) = 0_8
    ci=1
    do i=1, m
    change(ci:min(b(i),n)) = c(i)
    ci = b(i)+1

    if(ci > n) exit
    end do

    do i=1,n
        a(i) = max(a(i),change(i))
    end do

    print*, sum(a)
contains
recursive subroutine double_sort(ar1, ar2, fst, lst)
    integer(8),intent(inout):: ar1(:),ar2(:)
    integer(8),intent(in):: fst,lst
    integer(8):: mdl

    if (lst - fst < 2) then
        if (ar1(fst) < ar1(lst)) then
            call swap(ar1(fst), ar1(lst))
            call swap(ar2(fst), ar2(lst))
        end if
        return
    end if

    mdl = (fst+lst)/2

    call double_sort(ar1,ar2,fst,mdl)
    call double_sort(ar1,ar2,mdl+1,lst)
    call double_merge_(ar1,ar2,fst,mdl,lst)
end subroutine


subroutine double_merge_(ar1,ar2,fst,mdl,lst)
    integer(8),intent(inout):: ar1(:),ar2(:)
    integer(8),intent(in):: fst,mdl,lst
    integer(8),allocatable:: t1(:),t2(:)
    integer(8):: li,ri,ti

    allocate(t1(lst-fst+1), t2(lst-fst+1))

    li=fst
    ri=mdl+1
    ti=1

    do while(li <= mdl .and. ri <= lst)
        if (ar1(li) >= ar1(ri)) then
            t1(ti) = ar1(li) 
            t2(ti) = ar2(li)
            li=li+1
        else
            t1(ti) = ar1(ri)
            t2(ti) = ar2(ri)
            ri=ri+1
        end if
        ti=ti+1
    end do

    if (li <= mdl) then
        t1(ti:) = ar1(li:mdl)
        t2(ti:) = ar2(li:mdl)
    else
        t1(ti:) = ar1(ri:lst)
        t2(ti:) = ar2(ri:lst)
    end if

    ar1(fst:lst) = t1(:)
    ar2(fst:lst) = t2(:)

    deallocate(t1,t2)
end subroutine


recursive subroutine merge_sort(ar, fst, lst)
    integer(8),intent(inout):: ar(:)
    integer(8),intent(in):: fst,lst
    integer(8):: mdl

    if (lst-fst < 2) then
        if (ar(fst) > ar(lst)) call swap(ar(fst),ar(lst))
        return
    end if

    mdl = (fst+lst)/2
    call merge_sort(ar, fst, mdl)
    call merge_sort(ar, mdl+1, lst)
    call merge_(ar, fst, mdl, lst)
end subroutine

subroutine merge_(ar, fst, mdl, lst)
    integer(8),intent(inout):: ar(:)
    integer(8),intent(in):: fst, mdl, lst
    integer(8),allocatable:: tmp(:)
    integer(8):: li, ri, ti

    allocate(tmp(lst-fst+1))

    li=fst
    ri=mdl+1   
    ti=1

    do while (li <= mdl .and. ri <= lst)
        if (ar(li) <= ar(ri)) then
            tmp(ti) = ar(li)
            li=li+1
        else
            tmp(ti) = ar(ri)
            ri=ri+1
        end if
        ti=ti+1
    end do

    if (li <= mdl) then
        tmp(ti:) = ar(li:mdl)
    else
        tmp(ti:) = ar(ri:lst)
    end if

    ar(fst:lst) = tmp(:)
    deallocate(tmp)
end subroutine

subroutine swap(x,y)
    integer(8),intent(inout):: x,y
    integer(8):: tmp
    tmp = x
    x = y
    y = tmp
end subroutine
end program name
; 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"

@_QFEa.0 = internal unnamed_addr global ptr null
@_QFEa.8 = internal unnamed_addr global i64 0
@_QFEb.0 = internal unnamed_addr global ptr null
@_QFEb.8 = internal unnamed_addr global i64 0
@_QFEc.0 = internal unnamed_addr global ptr null
@_QFEc.8 = internal unnamed_addr global i64 0
@_QFEchange = internal unnamed_addr global { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] } { ptr null, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64), i32 20180515, i8 1, i8 10, i8 2, i8 0, [1 x [3 x i64]] [[3 x i64] [i64 1, i64 0, i64 ptrtoint (ptr getelementptr (i64, ptr null, i32 1) to i64)]] }
@_QQcl.bdabb6c83880fdceef97e923f043db4c = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_4242/source.f\00"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #1

define void @_QQmain() local_unnamed_addr {
  %1 = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, align 8
  %2 = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, align 8
  %3 = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, align 8
  %4 = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, align 8
  %5 = alloca i64, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.bdabb6c83880fdceef97e923f043db4c, i32 7)
  %10 = call i1 @_FortranAioInputInteger(ptr %9, ptr nonnull %8, i32 8)
  %11 = call i1 @_FortranAioInputInteger(ptr %9, ptr nonnull %7, i32 8)
  %12 = call i32 @_FortranAioEndIoStatement(ptr %9)
  %13 = load i64, ptr %8, align 8, !tbaa !3
  %14 = call i64 @llvm.smax.i64(i64 %13, i64 0)
  %15 = shl i64 %14, 3
  %16 = call ptr @malloc(i64 %15)
  store ptr %16, ptr @_QFEa.0, align 8, !tbaa !7
  store i64 %14, ptr @_QFEa.8, align 8, !tbaa !7
  %17 = load i64, ptr %7, align 8, !tbaa !3
  %18 = call i64 @llvm.smax.i64(i64 %17, i64 0)
  %19 = shl i64 %18, 3
  %20 = call ptr @malloc(i64 %19)
  store ptr %20, ptr @_QFEb.0, align 8, !tbaa !7
  store i64 %18, ptr @_QFEb.8, align 8, !tbaa !7
  %21 = call ptr @malloc(i64 %19)
  store ptr %21, ptr @_QFEc.0, align 8, !tbaa !7
  store i64 %18, ptr @_QFEc.8, align 8, !tbaa !7
  %22 = call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.bdabb6c83880fdceef97e923f043db4c, i32 9)
  %.unpack = load ptr, ptr @_QFEa.0, align 8, !tbaa !7
  %.unpack722.unpack.unpack724 = load i64, ptr @_QFEa.8, align 8, !tbaa !7
  %23 = call i64 @llvm.smax.i64(i64 %.unpack722.unpack.unpack724, i64 0)
  store ptr %.unpack, ptr %4, align 8, !tbaa !7
  %.fca.1.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 1
  store i64 8, ptr %.fca.1.gep, align 8, !tbaa !7
  %.fca.2.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 2
  store i32 20180515, ptr %.fca.2.gep, align 8, !tbaa !7
  %.fca.3.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 3
  store i8 1, ptr %.fca.3.gep, align 4, !tbaa !7
  %.fca.4.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 4
  store i8 10, ptr %.fca.4.gep, align 1, !tbaa !7
  %.fca.5.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 5
  store i8 0, ptr %.fca.5.gep, align 2, !tbaa !7
  %.fca.6.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 6
  store i8 0, ptr %.fca.6.gep, align 1, !tbaa !7
  %.fca.7.0.0.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 7, i64 0, i64 0
  store i64 1, ptr %.fca.7.0.0.gep, align 8, !tbaa !7
  %.fca.7.0.1.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 7, i64 0, i64 1
  store i64 %23, ptr %.fca.7.0.1.gep, align 8, !tbaa !7
  %.fca.7.0.2.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %4, i64 0, i32 7, i64 0, i64 2
  store i64 8, ptr %.fca.7.0.2.gep, align 8, !tbaa !7
  %24 = call i1 @_FortranAioInputDescriptor(ptr %22, ptr nonnull %4)
  %25 = call i32 @_FortranAioEndIoStatement(ptr %22)
  %26 = load i64, ptr %7, align 8, !tbaa !3
  %27 = icmp sgt i64 %26, 0
  br i1 %27, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %0, %.lr.ph
  %28 = phi i64 [ %37, %.lr.ph ], [ 1, %0 ]
  %29 = call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.bdabb6c83880fdceef97e923f043db4c, i32 12)
  %.unpack868 = load ptr, ptr @_QFEb.0, align 8, !tbaa !7
  %30 = add i64 %28, -1
  %31 = getelementptr i64, ptr %.unpack868, i64 %30
  %32 = call i1 @_FortranAioInputInteger(ptr %29, ptr %31, i32 8)
  %.unpack880 = load ptr, ptr @_QFEc.0, align 8, !tbaa !7
  %33 = add i64 %28, -1
  %34 = getelementptr i64, ptr %.unpack880, i64 %33
  %35 = call i1 @_FortranAioInputInteger(ptr %29, ptr %34, i32 8)
  %36 = call i32 @_FortranAioEndIoStatement(ptr %29)
  %37 = add nuw i64 %28, 1
  %exitcond.not = icmp eq i64 %28, %26
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %.lr.ph, %0
  %.unpack727 = load ptr, ptr @_QFEa.0, align 8, !tbaa !7
  %.unpack734.unpack.unpack736 = load i64, ptr @_QFEa.8, align 8, !tbaa !7
  store ptr %.unpack727, ptr %3, align 8, !tbaa !7
  %.fca.1.gep164 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 1
  store i64 8, ptr %.fca.1.gep164, align 8, !tbaa !7
  %.fca.2.gep166 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 2
  store i32 20180515, ptr %.fca.2.gep166, align 8, !tbaa !7
  %.fca.3.gep168 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 3
  store i8 1, ptr %.fca.3.gep168, align 4, !tbaa !7
  %.fca.4.gep170 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 4
  store i8 10, ptr %.fca.4.gep170, align 1, !tbaa !7
  %.fca.5.gep172 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 5
  store i8 0, ptr %.fca.5.gep172, align 2, !tbaa !7
  %.fca.6.gep174 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 6
  store i8 0, ptr %.fca.6.gep174, align 1, !tbaa !7
  %.fca.7.0.0.gep176 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 7, i64 0, i64 0
  store i64 1, ptr %.fca.7.0.0.gep176, align 8, !tbaa !7
  %.fca.7.0.1.gep178 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 7, i64 0, i64 1
  store i64 %.unpack734.unpack.unpack736, ptr %.fca.7.0.1.gep178, align 8, !tbaa !7
  %.fca.7.0.2.gep180 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %3, i64 0, i32 7, i64 0, i64 2
  store i64 8, ptr %.fca.7.0.2.gep180, align 8, !tbaa !7
  store i64 1, ptr %6, align 8, !tbaa !3
  call void @_QFPmerge_sort(ptr nonnull %3, ptr nonnull %6, ptr nonnull %8)
  %.unpack739 = load ptr, ptr @_QFEc.0, align 8, !tbaa !7
  %.unpack746.unpack.unpack748 = load i64, ptr @_QFEc.8, align 8, !tbaa !7
  store ptr %.unpack739, ptr %2, align 8, !tbaa !7
  %.fca.1.gep214 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 1
  store i64 8, ptr %.fca.1.gep214, align 8, !tbaa !7
  %.fca.2.gep216 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 2
  store i32 20180515, ptr %.fca.2.gep216, align 8, !tbaa !7
  %.fca.3.gep218 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 3
  store i8 1, ptr %.fca.3.gep218, align 4, !tbaa !7
  %.fca.4.gep220 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 4
  store i8 10, ptr %.fca.4.gep220, align 1, !tbaa !7
  %.fca.5.gep222 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 5
  store i8 0, ptr %.fca.5.gep222, align 2, !tbaa !7
  %.fca.6.gep224 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 6
  store i8 0, ptr %.fca.6.gep224, align 1, !tbaa !7
  %.fca.7.0.0.gep226 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 7, i64 0, i64 0
  store i64 1, ptr %.fca.7.0.0.gep226, align 8, !tbaa !7
  %.fca.7.0.1.gep228 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 7, i64 0, i64 1
  store i64 %.unpack746.unpack.unpack748, ptr %.fca.7.0.1.gep228, align 8, !tbaa !7
  %.fca.7.0.2.gep230 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 7, i64 0, i64 2
  store i64 8, ptr %.fca.7.0.2.gep230, align 8, !tbaa !7
  %.unpack751 = load ptr, ptr @_QFEb.0, align 8, !tbaa !7
  %.unpack758.unpack.unpack760 = load i64, ptr @_QFEb.8, align 8, !tbaa !7
  store ptr %.unpack751, ptr %1, align 8, !tbaa !7
  %.fca.1.gep264 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 1
  store i64 8, ptr %.fca.1.gep264, align 8, !tbaa !7
  %.fca.2.gep266 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 2
  store i32 20180515, ptr %.fca.2.gep266, align 8, !tbaa !7
  %.fca.3.gep268 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 3
  store i8 1, ptr %.fca.3.gep268, align 4, !tbaa !7
  %.fca.4.gep270 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 4
  store i8 10, ptr %.fca.4.gep270, align 1, !tbaa !7
  %.fca.5.gep272 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 5
  store i8 0, ptr %.fca.5.gep272, align 2, !tbaa !7
  %.fca.6.gep274 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 6
  store i8 0, ptr %.fca.6.gep274, align 1, !tbaa !7
  %.fca.7.0.0.gep276 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 0
  store i64 1, ptr %.fca.7.0.0.gep276, align 8, !tbaa !7
  %.fca.7.0.1.gep278 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 1
  store i64 %.unpack758.unpack.unpack760, ptr %.fca.7.0.1.gep278, align 8, !tbaa !7
  %.fca.7.0.2.gep280 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  store i64 8, ptr %.fca.7.0.2.gep280, align 8, !tbaa !7
  store i64 1, ptr %5, align 8, !tbaa !3
  call void @_QFPdouble_sort(ptr nonnull %2, ptr nonnull %1, ptr nonnull %5, ptr nonnull %7)
  %38 = load i64, ptr %7, align 8, !tbaa !3
  %39 = add i64 %38, -1
  %40 = icmp sgt i64 %39, 0
  br i1 %40, label %.lr.ph893, label %._crit_edge894

.lr.ph893:                                        ; preds = %._crit_edge
  %.unpack856 = load ptr, ptr @_QFEb.0, align 8, !tbaa !7
  %load_initial = load i64, ptr %.unpack856, align 8
  %41 = add i64 %38, -2
  %xtraiter = and i64 %39, 3
  %42 = icmp ult i64 %41, 3
  br i1 %42, label %._crit_edge894.loopexit.unr-lcssa, label %.lr.ph893.new

.lr.ph893.new:                                    ; preds = %.lr.ph893
  %unroll_iter = and i64 %39, -4
  br label %43

43:                                               ; preds = %43, %.lr.ph893.new
  %store_forwarded = phi i64 [ %load_initial, %.lr.ph893.new ], [ %59, %43 ]
  %44 = phi i64 [ 2, %.lr.ph893.new ], [ %60, %43 ]
  %niter = phi i64 [ 0, %.lr.ph893.new ], [ %niter.next.3, %43 ]
  %45 = add nsw i64 %44, -1
  %46 = getelementptr i64, ptr %.unpack856, i64 %45
  %47 = load i64, ptr %46, align 8, !tbaa !3
  %48 = add i64 %store_forwarded, %47
  store i64 %48, ptr %46, align 8, !tbaa !3
  %49 = or i64 %44, 1
  %50 = getelementptr i64, ptr %.unpack856, i64 %44
  %51 = load i64, ptr %50, align 8, !tbaa !3
  %52 = add i64 %48, %51
  store i64 %52, ptr %50, align 8, !tbaa !3
  %53 = add nuw i64 %44, 2
  %54 = getelementptr i64, ptr %.unpack856, i64 %49
  %55 = load i64, ptr %54, align 8, !tbaa !3
  %56 = add i64 %52, %55
  store i64 %56, ptr %54, align 8, !tbaa !3
  %57 = getelementptr i64, ptr %.unpack856, i64 %53
  %58 = load i64, ptr %57, align 8, !tbaa !3
  %59 = add i64 %56, %58
  store i64 %59, ptr %57, align 8, !tbaa !3
  %60 = add nuw i64 %44, 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_edge894.loopexit.unr-lcssa, label %43

._crit_edge894.loopexit.unr-lcssa:                ; preds = %43, %.lr.ph893
  %store_forwarded.unr = phi i64 [ %load_initial, %.lr.ph893 ], [ %59, %43 ]
  %.unr = phi i64 [ 2, %.lr.ph893 ], [ %60, %43 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge894, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge894.loopexit.unr-lcssa, %.epil.preheader
  %store_forwarded.epil = phi i64 [ %65, %.epil.preheader ], [ %store_forwarded.unr, %._crit_edge894.loopexit.unr-lcssa ]
  %61 = phi i64 [ %66, %.epil.preheader ], [ %.unr, %._crit_edge894.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge894.loopexit.unr-lcssa ]
  %62 = add i64 %61, -1
  %63 = getelementptr i64, ptr %.unpack856, i64 %62
  %64 = load i64, ptr %63, align 8, !tbaa !3
  %65 = add i64 %store_forwarded.epil, %64
  store i64 %65, ptr %63, align 8, !tbaa !3
  %66 = add nuw i64 %61, 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_edge894, label %.epil.preheader, !llvm.loop !9

._crit_edge894:                                   ; preds = %._crit_edge894.loopexit.unr-lcssa, %.epil.preheader, %._crit_edge
  %67 = load i64, ptr %8, align 8, !tbaa !3
  %68 = call i64 @llvm.smax.i64(i64 %67, i64 0)
  %69 = shl i64 %68, 3
  %70 = call ptr @malloc(i64 %69)
  store ptr %70, ptr @_QFEchange, align 16, !tbaa !7
  store i64 8, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 1), align 8, !tbaa !7
  store i32 20180515, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 2), align 16, !tbaa !7
  store i8 1, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 3), align 4, !tbaa !7
  store i8 10, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 4), align 1, !tbaa !7
  store i8 2, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 5), align 2, !tbaa !7
  store i8 0, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 6), align 1, !tbaa !7
  store i64 1, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 7), align 8, !tbaa !7
  store i64 %68, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 7, i64 0, i64 1), align 16, !tbaa !7
  store i64 8, ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEchange, i64 0, i32 7, i64 0, i64 2), align 8, !tbaa !7
  %.not = icmp slt i64 %67, 1
  br i1 %.not, label %._crit_edge897, label %.lr.ph896.preheader

.lr.ph896.preheader:                              ; preds = %._crit_edge894
  call void @llvm.memset.p0.i64(ptr align 8 %70, i8 0, i64 %69, i1 false), !tbaa !3
  br label %._crit_edge897

._crit_edge897:                                   ; preds = %.lr.ph896.preheader, %._crit_edge894
  %71 = load i64, ptr %7, align 8, !tbaa !3
  %72 = icmp sgt i64 %71, 0
  br i1 %72, label %.lr.ph905, label %._crit_edge906

.lr.ph905:                                        ; preds = %._crit_edge897
  %.unpack820 = load ptr, ptr @_QFEb.0, align 8, !tbaa !7
  %.unpack832 = load ptr, ptr @_QFEc.0, align 8, !tbaa !7
  br label %73

73:                                               ; preds = %._crit_edge900, %.lr.ph905
  %.0903 = phi i64 [ 1, %.lr.ph905 ], [ %95, %._crit_edge900 ]
  %.0681902 = phi i64 [ 1, %.lr.ph905 ], [ %93, %._crit_edge900 ]
  %74 = add i64 %.0903, -1
  %75 = getelementptr i64, ptr %.unpack820, i64 %74
  %76 = load i64, ptr %75, align 8, !tbaa !3
  %77 = call i64 @llvm.smin.i64(i64 %76, i64 %67)
  %78 = sub i64 1, %.0681902
  %79 = add i64 %78, %77
  %80 = add i64 %.0903, -1
  %81 = getelementptr i64, ptr %.unpack832, i64 %80
  %82 = load i64, ptr %81, align 8, !tbaa !3
  %.not911 = icmp slt i64 %79, 1
  br i1 %.not911, label %._crit_edge900, label %.lr.ph899

.lr.ph899:                                        ; preds = %73
  %83 = add i64 %.0681902, -1
  %min.iters.check = icmp ult i64 %79, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph899
  %n.vec = and i64 %79, -4
  %broadcast.splatinsert = insertelement <2 x i64> poison, i64 %82, i64 0
  %broadcast.splat = shufflevector <2 x i64> %broadcast.splatinsert, <2 x i64> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert916 = insertelement <2 x i64> poison, i64 %82, i64 0
  %broadcast.splat917 = shufflevector <2 x i64> %broadcast.splatinsert916, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %84 = add i64 %83, %index
  %85 = getelementptr i64, ptr %70, i64 %84
  store <2 x i64> %broadcast.splat, ptr %85, align 8, !tbaa !3
  %86 = getelementptr i64, ptr %85, i64 2
  store <2 x i64> %broadcast.splat917, ptr %86, align 8, !tbaa !3
  %index.next = add nuw i64 %index, 4
  %87 = icmp eq i64 %index.next, %n.vec
  br i1 %87, label %middle.block, label %vector.body, !llvm.loop !11

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %79, %n.vec
  br i1 %cmp.n, label %._crit_edge900.loopexit, label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %.lr.ph899, %middle.block
  %.ph952 = phi i64 [ 0, %.lr.ph899 ], [ %n.vec, %middle.block ]
  br label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %88 = phi i64 [ %91, %scalar.ph ], [ %.ph952, %scalar.ph.preheader ]
  %89 = add i64 %83, %88
  %90 = getelementptr i64, ptr %70, i64 %89
  store i64 %82, ptr %90, align 8, !tbaa !3
  %91 = add nuw nsw i64 %88, 1
  %exitcond913.not = icmp eq i64 %91, %79
  br i1 %exitcond913.not, label %._crit_edge900.loopexit, label %scalar.ph, !llvm.loop !14

._crit_edge900.loopexit:                          ; preds = %scalar.ph, %middle.block
  %.pre = load i64, ptr %75, align 8, !tbaa !3
  br label %._crit_edge900

._crit_edge900:                                   ; preds = %._crit_edge900.loopexit, %73
  %92 = phi i64 [ %.pre, %._crit_edge900.loopexit ], [ %76, %73 ]
  %93 = add i64 %92, 1
  %94 = icmp sgt i64 %93, %67
  %95 = add nuw i64 %.0903, 1
  %exitcond914.not = icmp eq i64 %.0903, %71
  %or.cond = select i1 %94, i1 true, i1 %exitcond914.not
  br i1 %or.cond, label %._crit_edge906, label %73

._crit_edge906:                                   ; preds = %._crit_edge900, %._crit_edge897
  %96 = icmp sgt i64 %67, 0
  br i1 %96, label %.lr.ph909, label %._crit_edge910

.lr.ph909:                                        ; preds = %._crit_edge906
  %.unpack784 = load ptr, ptr @_QFEa.0, align 8, !tbaa !7
  %min.iters.check921 = icmp ult i64 %67, 6
  br i1 %min.iters.check921, label %scalar.ph920.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph909
  %97 = shl i64 %67, 3
  %uglygep = getelementptr i8, ptr %.unpack784, i64 %97
  %uglygep918 = getelementptr i8, ptr %70, i64 %97
  %bound0 = icmp ult ptr %.unpack784, %uglygep918
  %bound1 = icmp ult ptr %70, %uglygep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %scalar.ph920.preheader, label %vector.ph922

vector.ph922:                                     ; preds = %vector.memcheck
  %n.vec924 = and i64 %67, -4
  %ind.end = or i64 %n.vec924, 1
  br label %vector.body927

vector.body927:                                   ; preds = %vector.body927, %vector.ph922
  %index928 = phi i64 [ 0, %vector.ph922 ], [ %index.next932, %vector.body927 ]
  %98 = getelementptr i64, ptr %.unpack784, i64 %index928
  %wide.load = load <2 x i64>, ptr %98, align 8, !tbaa !3, !alias.scope !15, !noalias !18
  %99 = getelementptr i64, ptr %98, i64 2
  %wide.load929 = load <2 x i64>, ptr %99, align 8, !tbaa !3, !alias.scope !15, !noalias !18
  %100 = getelementptr i64, ptr %70, i64 %index928
  %wide.load930 = load <2 x i64>, ptr %100, align 8, !tbaa !3, !alias.scope !18
  %101 = getelementptr i64, ptr %100, i64 2
  %wide.load931 = load <2 x i64>, ptr %101, align 8, !tbaa !3, !alias.scope !18
  %102 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %wide.load, <2 x i64> %wide.load930)
  %103 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %wide.load929, <2 x i64> %wide.load931)
  store <2 x i64> %102, ptr %98, align 8, !tbaa !3, !alias.scope !15, !noalias !18
  store <2 x i64> %103, ptr %99, align 8, !tbaa !3, !alias.scope !15, !noalias !18
  %index.next932 = add nuw i64 %index928, 4
  %104 = icmp eq i64 %index.next932, %n.vec924
  br i1 %104, label %middle.block919, label %vector.body927, !llvm.loop !20

middle.block919:                                  ; preds = %vector.body927
  %cmp.n926 = icmp eq i64 %67, %n.vec924
  br i1 %cmp.n926, label %._crit_edge910, label %scalar.ph920.preheader

scalar.ph920.preheader:                           ; preds = %vector.memcheck, %.lr.ph909, %middle.block919
  %.ph951 = phi i64 [ 1, %vector.memcheck ], [ 1, %.lr.ph909 ], [ %ind.end, %middle.block919 ]
  %xtraiter953 = and i64 %67, 1
  %lcmp.mod954.not = icmp eq i64 %xtraiter953, 0
  br i1 %lcmp.mod954.not, label %scalar.ph920.prol.loopexit, label %scalar.ph920.prol

scalar.ph920.prol:                                ; preds = %scalar.ph920.preheader
  %105 = add nsw i64 %.ph951, -1
  %106 = getelementptr i64, ptr %.unpack784, i64 %105
  %107 = load i64, ptr %106, align 8, !tbaa !3
  %108 = add nsw i64 %.ph951, -1
  %109 = getelementptr i64, ptr %70, i64 %108
  %110 = load i64, ptr %109, align 8, !tbaa !3
  %111 = call i64 @llvm.smax.i64(i64 %107, i64 %110)
  store i64 %111, ptr %106, align 8, !tbaa !3
  %112 = add nuw i64 %.ph951, 1
  br label %scalar.ph920.prol.loopexit

scalar.ph920.prol.loopexit:                       ; preds = %scalar.ph920.prol, %scalar.ph920.preheader
  %.unr955 = phi i64 [ %.ph951, %scalar.ph920.preheader ], [ %112, %scalar.ph920.prol ]
  %113 = icmp eq i64 %67, %.ph951
  br i1 %113, label %._crit_edge910, label %scalar.ph920

scalar.ph920:                                     ; preds = %scalar.ph920.prol.loopexit, %scalar.ph920
  %114 = phi i64 [ %128, %scalar.ph920 ], [ %.unr955, %scalar.ph920.prol.loopexit ]
  %115 = add i64 %114, -1
  %116 = getelementptr i64, ptr %.unpack784, i64 %115
  %117 = load i64, ptr %116, align 8, !tbaa !3
  %118 = add nsw i64 %114, -1
  %119 = getelementptr i64, ptr %70, i64 %118
  %120 = load i64, ptr %119, align 8, !tbaa !3
  %121 = call i64 @llvm.smax.i64(i64 %117, i64 %120)
  store i64 %121, ptr %116, align 8, !tbaa !3
  %122 = add nuw i64 %114, 1
  %123 = getelementptr i64, ptr %.unpack784, i64 %114
  %124 = load i64, ptr %123, align 8, !tbaa !3
  %125 = getelementptr i64, ptr %70, i64 %114
  %126 = load i64, ptr %125, align 8, !tbaa !3
  %127 = call i64 @llvm.smax.i64(i64 %124, i64 %126)
  store i64 %127, ptr %123, align 8, !tbaa !3
  %128 = add nuw i64 %114, 2
  %exitcond915.not.1 = icmp eq i64 %122, %67
  br i1 %exitcond915.not.1, label %._crit_edge910, label %scalar.ph920, !llvm.loop !21

._crit_edge910:                                   ; preds = %scalar.ph920.prol.loopexit, %scalar.ph920, %middle.block919, %._crit_edge906
  %129 = call ptr @_FortranAioBeginExternalListOutput(i32 -1, ptr nonnull @_QQcl.bdabb6c83880fdceef97e923f043db4c, i32 36)
  %.unpack772 = load ptr, ptr @_QFEa.0, align 8, !tbaa !7
  %.unpack779.unpack.unpack781 = load i64, ptr @_QFEa.8, align 8, !tbaa !7
  %130 = icmp sgt i64 %.unpack779.unpack.unpack781, 0
  br i1 %130, label %.lr.ph.i.preheader, label %_FortranASumInteger8x1_contract_simplified.exit

.lr.ph.i.preheader:                               ; preds = %._crit_edge910
  %min.iters.check935 = icmp ult i64 %.unpack779.unpack.unpack781, 4
  br i1 %min.iters.check935, label %.lr.ph.i.preheader947, label %vector.ph936

vector.ph936:                                     ; preds = %.lr.ph.i.preheader
  %n.vec938 = and i64 %.unpack779.unpack.unpack781, -4
  br label %vector.body941

vector.body941:                                   ; preds = %vector.body941, %vector.ph936
  %index942 = phi i64 [ 0, %vector.ph936 ], [ %index.next946, %vector.body941 ]
  %vec.phi = phi <2 x i64> [ zeroinitializer, %vector.ph936 ], [ %134, %vector.body941 ]
  %vec.phi943 = phi <2 x i64> [ zeroinitializer, %vector.ph936 ], [ %135, %vector.body941 ]
  %131 = shl i64 %index942, 3
  %132 = getelementptr i8, ptr %.unpack772, i64 %131
  %wide.load944 = load <2 x i64>, ptr %132, align 8, !tbaa !3
  %133 = getelementptr i64, ptr %132, i64 2
  %wide.load945 = load <2 x i64>, ptr %133, align 8, !tbaa !3
  %134 = add <2 x i64> %wide.load944, %vec.phi
  %135 = add <2 x i64> %wide.load945, %vec.phi943
  %index.next946 = add nuw i64 %index942, 4
  %136 = icmp eq i64 %index.next946, %n.vec938
  br i1 %136, label %middle.block933, label %vector.body941, !llvm.loop !22

middle.block933:                                  ; preds = %vector.body941
  %bin.rdx = add <2 x i64> %135, %134
  %137 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx)
  %cmp.n940 = icmp eq i64 %.unpack779.unpack.unpack781, %n.vec938
  br i1 %cmp.n940, label %_FortranASumInteger8x1_contract_simplified.exit, label %.lr.ph.i.preheader947

.lr.ph.i.preheader947:                            ; preds = %.lr.ph.i.preheader, %middle.block933
  %.ph = phi i64 [ 0, %.lr.ph.i.preheader ], [ %137, %middle.block933 ]
  %.ph948 = phi i64 [ 0, %.lr.ph.i.preheader ], [ %n.vec938, %middle.block933 ]
  br label %.lr.ph.i

.lr.ph.i:                                         ; preds = %.lr.ph.i.preheader947, %.lr.ph.i
  %138 = phi i64 [ %143, %.lr.ph.i ], [ %.ph, %.lr.ph.i.preheader947 ]
  %139 = phi i64 [ %144, %.lr.ph.i ], [ %.ph948, %.lr.ph.i.preheader947 ]
  %140 = shl i64 %139, 3
  %141 = getelementptr i8, ptr %.unpack772, i64 %140
  %142 = load i64, ptr %141, align 8, !tbaa !3
  %143 = add i64 %142, %138
  %144 = add nuw nsw i64 %139, 1
  %exitcond.not.i = icmp eq i64 %144, %.unpack779.unpack.unpack781
  br i1 %exitcond.not.i, label %_FortranASumInteger8x1_contract_simplified.exit, label %.lr.ph.i, !llvm.loop !23

_FortranASumInteger8x1_contract_simplified.exit:  ; preds = %.lr.ph.i, %middle.block933, %._crit_edge910
  %.lcssa.i = phi i64 [ 0, %._crit_edge910 ], [ %137, %middle.block933 ], [ %143, %.lr.ph.i ]
  %145 = call i1 @_FortranAioOutputInteger64(ptr %129, i64 %.lcssa.i)
  %146 = call i32 @_FortranAioEndIoStatement(ptr %129)
  ret void
}

; Function Attrs: nounwind
define void @_QFPdouble_sort(ptr %0, ptr %1, ptr nocapture readonly %2, ptr nocapture readonly %3) local_unnamed_addr #2 {
  %5 = alloca i64, align 8
  %6 = alloca i64, align 8
  %7 = load i64, ptr %3, align 8, !tbaa !3
  %8 = load i64, ptr %2, align 8, !tbaa !3
  %9 = sub i64 %7, %8
  %10 = icmp slt i64 %9, 2
  br i1 %10, label %11, label %38

11:                                               ; preds = %4
  %12 = add i64 %8, -1
  %13 = load ptr, ptr %0, align 8, !tbaa !7
  %14 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %15 = load i64, ptr %14, align 8, !tbaa !7
  %16 = mul i64 %15, %12
  %17 = getelementptr i8, ptr %13, i64 %16
  %18 = load i64, ptr %17, align 8, !tbaa !3
  %19 = add i64 %7, -1
  %20 = mul i64 %15, %19
  %21 = getelementptr i8, ptr %13, i64 %20
  %22 = load i64, ptr %21, align 8, !tbaa !3
  %23 = icmp slt i64 %18, %22
  br i1 %23, label %24, label %42

24:                                               ; preds = %11
  store i64 %22, ptr %17, align 8, !tbaa !3
  store i64 %18, ptr %21, align 8, !tbaa !3
  %25 = load i64, ptr %2, align 8, !tbaa !3
  %26 = add i64 %25, -1
  %27 = load ptr, ptr %1, align 8, !tbaa !7
  %28 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  %29 = load i64, ptr %28, align 8, !tbaa !7
  %30 = mul i64 %29, %26
  %31 = getelementptr i8, ptr %27, i64 %30
  %32 = load i64, ptr %3, align 8, !tbaa !3
  %33 = add i64 %32, -1
  %34 = mul i64 %33, %29
  %35 = getelementptr i8, ptr %27, i64 %34
  %36 = load i64, ptr %31, align 8, !tbaa !3
  %37 = load i64, ptr %35, align 8, !tbaa !3
  store i64 %37, ptr %31, align 8, !tbaa !3
  store i64 %36, ptr %35, align 8, !tbaa !3
  br label %42

38:                                               ; preds = %4
  %39 = add i64 %8, %7
  %40 = sdiv i64 %39, 2
  store i64 %40, ptr %6, align 8, !tbaa !3
  call void @_QFPdouble_sort(ptr %0, ptr %1, ptr nonnull %2, ptr nonnull %6)
  %41 = add nsw i64 %40, 1
  store i64 %41, ptr %5, align 8, !tbaa !3
  call void @_QFPdouble_sort(ptr %0, ptr %1, ptr nonnull %5, ptr nonnull %3)
  call void @_QFPdouble_merge_(ptr %0, ptr %1, ptr nonnull %2, ptr nonnull %6, ptr nonnull %3)
  br label %42

42:                                               ; preds = %24, %11, %38
  ret void
}

; Function Attrs: nounwind
define void @_QFPdouble_merge_(ptr nocapture readonly %0, ptr nocapture readonly %1, ptr nocapture readonly %2, ptr nocapture readonly %3, ptr nocapture readonly %4) local_unnamed_addr #2 {
  %6 = load i64, ptr %4, align 8, !tbaa !3
  %7 = load i64, ptr %2, align 8, !tbaa !3
  %8 = add i64 %6, 1
  %9 = sub i64 %8, %7
  %10 = tail call i64 @llvm.smax.i64(i64 %9, i64 0)
  %11 = shl i64 %10, 3
  %12 = tail call ptr @malloc(i64 %11)
  %13 = tail call ptr @malloc(i64 %11)
  %14 = load i64, ptr %3, align 8, !tbaa !3
  %15 = add i64 %14, 1
  %16 = icmp sle i64 %7, %14
  %17 = icmp sle i64 %15, %6
  %18 = and i1 %17, %16
  br i1 %18, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %5
  %19 = load ptr, ptr %0, align 8, !tbaa !7
  %20 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %21 = load i64, ptr %20, align 8, !tbaa !7
  %22 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  br label %23

23:                                               ; preds = %.lr.ph, %50
  %.068 = phi i64 [ 1, %.lr.ph ], [ %51, %50 ]
  %.05167 = phi i64 [ %7, %.lr.ph ], [ %.1, %50 ]
  %.05266 = phi i64 [ %15, %.lr.ph ], [ %.153, %50 ]
  %24 = add i64 %.05167, -1
  %25 = mul i64 %21, %24
  %26 = getelementptr i8, ptr %19, i64 %25
  %27 = load i64, ptr %26, align 8, !tbaa !3
  %28 = add i64 %.05266, -1
  %29 = mul i64 %21, %28
  %30 = getelementptr i8, ptr %19, i64 %29
  %31 = load i64, ptr %30, align 8, !tbaa !3
  %.not = icmp slt i64 %27, %31
  %32 = add i64 %.068, -1
  %33 = getelementptr i64, ptr %12, i64 %32
  br i1 %.not, label %42, label %34

34:                                               ; preds = %23
  store i64 %27, ptr %33, align 8, !tbaa !3
  %35 = load ptr, ptr %1, align 8, !tbaa !7
  %36 = load i64, ptr %22, align 8, !tbaa !7
  %37 = mul i64 %36, %24
  %38 = getelementptr i8, ptr %35, i64 %37
  %39 = load i64, ptr %38, align 8, !tbaa !3
  %40 = getelementptr i64, ptr %13, i64 %32
  store i64 %39, ptr %40, align 8, !tbaa !3
  %41 = add i64 %.05167, 1
  br label %50

42:                                               ; preds = %23
  store i64 %31, ptr %33, align 8, !tbaa !3
  %43 = load ptr, ptr %1, align 8, !tbaa !7
  %44 = load i64, ptr %22, align 8, !tbaa !7
  %45 = mul i64 %44, %28
  %46 = getelementptr i8, ptr %43, i64 %45
  %47 = load i64, ptr %46, align 8, !tbaa !3
  %48 = getelementptr i64, ptr %13, i64 %32
  store i64 %47, ptr %48, align 8, !tbaa !3
  %49 = add i64 %.05266, 1
  br label %50

50:                                               ; preds = %34, %42
  %.153 = phi i64 [ %.05266, %34 ], [ %49, %42 ]
  %.1 = phi i64 [ %41, %34 ], [ %.05167, %42 ]
  %51 = add i64 %.068, 1
  %52 = icmp sle i64 %.1, %14
  %53 = icmp sle i64 %.153, %6
  %54 = and i1 %53, %52
  br i1 %54, label %23, label %._crit_edge

._crit_edge:                                      ; preds = %50, %5
  %.0.lcssa65 = phi i64 [ 1, %5 ], [ %51, %50 ]
  %.052.lcssa = phi i64 [ %15, %5 ], [ %.153, %50 ]
  %.051.lcssa = phi i64 [ %7, %5 ], [ %.1, %50 ]
  %.lcssa = phi i1 [ %16, %5 ], [ %52, %50 ]
  %55 = add nuw i64 %10, 1
  %56 = sub i64 %55, %.0.lcssa65
  %57 = tail call i64 @llvm.smax.i64(i64 %56, i64 0)
  %.not89 = icmp slt i64 %56, 1
  br i1 %.lcssa, label %58, label %110

58:                                               ; preds = %._crit_edge
  br i1 %.not89, label %.loopexit, label %.lr.ph77

.lr.ph77:                                         ; preds = %58
  %59 = add i64 %.051.lcssa, -1
  %60 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %61 = load i64, ptr %60, align 8, !tbaa !7
  %62 = load ptr, ptr %0, align 8, !tbaa !7
  %63 = add i64 %.0.lcssa65, -1
  %64 = add nsw i64 %57, -1
  %xtraiter116 = and i64 %57, 1
  %65 = icmp eq i64 %64, 0
  br i1 %65, label %.preheader.unr-lcssa, label %.lr.ph77.new

.lr.ph77.new:                                     ; preds = %.lr.ph77
  %unroll_iter119 = and i64 %57, 9223372036854775806
  br label %78

.preheader.unr-lcssa:                             ; preds = %78, %.lr.ph77
  %.unr117 = phi i64 [ 0, %.lr.ph77 ], [ %87, %78 ]
  %lcmp.mod118.not = icmp eq i64 %xtraiter116, 0
  br i1 %lcmp.mod118.not, label %.preheader, label %.preheader.epilog-lcssa

.preheader.epilog-lcssa:                          ; preds = %.preheader.unr-lcssa
  %66 = add i64 %59, %.unr117
  %67 = mul i64 %61, %66
  %68 = getelementptr i8, ptr %62, i64 %67
  %69 = load i64, ptr %68, align 8, !tbaa !3
  %70 = add i64 %63, %.unr117
  %71 = getelementptr i64, ptr %12, i64 %70
  store i64 %69, ptr %71, align 8, !tbaa !3
  br label %.preheader

.preheader:                                       ; preds = %.preheader.unr-lcssa, %.preheader.epilog-lcssa
  br i1 %.not89, label %.loopexit, label %.lr.ph78

.lr.ph78:                                         ; preds = %.preheader
  %72 = add i64 %.051.lcssa, -1
  %73 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  %74 = load i64, ptr %73, align 8, !tbaa !7
  %75 = load ptr, ptr %1, align 8, !tbaa !7
  %76 = add i64 %.0.lcssa65, -1
  %xtraiter122 = and i64 %57, 1
  %77 = icmp eq i64 %64, 0
  br i1 %77, label %.loopexit.loopexit.unr-lcssa, label %.lr.ph78.new

.lr.ph78.new:                                     ; preds = %.lr.ph78
  %unroll_iter125 = and i64 %57, 9223372036854775806
  br label %94

78:                                               ; preds = %78, %.lr.ph77.new
  %79 = phi i64 [ 0, %.lr.ph77.new ], [ %87, %78 ]
  %niter120 = phi i64 [ 0, %.lr.ph77.new ], [ %niter120.next.1, %78 ]
  %80 = or i64 %79, 1
  %81 = add i64 %59, %79
  %82 = mul i64 %61, %81
  %83 = getelementptr i8, ptr %62, i64 %82
  %84 = load i64, ptr %83, align 8, !tbaa !3
  %85 = add i64 %63, %79
  %86 = getelementptr i64, ptr %12, i64 %85
  store i64 %84, ptr %86, align 8, !tbaa !3
  %87 = add nuw nsw i64 %79, 2
  %88 = add i64 %59, %80
  %89 = mul i64 %61, %88
  %90 = getelementptr i8, ptr %62, i64 %89
  %91 = load i64, ptr %90, align 8, !tbaa !3
  %92 = add i64 %63, %80
  %93 = getelementptr i64, ptr %12, i64 %92
  store i64 %91, ptr %93, align 8, !tbaa !3
  %niter120.next.1 = add i64 %niter120, 2
  %niter120.ncmp.1 = icmp eq i64 %niter120.next.1, %unroll_iter119
  br i1 %niter120.ncmp.1, label %.preheader.unr-lcssa, label %78

94:                                               ; preds = %94, %.lr.ph78.new
  %95 = phi i64 [ 0, %.lr.ph78.new ], [ %103, %94 ]
  %niter126 = phi i64 [ 0, %.lr.ph78.new ], [ %niter126.next.1, %94 ]
  %96 = or i64 %95, 1
  %97 = add i64 %72, %95
  %98 = mul i64 %74, %97
  %99 = getelementptr i8, ptr %75, i64 %98
  %100 = load i64, ptr %99, align 8, !tbaa !3
  %101 = add i64 %76, %95
  %102 = getelementptr i64, ptr %13, i64 %101
  store i64 %100, ptr %102, align 8, !tbaa !3
  %103 = add nuw nsw i64 %95, 2
  %104 = add i64 %72, %96
  %105 = mul i64 %74, %104
  %106 = getelementptr i8, ptr %75, i64 %105
  %107 = load i64, ptr %106, align 8, !tbaa !3
  %108 = add i64 %76, %96
  %109 = getelementptr i64, ptr %13, i64 %108
  store i64 %107, ptr %109, align 8, !tbaa !3
  %niter126.next.1 = add i64 %niter126, 2
  %niter126.ncmp.1 = icmp eq i64 %niter126.next.1, %unroll_iter125
  br i1 %niter126.ncmp.1, label %.loopexit.loopexit.unr-lcssa, label %94

110:                                              ; preds = %._crit_edge
  br i1 %.not89, label %.loopexit, label %.lr.ph74

.lr.ph74:                                         ; preds = %110
  %111 = add i64 %.052.lcssa, -1
  %112 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %113 = load i64, ptr %112, align 8, !tbaa !7
  %114 = load ptr, ptr %0, align 8, !tbaa !7
  %115 = add i64 %.0.lcssa65, -1
  %116 = add nsw i64 %57, -1
  %xtraiter = and i64 %57, 1
  %117 = icmp eq i64 %116, 0
  br i1 %117, label %.preheader63.unr-lcssa, label %.lr.ph74.new

.lr.ph74.new:                                     ; preds = %.lr.ph74
  %unroll_iter = and i64 %57, 9223372036854775806
  br label %130

.preheader63.unr-lcssa:                           ; preds = %130, %.lr.ph74
  %.unr = phi i64 [ 0, %.lr.ph74 ], [ %139, %130 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.preheader63, label %.preheader63.epilog-lcssa

.preheader63.epilog-lcssa:                        ; preds = %.preheader63.unr-lcssa
  %118 = add i64 %111, %.unr
  %119 = mul i64 %113, %118
  %120 = getelementptr i8, ptr %114, i64 %119
  %121 = load i64, ptr %120, align 8, !tbaa !3
  %122 = add i64 %115, %.unr
  %123 = getelementptr i64, ptr %12, i64 %122
  store i64 %121, ptr %123, align 8, !tbaa !3
  br label %.preheader63

.preheader63:                                     ; preds = %.preheader63.unr-lcssa, %.preheader63.epilog-lcssa
  br i1 %.not89, label %.loopexit, label %.lr.ph75

.lr.ph75:                                         ; preds = %.preheader63
  %124 = add i64 %.052.lcssa, -1
  %125 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  %126 = load i64, ptr %125, align 8, !tbaa !7
  %127 = load ptr, ptr %1, align 8, !tbaa !7
  %128 = add i64 %.0.lcssa65, -1
  %xtraiter110 = and i64 %57, 1
  %129 = icmp eq i64 %116, 0
  br i1 %129, label %.loopexit.loopexit106.unr-lcssa, label %.lr.ph75.new

.lr.ph75.new:                                     ; preds = %.lr.ph75
  %unroll_iter113 = and i64 %57, 9223372036854775806
  br label %146

130:                                              ; preds = %130, %.lr.ph74.new
  %131 = phi i64 [ 0, %.lr.ph74.new ], [ %139, %130 ]
  %niter = phi i64 [ 0, %.lr.ph74.new ], [ %niter.next.1, %130 ]
  %132 = or i64 %131, 1
  %133 = add i64 %111, %131
  %134 = mul i64 %113, %133
  %135 = getelementptr i8, ptr %114, i64 %134
  %136 = load i64, ptr %135, align 8, !tbaa !3
  %137 = add i64 %115, %131
  %138 = getelementptr i64, ptr %12, i64 %137
  store i64 %136, ptr %138, align 8, !tbaa !3
  %139 = add nuw nsw i64 %131, 2
  %140 = add i64 %111, %132
  %141 = mul i64 %113, %140
  %142 = getelementptr i8, ptr %114, i64 %141
  %143 = load i64, ptr %142, align 8, !tbaa !3
  %144 = add i64 %115, %132
  %145 = getelementptr i64, ptr %12, i64 %144
  store i64 %143, ptr %145, align 8, !tbaa !3
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.preheader63.unr-lcssa, label %130

146:                                              ; preds = %146, %.lr.ph75.new
  %147 = phi i64 [ 0, %.lr.ph75.new ], [ %155, %146 ]
  %niter114 = phi i64 [ 0, %.lr.ph75.new ], [ %niter114.next.1, %146 ]
  %148 = or i64 %147, 1
  %149 = add i64 %124, %147
  %150 = mul i64 %126, %149
  %151 = getelementptr i8, ptr %127, i64 %150
  %152 = load i64, ptr %151, align 8, !tbaa !3
  %153 = add i64 %128, %147
  %154 = getelementptr i64, ptr %13, i64 %153
  store i64 %152, ptr %154, align 8, !tbaa !3
  %155 = add nuw nsw i64 %147, 2
  %156 = add i64 %124, %148
  %157 = mul i64 %126, %156
  %158 = getelementptr i8, ptr %127, i64 %157
  %159 = load i64, ptr %158, align 8, !tbaa !3
  %160 = add i64 %128, %148
  %161 = getelementptr i64, ptr %13, i64 %160
  store i64 %159, ptr %161, align 8, !tbaa !3
  %niter114.next.1 = add i64 %niter114, 2
  %niter114.ncmp.1 = icmp eq i64 %niter114.next.1, %unroll_iter113
  br i1 %niter114.ncmp.1, label %.loopexit.loopexit106.unr-lcssa, label %146

.loopexit.loopexit.unr-lcssa:                     ; preds = %94, %.lr.ph78
  %.unr123 = phi i64 [ 0, %.lr.ph78 ], [ %103, %94 ]
  %lcmp.mod124.not = icmp eq i64 %xtraiter122, 0
  br i1 %lcmp.mod124.not, label %.loopexit, label %.loopexit.loopexit.epilog-lcssa

.loopexit.loopexit.epilog-lcssa:                  ; preds = %.loopexit.loopexit.unr-lcssa
  %162 = add i64 %72, %.unr123
  %163 = mul i64 %74, %162
  %164 = getelementptr i8, ptr %75, i64 %163
  %165 = load i64, ptr %164, align 8, !tbaa !3
  %166 = add i64 %76, %.unr123
  %167 = getelementptr i64, ptr %13, i64 %166
  store i64 %165, ptr %167, align 8, !tbaa !3
  br label %.loopexit

.loopexit.loopexit106.unr-lcssa:                  ; preds = %146, %.lr.ph75
  %.unr111 = phi i64 [ 0, %.lr.ph75 ], [ %155, %146 ]
  %lcmp.mod112.not = icmp eq i64 %xtraiter110, 0
  br i1 %lcmp.mod112.not, label %.loopexit, label %.loopexit.loopexit106.epilog-lcssa

.loopexit.loopexit106.epilog-lcssa:               ; preds = %.loopexit.loopexit106.unr-lcssa
  %168 = add i64 %124, %.unr111
  %169 = mul i64 %126, %168
  %170 = getelementptr i8, ptr %127, i64 %169
  %171 = load i64, ptr %170, align 8, !tbaa !3
  %172 = add i64 %128, %.unr111
  %173 = getelementptr i64, ptr %13, i64 %172
  store i64 %171, ptr %173, align 8, !tbaa !3
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit106.epilog-lcssa, %.loopexit.loopexit106.unr-lcssa, %.loopexit.loopexit.epilog-lcssa, %.loopexit.loopexit.unr-lcssa, %110, %58, %.preheader63, %.preheader
  %.not87 = icmp slt i64 %9, 1
  br i1 %.not87, label %._crit_edge81, label %.lr.ph80

.lr.ph80:                                         ; preds = %.loopexit
  %174 = add i64 %7, -1
  %175 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %176 = load i64, ptr %175, align 8, !tbaa !7
  %177 = load ptr, ptr %0, align 8, !tbaa !7
  %178 = add nsw i64 %10, -1
  %xtraiter128 = and i64 %10, 3
  %179 = icmp ult i64 %178, 3
  br i1 %179, label %._crit_edge81.loopexit.unr-lcssa, label %.lr.ph80.new

.lr.ph80.new:                                     ; preds = %.lr.ph80
  %unroll_iter131 = and i64 %10, 9223372036854775804
  br label %180

180:                                              ; preds = %180, %.lr.ph80.new
  %181 = phi i64 [ 0, %.lr.ph80.new ], [ %200, %180 ]
  %niter132 = phi i64 [ 0, %.lr.ph80.new ], [ %niter132.next.3, %180 ]
  %182 = or i64 %181, 1
  %183 = getelementptr i64, ptr %12, i64 %181
  %184 = load i64, ptr %183, align 8, !tbaa !3
  %185 = add i64 %174, %181
  %186 = mul i64 %176, %185
  %187 = getelementptr i8, ptr %177, i64 %186
  store i64 %184, ptr %187, align 8, !tbaa !3
  %188 = or i64 %181, 2
  %189 = getelementptr i64, ptr %12, i64 %182
  %190 = load i64, ptr %189, align 8, !tbaa !3
  %191 = add i64 %7, %181
  %192 = mul i64 %176, %191
  %193 = getelementptr i8, ptr %177, i64 %192
  store i64 %190, ptr %193, align 8, !tbaa !3
  %194 = or i64 %181, 3
  %195 = getelementptr i64, ptr %12, i64 %188
  %196 = load i64, ptr %195, align 8, !tbaa !3
  %197 = add i64 %174, %188
  %198 = mul i64 %176, %197
  %199 = getelementptr i8, ptr %177, i64 %198
  store i64 %196, ptr %199, align 8, !tbaa !3
  %200 = add nuw nsw i64 %181, 4
  %201 = getelementptr i64, ptr %12, i64 %194
  %202 = load i64, ptr %201, align 8, !tbaa !3
  %203 = add i64 %174, %194
  %204 = mul i64 %176, %203
  %205 = getelementptr i8, ptr %177, i64 %204
  store i64 %202, ptr %205, align 8, !tbaa !3
  %niter132.next.3 = add i64 %niter132, 4
  %niter132.ncmp.3 = icmp eq i64 %niter132.next.3, %unroll_iter131
  br i1 %niter132.ncmp.3, label %._crit_edge81.loopexit.unr-lcssa, label %180

._crit_edge81.loopexit.unr-lcssa:                 ; preds = %180, %.lr.ph80
  %.unr129 = phi i64 [ 0, %.lr.ph80 ], [ %200, %180 ]
  %lcmp.mod130.not = icmp eq i64 %xtraiter128, 0
  br i1 %lcmp.mod130.not, label %._crit_edge81.loopexit, label %.epil.preheader127

.epil.preheader127:                               ; preds = %._crit_edge81.loopexit.unr-lcssa, %.epil.preheader127
  %206 = phi i64 [ %207, %.epil.preheader127 ], [ %.unr129, %._crit_edge81.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader127 ], [ 0, %._crit_edge81.loopexit.unr-lcssa ]
  %207 = add nuw nsw i64 %206, 1
  %208 = getelementptr i64, ptr %12, i64 %206
  %209 = load i64, ptr %208, align 8, !tbaa !3
  %210 = add i64 %174, %206
  %211 = mul i64 %176, %210
  %212 = getelementptr i8, ptr %177, i64 %211
  store i64 %209, ptr %212, align 8, !tbaa !3
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter128
  br i1 %epil.iter.cmp.not, label %._crit_edge81.loopexit, label %.epil.preheader127, !llvm.loop !24

._crit_edge81.loopexit:                           ; preds = %.epil.preheader127, %._crit_edge81.loopexit.unr-lcssa
  %.pre = load i64, ptr %2, align 8, !tbaa !3
  %.pre99 = load i64, ptr %4, align 8, !tbaa !3
  br label %._crit_edge81

._crit_edge81:                                    ; preds = %._crit_edge81.loopexit, %.loopexit
  %213 = phi i64 [ %.pre99, %._crit_edge81.loopexit ], [ %6, %.loopexit ]
  %214 = phi i64 [ %.pre, %._crit_edge81.loopexit ], [ %7, %.loopexit ]
  %215 = sub i64 1, %214
  %216 = add i64 %215, %213
  %.not88 = icmp slt i64 %216, 1
  br i1 %.not88, label %._crit_edge84, label %.lr.ph83

.lr.ph83:                                         ; preds = %._crit_edge81
  %217 = add i64 %214, -1
  %218 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  %219 = load i64, ptr %218, align 8, !tbaa !7
  %220 = load ptr, ptr %1, align 8, !tbaa !7
  %221 = sub i64 %213, %214
  %xtraiter134 = and i64 %216, 3
  %222 = icmp ult i64 %221, 3
  br i1 %222, label %._crit_edge84.loopexit.unr-lcssa, label %.lr.ph83.new

.lr.ph83.new:                                     ; preds = %.lr.ph83
  %unroll_iter138 = and i64 %216, -4
  br label %223

223:                                              ; preds = %223, %.lr.ph83.new
  %224 = phi i64 [ 0, %.lr.ph83.new ], [ %243, %223 ]
  %niter139 = phi i64 [ 0, %.lr.ph83.new ], [ %niter139.next.3, %223 ]
  %225 = or i64 %224, 1
  %226 = getelementptr i64, ptr %13, i64 %224
  %227 = load i64, ptr %226, align 8, !tbaa !3
  %228 = add i64 %217, %224
  %229 = mul i64 %219, %228
  %230 = getelementptr i8, ptr %220, i64 %229
  store i64 %227, ptr %230, align 8, !tbaa !3
  %231 = or i64 %224, 2
  %232 = getelementptr i64, ptr %13, i64 %225
  %233 = load i64, ptr %232, align 8, !tbaa !3
  %234 = add i64 %214, %224
  %235 = mul i64 %219, %234
  %236 = getelementptr i8, ptr %220, i64 %235
  store i64 %233, ptr %236, align 8, !tbaa !3
  %237 = or i64 %224, 3
  %238 = getelementptr i64, ptr %13, i64 %231
  %239 = load i64, ptr %238, align 8, !tbaa !3
  %240 = add i64 %217, %231
  %241 = mul i64 %219, %240
  %242 = getelementptr i8, ptr %220, i64 %241
  store i64 %239, ptr %242, align 8, !tbaa !3
  %243 = add nuw nsw i64 %224, 4
  %244 = getelementptr i64, ptr %13, i64 %237
  %245 = load i64, ptr %244, align 8, !tbaa !3
  %246 = add i64 %217, %237
  %247 = mul i64 %219, %246
  %248 = getelementptr i8, ptr %220, i64 %247
  store i64 %245, ptr %248, align 8, !tbaa !3
  %niter139.next.3 = add i64 %niter139, 4
  %niter139.ncmp.3 = icmp eq i64 %niter139.next.3, %unroll_iter138
  br i1 %niter139.ncmp.3, label %._crit_edge84.loopexit.unr-lcssa, label %223

._crit_edge84.loopexit.unr-lcssa:                 ; preds = %223, %.lr.ph83
  %.unr136 = phi i64 [ 0, %.lr.ph83 ], [ %243, %223 ]
  %lcmp.mod137.not = icmp eq i64 %xtraiter134, 0
  br i1 %lcmp.mod137.not, label %._crit_edge84, label %.epil.preheader133

.epil.preheader133:                               ; preds = %._crit_edge84.loopexit.unr-lcssa, %.epil.preheader133
  %249 = phi i64 [ %250, %.epil.preheader133 ], [ %.unr136, %._crit_edge84.loopexit.unr-lcssa ]
  %epil.iter135 = phi i64 [ %epil.iter135.next, %.epil.preheader133 ], [ 0, %._crit_edge84.loopexit.unr-lcssa ]
  %250 = add nuw nsw i64 %249, 1
  %251 = getelementptr i64, ptr %13, i64 %249
  %252 = load i64, ptr %251, align 8, !tbaa !3
  %253 = add i64 %217, %249
  %254 = mul i64 %219, %253
  %255 = getelementptr i8, ptr %220, i64 %254
  store i64 %252, ptr %255, align 8, !tbaa !3
  %epil.iter135.next = add i64 %epil.iter135, 1
  %epil.iter135.cmp.not = icmp eq i64 %epil.iter135.next, %xtraiter134
  br i1 %epil.iter135.cmp.not, label %._crit_edge84, label %.epil.preheader133, !llvm.loop !25

._crit_edge84:                                    ; preds = %._crit_edge84.loopexit.unr-lcssa, %.epil.preheader133, %._crit_edge81
  tail call void @free(ptr %12)
  tail call void @free(ptr %13)
  ret void
}

; Function Attrs: nounwind
define void @_QFPmerge_sort(ptr %0, ptr nocapture readonly %1, ptr nocapture readonly %2) local_unnamed_addr #2 {
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = load i64, ptr %2, align 8, !tbaa !3
  %7 = load i64, ptr %1, align 8, !tbaa !3
  %8 = sub i64 %6, %7
  %9 = icmp slt i64 %8, 2
  br i1 %9, label %10, label %24

10:                                               ; preds = %3
  %11 = add i64 %7, -1
  %12 = load ptr, ptr %0, align 8, !tbaa !7
  %13 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %14 = load i64, ptr %13, align 8, !tbaa !7
  %15 = mul i64 %14, %11
  %16 = getelementptr i8, ptr %12, i64 %15
  %17 = load i64, ptr %16, align 8, !tbaa !3
  %18 = add i64 %6, -1
  %19 = mul i64 %14, %18
  %20 = getelementptr i8, ptr %12, i64 %19
  %21 = load i64, ptr %20, align 8, !tbaa !3
  %22 = icmp sgt i64 %17, %21
  br i1 %22, label %23, label %28

23:                                               ; preds = %10
  store i64 %21, ptr %16, align 8, !tbaa !3
  store i64 %17, ptr %20, align 8, !tbaa !3
  br label %28

24:                                               ; preds = %3
  %25 = add i64 %7, %6
  %26 = sdiv i64 %25, 2
  store i64 %26, ptr %5, align 8, !tbaa !3
  call void @_QFPmerge_sort(ptr %0, ptr nonnull %1, ptr nonnull %5)
  %27 = add nsw i64 %26, 1
  store i64 %27, ptr %4, align 8, !tbaa !3
  call void @_QFPmerge_sort(ptr %0, ptr nonnull %4, ptr nonnull %2)
  call void @_QFPmerge_(ptr %0, ptr nonnull %1, ptr nonnull %5, ptr nonnull %2)
  br label %28

28:                                               ; preds = %23, %10, %24
  ret void
}

; Function Attrs: nounwind
define void @_QFPmerge_(ptr nocapture readonly %0, ptr nocapture readonly %1, ptr nocapture readonly %2, ptr nocapture readonly %3) local_unnamed_addr #2 {
  %5 = load i64, ptr %3, align 8, !tbaa !3
  %6 = load i64, ptr %1, align 8, !tbaa !3
  %7 = add i64 %5, 1
  %8 = sub i64 %7, %6
  %9 = tail call i64 @llvm.smax.i64(i64 %8, i64 0)
  %10 = shl i64 %9, 3
  %11 = tail call ptr @malloc(i64 %10)
  %12 = load i64, ptr %2, align 8, !tbaa !3
  %13 = add i64 %12, 1
  %14 = icmp sle i64 %6, %12
  %15 = icmp sle i64 %13, %5
  %16 = and i1 %15, %14
  br i1 %16, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %4
  %17 = load ptr, ptr %0, align 8, !tbaa !7
  %18 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %19 = load i64, ptr %18, align 8, !tbaa !7
  br label %20

20:                                               ; preds = %.lr.ph, %35
  %.041 = phi i64 [ %6, %.lr.ph ], [ %.1, %35 ]
  %.02940 = phi i64 [ %13, %.lr.ph ], [ %.130, %35 ]
  %.03139 = phi i64 [ 1, %.lr.ph ], [ %36, %35 ]
  %21 = add i64 %.041, -1
  %22 = mul i64 %19, %21
  %23 = getelementptr i8, ptr %17, i64 %22
  %24 = load i64, ptr %23, align 8, !tbaa !3
  %25 = add i64 %.02940, -1
  %26 = mul i64 %19, %25
  %27 = getelementptr i8, ptr %17, i64 %26
  %28 = load i64, ptr %27, align 8, !tbaa !3
  %.not = icmp sgt i64 %24, %28
  %29 = add i64 %.03139, -1
  %30 = getelementptr i64, ptr %11, i64 %29
  br i1 %.not, label %33, label %31

31:                                               ; preds = %20
  store i64 %24, ptr %30, align 8, !tbaa !3
  %32 = add i64 %.041, 1
  br label %35

33:                                               ; preds = %20
  store i64 %28, ptr %30, align 8, !tbaa !3
  %34 = add i64 %.02940, 1
  br label %35

35:                                               ; preds = %31, %33
  %.130 = phi i64 [ %.02940, %31 ], [ %34, %33 ]
  %.1 = phi i64 [ %32, %31 ], [ %.041, %33 ]
  %36 = add i64 %.03139, 1
  %37 = icmp sle i64 %.1, %12
  %38 = icmp sle i64 %.130, %5
  %39 = and i1 %38, %37
  br i1 %39, label %20, label %._crit_edge

._crit_edge:                                      ; preds = %35, %4
  %.031.lcssa38 = phi i64 [ 1, %4 ], [ %36, %35 ]
  %.029.lcssa = phi i64 [ %13, %4 ], [ %.130, %35 ]
  %.0.lcssa = phi i64 [ %6, %4 ], [ %.1, %35 ]
  %.lcssa = phi i1 [ %14, %4 ], [ %37, %35 ]
  %40 = add nuw i64 %9, 1
  %41 = sub i64 %40, %.031.lcssa38
  %.not55 = icmp slt i64 %41, 1
  br i1 %.lcssa, label %42, label %65

42:                                               ; preds = %._crit_edge
  br i1 %.not55, label %.loopexit, label %.lr.ph49

.lr.ph49:                                         ; preds = %42
  %43 = add i64 %.0.lcssa, -1
  %44 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %45 = load i64, ptr %44, align 8, !tbaa !7
  %46 = load ptr, ptr %0, align 8, !tbaa !7
  %47 = add i64 %.031.lcssa38, -1
  %xtraiter71 = and i64 %41, 1
  %48 = icmp eq i64 %9, %.031.lcssa38
  br i1 %48, label %.loopexit.loopexit.unr-lcssa, label %.lr.ph49.new

.lr.ph49.new:                                     ; preds = %.lr.ph49
  %unroll_iter74 = and i64 %41, -2
  br label %49

49:                                               ; preds = %49, %.lr.ph49.new
  %50 = phi i64 [ 0, %.lr.ph49.new ], [ %58, %49 ]
  %niter75 = phi i64 [ 0, %.lr.ph49.new ], [ %niter75.next.1, %49 ]
  %51 = or i64 %50, 1
  %52 = add i64 %43, %50
  %53 = mul i64 %45, %52
  %54 = getelementptr i8, ptr %46, i64 %53
  %55 = load i64, ptr %54, align 8, !tbaa !3
  %56 = add i64 %47, %50
  %57 = getelementptr i64, ptr %11, i64 %56
  store i64 %55, ptr %57, align 8, !tbaa !3
  %58 = add nuw nsw i64 %50, 2
  %59 = add i64 %43, %51
  %60 = mul i64 %45, %59
  %61 = getelementptr i8, ptr %46, i64 %60
  %62 = load i64, ptr %61, align 8, !tbaa !3
  %63 = add i64 %47, %51
  %64 = getelementptr i64, ptr %11, i64 %63
  store i64 %62, ptr %64, align 8, !tbaa !3
  %niter75.next.1 = add i64 %niter75, 2
  %niter75.ncmp.1 = icmp eq i64 %niter75.next.1, %unroll_iter74
  br i1 %niter75.ncmp.1, label %.loopexit.loopexit.unr-lcssa, label %49

65:                                               ; preds = %._crit_edge
  br i1 %.not55, label %.loopexit, label %.lr.ph47

.lr.ph47:                                         ; preds = %65
  %66 = add i64 %.029.lcssa, -1
  %67 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %68 = load i64, ptr %67, align 8, !tbaa !7
  %69 = load ptr, ptr %0, align 8, !tbaa !7
  %70 = add i64 %.031.lcssa38, -1
  %xtraiter = and i64 %41, 1
  %71 = icmp eq i64 %9, %.031.lcssa38
  br i1 %71, label %.loopexit.loopexit67.unr-lcssa, label %.lr.ph47.new

.lr.ph47.new:                                     ; preds = %.lr.ph47
  %unroll_iter = and i64 %41, -2
  br label %72

72:                                               ; preds = %72, %.lr.ph47.new
  %73 = phi i64 [ 0, %.lr.ph47.new ], [ %81, %72 ]
  %niter = phi i64 [ 0, %.lr.ph47.new ], [ %niter.next.1, %72 ]
  %74 = or i64 %73, 1
  %75 = add i64 %66, %73
  %76 = mul i64 %68, %75
  %77 = getelementptr i8, ptr %69, i64 %76
  %78 = load i64, ptr %77, align 8, !tbaa !3
  %79 = add i64 %70, %73
  %80 = getelementptr i64, ptr %11, i64 %79
  store i64 %78, ptr %80, align 8, !tbaa !3
  %81 = add nuw nsw i64 %73, 2
  %82 = add i64 %66, %74
  %83 = mul i64 %68, %82
  %84 = getelementptr i8, ptr %69, i64 %83
  %85 = load i64, ptr %84, align 8, !tbaa !3
  %86 = add i64 %70, %74
  %87 = getelementptr i64, ptr %11, i64 %86
  store i64 %85, ptr %87, align 8, !tbaa !3
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.loopexit.loopexit67.unr-lcssa, label %72

.loopexit.loopexit.unr-lcssa:                     ; preds = %49, %.lr.ph49
  %.unr72 = phi i64 [ 0, %.lr.ph49 ], [ %58, %49 ]
  %lcmp.mod73.not = icmp eq i64 %xtraiter71, 0
  br i1 %lcmp.mod73.not, label %.loopexit, label %.loopexit.loopexit.epilog-lcssa

.loopexit.loopexit.epilog-lcssa:                  ; preds = %.loopexit.loopexit.unr-lcssa
  %88 = add i64 %43, %.unr72
  %89 = mul i64 %45, %88
  %90 = getelementptr i8, ptr %46, i64 %89
  %91 = load i64, ptr %90, align 8, !tbaa !3
  %92 = add i64 %47, %.unr72
  %93 = getelementptr i64, ptr %11, i64 %92
  store i64 %91, ptr %93, align 8, !tbaa !3
  br label %.loopexit

.loopexit.loopexit67.unr-lcssa:                   ; preds = %72, %.lr.ph47
  %.unr = phi i64 [ 0, %.lr.ph47 ], [ %81, %72 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.loopexit, label %.loopexit.loopexit67.epilog-lcssa

.loopexit.loopexit67.epilog-lcssa:                ; preds = %.loopexit.loopexit67.unr-lcssa
  %94 = add i64 %66, %.unr
  %95 = mul i64 %68, %94
  %96 = getelementptr i8, ptr %69, i64 %95
  %97 = load i64, ptr %96, align 8, !tbaa !3
  %98 = add i64 %70, %.unr
  %99 = getelementptr i64, ptr %11, i64 %98
  store i64 %97, ptr %99, align 8, !tbaa !3
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit67.epilog-lcssa, %.loopexit.loopexit67.unr-lcssa, %.loopexit.loopexit.epilog-lcssa, %.loopexit.loopexit.unr-lcssa, %65, %42
  %.not54 = icmp slt i64 %8, 1
  br i1 %.not54, label %._crit_edge52, label %.lr.ph51

.lr.ph51:                                         ; preds = %.loopexit
  %100 = add i64 %6, -1
  %101 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %102 = load i64, ptr %101, align 8, !tbaa !7
  %103 = load ptr, ptr %0, align 8, !tbaa !7
  %104 = add nsw i64 %9, -1
  %xtraiter77 = and i64 %9, 3
  %105 = icmp ult i64 %104, 3
  br i1 %105, label %._crit_edge52.loopexit.unr-lcssa, label %.lr.ph51.new

.lr.ph51.new:                                     ; preds = %.lr.ph51
  %unroll_iter80 = and i64 %9, 9223372036854775804
  br label %106

106:                                              ; preds = %106, %.lr.ph51.new
  %107 = phi i64 [ 0, %.lr.ph51.new ], [ %126, %106 ]
  %niter81 = phi i64 [ 0, %.lr.ph51.new ], [ %niter81.next.3, %106 ]
  %108 = or i64 %107, 1
  %109 = getelementptr i64, ptr %11, i64 %107
  %110 = load i64, ptr %109, align 8, !tbaa !3
  %111 = add i64 %100, %107
  %112 = mul i64 %102, %111
  %113 = getelementptr i8, ptr %103, i64 %112
  store i64 %110, ptr %113, align 8, !tbaa !3
  %114 = or i64 %107, 2
  %115 = getelementptr i64, ptr %11, i64 %108
  %116 = load i64, ptr %115, align 8, !tbaa !3
  %117 = add i64 %6, %107
  %118 = mul i64 %102, %117
  %119 = getelementptr i8, ptr %103, i64 %118
  store i64 %116, ptr %119, align 8, !tbaa !3
  %120 = or i64 %107, 3
  %121 = getelementptr i64, ptr %11, i64 %114
  %122 = load i64, ptr %121, align 8, !tbaa !3
  %123 = add i64 %100, %114
  %124 = mul i64 %102, %123
  %125 = getelementptr i8, ptr %103, i64 %124
  store i64 %122, ptr %125, align 8, !tbaa !3
  %126 = add nuw nsw i64 %107, 4
  %127 = getelementptr i64, ptr %11, i64 %120
  %128 = load i64, ptr %127, align 8, !tbaa !3
  %129 = add i64 %100, %120
  %130 = mul i64 %102, %129
  %131 = getelementptr i8, ptr %103, i64 %130
  store i64 %128, ptr %131, align 8, !tbaa !3
  %niter81.next.3 = add i64 %niter81, 4
  %niter81.ncmp.3 = icmp eq i64 %niter81.next.3, %unroll_iter80
  br i1 %niter81.ncmp.3, label %._crit_edge52.loopexit.unr-lcssa, label %106

._crit_edge52.loopexit.unr-lcssa:                 ; preds = %106, %.lr.ph51
  %.unr78 = phi i64 [ 0, %.lr.ph51 ], [ %126, %106 ]
  %lcmp.mod79.not = icmp eq i64 %xtraiter77, 0
  br i1 %lcmp.mod79.not, label %._crit_edge52, label %.epil.preheader76

.epil.preheader76:                                ; preds = %._crit_edge52.loopexit.unr-lcssa, %.epil.preheader76
  %132 = phi i64 [ %133, %.epil.preheader76 ], [ %.unr78, %._crit_edge52.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader76 ], [ 0, %._crit_edge52.loopexit.unr-lcssa ]
  %133 = add nuw nsw i64 %132, 1
  %134 = getelementptr i64, ptr %11, i64 %132
  %135 = load i64, ptr %134, align 8, !tbaa !3
  %136 = add i64 %100, %132
  %137 = mul i64 %102, %136
  %138 = getelementptr i8, ptr %103, i64 %137
  store i64 %135, ptr %138, align 8, !tbaa !3
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter77
  br i1 %epil.iter.cmp.not, label %._crit_edge52, label %.epil.preheader76, !llvm.loop !26

._crit_edge52:                                    ; preds = %._crit_edge52.loopexit.unr-lcssa, %.epil.preheader76, %.loopexit
  tail call void @free(ptr %11)
  ret void
}

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
define void @_QFPswap(ptr nocapture %0, ptr nocapture %1) local_unnamed_addr #3 {
  %3 = load i64, ptr %0, align 8, !tbaa !3
  %4 = load i64, ptr %1, align 8, !tbaa !3
  store i64 %4, ptr %0, align 8, !tbaa !3
  store i64 %3, ptr %1, align 8, !tbaa !3
  ret void
}

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 i1 @_FortranAioInputDescriptor(ptr, ptr) local_unnamed_addr

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

declare i1 @_FortranAioOutputInteger64(ptr, i64) local_unnamed_addr

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

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>) #4

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>) #6

attributes #0 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
attributes #1 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" }
attributes #2 = { nounwind }
attributes #3 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { nocallback nofree nosync nounwind willreturn memory(none) }

!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, !12, !13}
!12 = !{!"llvm.loop.isvectorized", i32 1}
!13 = !{!"llvm.loop.unroll.runtime.disable"}
!14 = distinct !{!14, !13, !12}
!15 = !{!16}
!16 = distinct !{!16, !17}
!17 = distinct !{!17, !"LVerDomain"}
!18 = !{!19}
!19 = distinct !{!19, !17}
!20 = distinct !{!20, !12, !13}
!21 = distinct !{!21, !12}
!22 = distinct !{!22, !12, !13}
!23 = distinct !{!23, !13, !12}
!24 = distinct !{!24, !10}
!25 = distinct !{!25, !10}
!26 = distinct !{!26, !10}
