; LLVM IR from askforalfred/alfred :: gen/ff_planner (inst_easy)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct._NormOperator = type { ptr, i32, [15 x i32], [15 x i32], [15 x i32], i32, [15 x i32], ptr, i32, ptr, ptr, ptr, i32, ptr, i8 }
%struct._EasyTemplate = type { ptr, [15 x i32], ptr, ptr }

@geasy_templates = external global ptr, align 8
@gtype_size = external global [50 x i32], align 16
@gtype_consts = external global [50 x [2000 x i32]], align 16
@lo = external dso_local global ptr, align 8
@lnum_multiply_parameters = external dso_local global i32, align 4
@lmultiply_parameters = external dso_local global [15 x i32], align 16
@gnum_easy_templates = external global i32, align 4

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
define dso_local void @multiply_easy_non_constrained_op_parameters(i32 noundef %0) #1 {
  %2 = alloca i32, align 4
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  store i32 %0, ptr %2, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  %9 = load i32, ptr %2, align 4, !tbaa !5
  %10 = load i32, ptr @lnum_multiply_parameters, align 4, !tbaa !5
  %11 = icmp eq i32 %9, %10
  br i1 %11, label %12, label %50

12:                                               ; preds = %1
  %13 = load ptr, ptr @lo, align 8, !tbaa !9
  %14 = call ptr @new_EasyTemplate(ptr noundef %13)
  store ptr %14, ptr %3, align 8, !tbaa !9
  store i32 0, ptr %4, align 4, !tbaa !5
  br label %15

15:                                               ; preds = %33, %12
  %16 = load i32, ptr %4, align 4, !tbaa !5
  %17 = load ptr, ptr @lo, align 8, !tbaa !9
  %18 = getelementptr inbounds %struct._NormOperator, ptr %17, i32 0, i32 1
  %19 = load i32, ptr %18, align 8, !tbaa !11
  %20 = icmp slt i32 %16, %19
  br i1 %20, label %21, label %36

21:                                               ; preds = %15
  %22 = load ptr, ptr @lo, align 8, !tbaa !9
  %23 = getelementptr inbounds %struct._NormOperator, ptr %22, i32 0, i32 3
  %24 = load i32, ptr %4, align 4, !tbaa !5
  %25 = sext i32 %24 to i64
  %26 = getelementptr inbounds [15 x i32], ptr %23, i64 0, i64 %25
  %27 = load i32, ptr %26, align 4, !tbaa !5
  %28 = load ptr, ptr %3, align 8, !tbaa !9
  %29 = getelementptr inbounds %struct._EasyTemplate, ptr %28, i32 0, i32 1
  %30 = load i32, ptr %4, align 4, !tbaa !5
  %31 = sext i32 %30 to i64
  %32 = getelementptr inbounds [15 x i32], ptr %29, i64 0, i64 %31
  store i32 %27, ptr %32, align 4, !tbaa !5
  br label %33

33:                                               ; preds = %21
  %34 = load i32, ptr %4, align 4, !tbaa !5
  %35 = add nsw i32 %34, 1
  store i32 %35, ptr %4, align 4, !tbaa !5
  br label %15, !llvm.loop !13

36:                                               ; preds = %15
  %37 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %38 = load ptr, ptr %3, align 8, !tbaa !9
  %39 = getelementptr inbounds %struct._EasyTemplate, ptr %38, i32 0, i32 3
  store ptr %37, ptr %39, align 8, !tbaa !15
  %40 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %41 = icmp ne ptr %40, null
  br i1 %41, label %42, label %46

42:                                               ; preds = %36
  %43 = load ptr, ptr %3, align 8, !tbaa !9
  %44 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %45 = getelementptr inbounds %struct._EasyTemplate, ptr %44, i32 0, i32 2
  store ptr %43, ptr %45, align 8, !tbaa !17
  br label %46

