program main
  implicit none
  integer(8) :: n, i, d, e, k, res, x, b(0:42)
  integer(8), allocatable :: a(:)
  read (*, *) n, k
  allocate (a(n))
  read (*, *) a

  b(:) = 0
  do i = 1, n
    do d = 0, 42
      if (btest(a(i), d)) b(d) = b(d) + 1
    end do
  end do

  res = f(k, b, n)
  do d = 0, 42
    x = k
    if (.not. btest(x, d)) cycle
    x = ibclr(x, d)
    do e = 0, d - 1
      if (b(e) * 2 >= n) then
        x = ibclr(x, e)
      else
        x = ibset(x, e)
      end if
    end do
    res = max(res, f(x, b, n))
  end do
  print "(i0)", res
  contains

  integer(8) function f(x, b, n)
    integer(8), intent(in) :: x, b(0:42), n
    integer(8) :: d
    f = 0
    do d = 0, 42
      if (btest(x, d)) then
        f = f + (n - b(d)) * 2 ** d
      else
        f = f + b(d) * 2 ** d
      end if
    end do
  end function
end program main

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

@_QFEa.0 = internal unnamed_addr global ptr null
@_QFEa.8 = internal unnamed_addr global i64 0
@_QFEb = internal unnamed_addr global [43 x i64] undef
@_QQcl.34b3db8a2d2fbd2c2e25e8e2632943e5 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_5033/source.f\00"
@_QQcl.28693029 = linkonce constant [4 x i8] c"(i0)"
@_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

define void @_QQmain() local_unnamed_addr {
  %1 = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, align 8
  %2 = alloca i64, align 8
  %3 = alloca i64, align 8
  %4 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.34b3db8a2d2fbd2c2e25e8e2632943e5, i32 5)
  %5 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %3, i32 8)
  %6 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %2, i32 8)
  %7 = call i32 @_FortranAioEndIoStatement(ptr %4)
  %8 = load i64, ptr %3, align 8, !tbaa !3
  %9 = call i64 @llvm.smax.i64(i64 %8, i64 0)
  %10 = shl i64 %9, 3
  %11 = call ptr @malloc(i64 %10)
  store ptr %11, ptr @_QFEa.0, align 8, !tbaa !7
  store i64 %9, ptr @_QFEa.8, align 8, !tbaa !7
  %12 = call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.34b3db8a2d2fbd2c2e25e8e2632943e5, i32 7)
  %.unpack = load ptr, ptr @_QFEa.0, align 8, !tbaa !7
  %.unpack102.unpack.unpack104 = load i64, ptr @_QFEa.8, align 8, !tbaa !7
  store ptr %.unpack, ptr %1, align 8, !tbaa !7
  %.fca.1.gep = 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.gep, align 8, !tbaa !7
  %.fca.2.gep = 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.gep, align 8, !tbaa !7
  %.fca.3.gep = 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.gep, align 4, !tbaa !7
  %.fca.4.gep = 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.gep, align 1, !tbaa !7
  %.fca.5.gep = 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.gep, align 2, !tbaa !7
  %.fca.6.gep = 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.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 %1, 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 %1, i64 0, i32 7, i64 0, i64 1
  store i64 %.unpack102.unpack.unpack104, 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 %1, i64 0, i32 7, i64 0, i64 2
  store i64 8, ptr %.fca.7.0.2.gep, align 8, !tbaa !7
  %13 = call i1 @_FortranAioInputDescriptor(ptr %12, ptr nonnull %1)
  %14 = call i32 @_FortranAioEndIoStatement(ptr %12)
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(344) @_QFEb, i8 0, i64 344, i1 false), !tbaa !3
  %15 = load i64, ptr %3, align 8, !tbaa !3
  %16 = icmp sgt i64 %15, 0
  br i1 %16, label %.preheader150.lr.ph, label %._crit_edge

