program range_set
  implicit none
  integer(8), parameter :: modu = 1000000007
  integer :: n, a, b, i, j
  integer(8) :: x = 1, f(0:5000, 2) = 0, g(0:5000, 2) = 0
  read(*,*) n, a, b
  if (a > b) then
    i = a
    a = b
    b = i
  end if
  g(1, 2) = 1
  do i = 2, b - 1
    g(i, 2) = mod(g(i - 1, 1) + g(i - 1, 2), modu)
    g(i, 1) = mod(sum(g(1:i - a, 2)), modu)
  end do
  f(0, :) = 1
  do i = 1, n
    x = mod(x * 2, modu)
    f(i, 1) = mod(sum(f(max(i - a + 1, 0):i - 1, 2)), modu)
    do j = 1, min(b - 1, i)
      if (i == n) f(i, 1) = mod(f(i, 1) + f(i - j, 1) * g(j, 1), modu)
      f(i, 2) = f(i, 2) + merge(g(j, 1) + g(j, 2), mod(f(i - j, 1) * g(j, 2), modu), j == i)
    end do
    f(i, 2) = mod(f(i, 2), modu)
  end do
  write(*,'(i0)') modulo(x - f(n, 1) - f(n, 2), modu)
end program range_set
; 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"

@_QFEf = internal unnamed_addr global [2 x [5001 x i64]] zeroinitializer
@_QFEg = internal unnamed_addr global [2 x [5001 x i64]] zeroinitializer
@_QFEx = internal unnamed_addr global i64 1
@_QQcl.cdbd91fd4561ae2584f498dcca835dd4 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_1241/source.f\00"
@_QQcl.28693029 = linkonce constant [4 x i8] c"(i0)"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

define void @_QQmain() local_unnamed_addr {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.cdbd91fd4561ae2584f498dcca835dd4, i32 6)
  %5 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %3, i32 4)
  %6 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %1, i32 4)
  %7 = call i1 @_FortranAioInputInteger(ptr %4, ptr nonnull %2, i32 4)
  %8 = call i32 @_FortranAioEndIoStatement(ptr %4)
  %9 = load i32, ptr %1, align 4, !tbaa !3
  %10 = load i32, ptr %2, align 4, !tbaa !3
  %11 = icmp sgt i32 %9, %10
  br i1 %11, label %12, label %13

12:                                               ; preds = %0
  store i32 %10, ptr %1, align 4, !tbaa !3
  store i32 %9, ptr %2, align 4, !tbaa !3
  br label %13