46:                                               ; preds = %42, %36
  %47 = load ptr, ptr %3, align 8, !tbaa !9
  store ptr %47, ptr @geasy_templates, align 8, !tbaa !9
  %48 = load i32, ptr @gnum_easy_templates, align 4, !tbaa !5
  %49 = add nsw i32 %48, 1
  store i32 %49, ptr @gnum_easy_templates, align 4, !tbaa !5
  store i32 1, ptr %8, align 4
  br label %186

50:                                               ; preds = %1
  %51 = load i32, ptr %2, align 4, !tbaa !5
  %52 = load i32, ptr @lnum_multiply_parameters, align 4, !tbaa !5
  %53 = sub nsw i32 %52, 1
  %54 = icmp eq i32 %51, %53
  br i1 %54, label %55, label %138

55:                                               ; preds = %50
  %56 = load ptr, ptr @lo, align 8, !tbaa !9
  %57 = getelementptr inbounds %struct._NormOperator, ptr %56, i32 0, i32 2
  %58 = load i32, ptr %2, align 4, !tbaa !5
  %59 = sext i32 %58 to i64
  %60 = getelementptr inbounds [15 x i32], ptr @lmultiply_parameters, i64 0, i64 %59
  %61 = load i32, ptr %60, align 4, !tbaa !5
  %62 = sext i32 %61 to i64
  %63 = getelementptr inbounds [15 x i32], ptr %57, i64 0, i64 %62
  %64 = load i32, ptr %63, align 4, !tbaa !5
  store i32 %64, ptr %6, align 4, !tbaa !5
  %65 = load i32, ptr %6, align 4, !tbaa !5
  %66 = sext i32 %65 to i64
  %67 = getelementptr inbounds [50 x i32], ptr @gtype_size, i64 0, i64 %66
  %68 = load i32, ptr %67, align 4, !tbaa !5
  store i32 %68, ptr %7, align 4, !tbaa !5
  store i32 0, ptr %4, align 4, !tbaa !5
  br label %69

69:                                               ; preds = %126, %55
  %70 = load i32, ptr %4, align 4, !tbaa !5
  %71 = load i32, ptr %7, align 4, !tbaa !5
  %72 = icmp slt i32 %70, %71
  br i1 %72, label %73, label %129

73:                                               ; preds = %69
  %74 = load i32, ptr %6, align 4, !tbaa !5
  %75 = sext i32 %74 to i64
  %76 = getelementptr inbounds [50 x [2000 x i32]], ptr @gtype_consts, i64 0, i64 %75
  %77 = load i32, ptr %4, align 4, !tbaa !5
  %78 = sext i32 %77 to i64
  %79 = getelementptr inbounds [2000 x i32], ptr %76, i64 0, i64 %78
  %80 = load i32, ptr %79, align 4, !tbaa !5
  %81 = load ptr, ptr @lo, align 8, !tbaa !9
  %82 = getelementptr inbounds %struct._NormOperator, ptr %81, i32 0, i32 3
  %83 = load i32, ptr %2, align 4, !tbaa !5
  %84 = sext i32 %83 to i64
  %85 = getelementptr inbounds [15 x i32], ptr @lmultiply_parameters, i64 0, i64 %84
  %86 = load i32, ptr %85, align 4, !tbaa !5
  %87 = sext i32 %86 to i64
  %88 = getelementptr inbounds [15 x i32], ptr %82, i64 0, i64 %87
  store i32 %80, ptr %88, align 4, !tbaa !5
  %89 = load ptr, ptr @lo, align 8, !tbaa !9
  %90 = call ptr @new_EasyTemplate(ptr noundef %89)
  store ptr %90, ptr %3, align 8, !tbaa !9
  store i32 0, ptr %5, align 4, !tbaa !5
  br label %91

91:                                               ; preds = %109, %73
  %92 = load i32, ptr %5, align 4, !tbaa !5
  %93 = load ptr, ptr @lo, align 8, !tbaa !9
  %94 = getelementptr inbounds %struct._NormOperator, ptr %93, i32 0, i32 1
  %95 = load i32, ptr %94, align 8, !tbaa !11
  %96 = icmp slt i32 %92, %95
  br i1 %96, label %97, label %112