.preheader150.lr.ph:                              ; preds = %0
  %.unpack110 = load ptr, ptr @_QFEa.0, align 8, !tbaa !7
  br label %.preheader150

.preheader150:                                    ; preds = %.preheader150.lr.ph, %32
  %17 = phi i64 [ 1, %.preheader150.lr.ph ], [ %33, %32 ]
  %18 = add i64 %17, -1
  %19 = getelementptr i64, ptr %.unpack110, i64 %18
  %20 = load i64, ptr %19, align 8, !tbaa !3
  br label %21

21:                                               ; preds = %.preheader150, %30
  %22 = phi i64 [ 0, %.preheader150 ], [ %31, %30 ]
  %sext122 = shl i64 %22, 32
  %23 = ashr exact i64 %sext122, 32
  %24 = shl nuw i64 1, %23
  %25 = and i64 %20, %24
  %.not123 = icmp eq i64 %25, 0
  br i1 %.not123, label %30, label %26

26:                                               ; preds = %21
  %27 = getelementptr [43 x i64], ptr @_QFEb, i64 0, i64 %22
  %28 = load i64, ptr %27, align 8, !tbaa !3
  %29 = add i64 %28, 1
  store i64 %29, ptr %27, align 8, !tbaa !3
  br label %30

30:                                               ; preds = %26, %21
  %31 = add nuw nsw i64 %22, 1
  %exitcond.not = icmp eq i64 %31, 43
  br i1 %exitcond.not, label %32, label %21

32:                                               ; preds = %30
  %33 = add nuw i64 %17, 1
  %exitcond154.not = icmp eq i64 %17, %15
  br i1 %exitcond154.not, label %._crit_edge, label %.preheader150

._crit_edge:                                      ; preds = %32, %0
  %34 = load i64, ptr %2, align 8, !tbaa !3
  br label %35

35:                                               ; preds = %69, %._crit_edge
  %36 = phi i64 [ 0, %._crit_edge ], [ %70, %69 ]
  %.016.i = phi i64 [ 0, %._crit_edge ], [ %.1.i, %69 ]
  %sext.i = shl i64 %36, 32
  %37 = ashr exact i64 %sext.i, 32
  %38 = shl nuw i64 1, %37
  %39 = and i64 %38, %34
  %.not.i = icmp eq i64 %39, 0
  %40 = getelementptr [43 x i64], ptr @_QFEb, i64 0, i64 %36
  %41 = load i64, ptr %40, align 8, !tbaa !3
  br i1 %.not.i, label %56, label %42

42:                                               ; preds = %35
  %43 = sub i64 %15, %41
  %44 = icmp eq i64 %36, 0
  br i1 %44, label %__mlir_math_ipowi_i64.exit.i, label %.preheader.i.i

.preheader.i.i:                                   ; preds = %42
  %45 = and i64 %36, 1
  %.not3.i.i = icmp eq i64 %45, 0
  %46 = select i1 %.not3.i.i, i64 1, i64 2
  %47 = icmp eq i64 %36, 1
  br i1 %47, label %__mlir_math_ipowi_i64.exit.i, label %.lr.ph.i.i

.lr.ph.i.i:                                       ; preds = %.preheader.i.i, %.lr.ph.i.i
  %spec.select4.i.i = phi i64 [ %spec.select.i.i, %.lr.ph.i.i ], [ %46, %.preheader.i.i ]
  %48 = phi i64 [ %50, %.lr.ph.i.i ], [ %36, %.preheader.i.i ]
  %49 = phi i64 [ %51, %.lr.ph.i.i ], [ 2, %.preheader.i.i ]
  %50 = lshr i64 %48, 1
  %51 = mul i64 %49, %49
  %52 = and i64 %48, 2
  %.not.i.i = icmp eq i64 %52, 0
  %53 = select i1 %.not.i.i, i64 1, i64 %51
  %spec.select.i.i = mul i64 %53, %spec.select4.i.i
  %54 = icmp ult i64 %48, 4
  br i1 %54, label %__mlir_math_ipowi_i64.exit.i, label %.lr.ph.i.i