13:                                               ; preds = %12, %0
  %14 = phi i32 [ %10, %12 ], [ %9, %0 ]
  %15 = phi i32 [ %9, %12 ], [ %10, %0 ]
  store i64 1, ptr getelementptr inbounds ([2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 1, i64 1), align 16, !tbaa !3
  %16 = add i32 %15, -1
  %17 = icmp sgt i32 %16, 1
  br i1 %17, label %.lr.ph, label %.preheader

.lr.ph:                                           ; preds = %13
  %18 = zext i32 %16 to i64
  %.pre = load i64, ptr getelementptr inbounds ([2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 0, i64 1), align 8, !tbaa !3
  %19 = sub i32 2, %14
  br label %22

.preheader:                                       ; preds = %_FortranASumInteger8x1_contract_simplified.exit, %13
  store i64 1, ptr @_QFEf, align 16, !tbaa !3
  store i64 1, ptr getelementptr inbounds ([2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 1, i64 0), align 8, !tbaa !3
  %20 = load i32, ptr %3, align 4, !tbaa !3
  %21 = icmp sgt i32 %20, 0
  br i1 %21, label %.lr.ph63, label %124

22:                                               ; preds = %.lr.ph, %_FortranASumInteger8x1_contract_simplified.exit
  %indvar = phi i32 [ 0, %.lr.ph ], [ %indvar.next, %_FortranASumInteger8x1_contract_simplified.exit ]
  %23 = phi i64 [ 1, %.lr.ph ], [ %28, %_FortranASumInteger8x1_contract_simplified.exit ]
  %24 = phi i64 [ %.pre, %.lr.ph ], [ %48, %_FortranASumInteger8x1_contract_simplified.exit ]
  %indvars.iv = phi i64 [ 2, %.lr.ph ], [ %indvars.iv.next, %_FortranASumInteger8x1_contract_simplified.exit ]
  %25 = add i32 %19, %indvar
  %smax = call i32 @llvm.smax.i32(i32 %25, i32 0)
  %26 = zext i32 %smax to i64
  %27 = add i64 %23, %24
  %28 = srem i64 %27, 1000000007
  %29 = getelementptr [2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 1, i64 %indvars.iv
  store i64 %28, ptr %29, align 8, !tbaa !3
  %30 = trunc i64 %indvars.iv to i32
  %31 = sub i32 %30, %14
  %32 = call i32 @llvm.smax.i32(i32 %31, i32 0)
  %33 = zext i32 %32 to i64
  %.not56 = icmp slt i32 %31, 1
  br i1 %.not56, label %_FortranASumInteger8x1_contract_simplified.exit, label %.lr.ph.i.preheader

.lr.ph.i.preheader:                               ; preds = %22
  %min.iters.check = icmp ult i32 %smax, 4
  br i1 %min.iters.check, label %.lr.ph.i.preheader116, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph.i.preheader
  %n.vec = and i64 %26, 2147483644
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.phi = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %37, %vector.body ]
  %vec.phi87 = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %38, %vector.body ]
  %34 = shl i64 %index, 3
  %35 = getelementptr i8, ptr getelementptr inbounds ([2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 1, i64 1), i64 %34
  %wide.load = load <2 x i64>, ptr %35, align 16, !tbaa !3
  %36 = getelementptr i64, ptr %35, i64 2
  %wide.load88 = load <2 x i64>, ptr %36, align 16, !tbaa !3
  %37 = add <2 x i64> %wide.load, %vec.phi
  %38 = add <2 x i64> %wide.load88, %vec.phi87
  %index.next = add nuw i64 %index, 4
  %39 = icmp eq i64 %index.next, %n.vec
  br i1 %39, label %middle.block, label %vector.body, !llvm.loop !7

middle.block:                                     ; preds = %vector.body
  %bin.rdx = add <2 x i64> %38, %37
  %40 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx)
  %cmp.n = icmp eq i64 %n.vec, %26
  br i1 %cmp.n, label %_FortranASumInteger8x1_contract_simplified.exit, label %.lr.ph.i.preheader116

.lr.ph.i.preheader116:                            ; preds = %.lr.ph.i.preheader, %middle.block
  %.ph117 = phi i64 [ 0, %.lr.ph.i.preheader ], [ %40, %middle.block ]
  %.ph118 = phi i64 [ 0, %.lr.ph.i.preheader ], [ %n.vec, %middle.block ]
  br label %.lr.ph.i

.lr.ph.i:                                         ; preds = %.lr.ph.i.preheader116, %.lr.ph.i
  %41 = phi i64 [ %46, %.lr.ph.i ], [ %.ph117, %.lr.ph.i.preheader116 ]
  %42 = phi i64 [ %47, %.lr.ph.i ], [ %.ph118, %.lr.ph.i.preheader116 ]
  %43 = shl i64 %42, 3
  %44 = getelementptr i8, ptr getelementptr inbounds ([2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 1, i64 1), i64 %43
  %45 = load i64, ptr %44, align 8, !tbaa !3
  %46 = add i64 %45, %41
  %47 = add nuw nsw i64 %42, 1
  %exitcond.not.i = icmp eq i64 %47, %33
  br i1 %exitcond.not.i, label %_FortranASumInteger8x1_contract_simplified.exit, label %.lr.ph.i, !llvm.loop !10

_FortranASumInteger8x1_contract_simplified.exit:  ; preds = %.lr.ph.i, %middle.block, %22
  %.lcssa.i = phi i64 [ 0, %22 ], [ %40, %middle.block ], [ %46, %.lr.ph.i ]
  %48 = srem i64 %.lcssa.i, 1000000007
  %49 = getelementptr [2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 0, i64 %indvars.iv
  store i64 %48, ptr %49, align 8, !tbaa !3
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv, %18
  %indvar.next = add i32 %indvar, 1
  br i1 %exitcond.not, label %.preheader, label %22

.lr.ph63:                                         ; preds = %.preheader
  %50 = zext i32 %20 to i64
  %_QFEx.promoted = load i64, ptr @_QFEx, align 8, !tbaa !3
  %51 = zext i32 %20 to i64
  %52 = sub i32 2, %14
  br label %53

53:                                               ; preds = %.lr.ph63, %._crit_edge
  %indvar89 = phi i64 [ 0, %.lr.ph63 ], [ %indvar.next90, %._crit_edge ]
  %indvars.iv73 = phi i64 [ 1, %.lr.ph63 ], [ %indvars.iv.next74, %._crit_edge ]
  %54 = phi i64 [ %_QFEx.promoted, %.lr.ph63 ], [ %61, %._crit_edge ]
  %55 = trunc i64 %indvar89 to i32
  %56 = add i32 %52, %55
  %smax91 = call i32 @llvm.smax.i32(i32 %56, i32 0)
  %57 = zext i32 %smax91 to i64
  %58 = sub i64 %indvar89, %57
  %smax92 = call i64 @llvm.smax.i64(i64 %58, i64 -1)
  %59 = add nsw i64 %smax92, 1
  %60 = shl i64 %54, 1
  %61 = srem i64 %60, 1000000007
  %indvars.iv.next74 = add nuw nsw i64 %indvars.iv73, 1
  %62 = trunc i64 %indvars.iv.next74 to i32
  %63 = sub i32 %62, %14
  %64 = call i32 @llvm.smax.i32(i32 %63, i32 0)
  %65 = zext i32 %64 to i64
  %66 = xor i64 %65, -1
  %67 = add nsw i64 %indvars.iv73, %66
  %68 = call i64 @llvm.smax.i64(i64 %67, i64 -1)
  %69 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 1, i64 %65
  %.not = icmp slt i64 %67, 0
  br i1 %.not, label %_FortranASumInteger8x1_contract_simplified.exit45, label %.lr.ph.i42.preheader

.lr.ph.i42.preheader:                             ; preds = %53
  %min.iters.check95 = icmp ult i64 %59, 4
  br i1 %min.iters.check95, label %.lr.ph.i42.preheader110, label %vector.ph96

vector.ph96:                                      ; preds = %.lr.ph.i42.preheader
  %n.vec98 = and i64 %59, -4
  br label %vector.body101

vector.body101:                                   ; preds = %vector.body101, %vector.ph96
  %index102 = phi i64 [ 0, %vector.ph96 ], [ %index.next107, %vector.body101 ]
  %vec.phi103 = phi <2 x i64> [ zeroinitializer, %vector.ph96 ], [ %73, %vector.body101 ]
  %vec.phi104 = phi <2 x i64> [ zeroinitializer, %vector.ph96 ], [ %74, %vector.body101 ]
  %70 = shl i64 %index102, 3
  %71 = getelementptr i8, ptr %69, i64 %70
  %wide.load105 = load <2 x i64>, ptr %71, align 8, !tbaa !3
  %72 = getelementptr i64, ptr %71, i64 2
  %wide.load106 = load <2 x i64>, ptr %72, align 8, !tbaa !3
  %73 = add <2 x i64> %wide.load105, %vec.phi103
  %74 = add <2 x i64> %wide.load106, %vec.phi104
  %index.next107 = add nuw i64 %index102, 4
  %75 = icmp eq i64 %index.next107, %n.vec98
  br i1 %75, label %middle.block93, label %vector.body101, !llvm.loop !11

middle.block93:                                   ; preds = %vector.body101
  %bin.rdx108 = add <2 x i64> %74, %73
  %76 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx108)
  %cmp.n100 = icmp eq i64 %59, %n.vec98
  br i1 %cmp.n100, label %_FortranASumInteger8x1_contract_simplified.exit45, label %.lr.ph.i42.preheader110

.lr.ph.i42.preheader110:                          ; preds = %.lr.ph.i42.preheader, %middle.block93
  %.ph = phi i64 [ 0, %.lr.ph.i42.preheader ], [ %76, %middle.block93 ]
  %.ph111 = phi i64 [ 0, %.lr.ph.i42.preheader ], [ %n.vec98, %middle.block93 ]
  br label %.lr.ph.i42

.lr.ph.i42:                                       ; preds = %.lr.ph.i42.preheader110, %.lr.ph.i42
  %77 = phi i64 [ %82, %.lr.ph.i42 ], [ %.ph, %.lr.ph.i42.preheader110 ]
  %78 = phi i64 [ %83, %.lr.ph.i42 ], [ %.ph111, %.lr.ph.i42.preheader110 ]
  %79 = shl i64 %78, 3
  %80 = getelementptr i8, ptr %69, i64 %79
  %81 = load i64, ptr %80, align 8, !tbaa !3
  %82 = add i64 %81, %77
  %83 = add nuw nsw i64 %78, 1
  %exitcond.not.i43 = icmp eq i64 %78, %68
  br i1 %exitcond.not.i43, label %_FortranASumInteger8x1_contract_simplified.exit45, label %.lr.ph.i42, !llvm.loop !12

_FortranASumInteger8x1_contract_simplified.exit45: ; preds = %.lr.ph.i42, %middle.block93, %53
  %.lcssa.i44 = phi i64 [ 0, %53 ], [ %76, %middle.block93 ], [ %82, %.lr.ph.i42 ]
  %84 = srem i64 %.lcssa.i44, 1000000007
  %85 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 0, i64 %indvars.iv73
  store i64 %84, ptr %85, align 8, !tbaa !3
  %86 = trunc i64 %indvars.iv73 to i32
  %87 = call i32 @llvm.smin.i32(i32 %16, i32 %86)
  %88 = icmp sgt i32 %87, 0
  br i1 %88, label %.lr.ph61, label %_FortranASumInteger8x1_contract_simplified.exit45.._crit_edge_crit_edge

_FortranASumInteger8x1_contract_simplified.exit45.._crit_edge_crit_edge: ; preds = %_FortranASumInteger8x1_contract_simplified.exit45
  %.phi.trans.insert79 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 1, i64 %indvars.iv73
  %.pre80 = load i64, ptr %.phi.trans.insert79, align 8, !tbaa !3
  br label %._crit_edge

.lr.ph61:                                         ; preds = %_FortranASumInteger8x1_contract_simplified.exit45
  %89 = zext i32 %87 to i64
  %90 = icmp eq i64 %indvars.iv73, %51
  %91 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 1, i64 %indvars.iv73
  %.promoted = load i64, ptr %91, align 8, !tbaa !3
  br label %92

92:                                               ; preds = %.lr.ph61, %105
  %93 = phi i64 [ %84, %.lr.ph61 ], [ %107, %105 ]
  %indvars.iv70 = phi i64 [ 1, %.lr.ph61 ], [ %indvars.iv.next71, %105 ]
  %94 = phi i64 [ %.promoted, %.lr.ph61 ], [ %118, %105 ]
  %95 = phi i64 [ %89, %.lr.ph61 ], [ %119, %105 ]
  br i1 %90, label %96, label %._crit_edge77

._crit_edge77:                                    ; preds = %92
  %.phi.trans.insert = getelementptr [2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 0, i64 %indvars.iv70
  %.pre78 = load i64, ptr %.phi.trans.insert, align 8, !tbaa !3
  br label %105

96:                                               ; preds = %92
  %97 = sub nsw i64 %51, %indvars.iv70
  %98 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 0, i64 %97
  %99 = load i64, ptr %98, align 8, !tbaa !3
  %100 = getelementptr [2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 0, i64 %indvars.iv70
  %101 = load i64, ptr %100, align 8, !tbaa !3
  %102 = mul i64 %101, %99
  %103 = add i64 %102, %93
  %104 = srem i64 %103, 1000000007
  store i64 %104, ptr %85, align 8, !tbaa !3
  br label %105

105:                                              ; preds = %._crit_edge77, %96
  %106 = phi i64 [ %101, %96 ], [ %.pre78, %._crit_edge77 ]
  %107 = phi i64 [ %104, %96 ], [ %93, %._crit_edge77 ]
  %108 = getelementptr [2 x [5001 x i64]], ptr @_QFEg, i64 0, i64 1, i64 %indvars.iv70
  %109 = load i64, ptr %108, align 8, !tbaa !3
  %110 = add i64 %109, %106
  %111 = sub nsw i64 %indvars.iv73, %indvars.iv70
  %112 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 0, i64 %111
  %113 = load i64, ptr %112, align 8, !tbaa !3
  %114 = mul i64 %113, %109
  %115 = srem i64 %114, 1000000007
  %116 = icmp eq i64 %indvars.iv73, %indvars.iv70
  %117 = select i1 %116, i64 %110, i64 %115
  %118 = add i64 %117, %94
  store i64 %118, ptr %91, align 8, !tbaa !3
  %indvars.iv.next71 = add nuw nsw i64 %indvars.iv70, 1
  %119 = add nsw i64 %95, -1
  %120 = icmp sgt i64 %95, 1
  br i1 %120, label %92, label %._crit_edge

._crit_edge:                                      ; preds = %105, %_FortranASumInteger8x1_contract_simplified.exit45.._crit_edge_crit_edge
  %121 = phi i64 [ %.pre80, %_FortranASumInteger8x1_contract_simplified.exit45.._crit_edge_crit_edge ], [ %118, %105 ]
  %122 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 1, i64 %indvars.iv73
  %123 = srem i64 %121, 1000000007
  store i64 %123, ptr %122, align 8, !tbaa !3
  %exitcond76.not = icmp eq i64 %indvars.iv73, %50
  %indvar.next90 = add i64 %indvar89, 1
  br i1 %exitcond76.not, label %._crit_edge64, label %53

._crit_edge64:                                    ; preds = %._crit_edge
  store i64 %61, ptr @_QFEx, align 8, !tbaa !3
  br label %124

124:                                              ; preds = %._crit_edge64, %.preheader
  %125 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.cdbd91fd4561ae2584f498dcca835dd4, i32 27)
  %126 = load i64, ptr @_QFEx, align 8, !tbaa !3
  %127 = load i32, ptr %3, align 4, !tbaa !3
  %128 = sext i32 %127 to i64
  %129 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 0, i64 %128
  %130 = load i64, ptr %129, align 8, !tbaa !3
  %131 = getelementptr [2 x [5001 x i64]], ptr @_QFEf, i64 0, i64 1, i64 %128
  %132 = load i64, ptr %131, align 8, !tbaa !3
  %133 = add i64 %130, %132
  %134 = sub i64 %126, %133
  %135 = srem i64 %134, 1000000007
  %136 = icmp slt i64 %134, 0
  %137 = icmp ne i64 %135, 0
  %138 = and i1 %136, %137
  %139 = add nsw i64 %135, 1000000007
  %140 = select i1 %138, i64 %139, i64 %135
  %141 = call i1 @_FortranAioOutputInteger64(ptr %125, i64 %140)
  %142 = call i32 @_FortranAioEndIoStatement(ptr %125)
  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 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 i32 @llvm.smax.i32(i32, i32) #0

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

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

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

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { 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 = distinct !{!7, !8, !9}
!8 = !{!"llvm.loop.isvectorized", i32 1}
!9 = !{!"llvm.loop.unroll.runtime.disable"}
!10 = distinct !{!10, !9, !8}
!11 = distinct !{!11, !8, !9}
!12 = distinct !{!12, !9, !8}