97:                                               ; preds = %91
  %98 = load ptr, ptr @lo, align 8, !tbaa !9
  %99 = getelementptr inbounds %struct._NormOperator, ptr %98, i32 0, i32 3
  %100 = load i32, ptr %5, align 4, !tbaa !5
  %101 = sext i32 %100 to i64
  %102 = getelementptr inbounds [15 x i32], ptr %99, i64 0, i64 %101
  %103 = load i32, ptr %102, align 4, !tbaa !5
  %104 = load ptr, ptr %3, align 8, !tbaa !9
  %105 = getelementptr inbounds %struct._EasyTemplate, ptr %104, i32 0, i32 1
  %106 = load i32, ptr %5, align 4, !tbaa !5
  %107 = sext i32 %106 to i64
  %108 = getelementptr inbounds [15 x i32], ptr %105, i64 0, i64 %107
  store i32 %103, ptr %108, align 4, !tbaa !5
  br label %109

109:                                              ; preds = %97
  %110 = load i32, ptr %5, align 4, !tbaa !5
  %111 = add nsw i32 %110, 1
  store i32 %111, ptr %5, align 4, !tbaa !5
  br label %91, !llvm.loop !18

112:                                              ; preds = %91
  %113 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %114 = load ptr, ptr %3, align 8, !tbaa !9
  %115 = getelementptr inbounds %struct._EasyTemplate, ptr %114, i32 0, i32 3
  store ptr %113, ptr %115, align 8, !tbaa !15
  %116 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %117 = icmp ne ptr %116, null
  br i1 %117, label %118, label %122

118:                                              ; preds = %112
  %119 = load ptr, ptr %3, align 8, !tbaa !9
  %120 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %121 = getelementptr inbounds %struct._EasyTemplate, ptr %120, i32 0, i32 2
  store ptr %119, ptr %121, align 8, !tbaa !17
  br label %122

122:                                              ; preds = %118, %112
  %123 = load ptr, ptr %3, align 8, !tbaa !9
  store ptr %123, ptr @geasy_templates, align 8, !tbaa !9
  %124 = load i32, ptr @gnum_easy_templates, align 4, !tbaa !5
  %125 = add nsw i32 %124, 1
  store i32 %125, ptr @gnum_easy_templates, align 4, !tbaa !5
  br label %126

126:                                              ; preds = %122
  %127 = load i32, ptr %4, align 4, !tbaa !5
  %128 = add nsw i32 %127, 1
  store i32 %128, ptr %4, align 4, !tbaa !5
  br label %69, !llvm.loop !19

129:                                              ; preds = %69
  %130 = load ptr, ptr @lo, align 8, !tbaa !9
  %131 = getelementptr inbounds %struct._NormOperator, ptr %130, i32 0, i32 3
  %132 = load i32, ptr %2, align 4, !tbaa !5
  %133 = sext i32 %132 to i64
  %134 = getelementptr inbounds [15 x i32], ptr @lmultiply_parameters, i64 0, i64 %133
  %135 = load i32, ptr %134, align 4, !tbaa !5
  %136 = sext i32 %135 to i64
  %137 = getelementptr inbounds [15 x i32], ptr %131, i64 0, i64 %136
  store i32 -1, ptr %137, align 4, !tbaa !5
  store i32 1, ptr %8, align 4
  br label %186

138:                                              ; preds = %50
  %139 = load ptr, ptr @lo, align 8, !tbaa !9
  %140 = getelementptr inbounds %struct._NormOperator, ptr %139, i32 0, i32 2
  %141 = load i32, ptr %2, align 4, !tbaa !5
  %142 = sext i32 %141 to i64
  %143 = getelementptr inbounds [15 x i32], ptr @lmultiply_parameters, i64 0, i64 %142
  %144 = load i32, ptr %143, align 4, !tbaa !5
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds [15 x i32], ptr %140, i64 0, i64 %145
  %147 = load i32, ptr %146, align 4, !tbaa !5
  store i32 %147, ptr %6, align 4, !tbaa !5
  %148 = load i32, ptr %6, align 4, !tbaa !5
  %149 = sext i32 %148 to i64
  %150 = getelementptr inbounds [50 x i32], ptr @gtype_size, i64 0, i64 %149
  %151 = load i32, ptr %150, align 4, !tbaa !5
  store i32 %151, ptr %7, align 4, !tbaa !5
  store i32 0, ptr %4, align 4, !tbaa !5
  br label %152