__mlir_math_ipowi_i64.exit.i:                     ; preds = %.lr.ph.i.i, %.preheader.i.i, %42
  %common.ret.op.i.i = phi i64 [ 1, %42 ], [ %46, %.preheader.i.i ], [ %spec.select.i.i, %.lr.ph.i.i ]
  %55 = mul i64 %common.ret.op.i.i, %43
  br label %69

56:                                               ; preds = %35
  %57 = icmp eq i64 %36, 0
  br i1 %57, label %__mlir_math_ipowi_i64.exit15.i, label %.preheader.i10.i

.preheader.i10.i:                                 ; preds = %56
  %58 = and i64 %36, 1
  %.not3.i9.i = icmp eq i64 %58, 0
  %59 = select i1 %.not3.i9.i, i64 1, i64 2
  %60 = icmp eq i64 %36, 1
  br i1 %60, label %__mlir_math_ipowi_i64.exit15.i, label %.lr.ph.i14.i

.lr.ph.i14.i:                                     ; preds = %.preheader.i10.i, %.lr.ph.i14.i
  %spec.select4.i11.i = phi i64 [ %spec.select.i13.i, %.lr.ph.i14.i ], [ %59, %.preheader.i10.i ]
  %61 = phi i64 [ %63, %.lr.ph.i14.i ], [ %36, %.preheader.i10.i ]
  %62 = phi i64 [ %64, %.lr.ph.i14.i ], [ 2, %.preheader.i10.i ]
  %63 = lshr i64 %61, 1
  %64 = mul i64 %62, %62
  %65 = and i64 %61, 2
  %.not.i12.i = icmp eq i64 %65, 0
  %66 = select i1 %.not.i12.i, i64 1, i64 %64
  %spec.select.i13.i = mul i64 %66, %spec.select4.i11.i
  %67 = icmp ult i64 %61, 4
  br i1 %67, label %__mlir_math_ipowi_i64.exit15.i, label %.lr.ph.i14.i

__mlir_math_ipowi_i64.exit15.i:                   ; preds = %.lr.ph.i14.i, %.preheader.i10.i, %56
  %common.ret.op.i8.i = phi i64 [ 1, %56 ], [ %59, %.preheader.i10.i ], [ %spec.select.i13.i, %.lr.ph.i14.i ]
  %68 = mul i64 %common.ret.op.i8.i, %41
  br label %69

69:                                               ; preds = %__mlir_math_ipowi_i64.exit15.i, %__mlir_math_ipowi_i64.exit.i
  %.pn.i = phi i64 [ %55, %__mlir_math_ipowi_i64.exit.i ], [ %68, %__mlir_math_ipowi_i64.exit15.i ]
  %.1.i = add i64 %.pn.i, %.016.i
  %70 = add nuw nsw i64 %36, 1
  %exitcond.not.i = icmp eq i64 %70, 43
  br i1 %exitcond.not.i, label %_QFPf.exit.preheader, label %35

_QFPf.exit.preheader:                             ; preds = %69, %_QFPf.exit
  %71 = phi i64 [ %143, %_QFPf.exit ], [ 0, %69 ]
  %.0153 = phi i64 [ %.1, %_QFPf.exit ], [ %.1.i, %69 ]
  %sext = shl i64 %71, 32
  %72 = ashr exact i64 %sext, 32
  %73 = shl nuw i64 1, %72
  %74 = and i64 %73, %34
  %.not = icmp eq i64 %74, 0
  br i1 %.not, label %_QFPf.exit, label %75

75:                                               ; preds = %_QFPf.exit.preheader
  %76 = xor i64 %73, -1
  %77 = and i64 %34, %76
  %.not157 = icmp eq i64 %71, 0
  br i1 %.not157, label %.preheader, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %75
  %xtraiter = and i64 %71, 1
  %78 = icmp eq i64 %71, 1
  br i1 %78, label %.preheader.loopexit.unr-lcssa, label %.lr.ph.preheader.new