152:                                              ; preds = %174, %138
  %153 = load i32, ptr %4, align 4, !tbaa !5
  %154 = load i32, ptr %7, align 4, !tbaa !5
  %155 = icmp slt i32 %153, %154
  br i1 %155, label %156, label %177

156:                                              ; preds = %152
  %157 = load i32, ptr %6, align 4, !tbaa !5
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds [50 x [2000 x i32]], ptr @gtype_consts, i64 0, i64 %158
  %160 = load i32, ptr %4, align 4, !tbaa !5
  %161 = sext i32 %160 to i64
  %162 = getelementptr inbounds [2000 x i32], ptr %159, i64 0, i64 %161
  %163 = load i32, ptr %162, align 4, !tbaa !5
  %164 = load ptr, ptr @lo, align 8, !tbaa !9
  %165 = getelementptr inbounds %struct._NormOperator, ptr %164, i32 0, i32 3
  %166 = load i32, ptr %2, align 4, !tbaa !5
  %167 = sext i32 %166 to i64
  %168 = getelementptr inbounds [15 x i32], ptr @lmultiply_parameters, i64 0, i64 %167
  %169 = load i32, ptr %168, align 4, !tbaa !5
  %170 = sext i32 %169 to i64
  %171 = getelementptr inbounds [15 x i32], ptr %165, i64 0, i64 %170
  store i32 %163, ptr %171, align 4, !tbaa !5
  %172 = load i32, ptr %2, align 4, !tbaa !5
  %173 = add nsw i32 %172, 1
  call void @multiply_easy_non_constrained_op_parameters(i32 noundef %173)
  br label %174

174:                                              ; preds = %156
  %175 = load i32, ptr %4, align 4, !tbaa !5
  %176 = add nsw i32 %175, 1
  store i32 %176, ptr %4, align 4, !tbaa !5
  br label %152, !llvm.loop !20

177:                                              ; preds = %152
  %178 = load ptr, ptr @lo, align 8, !tbaa !9
  %179 = getelementptr inbounds %struct._NormOperator, ptr %178, i32 0, i32 3
  %180 = load i32, ptr %2, align 4, !tbaa !5
  %181 = sext i32 %180 to i64
  %182 = getelementptr inbounds [15 x i32], ptr @lmultiply_parameters, i64 0, i64 %181
  %183 = load i32, ptr %182, align 4, !tbaa !5
  %184 = sext i32 %183 to i64
  %185 = getelementptr inbounds [15 x i32], ptr %179, i64 0, i64 %184
  store i32 -1, ptr %185, align 4, !tbaa !5
  store i32 0, ptr %8, align 4
  br label %186

186:                                              ; preds = %177, %129, %46
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #3
  %187 = load i32, ptr %8, align 4
  switch i32 %187, label %189 [
    i32 0, label %188
    i32 1, label %188
  ]

188:                                              ; preds = %186, %186
  ret void

189:                                              ; preds = %186
  unreachable
}

declare ptr @new_EasyTemplate(ptr noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !6, i64 8}
!12 = !{!"_NormOperator", !10, i64 0, !6, i64 8, !7, i64 12, !7, i64 72, !7, i64 132, !6, i64 192, !7, i64 196, !10, i64 256, !6, i64 264, !10, i64 272, !10, i64 280, !10, i64 288, !6, i64 296, !10, i64 304, !7, i64 312}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!16, !10, i64 80}
!16 = !{!"_EasyTemplate", !10, i64 0, !7, i64 8, !10, i64 72, !10, i64 80}
!17 = !{!16, !10, i64 72}
!18 = distinct !{!18, !14}
!19 = distinct !{!19, !14}
!20 = distinct !{!20, !14}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@geasy_templates = external local_unnamed_addr global ptr, align 8
@gtype_size = external local_unnamed_addr global [50 x i32], align 16
@gtype_consts = external local_unnamed_addr global [50 x [2000 x i32]], align 16
@lo = external dso_local local_unnamed_addr global ptr, align 8
@lnum_multiply_parameters = external dso_local local_unnamed_addr global i32, align 4
@lmultiply_parameters = external dso_local local_unnamed_addr global [15 x i32], align 16
@gnum_easy_templates = external local_unnamed_addr global i32, align 4

; Function Attrs: nounwind uwtable
define dso_local void @multiply_easy_non_constrained_op_parameters(i32 noundef %0) local_unnamed_addr #0 {
  %2 = load i32, ptr @lnum_multiply_parameters, align 4, !tbaa !5
  %3 = icmp eq i32 %2, %0
  br i1 %3, label %4, label %27

4:                                                ; preds = %1
  %5 = load ptr, ptr @lo, align 8, !tbaa !9
  %6 = tail call ptr @new_EasyTemplate(ptr noundef %5) #2
  %7 = load ptr, ptr @lo, align 8, !tbaa !9
  %8 = getelementptr inbounds i8, ptr %7, i64 8
  %9 = load i32, ptr %8, align 8, !tbaa !11
  %10 = icmp sgt i32 %9, 0
  br i1 %10, label %.lr.ph53, label %._crit_edge54

.lr.ph53:                                         ; preds = %4
  %11 = getelementptr inbounds i8, ptr %7, i64 72
  %12 = getelementptr inbounds i8, ptr %6, i64 8
  br label %13

13:                                               ; preds = %.lr.ph53, %13
  %indvars.iv64 = phi i64 [ 0, %.lr.ph53 ], [ %indvars.iv.next65, %13 ]
  %14 = getelementptr inbounds [15 x i32], ptr %11, i64 0, i64 %indvars.iv64
  %15 = load i32, ptr %14, align 4, !tbaa !5
  %16 = getelementptr inbounds [15 x i32], ptr %12, i64 0, i64 %indvars.iv64
  store i32 %15, ptr %16, align 4, !tbaa !5
  %indvars.iv.next65 = add nuw nsw i64 %indvars.iv64, 1
  %17 = load i32, ptr %8, align 8, !tbaa !11
  %18 = sext i32 %17 to i64
  %19 = icmp slt i64 %indvars.iv.next65, %18
  br i1 %19, label %13, label %._crit_edge54, !llvm.loop !13

._crit_edge54:                                    ; preds = %13, %4
  %20 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %21 = getelementptr inbounds i8, ptr %6, i64 80
  store ptr %20, ptr %21, align 8, !tbaa !15
  %.not41 = icmp eq ptr %20, null
  br i1 %.not41, label %24, label %22

22:                                               ; preds = %._crit_edge54
  %23 = getelementptr inbounds i8, ptr %20, i64 72
  store ptr %6, ptr %23, align 8, !tbaa !17
  br label %24

24:                                               ; preds = %22, %._crit_edge54
  store ptr %6, ptr @geasy_templates, align 8, !tbaa !9
  %25 = load i32, ptr @gnum_easy_templates, align 4, !tbaa !5
  %26 = add nsw i32 %25, 1
  store i32 %26, ptr @gnum_easy_templates, align 4, !tbaa !5
  br label %87