.lr.ph.preheader.new:                             ; preds = %.lr.ph.preheader
  %unroll_iter = and i64 %71, 9223372036854775806
  br label %.lr.ph

.preheader.loopexit.unr-lcssa:                    ; preds = %.lr.ph, %.lr.ph.preheader
  %storemerge.lcssa.ph = phi i64 [ undef, %.lr.ph.preheader ], [ %storemerge.1, %.lr.ph ]
  %.unr = phi i64 [ 0, %.lr.ph.preheader ], [ %105, %.lr.ph ]
  %.0149151.unr = phi i64 [ %77, %.lr.ph.preheader ], [ %storemerge.1, %.lr.ph ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.preheader, label %.lr.ph.epil

.lr.ph.epil:                                      ; preds = %.preheader.loopexit.unr-lcssa
  %79 = getelementptr [43 x i64], ptr @_QFEb, i64 0, i64 %.unr
  %80 = load i64, ptr %79, align 8, !tbaa !3
  %81 = shl i64 %80, 1
  %.not107.epil = icmp slt i64 %81, %15
  %sext108.epil = shl i64 %.unr, 32
  %82 = ashr exact i64 %sext108.epil, 32
  %83 = shl nuw i64 1, %82
  %84 = or i64 %83, %.0149151.unr
  %85 = xor i64 %83, -1
  %86 = and i64 %.0149151.unr, %85
  %storemerge.epil = select i1 %.not107.epil, i64 %84, i64 %86
  br label %.preheader

.preheader:                                       ; preds = %.lr.ph.epil, %.preheader.loopexit.unr-lcssa, %75
  %.0149.lcssa = phi i64 [ %77, %75 ], [ %storemerge.lcssa.ph, %.preheader.loopexit.unr-lcssa ], [ %storemerge.epil, %.lr.ph.epil ]
  br label %106

.lr.ph:                                           ; preds = %.lr.ph, %.lr.ph.preheader.new
  %87 = phi i64 [ 0, %.lr.ph.preheader.new ], [ %105, %.lr.ph ]
  %.0149151 = phi i64 [ %77, %.lr.ph.preheader.new ], [ %storemerge.1, %.lr.ph ]
  %niter = phi i64 [ 0, %.lr.ph.preheader.new ], [ %niter.next.1, %.lr.ph ]
  %88 = getelementptr [43 x i64], ptr @_QFEb, i64 0, i64 %87
  %89 = load i64, ptr %88, align 16, !tbaa !3
  %90 = shl i64 %89, 1
  %.not107 = icmp slt i64 %90, %15
  %sext108 = shl i64 %87, 32
  %91 = ashr exact i64 %sext108, 32
  %92 = shl nuw i64 1, %91
  %93 = or i64 %92, %.0149151
  %94 = xor i64 %92, -1
  %95 = and i64 %.0149151, %94
  %storemerge = select i1 %.not107, i64 %93, i64 %95
  %96 = or i64 %87, 1
  %97 = getelementptr [43 x i64], ptr @_QFEb, i64 0, i64 %96
  %98 = load i64, ptr %97, align 8, !tbaa !3
  %99 = shl i64 %98, 1
  %.not107.1 = icmp slt i64 %99, %15
  %sext108.1 = shl i64 %96, 32
  %100 = ashr exact i64 %sext108.1, 32
  %101 = shl nuw i64 1, %100
  %102 = or i64 %101, %storemerge
  %103 = xor i64 %101, -1
  %104 = and i64 %storemerge, %103
  %storemerge.1 = select i1 %.not107.1, i64 %102, i64 %104
  %105 = add nuw nsw i64 %87, 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 %.preheader.loopexit.unr-lcssa, label %.lr.ph

106:                                              ; preds = %.preheader, %140
  %107 = phi i64 [ %141, %140 ], [ 0, %.preheader ]
  %.016.i124 = phi i64 [ %.1.i144, %140 ], [ 0, %.preheader ]
  %sext.i125 = shl i64 %107, 32
  %108 = ashr exact i64 %sext.i125, 32
  %109 = shl nuw i64 1, %108
  %110 = and i64 %109, %.0149.lcssa
  %.not.i126 = icmp eq i64 %110, 0
  %111 = getelementptr [43 x i64], ptr @_QFEb, i64 0, i64 %107
  %112 = load i64, ptr %111, align 8, !tbaa !3
  br i1 %.not.i126, label %127, label %113

113:                                              ; preds = %106
  %114 = sub i64 %15, %112
  %115 = icmp eq i64 %107, 0
  br i1 %115, label %__mlir_math_ipowi_i64.exit.i134, label %.preheader.i.i128

.preheader.i.i128:                                ; preds = %113
  %116 = and i64 %107, 1
  %.not3.i.i127 = icmp eq i64 %116, 0
  %117 = select i1 %.not3.i.i127, i64 1, i64 2
  %118 = icmp eq i64 %107, 1
  br i1 %118, label %__mlir_math_ipowi_i64.exit.i134, label %.lr.ph.i.i132

.lr.ph.i.i132:                                    ; preds = %.preheader.i.i128, %.lr.ph.i.i132
  %spec.select4.i.i129 = phi i64 [ %spec.select.i.i131, %.lr.ph.i.i132 ], [ %117, %.preheader.i.i128 ]
  %119 = phi i64 [ %121, %.lr.ph.i.i132 ], [ %107, %.preheader.i.i128 ]
  %120 = phi i64 [ %122, %.lr.ph.i.i132 ], [ 2, %.preheader.i.i128 ]
  %121 = lshr i64 %119, 1
  %122 = mul i64 %120, %120
  %123 = and i64 %119, 2
  %.not.i.i130 = icmp eq i64 %123, 0
  %124 = select i1 %.not.i.i130, i64 1, i64 %122
  %spec.select.i.i131 = mul i64 %124, %spec.select4.i.i129
  %125 = icmp ult i64 %119, 4
  br i1 %125, label %__mlir_math_ipowi_i64.exit.i134, label %.lr.ph.i.i132

__mlir_math_ipowi_i64.exit.i134:                  ; preds = %.lr.ph.i.i132, %.preheader.i.i128, %113
  %common.ret.op.i.i133 = phi i64 [ 1, %113 ], [ %117, %.preheader.i.i128 ], [ %spec.select.i.i131, %.lr.ph.i.i132 ]
  %126 = mul i64 %common.ret.op.i.i133, %114
  br label %140

127:                                              ; preds = %106
  %128 = icmp eq i64 %107, 0
  br i1 %128, label %__mlir_math_ipowi_i64.exit15.i142, label %.preheader.i10.i136

.preheader.i10.i136:                              ; preds = %127
  %129 = and i64 %107, 1
  %.not3.i9.i135 = icmp eq i64 %129, 0
  %130 = select i1 %.not3.i9.i135, i64 1, i64 2
  %131 = icmp eq i64 %107, 1
  br i1 %131, label %__mlir_math_ipowi_i64.exit15.i142, label %.lr.ph.i14.i140

.lr.ph.i14.i140:                                  ; preds = %.preheader.i10.i136, %.lr.ph.i14.i140
  %spec.select4.i11.i137 = phi i64 [ %spec.select.i13.i139, %.lr.ph.i14.i140 ], [ %130, %.preheader.i10.i136 ]
  %132 = phi i64 [ %134, %.lr.ph.i14.i140 ], [ %107, %.preheader.i10.i136 ]
  %133 = phi i64 [ %135, %.lr.ph.i14.i140 ], [ 2, %.preheader.i10.i136 ]
  %134 = lshr i64 %132, 1
  %135 = mul i64 %133, %133
  %136 = and i64 %132, 2
  %.not.i12.i138 = icmp eq i64 %136, 0
  %137 = select i1 %.not.i12.i138, i64 1, i64 %135
  %spec.select.i13.i139 = mul i64 %137, %spec.select4.i11.i137
  %138 = icmp ult i64 %132, 4
  br i1 %138, label %__mlir_math_ipowi_i64.exit15.i142, label %.lr.ph.i14.i140

__mlir_math_ipowi_i64.exit15.i142:                ; preds = %.lr.ph.i14.i140, %.preheader.i10.i136, %127
  %common.ret.op.i8.i141 = phi i64 [ 1, %127 ], [ %130, %.preheader.i10.i136 ], [ %spec.select.i13.i139, %.lr.ph.i14.i140 ]
  %139 = mul i64 %common.ret.op.i8.i141, %112
  br label %140

140:                                              ; preds = %__mlir_math_ipowi_i64.exit15.i142, %__mlir_math_ipowi_i64.exit.i134
  %.pn.i143 = phi i64 [ %126, %__mlir_math_ipowi_i64.exit.i134 ], [ %139, %__mlir_math_ipowi_i64.exit15.i142 ]
  %.1.i144 = add i64 %.pn.i143, %.016.i124
  %141 = add nuw nsw i64 %107, 1
  %exitcond.not.i145 = icmp eq i64 %141, 43
  br i1 %exitcond.not.i145, label %_QFPf.exit146, label %106

_QFPf.exit146:                                    ; preds = %140
  %142 = call i64 @llvm.smax.i64(i64 %.0153, i64 %.1.i144)
  br label %_QFPf.exit

_QFPf.exit:                                       ; preds = %_QFPf.exit146, %_QFPf.exit.preheader
  %.1 = phi i64 [ %142, %_QFPf.exit146 ], [ %.0153, %_QFPf.exit.preheader ]
  %143 = add nuw nsw i64 %71, 1
  %exitcond156.not = icmp eq i64 %143, 43
  br i1 %exitcond156.not, label %144, label %_QFPf.exit.preheader

144:                                              ; preds = %_QFPf.exit
  %145 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.34b3db8a2d2fbd2c2e25e8e2632943e5, i32 30)
  %146 = call i1 @_FortranAioOutputInteger64(ptr %145, i64 %.1)
  %147 = call i32 @_FortranAioEndIoStatement(ptr %145)
  ret void
}

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