27:                                               ; preds = %1
  %28 = add nsw i32 %2, -1
  %29 = icmp eq i32 %28, %0
  %30 = load ptr, ptr @lo, align 8, !tbaa !9
  %31 = getelementptr inbounds i8, ptr %30, i64 12
  %32 = sext i32 %0 to i64
  %33 = getelementptr inbounds [15 x i32], ptr @lmultiply_parameters, i64 0, i64 %32
  %34 = load i32, ptr %33, align 4, !tbaa !5
  %35 = sext i32 %34 to i64
  %36 = getelementptr inbounds [15 x i32], ptr %31, i64 0, i64 %35
  %37 = load i32, ptr %36, align 4, !tbaa !5
  %38 = sext i32 %37 to i64
  %39 = getelementptr inbounds [50 x i32], ptr @gtype_size, i64 0, i64 %38
  %40 = load i32, ptr %39, align 4, !tbaa !5
  %41 = icmp sgt i32 %40, 0
  br i1 %29, label %42, label %74

42:                                               ; preds = %27
  br i1 %41, label %.lr.ph49.preheader, label %._crit_edge50

.lr.ph49.preheader:                               ; preds = %42
  %wide.trip.count62 = zext nneg i32 %40 to i64
  br label %.lr.ph49

.lr.ph49:                                         ; preds = %.lr.ph49.preheader, %68
  %43 = phi ptr [ %30, %.lr.ph49.preheader ], [ %51, %68 ]
  %indvars.iv59 = phi i64 [ 0, %.lr.ph49.preheader ], [ %indvars.iv.next60, %68 ]
  %44 = getelementptr inbounds [50 x [2000 x i32]], ptr @gtype_consts, i64 0, i64 %38, i64 %indvars.iv59
  %45 = load i32, ptr %44, align 4, !tbaa !5
  %46 = getelementptr inbounds i8, ptr %43, i64 72
  %47 = load i32, ptr %33, align 4, !tbaa !5
  %48 = sext i32 %47 to i64
  %49 = getelementptr inbounds [15 x i32], ptr %46, i64 0, i64 %48
  store i32 %45, ptr %49, align 4, !tbaa !5
  %50 = tail call ptr @new_EasyTemplate(ptr noundef nonnull %43) #2
  %51 = load ptr, ptr @lo, align 8, !tbaa !9
  %52 = getelementptr inbounds i8, ptr %51, i64 8
  %53 = load i32, ptr %52, align 8, !tbaa !11
  %54 = icmp sgt i32 %53, 0
  br i1 %54, label %.lr.ph45, label %._crit_edge46

.lr.ph45:                                         ; preds = %.lr.ph49
  %55 = getelementptr inbounds i8, ptr %51, i64 72
  %56 = getelementptr inbounds i8, ptr %50, i64 8
  br label %57

57:                                               ; preds = %.lr.ph45, %57
  %indvars.iv56 = phi i64 [ 0, %.lr.ph45 ], [ %indvars.iv.next57, %57 ]
  %58 = getelementptr inbounds [15 x i32], ptr %55, i64 0, i64 %indvars.iv56
  %59 = load i32, ptr %58, align 4, !tbaa !5
  %60 = getelementptr inbounds [15 x i32], ptr %56, i64 0, i64 %indvars.iv56
  store i32 %59, ptr %60, align 4, !tbaa !5
  %indvars.iv.next57 = add nuw nsw i64 %indvars.iv56, 1
  %61 = load i32, ptr %52, align 8, !tbaa !11
  %62 = sext i32 %61 to i64
  %63 = icmp slt i64 %indvars.iv.next57, %62
  br i1 %63, label %57, label %._crit_edge46, !llvm.loop !18

._crit_edge46:                                    ; preds = %57, %.lr.ph49
  %64 = load ptr, ptr @geasy_templates, align 8, !tbaa !9
  %65 = getelementptr inbounds i8, ptr %50, i64 80
  store ptr %64, ptr %65, align 8, !tbaa !15
  %.not = icmp eq ptr %64, null
  br i1 %.not, label %68, label %66

66:                                               ; preds = %._crit_edge46
  %67 = getelementptr inbounds i8, ptr %64, i64 72
  store ptr %50, ptr %67, align 8, !tbaa !17
  br label %68