5:                                                ; preds = %3, %42
  %6 = phi i64 [ 0, %3 ], [ %43, %42 ]
  %.016 = phi i64 [ 0, %3 ], [ %.1, %42 ]
  %sext = shl i64 %6, 32
  %7 = ashr exact i64 %sext, 32
  %8 = shl nuw i64 1, %7
  %9 = and i64 %4, %8
  %.not = icmp eq i64 %9, 0
  br i1 %.not, label %27, label %10

10:                                               ; preds = %5
  %11 = load i64, ptr %2, align 8, !tbaa !3
  %12 = getelementptr [43 x i64], ptr %1, i64 0, i64 %6
  %13 = load i64, ptr %12, align 8, !tbaa !3
  %14 = sub i64 %11, %13
  %15 = icmp eq i64 %6, 0
  br i1 %15, label %__mlir_math_ipowi_i64.exit, label %.preheader.i

.preheader.i:                                     ; preds = %10
  %16 = and i64 %6, 1
  %.not3.i = icmp eq i64 %16, 0
  %17 = select i1 %.not3.i, i64 1, i64 2
  %18 = icmp eq i64 %6, 1
  br i1 %18, label %__mlir_math_ipowi_i64.exit, label %.lr.ph.i

.lr.ph.i:                                         ; preds = %.preheader.i, %.lr.ph.i
  %spec.select4.i = phi i64 [ %spec.select.i, %.lr.ph.i ], [ %17, %.preheader.i ]
  %19 = phi i64 [ %21, %.lr.ph.i ], [ %6, %.preheader.i ]
  %20 = phi i64 [ %22, %.lr.ph.i ], [ 2, %.preheader.i ]
  %21 = lshr i64 %19, 1
  %22 = mul i64 %20, %20
  %23 = and i64 %19, 2
  %.not.i = icmp eq i64 %23, 0
  %24 = select i1 %.not.i, i64 1, i64 %22
  %spec.select.i = mul i64 %24, %spec.select4.i
  %25 = icmp ult i64 %19, 4
  br i1 %25, label %__mlir_math_ipowi_i64.exit, label %.lr.ph.i

__mlir_math_ipowi_i64.exit:                       ; preds = %.lr.ph.i, %10, %.preheader.i
  %common.ret.op.i = phi i64 [ 1, %10 ], [ %17, %.preheader.i ], [ %spec.select.i, %.lr.ph.i ]
  %26 = mul i64 %common.ret.op.i, %14
  br label %42

27:                                               ; preds = %5
  %28 = getelementptr [43 x i64], ptr %1, i64 0, i64 %6
  %29 = load i64, ptr %28, align 8, !tbaa !3
  %30 = icmp eq i64 %6, 0
  br i1 %30, label %__mlir_math_ipowi_i64.exit15, label %.preheader.i10

.preheader.i10:                                   ; preds = %27
  %31 = and i64 %6, 1
  %.not3.i9 = icmp eq i64 %31, 0
  %32 = select i1 %.not3.i9, i64 1, i64 2
  %33 = icmp eq i64 %6, 1
  br i1 %33, label %__mlir_math_ipowi_i64.exit15, label %.lr.ph.i14

.lr.ph.i14:                                       ; preds = %.preheader.i10, %.lr.ph.i14
  %spec.select4.i11 = phi i64 [ %spec.select.i13, %.lr.ph.i14 ], [ %32, %.preheader.i10 ]
  %34 = phi i64 [ %36, %.lr.ph.i14 ], [ %6, %.preheader.i10 ]
  %35 = phi i64 [ %37, %.lr.ph.i14 ], [ 2, %.preheader.i10 ]
  %36 = lshr i64 %34, 1
  %37 = mul i64 %35, %35
  %38 = and i64 %34, 2
  %.not.i12 = icmp eq i64 %38, 0
  %39 = select i1 %.not.i12, i64 1, i64 %37
  %spec.select.i13 = mul i64 %39, %spec.select4.i11
  %40 = icmp ult i64 %34, 4
  br i1 %40, label %__mlir_math_ipowi_i64.exit15, label %.lr.ph.i14

__mlir_math_ipowi_i64.exit15:                     ; preds = %.lr.ph.i14, %27, %.preheader.i10
  %common.ret.op.i8 = phi i64 [ 1, %27 ], [ %32, %.preheader.i10 ], [ %spec.select.i13, %.lr.ph.i14 ]
  %41 = mul i64 %common.ret.op.i8, %29
  br label %42

42:                                               ; preds = %__mlir_math_ipowi_i64.exit, %__mlir_math_ipowi_i64.exit15
  %.pn = phi i64 [ %26, %__mlir_math_ipowi_i64.exit ], [ %41, %__mlir_math_ipowi_i64.exit15 ]
  %.1 = add i64 %.pn, %.016
  %43 = add nuw nsw i64 %6, 1
  %exitcond.not = icmp eq i64 %43, 43
  br i1 %exitcond.not, label %44, label %5

44:                                               ; preds = %42
  ret i64 %.1
}

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 @_FortranAioBeginExternalFormattedOutput(ptr, i64, ptr, 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) #2

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

attributes #0 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
attributes #1 = { nofree norecurse nosync nounwind memory(argmem: read) }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { 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}