68:                                               ; preds = %66, %._crit_edge46
  store ptr %50, ptr @geasy_templates, align 8, !tbaa !9
  %69 = load i32, ptr @gnum_easy_templates, align 4, !tbaa !5
  %70 = add nsw i32 %69, 1
  store i32 %70, ptr @gnum_easy_templates, align 4, !tbaa !5
  %indvars.iv.next60 = add nuw nsw i64 %indvars.iv59, 1
  %exitcond63.not = icmp eq i64 %indvars.iv.next60, %wide.trip.count62
  br i1 %exitcond63.not, label %._crit_edge50.loopexit, label %.lr.ph49, !llvm.loop !19

._crit_edge50.loopexit:                           ; preds = %68
  %.pre68 = load i32, ptr %33, align 4, !tbaa !5
  %.pre69 = sext i32 %.pre68 to i64
  br label %._crit_edge50

._crit_edge50:                                    ; preds = %._crit_edge50.loopexit, %42
  %.pre-phi = phi i64 [ %.pre69, %._crit_edge50.loopexit ], [ %35, %42 ]
  %71 = phi ptr [ %51, %._crit_edge50.loopexit ], [ %30, %42 ]
  %72 = getelementptr inbounds i8, ptr %71, i64 72
  %73 = getelementptr inbounds [15 x i32], ptr %72, i64 0, i64 %.pre-phi
  store i32 -1, ptr %73, align 4, !tbaa !5
  br label %87

74:                                               ; preds = %27
  br i1 %41, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %74
  %75 = add nsw i32 %0, 1
  %wide.trip.count = zext nneg i32 %40 to i64
  br label %76

76:                                               ; preds = %.lr.ph, %76
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %76 ]
  %77 = getelementptr inbounds [50 x [2000 x i32]], ptr @gtype_consts, i64 0, i64 %38, i64 %indvars.iv
  %78 = load i32, ptr %77, align 4, !tbaa !5
  %79 = load ptr, ptr @lo, align 8, !tbaa !9
  %80 = getelementptr inbounds i8, ptr %79, i64 72
  %81 = load i32, ptr %33, align 4, !tbaa !5
  %82 = sext i32 %81 to i64
  %83 = getelementptr inbounds [15 x i32], ptr %80, i64 0, i64 %82
  store i32 %78, ptr %83, align 4, !tbaa !5
  tail call void @multiply_easy_non_constrained_op_parameters(i32 noundef %75)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge.loopexit, label %76, !llvm.loop !20

._crit_edge.loopexit:                             ; preds = %76
  %.pre = load ptr, ptr @lo, align 8, !tbaa !9
  %.pre67 = load i32, ptr %33, align 4, !tbaa !5
  %.pre70 = sext i32 %.pre67 to i64
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %74
  %.pre-phi71 = phi i64 [ %.pre70, %._crit_edge.loopexit ], [ %35, %74 ]
  %84 = phi ptr [ %.pre, %._crit_edge.loopexit ], [ %30, %74 ]
  %85 = getelementptr inbounds i8, ptr %84, i64 72
  %86 = getelementptr inbounds [15 x i32], ptr %85, i64 0, i64 %.pre-phi71
  store i32 -1, ptr %86, align 4, !tbaa !5
  br label %87

87:                                               ; preds = %._crit_edge, %._crit_edge50, %24
  ret void
}

declare ptr @new_EasyTemplate(ptr noundef) local_unnamed_addr #1

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !6, i64 8}
!12 = !{!"_NormOperator", !10, i64 0, !6, i64 8, !7, i64 12, !7, i64 72, !7, i64 132, !6, i64 192, !7, i64 196, !10, i64 256, !6, i64 264, !10, i64 272, !10, i64 280, !10, i64 288, !6, i64 296, !10, i64 304, !7, i64 312}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!16, !10, i64 80}
!16 = !{!"_EasyTemplate", !10, i64 0, !7, i64 8, !10, i64 72, !10, i64 80}
!17 = !{!16, !10, i64 72}
!18 = distinct !{!18, !14}
!19 = distinct !{!19, !14}
!20 = distinct !{!20, !14}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,SROAPass,SimplifyCFGPass,TailCallElimPass