; 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._Fact = type { i32, [5 x i32] }
%struct._NormEffect = type { i32, [15 x i32], [15 x i32], ptr, i32, ptr, i32, ptr, i32, ptr, ptr, ptr, i32, ptr, ptr, ptr, i32, ptr, ptr }

@gnum_easy_operators = external global i32, align 4
@geasy_operators = external global ptr, align 8
@garity = external global [50 x i32], align 16
@gtype_to_predicate = external global [50 x i32], align 16
@.str.11 = external hidden unnamed_addr constant [50 x i8], align 1

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

declare i32 @printf(ptr noundef, ...) #1

; Function Attrs: nounwind uwtable
define dso_local void @encode_easy_unaries_as_types() #2 {
  %1 = alloca ptr, align 8
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %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
  %9 = alloca i32, align 4
  %10 = alloca [10 x i32], align 16
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %1) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %2) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  store i32 0, ptr %2, align 4, !tbaa !5
  br label %15

15:                                               ; preds = %466, %0
  %16 = load i32, ptr %2, align 4, !tbaa !5
  %17 = load i32, ptr @gnum_easy_operators, align 4, !tbaa !5
  %18 = icmp slt i32 %16, %17
  br i1 %18, label %19, label %469

19:                                               ; preds = %15
  %20 = load ptr, ptr @geasy_operators, align 8, !tbaa !9
  %21 = load i32, ptr %2, align 4, !tbaa !5
  %22 = sext i32 %21 to i64
  %23 = getelementptr inbounds ptr, ptr %20, i64 %22
  %24 = load ptr, ptr %23, align 8, !tbaa !9
  store ptr %24, ptr %1, align 8, !tbaa !9
  store i32 0, ptr %3, align 4, !tbaa !5
  br label %25

25:                                               ; preds = %223, %19
  %26 = load i32, ptr %3, align 4, !tbaa !5
  %27 = load ptr, ptr %1, align 8, !tbaa !9
  %28 = getelementptr inbounds %struct._NormOperator, ptr %27, i32 0, i32 1
  %29 = load i32, ptr %28, align 8, !tbaa !11
  %30 = icmp slt i32 %26, %29
  br i1 %30, label %31, label %226

31:                                               ; preds = %25
  %32 = load ptr, ptr %1, align 8, !tbaa !9
  %33 = getelementptr inbounds %struct._NormOperator, ptr %32, i32 0, i32 2
  %34 = load i32, ptr %3, align 4, !tbaa !5
  %35 = sext i32 %34 to i64
  %36 = getelementptr inbounds [15 x i32], ptr %33, i64 0, i64 %35
  %37 = load i32, ptr %36, align 4, !tbaa !5
  %38 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 0
  store i32 %37, ptr %38, align 16, !tbaa !5
  store i32 1, ptr %11, align 4, !tbaa !5
  store i32 0, ptr %4, align 4, !tbaa !5
  br label %39

39:                                               ; preds = %197, %31
  %40 = load i32, ptr %4, align 4, !tbaa !5
  %41 = load ptr, ptr %1, align 8, !tbaa !9
  %42 = getelementptr inbounds %struct._NormOperator, ptr %41, i32 0, i32 8
  %43 = load i32, ptr %42, align 8, !tbaa !13
  %44 = icmp slt i32 %40, %43
  br i1 %44, label %45, label %198

45:                                               ; preds = %39
  %46 = load ptr, ptr %1, align 8, !tbaa !9
  %47 = getelementptr inbounds %struct._NormOperator, ptr %46, i32 0, i32 7
  %48 = load ptr, ptr %47, align 8, !tbaa !14
  %49 = load i32, ptr %4, align 4, !tbaa !5
  %50 = sext i32 %49 to i64
  %51 = getelementptr inbounds %struct._Fact, ptr %48, i64 %50
  %52 = getelementptr inbounds %struct._Fact, ptr %51, i32 0, i32 0
  %53 = load i32, ptr %52, align 4, !tbaa !15
  store i32 %53, ptr %8, align 4, !tbaa !5
  %54 = load i32, ptr %8, align 4, !tbaa !5
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds [50 x i32], ptr @gtype_to_predicate, i64 0, i64 %55
  %57 = load i32, ptr %56, align 4, !tbaa !5
  store i32 %57, ptr %7, align 4, !tbaa !5
  %58 = icmp ne i32 %57, -1
  br i1 %58, label %59, label %194

59:                                               ; preds = %45
  %60 = load ptr, ptr %1, align 8, !tbaa !9
  %61 = getelementptr inbounds %struct._NormOperator, ptr %60, i32 0, i32 7
  %62 = load ptr, ptr %61, align 8, !tbaa !14
  %63 = load i32, ptr %4, align 4, !tbaa !5
  %64 = sext i32 %63 to i64
  %65 = getelementptr inbounds %struct._Fact, ptr %62, i64 %64
  %66 = getelementptr inbounds %struct._Fact, ptr %65, i32 0, i32 1
  %67 = getelementptr inbounds [5 x i32], ptr %66, i64 0, i64 0
  %68 = load i32, ptr %67, align 4, !tbaa !5
  %69 = load i32, ptr %3, align 4, !tbaa !5
  %70 = mul nsw i32 %69, -1
  %71 = sub nsw i32 %70, 1
  %72 = icmp eq i32 %68, %71
  br i1 %72, label %73, label %194

73:                                               ; preds = %59
  %74 = load i32, ptr %11, align 4, !tbaa !5
  %75 = icmp eq i32 %74, 10
  br i1 %75, label %76, label %78

76:                                               ; preds = %73
  %77 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, i32 noundef 10)
  call void @exit(i32 noundef 1) #5
  unreachable

78:                                               ; preds = %73
  store i32 0, ptr %5, align 4, !tbaa !5
  br label %79

79:                                               ; preds = %92, %78
  %80 = load i32, ptr %5, align 4, !tbaa !5
  %81 = load i32, ptr %11, align 4, !tbaa !5
  %82 = icmp slt i32 %80, %81
  br i1 %82, label %83, label %95

83:                                               ; preds = %79
  %84 = load i32, ptr %7, align 4, !tbaa !5
  %85 = load i32, ptr %5, align 4, !tbaa !5
  %86 = sext i32 %85 to i64
  %87 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %86
  %88 = load i32, ptr %87, align 4, !tbaa !5
  %89 = icmp slt i32 %84, %88
  br i1 %89, label %90, label %91

90:                                               ; preds = %83
  br label %95

91:                                               ; preds = %83
  br label %92

92:                                               ; preds = %91
  %93 = load i32, ptr %5, align 4, !tbaa !5
  %94 = add nsw i32 %93, 1
  store i32 %94, ptr %5, align 4, !tbaa !5
  br label %79, !llvm.loop !17

95:                                               ; preds = %90, %79
  %96 = load i32, ptr %11, align 4, !tbaa !5
  store i32 %96, ptr %6, align 4, !tbaa !5
  br label %97

97:                                               ; preds = %110, %95
  %98 = load i32, ptr %6, align 4, !tbaa !5
  %99 = load i32, ptr %5, align 4, !tbaa !5
  %100 = icmp sgt i32 %98, %99
  br i1 %100, label %101, label %113

101:                                              ; preds = %97
  %102 = load i32, ptr %6, align 4, !tbaa !5
  %103 = sub nsw i32 %102, 1
  %104 = sext i32 %103 to i64
  %105 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %104
  %106 = load i32, ptr %105, align 4, !tbaa !5
  %107 = load i32, ptr %6, align 4, !tbaa !5
  %108 = sext i32 %107 to i64
  %109 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %108
  store i32 %106, ptr %109, align 4, !tbaa !5
  br label %110

110:                                              ; preds = %101
  %111 = load i32, ptr %6, align 4, !tbaa !5
  %112 = add nsw i32 %111, -1
  store i32 %112, ptr %6, align 4, !tbaa !5
  br label %97, !llvm.loop !19

113:                                              ; preds = %97
  %114 = load i32, ptr %7, align 4, !tbaa !5
  %115 = load i32, ptr %5, align 4, !tbaa !5
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %116
  store i32 %114, ptr %117, align 4, !tbaa !5
  %118 = load i32, ptr %11, align 4, !tbaa !5
  %119 = add nsw i32 %118, 1
  store i32 %119, ptr %11, align 4, !tbaa !5
  %120 = load i32, ptr %4, align 4, !tbaa !5
  store i32 %120, ptr %5, align 4, !tbaa !5
  br label %121

121:                                              ; preds = %186, %113
  %122 = load i32, ptr %5, align 4, !tbaa !5
  %123 = load ptr, ptr %1, align 8, !tbaa !9
  %124 = getelementptr inbounds %struct._NormOperator, ptr %123, i32 0, i32 8
  %125 = load i32, ptr %124, align 8, !tbaa !13
  %126 = sub nsw i32 %125, 1
  %127 = icmp slt i32 %122, %126
  br i1 %127, label %128, label %189

128:                                              ; preds = %121
  %129 = load ptr, ptr %1, align 8, !tbaa !9
  %130 = getelementptr inbounds %struct._NormOperator, ptr %129, i32 0, i32 7
  %131 = load ptr, ptr %130, align 8, !tbaa !14
  %132 = load i32, ptr %5, align 4, !tbaa !5
  %133 = add nsw i32 %132, 1
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds %struct._Fact, ptr %131, i64 %134
  %136 = getelementptr inbounds %struct._Fact, ptr %135, i32 0, i32 0
  %137 = load i32, ptr %136, align 4, !tbaa !15
  %138 = load ptr, ptr %1, align 8, !tbaa !9
  %139 = getelementptr inbounds %struct._NormOperator, ptr %138, i32 0, i32 7
  %140 = load ptr, ptr %139, align 8, !tbaa !14
  %141 = load i32, ptr %5, align 4, !tbaa !5
  %142 = sext i32 %141 to i64
  %143 = getelementptr inbounds %struct._Fact, ptr %140, i64 %142
  %144 = getelementptr inbounds %struct._Fact, ptr %143, i32 0, i32 0
  store i32 %137, ptr %144, align 4, !tbaa !15
  store i32 0, ptr %6, align 4, !tbaa !5
  br label %145

145:                                              ; preds = %182, %128
  %146 = load i32, ptr %6, align 4, !tbaa !5
  %147 = load ptr, ptr %1, align 8, !tbaa !9
  %148 = getelementptr inbounds %struct._NormOperator, ptr %147, i32 0, i32 7
  %149 = load ptr, ptr %148, align 8, !tbaa !14
  %150 = load i32, ptr %5, align 4, !tbaa !5
  %151 = sext i32 %150 to i64
  %152 = getelementptr inbounds %struct._Fact, ptr %149, i64 %151
  %153 = getelementptr inbounds %struct._Fact, ptr %152, i32 0, i32 0
  %154 = load i32, ptr %153, align 4, !tbaa !15
  %155 = sext i32 %154 to i64
  %156 = getelementptr inbounds [50 x i32], ptr @garity, i64 0, i64 %155
  %157 = load i32, ptr %156, align 4, !tbaa !5
  %158 = icmp slt i32 %146, %157
  br i1 %158, label %159, label %185

159:                                              ; preds = %145
  %160 = load ptr, ptr %1, align 8, !tbaa !9
  %161 = getelementptr inbounds %struct._NormOperator, ptr %160, i32 0, i32 7
  %162 = load ptr, ptr %161, align 8, !tbaa !14
  %163 = load i32, ptr %5, align 4, !tbaa !5
  %164 = add nsw i32 %163, 1
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds %struct._Fact, ptr %162, i64 %165
  %167 = getelementptr inbounds %struct._Fact, ptr %166, i32 0, i32 1
  %168 = load i32, ptr %6, align 4, !tbaa !5
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds [5 x i32], ptr %167, i64 0, i64 %169
  %171 = load i32, ptr %170, align 4, !tbaa !5
  %172 = load ptr, ptr %1, align 8, !tbaa !9
  %173 = getelementptr inbounds %struct._NormOperator, ptr %172, i32 0, i32 7
  %174 = load ptr, ptr %173, align 8, !tbaa !14
  %175 = load i32, ptr %5, align 4, !tbaa !5
  %176 = sext i32 %175 to i64
  %177 = getelementptr inbounds %struct._Fact, ptr %174, i64 %176
  %178 = getelementptr inbounds %struct._Fact, ptr %177, i32 0, i32 1
  %179 = load i32, ptr %6, align 4, !tbaa !5
  %180 = sext i32 %179 to i64
  %181 = getelementptr inbounds [5 x i32], ptr %178, i64 0, i64 %180
  store i32 %171, ptr %181, align 4, !tbaa !5
  br label %182

182:                                              ; preds = %159
  %183 = load i32, ptr %6, align 4, !tbaa !5
  %184 = add nsw i32 %183, 1
  store i32 %184, ptr %6, align 4, !tbaa !5
  br label %145, !llvm.loop !20

185:                                              ; preds = %145
  br label %186

186:                                              ; preds = %185
  %187 = load i32, ptr %5, align 4, !tbaa !5
  %188 = add nsw i32 %187, 1
  store i32 %188, ptr %5, align 4, !tbaa !5
  br label %121, !llvm.loop !21

189:                                              ; preds = %121
  %190 = load ptr, ptr %1, align 8, !tbaa !9
  %191 = getelementptr inbounds %struct._NormOperator, ptr %190, i32 0, i32 8
  %192 = load i32, ptr %191, align 8, !tbaa !13
  %193 = add nsw i32 %192, -1
  store i32 %193, ptr %191, align 8, !tbaa !13
  br label %197

194:                                              ; preds = %59, %45
  %195 = load i32, ptr %4, align 4, !tbaa !5
  %196 = add nsw i32 %195, 1
  store i32 %196, ptr %4, align 4, !tbaa !5
  br label %197

197:                                              ; preds = %194, %189
  br label %39, !llvm.loop !22

198:                                              ; preds = %39
  %199 = load i32, ptr %11, align 4, !tbaa !5
  %200 = icmp eq i32 %199, 1
  br i1 %200, label %201, label %202

201:                                              ; preds = %198
  br label %223

202:                                              ; preds = %198
  %203 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 0
  %204 = load i32, ptr %11, align 4, !tbaa !5
  %205 = call i32 @find_intersected_type(ptr noundef %203, i32 noundef %204)
  store i32 %205, ptr %13, align 4, !tbaa !5
  %206 = icmp ne i32 %205, -1
  br i1 %206, label %207, label %214

207:                                              ; preds = %202
  %208 = load i32, ptr %13, align 4, !tbaa !5
  %209 = load ptr, ptr %1, align 8, !tbaa !9
  %210 = getelementptr inbounds %struct._NormOperator, ptr %209, i32 0, i32 2
  %211 = load i32, ptr %3, align 4, !tbaa !5
  %212 = sext i32 %211 to i64
  %213 = getelementptr inbounds [15 x i32], ptr %210, i64 0, i64 %212
  store i32 %208, ptr %213, align 4, !tbaa !5
  br label %223

214:                                              ; preds = %202
  %215 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 0
  %216 = load i32, ptr %11, align 4, !tbaa !5
  %217 = call i32 @create_intersected_type(ptr noundef %215, i32 noundef %216)
  %218 = load ptr, ptr %1, align 8, !tbaa !9
  %219 = getelementptr inbounds %struct._NormOperator, ptr %218, i32 0, i32 2
  %220 = load i32, ptr %3, align 4, !tbaa !5
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds [15 x i32], ptr %219, i64 0, i64 %221
  store i32 %217, ptr %222, align 4, !tbaa !5
  br label %223

223:                                              ; preds = %214, %207, %201
  %224 = load i32, ptr %3, align 4, !tbaa !5
  %225 = add nsw i32 %224, 1
  store i32 %225, ptr %3, align 4, !tbaa !5
  br label %25, !llvm.loop !23

226:                                              ; preds = %25
  %227 = load ptr, ptr %1, align 8, !tbaa !9
  %228 = getelementptr inbounds %struct._NormOperator, ptr %227, i32 0, i32 13
  %229 = load ptr, ptr %228, align 8, !tbaa !24
  store ptr %229, ptr %12, align 8, !tbaa !9
  br label %230

230:                                              ; preds = %461, %226
  %231 = load ptr, ptr %12, align 8, !tbaa !9
  %232 = icmp ne ptr %231, null
  br i1 %232, label %233, label %465

233:                                              ; preds = %230
  store i32 0, ptr %3, align 4, !tbaa !5
  br label %234

234:                                              ; preds = %457, %233
  %235 = load i32, ptr %3, align 4, !tbaa !5
  %236 = load ptr, ptr %12, align 8, !tbaa !9
  %237 = getelementptr inbounds %struct._NormEffect, ptr %236, i32 0, i32 0
  %238 = load i32, ptr %237, align 8, !tbaa !25
  %239 = icmp slt i32 %235, %238
  br i1 %239, label %240, label %460

240:                                              ; preds = %234
  %241 = load ptr, ptr %12, align 8, !tbaa !9
  %242 = getelementptr inbounds %struct._NormEffect, ptr %241, i32 0, i32 1
  %243 = load i32, ptr %3, align 4, !tbaa !5
  %244 = sext i32 %243 to i64
  %245 = getelementptr inbounds [15 x i32], ptr %242, i64 0, i64 %244
  %246 = load i32, ptr %245, align 4, !tbaa !5
  %247 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 0
  store i32 %246, ptr %247, align 16, !tbaa !5
  %248 = load ptr, ptr %1, align 8, !tbaa !9
  %249 = getelementptr inbounds %struct._NormOperator, ptr %248, i32 0, i32 1
  %250 = load i32, ptr %249, align 8, !tbaa !11
  %251 = load i32, ptr %3, align 4, !tbaa !5
  %252 = add nsw i32 %250, %251
  store i32 %252, ptr %14, align 4, !tbaa !5
  store i32 1, ptr %11, align 4, !tbaa !5
  store i32 0, ptr %4, align 4, !tbaa !5
  br label %253

253:                                              ; preds = %431, %270, %240
  %254 = load i32, ptr %4, align 4, !tbaa !5
  %255 = load ptr, ptr %12, align 8, !tbaa !9
  %256 = getelementptr inbounds %struct._NormEffect, ptr %255, i32 0, i32 4
  %257 = load i32, ptr %256, align 8, !tbaa !27
  %258 = icmp slt i32 %254, %257
  br i1 %258, label %259, label %432

259:                                              ; preds = %253
  %260 = load ptr, ptr %12, align 8, !tbaa !9
  %261 = getelementptr inbounds %struct._NormEffect, ptr %260, i32 0, i32 3
  %262 = load ptr, ptr %261, align 8, !tbaa !28
  %263 = load i32, ptr %4, align 4, !tbaa !5
  %264 = sext i32 %263 to i64
  %265 = getelementptr inbounds %struct._Fact, ptr %262, i64 %264
  %266 = getelementptr inbounds %struct._Fact, ptr %265, i32 0, i32 0
  %267 = load i32, ptr %266, align 4, !tbaa !15
  store i32 %267, ptr %8, align 4, !tbaa !5
  %268 = load i32, ptr %8, align 4, !tbaa !5
  %269 = icmp slt i32 %268, 0
  br i1 %269, label %270, label %273

270:                                              ; preds = %259
  %271 = load i32, ptr %4, align 4, !tbaa !5
  %272 = add nsw i32 %271, 1
  store i32 %272, ptr %4, align 4, !tbaa !5
  br label %253, !llvm.loop !29

273:                                              ; preds = %259
  %274 = load i32, ptr %8, align 4, !tbaa !5
  %275 = sext i32 %274 to i64
  %276 = getelementptr inbounds [50 x i32], ptr @gtype_to_predicate, i64 0, i64 %275
  %277 = load i32, ptr %276, align 4, !tbaa !5
  store i32 %277, ptr %7, align 4, !tbaa !5
  %278 = icmp ne i32 %277, -1
  br i1 %278, label %279, label %428

279:                                              ; preds = %273
  %280 = load ptr, ptr %12, align 8, !tbaa !9
  %281 = getelementptr inbounds %struct._NormEffect, ptr %280, i32 0, i32 3
  %282 = load ptr, ptr %281, align 8, !tbaa !28
  %283 = load i32, ptr %4, align 4, !tbaa !5
  %284 = sext i32 %283 to i64
  %285 = getelementptr inbounds %struct._Fact, ptr %282, i64 %284
  %286 = getelementptr inbounds %struct._Fact, ptr %285, i32 0, i32 1
  %287 = getelementptr inbounds [5 x i32], ptr %286, i64 0, i64 0
  %288 = load i32, ptr %287, align 4, !tbaa !5
  %289 = load i32, ptr %14, align 4, !tbaa !5
  %290 = mul nsw i32 %289, -1
  %291 = sub nsw i32 %290, 1
  %292 = icmp eq i32 %288, %291
  br i1 %292, label %293, label %428

293:                                              ; preds = %279
  %294 = load i32, ptr %11, align 4, !tbaa !5
  %295 = icmp eq i32 %294, 10
  br i1 %295, label %296, label %298

296:                                              ; preds = %293
  %297 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, i32 noundef 10)
  call void @exit(i32 noundef 1) #5
  unreachable

298:                                              ; preds = %293
  store i32 0, ptr %5, align 4, !tbaa !5
  br label %299

299:                                              ; preds = %312, %298
  %300 = load i32, ptr %5, align 4, !tbaa !5
  %301 = load i32, ptr %11, align 4, !tbaa !5
  %302 = icmp slt i32 %300, %301
  br i1 %302, label %303, label %315

303:                                              ; preds = %299
  %304 = load i32, ptr %7, align 4, !tbaa !5
  %305 = load i32, ptr %5, align 4, !tbaa !5
  %306 = sext i32 %305 to i64
  %307 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %306
  %308 = load i32, ptr %307, align 4, !tbaa !5
  %309 = icmp slt i32 %304, %308
  br i1 %309, label %310, label %311

310:                                              ; preds = %303
  br label %315

311:                                              ; preds = %303
  br label %312

312:                                              ; preds = %311
  %313 = load i32, ptr %5, align 4, !tbaa !5
  %314 = add nsw i32 %313, 1
  store i32 %314, ptr %5, align 4, !tbaa !5
  br label %299, !llvm.loop !30

315:                                              ; preds = %310, %299
  %316 = load i32, ptr %11, align 4, !tbaa !5
  store i32 %316, ptr %6, align 4, !tbaa !5
  br label %317

317:                                              ; preds = %330, %315
  %318 = load i32, ptr %6, align 4, !tbaa !5
  %319 = load i32, ptr %5, align 4, !tbaa !5
  %320 = icmp sgt i32 %318, %319
  br i1 %320, label %321, label %333

321:                                              ; preds = %317
  %322 = load i32, ptr %6, align 4, !tbaa !5
  %323 = sub nsw i32 %322, 1
  %324 = sext i32 %323 to i64
  %325 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %324
  %326 = load i32, ptr %325, align 4, !tbaa !5
  %327 = load i32, ptr %6, align 4, !tbaa !5
  %328 = sext i32 %327 to i64
  %329 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %328
  store i32 %326, ptr %329, align 4, !tbaa !5
  br label %330

330:                                              ; preds = %321
  %331 = load i32, ptr %6, align 4, !tbaa !5
  %332 = add nsw i32 %331, -1
  store i32 %332, ptr %6, align 4, !tbaa !5
  br label %317, !llvm.loop !31

333:                                              ; preds = %317
  %334 = load i32, ptr %7, align 4, !tbaa !5
  %335 = load i32, ptr %5, align 4, !tbaa !5
  %336 = sext i32 %335 to i64
  %337 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 %336
  store i32 %334, ptr %337, align 4, !tbaa !5
  %338 = load i32, ptr %11, align 4, !tbaa !5
  %339 = add nsw i32 %338, 1
  store i32 %339, ptr %11, align 4, !tbaa !5
  %340 = load i32, ptr %4, align 4, !tbaa !5
  store i32 %340, ptr %5, align 4, !tbaa !5
  br label %341

341:                                              ; preds = %420, %333
  %342 = load i32, ptr %5, align 4, !tbaa !5
  %343 = load ptr, ptr %12, align 8, !tbaa !9
  %344 = getelementptr inbounds %struct._NormEffect, ptr %343, i32 0, i32 4
  %345 = load i32, ptr %344, align 8, !tbaa !27
  %346 = sub nsw i32 %345, 1
  %347 = icmp slt i32 %342, %346
  br i1 %347, label %348, label %423

348:                                              ; preds = %341
  %349 = load ptr, ptr %12, align 8, !tbaa !9
  %350 = getelementptr inbounds %struct._NormEffect, ptr %349, i32 0, i32 3
  %351 = load ptr, ptr %350, align 8, !tbaa !28
  %352 = load i32, ptr %5, align 4, !tbaa !5
  %353 = add nsw i32 %352, 1
  %354 = sext i32 %353 to i64
  %355 = getelementptr inbounds %struct._Fact, ptr %351, i64 %354
  %356 = getelementptr inbounds %struct._Fact, ptr %355, i32 0, i32 0
  %357 = load i32, ptr %356, align 4, !tbaa !15
  %358 = load ptr, ptr %12, align 8, !tbaa !9
  %359 = getelementptr inbounds %struct._NormEffect, ptr %358, i32 0, i32 3
  %360 = load ptr, ptr %359, align 8, !tbaa !28
  %361 = load i32, ptr %5, align 4, !tbaa !5
  %362 = sext i32 %361 to i64
  %363 = getelementptr inbounds %struct._Fact, ptr %360, i64 %362
  %364 = getelementptr inbounds %struct._Fact, ptr %363, i32 0, i32 0
  store i32 %357, ptr %364, align 4, !tbaa !15
  %365 = load ptr, ptr %12, align 8, !tbaa !9
  %366 = getelementptr inbounds %struct._NormEffect, ptr %365, i32 0, i32 3
  %367 = load ptr, ptr %366, align 8, !tbaa !28
  %368 = load i32, ptr %5, align 4, !tbaa !5
  %369 = sext i32 %368 to i64
  %370 = getelementptr inbounds %struct._Fact, ptr %367, i64 %369
  %371 = getelementptr inbounds %struct._Fact, ptr %370, i32 0, i32 0
  %372 = load i32, ptr %371, align 4, !tbaa !15
  %373 = icmp slt i32 %372, 0
  br i1 %373, label %374, label %375

374:                                              ; preds = %348
  br label %387

375:                                              ; preds = %348
  %376 = load ptr, ptr %12, align 8, !tbaa !9
  %377 = getelementptr inbounds %struct._NormEffect, ptr %376, i32 0, i32 3
  %378 = load ptr, ptr %377, align 8, !tbaa !28
  %379 = load i32, ptr %5, align 4, !tbaa !5
  %380 = sext i32 %379 to i64
  %381 = getelementptr inbounds %struct._Fact, ptr %378, i64 %380
  %382 = getelementptr inbounds %struct._Fact, ptr %381, i32 0, i32 0
  %383 = load i32, ptr %382, align 4, !tbaa !15
  %384 = sext i32 %383 to i64
  %385 = getelementptr inbounds [50 x i32], ptr @garity, i64 0, i64 %384
  %386 = load i32, ptr %385, align 4, !tbaa !5
  br label %387

387:                                              ; preds = %375, %374
  %388 = phi i32 [ 2, %374 ], [ %386, %375 ]
  store i32 %388, ptr %9, align 4, !tbaa !5
  store i32 0, ptr %6, align 4, !tbaa !5
  br label %389

389:                                              ; preds = %416, %387
  %390 = load i32, ptr %6, align 4, !tbaa !5
  %391 = load i32, ptr %9, align 4, !tbaa !5
  %392 = icmp slt i32 %390, %391
  br i1 %392, label %393, label %419

393:                                              ; preds = %389
  %394 = load ptr, ptr %12, align 8, !tbaa !9
  %395 = getelementptr inbounds %struct._NormEffect, ptr %394, i32 0, i32 3
  %396 = load ptr, ptr %395, align 8, !tbaa !28
  %397 = load i32, ptr %5, align 4, !tbaa !5
  %398 = add nsw i32 %397, 1
  %399 = sext i32 %398 to i64
  %400 = getelementptr inbounds %struct._Fact, ptr %396, i64 %399
  %401 = getelementptr inbounds %struct._Fact, ptr %400, i32 0, i32 1
  %402 = load i32, ptr %6, align 4, !tbaa !5
  %403 = sext i32 %402 to i64
  %404 = getelementptr inbounds [5 x i32], ptr %401, i64 0, i64 %403
  %405 = load i32, ptr %404, align 4, !tbaa !5
  %406 = load ptr, ptr %12, align 8, !tbaa !9
  %407 = getelementptr inbounds %struct._NormEffect, ptr %406, i32 0, i32 3
  %408 = load ptr, ptr %407, align 8, !tbaa !28
  %409 = load i32, ptr %5, align 4, !tbaa !5
  %410 = sext i32 %409 to i64
  %411 = getelementptr inbounds %struct._Fact, ptr %408, i64 %410
  %412 = getelementptr inbounds %struct._Fact, ptr %411, i32 0, i32 1
  %413 = load i32, ptr %6, align 4, !tbaa !5
  %414 = sext i32 %413 to i64
  %415 = getelementptr inbounds [5 x i32], ptr %412, i64 0, i64 %414
  store i32 %405, ptr %415, align 4, !tbaa !5
  br label %416

416:                                              ; preds = %393
  %417 = load i32, ptr %6, align 4, !tbaa !5
  %418 = add nsw i32 %417, 1
  store i32 %418, ptr %6, align 4, !tbaa !5
  br label %389, !llvm.loop !32

419:                                              ; preds = %389
  br label %420

420:                                              ; preds = %419
  %421 = load i32, ptr %5, align 4, !tbaa !5
  %422 = add nsw i32 %421, 1
  store i32 %422, ptr %5, align 4, !tbaa !5
  br label %341, !llvm.loop !33

423:                                              ; preds = %341
  %424 = load ptr, ptr %12, align 8, !tbaa !9
  %425 = getelementptr inbounds %struct._NormEffect, ptr %424, i32 0, i32 4
  %426 = load i32, ptr %425, align 8, !tbaa !27
  %427 = add nsw i32 %426, -1
  store i32 %427, ptr %425, align 8, !tbaa !27
  br label %431

428:                                              ; preds = %279, %273
  %429 = load i32, ptr %4, align 4, !tbaa !5
  %430 = add nsw i32 %429, 1
  store i32 %430, ptr %4, align 4, !tbaa !5
  br label %431

431:                                              ; preds = %428, %423
  br label %253, !llvm.loop !29

432:                                              ; preds = %253
  %433 = load i32, ptr %11, align 4, !tbaa !5
  %434 = icmp eq i32 %433, 1
  br i1 %434, label %435, label %436

435:                                              ; preds = %432
  br label %457

436:                                              ; preds = %432
  %437 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 0
  %438 = load i32, ptr %11, align 4, !tbaa !5
  %439 = call i32 @find_intersected_type(ptr noundef %437, i32 noundef %438)
  store i32 %439, ptr %13, align 4, !tbaa !5
  %440 = icmp ne i32 %439, -1
  br i1 %440, label %441, label %448

441:                                              ; preds = %436
  %442 = load i32, ptr %13, align 4, !tbaa !5
  %443 = load ptr, ptr %12, align 8, !tbaa !9
  %444 = getelementptr inbounds %struct._NormEffect, ptr %443, i32 0, i32 1
  %445 = load i32, ptr %3, align 4, !tbaa !5
  %446 = sext i32 %445 to i64
  %447 = getelementptr inbounds [15 x i32], ptr %444, i64 0, i64 %446
  store i32 %442, ptr %447, align 4, !tbaa !5
  br label %457

448:                                              ; preds = %436
  %449 = getelementptr inbounds [10 x i32], ptr %10, i64 0, i64 0
  %450 = load i32, ptr %11, align 4, !tbaa !5
  %451 = call i32 @create_intersected_type(ptr noundef %449, i32 noundef %450)
  %452 = load ptr, ptr %12, align 8, !tbaa !9
  %453 = getelementptr inbounds %struct._NormEffect, ptr %452, i32 0, i32 1
  %454 = load i32, ptr %3, align 4, !tbaa !5
  %455 = sext i32 %454 to i64
  %456 = getelementptr inbounds [15 x i32], ptr %453, i64 0, i64 %455
  store i32 %451, ptr %456, align 4, !tbaa !5
  br label %457

457:                                              ; preds = %448, %441, %435
  %458 = load i32, ptr %3, align 4, !tbaa !5
  %459 = add nsw i32 %458, 1
  store i32 %459, ptr %3, align 4, !tbaa !5
  br label %234, !llvm.loop !34

460:                                              ; preds = %234
  br label %461

461:                                              ; preds = %460
  %462 = load ptr, ptr %12, align 8, !tbaa !9
  %463 = getelementptr inbounds %struct._NormEffect, ptr %462, i32 0, i32 18
  %464 = load ptr, ptr %463, align 8, !tbaa !35
  store ptr %464, ptr %12, align 8, !tbaa !9
  br label %230, !llvm.loop !36

465:                                              ; preds = %230
  br label %466

466:                                              ; preds = %465
  %467 = load i32, ptr %2, align 4, !tbaa !5
  %468 = add nsw i32 %467, 1
  store i32 %468, ptr %2, align 4, !tbaa !5
  br label %15, !llvm.loop !37

469:                                              ; preds = %15
  call void @handle_empty_easy_parameters()
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %2) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %1) #4
  ret void
}

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #3

; 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
declare dso_local void @handle_empty_easy_parameters() #2

; Function Attrs: nounwind uwtable
declare dso_local i32 @find_intersected_type(ptr noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local i32 @create_intersected_type(ptr noundef, i32 noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 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 #3 = { noreturn nounwind "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 #4 = { nounwind }
attributes #5 = { noreturn 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 = !{!12, !6, i64 264}
!14 = !{!12, !10, i64 256}
!15 = !{!16, !6, i64 0}
!16 = !{!"_Fact", !6, i64 0, !7, i64 4}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18}
!20 = distinct !{!20, !18}
!21 = distinct !{!21, !18}
!22 = distinct !{!22, !18}
!23 = distinct !{!23, !18}
!24 = !{!12, !10, i64 304}
!25 = !{!26, !6, i64 0}
!26 = !{!"_NormEffect", !6, i64 0, !7, i64 4, !7, i64 64, !10, i64 128, !6, i64 136, !10, i64 144, !6, i64 152, !10, i64 160, !6, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !6, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !6, i64 232, !10, i64 240, !10, i64 248}
!27 = !{!26, !6, i64 136}
!28 = !{!26, !10, i64 128}
!29 = distinct !{!29, !18}
!30 = distinct !{!30, !18}
!31 = distinct !{!31, !18}
!32 = distinct !{!32, !18}
!33 = distinct !{!33, !18}
!34 = distinct !{!34, !18}
!35 = !{!26, !10, i64 248}
!36 = distinct !{!36, !18}
!37 = distinct !{!37, !18}


; 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"

%struct._Fact = type { i32, [5 x i32] }

@gnum_easy_operators = external local_unnamed_addr global i32, align 4
@geasy_operators = external local_unnamed_addr global ptr, align 8
@garity = external local_unnamed_addr global [50 x i32], align 16
@gtype_to_predicate = external local_unnamed_addr global [50 x i32], align 16
@.str.11 = external hidden unnamed_addr constant [50 x i8], align 1

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

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local void @encode_easy_unaries_as_types() local_unnamed_addr #2 {
  %1 = alloca [10 x i32], align 16
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %1) #4
  %2 = load i32, ptr @gnum_easy_operators, align 4, !tbaa !5
  %3 = icmp sgt i32 %2, 0
  br i1 %3, label %.lr.ph224, label %._crit_edge225

.lr.ph224:                                        ; preds = %0, %._crit_edge221
  %indvars.iv280 = phi i64 [ %indvars.iv.next281, %._crit_edge221 ], [ 0, %0 ]
  %4 = load ptr, ptr @geasy_operators, align 8, !tbaa !9
  %5 = getelementptr inbounds ptr, ptr %4, i64 %indvars.iv280
  %6 = load ptr, ptr %5, align 8, !tbaa !9
  %7 = getelementptr inbounds i8, ptr %6, i64 8
  %8 = load i32, ptr %7, align 8, !tbaa !11
  %9 = icmp sgt i32 %8, 0
  br i1 %9, label %.lr.ph187, label %._crit_edge188

.lr.ph187:                                        ; preds = %.lr.ph224
  %10 = getelementptr inbounds i8, ptr %6, i64 12
  %11 = getelementptr inbounds i8, ptr %6, i64 264
  %12 = getelementptr inbounds i8, ptr %6, i64 256
  br label %13

13:                                               ; preds = %.lr.ph187, %._crit_edge183.thread
  %indvars.iv248 = phi i64 [ 0, %.lr.ph187 ], [ %indvars.iv.next249, %._crit_edge183.thread ]
  %14 = getelementptr inbounds [15 x i32], ptr %10, i64 0, i64 %indvars.iv248
  %15 = load i32, ptr %14, align 4, !tbaa !5
  store i32 %15, ptr %1, align 16, !tbaa !5
  %16 = load i32, ptr %11, align 8, !tbaa !13
  %17 = icmp sgt i32 %16, 0
  br i1 %17, label %.lr.ph182, label %._crit_edge183.thread

.lr.ph182:                                        ; preds = %13
  %18 = load ptr, ptr %12, align 8, !tbaa !14
  %19 = trunc nuw nsw i64 %indvars.iv248 to i32
  br label %20

20:                                               ; preds = %.lr.ph182, %87
  %21 = phi i32 [ %16, %.lr.ph182 ], [ %88, %87 ]
  %.0125180 = phi i32 [ 1, %.lr.ph182 ], [ %.1, %87 ]
  %.0136179 = phi i32 [ 0, %.lr.ph182 ], [ %.1137, %87 ]
  %22 = sext i32 %.0136179 to i64
  %23 = getelementptr inbounds %struct._Fact, ptr %18, i64 %22
  %24 = load i32, ptr %23, align 4, !tbaa !15
  %25 = sext i32 %24 to i64
  %26 = getelementptr inbounds [50 x i32], ptr @gtype_to_predicate, i64 0, i64 %25
  %27 = load i32, ptr %26, align 4, !tbaa !5
  %.not149 = icmp eq i32 %27, -1
  br i1 %.not149, label %85, label %28

28:                                               ; preds = %20
  %29 = getelementptr inbounds i8, ptr %23, i64 4
  %30 = load i32, ptr %29, align 4, !tbaa !5
  %31 = xor i32 %30, %19
  %32 = icmp eq i32 %31, -1
  br i1 %32, label %33, label %85

33:                                               ; preds = %28
  %34 = icmp eq i32 %.0125180, 10
  br i1 %34, label %36, label %.preheader151

.preheader151:                                    ; preds = %33
  %35 = icmp sgt i32 %.0125180, 0
  br i1 %35, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %.preheader151
  %wide.trip.count = zext nneg i32 %.0125180 to i64
  br label %.lr.ph

36:                                               ; preds = %33
  %37 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, i32 noundef 10)
  call void @exit(i32 noundef 1) #5
  unreachable

.lr.ph:                                           ; preds = %.lr.ph.preheader, %41
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %41 ]
  %38 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %indvars.iv
  %39 = load i32, ptr %38, align 4, !tbaa !5
  %40 = icmp slt i32 %27, %39
  br i1 %40, label %._crit_edge.loopexit.split.loop.exit, label %41

41:                                               ; preds = %.lr.ph
  %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, label %.lr.ph, !llvm.loop !17

._crit_edge.loopexit.split.loop.exit:             ; preds = %.lr.ph
  %42 = trunc nuw nsw i64 %indvars.iv to i32
  br label %._crit_edge

._crit_edge:                                      ; preds = %41, %._crit_edge.loopexit.split.loop.exit, %.preheader151
  %.0132.lcssa = phi i32 [ 0, %.preheader151 ], [ %42, %._crit_edge.loopexit.split.loop.exit ], [ %.0125180, %41 ]
  %43 = icmp sgt i32 %.0125180, %.0132.lcssa
  br i1 %43, label %.lr.ph169.preheader, label %._crit_edge170

.lr.ph169.preheader:                              ; preds = %._crit_edge
  %44 = sext i32 %.0125180 to i64
  %45 = sext i32 %.0132.lcssa to i64
  %46 = sub nsw i64 %44, %45
  %min.iters.check332 = icmp ult i64 %46, 8
  br i1 %min.iters.check332, label %.lr.ph169.preheader352, label %vector.ph333

vector.ph333:                                     ; preds = %.lr.ph169.preheader
  %n.vec335 = and i64 %46, -8
  %ind.end336 = sub nsw i64 %44, %n.vec335
  br label %vector.body338

vector.body338:                                   ; preds = %vector.body338, %vector.ph333
  %index339 = phi i64 [ 0, %vector.ph333 ], [ %index.next347, %vector.body338 ]
  %offset.idx340 = sub i64 %44, %index339
  %47 = add nsw i64 %offset.idx340, -1
  %48 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %47
  %49 = getelementptr inbounds i8, ptr %48, i64 -12
  %50 = getelementptr inbounds i8, ptr %48, i64 -28
  %wide.load341 = load <4 x i32>, ptr %49, align 4, !tbaa !5
  %wide.load343 = load <4 x i32>, ptr %50, align 4, !tbaa !5
  %51 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %offset.idx340
  %52 = getelementptr inbounds i8, ptr %51, i64 -12
  %53 = getelementptr inbounds i8, ptr %51, i64 -28
  store <4 x i32> %wide.load341, ptr %52, align 4, !tbaa !5
  store <4 x i32> %wide.load343, ptr %53, align 4, !tbaa !5
  %index.next347 = add nuw i64 %index339, 8
  %54 = icmp eq i64 %index.next347, %n.vec335
  br i1 %54, label %middle.block330, label %vector.body338, !llvm.loop !19

middle.block330:                                  ; preds = %vector.body338
  %cmp.n348 = icmp eq i64 %46, %n.vec335
  br i1 %cmp.n348, label %._crit_edge170, label %.lr.ph169.preheader352

.lr.ph169.preheader352:                           ; preds = %middle.block330, %.lr.ph169.preheader
  %indvars.iv239.ph = phi i64 [ %44, %.lr.ph169.preheader ], [ %ind.end336, %middle.block330 ]
  br label %.lr.ph169

.lr.ph169:                                        ; preds = %.lr.ph169.preheader352, %.lr.ph169
  %indvars.iv239 = phi i64 [ %indvars.iv.next240, %.lr.ph169 ], [ %indvars.iv239.ph, %.lr.ph169.preheader352 ]
  %indvars.iv.next240 = add nsw i64 %indvars.iv239, -1
  %55 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %indvars.iv.next240
  %56 = load i32, ptr %55, align 4, !tbaa !5
  %57 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %indvars.iv239
  store i32 %56, ptr %57, align 4, !tbaa !5
  %58 = icmp sgt i64 %indvars.iv.next240, %45
  br i1 %58, label %.lr.ph169, label %._crit_edge170, !llvm.loop !22

._crit_edge170:                                   ; preds = %.lr.ph169, %middle.block330, %._crit_edge
  %59 = zext nneg i32 %.0132.lcssa to i64
  %60 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %59
  store i32 %27, ptr %60, align 4, !tbaa !5
  %61 = add nsw i32 %.0125180, 1
  %62 = load i32, ptr %11, align 8, !tbaa !13
  %63 = add nsw i32 %62, -1
  %64 = icmp slt i32 %.0136179, %63
  br i1 %64, label %.lr.ph176, label %._crit_edge177

.loopexit150.loopexit:                            ; preds = %78
  %.pre = load i32, ptr %11, align 8, !tbaa !13
  br label %.loopexit150

.loopexit150:                                     ; preds = %.loopexit150.loopexit, %.lr.ph176
  %65 = phi i32 [ %.pre, %.loopexit150.loopexit ], [ %69, %.lr.ph176 ]
  %66 = add nsw i32 %65, -1
  %67 = sext i32 %66 to i64
  %68 = icmp slt i64 %indvars.iv.next246, %67
  br i1 %68, label %.lr.ph176, label %._crit_edge177, !llvm.loop !23

.lr.ph176:                                        ; preds = %._crit_edge170, %.loopexit150
  %69 = phi i32 [ %65, %.loopexit150 ], [ %62, %._crit_edge170 ]
  %indvars.iv245 = phi i64 [ %indvars.iv.next246, %.loopexit150 ], [ %22, %._crit_edge170 ]
  %indvars.iv.next246 = add nsw i64 %indvars.iv245, 1
  %70 = getelementptr inbounds %struct._Fact, ptr %18, i64 %indvars.iv.next246
  %71 = load i32, ptr %70, align 4, !tbaa !15
  %72 = getelementptr inbounds %struct._Fact, ptr %18, i64 %indvars.iv245
  store i32 %71, ptr %72, align 4, !tbaa !15
  %73 = sext i32 %71 to i64
  %74 = getelementptr inbounds [50 x i32], ptr @garity, i64 0, i64 %73
  %75 = load i32, ptr %74, align 4, !tbaa !5
  %76 = icmp sgt i32 %75, 0
  br i1 %76, label %.lr.ph173, label %.loopexit150

.lr.ph173:                                        ; preds = %.lr.ph176
  %77 = getelementptr inbounds i8, ptr %72, i64 4
  br label %78

78:                                               ; preds = %.lr.ph173, %78
  %indvars.iv242 = phi i64 [ 0, %.lr.ph173 ], [ %indvars.iv.next243, %78 ]
  %79 = getelementptr inbounds %struct._Fact, ptr %18, i64 %indvars.iv.next246, i32 1, i64 %indvars.iv242
  %80 = load i32, ptr %79, align 4, !tbaa !5
  %81 = getelementptr inbounds [5 x i32], ptr %77, i64 0, i64 %indvars.iv242
  store i32 %80, ptr %81, align 4, !tbaa !5
  %indvars.iv.next243 = add nuw nsw i64 %indvars.iv242, 1
  %82 = load i32, ptr %74, align 4, !tbaa !5
  %83 = sext i32 %82 to i64
  %84 = icmp slt i64 %indvars.iv.next243, %83
  br i1 %84, label %78, label %.loopexit150.loopexit, !llvm.loop !24

._crit_edge177:                                   ; preds = %.loopexit150, %._crit_edge170
  %.lcssa = phi i32 [ %63, %._crit_edge170 ], [ %66, %.loopexit150 ]
  store i32 %.lcssa, ptr %11, align 8, !tbaa !13
  br label %87

85:                                               ; preds = %28, %20
  %86 = add nsw i32 %.0136179, 1
  br label %87

87:                                               ; preds = %85, %._crit_edge177
  %88 = phi i32 [ %.lcssa, %._crit_edge177 ], [ %21, %85 ]
  %.1137 = phi i32 [ %.0136179, %._crit_edge177 ], [ %86, %85 ]
  %.1 = phi i32 [ %61, %._crit_edge177 ], [ %.0125180, %85 ]
  %89 = icmp slt i32 %.1137, %88
  br i1 %89, label %20, label %._crit_edge183, !llvm.loop !25

._crit_edge183:                                   ; preds = %87
  %90 = icmp eq i32 %.1, 1
  br i1 %90, label %._crit_edge183.thread, label %91

91:                                               ; preds = %._crit_edge183
  %92 = call i32 @find_intersected_type(ptr noundef nonnull %1, i32 noundef %.1)
  %.not148 = icmp eq i32 %92, -1
  br i1 %.not148, label %93, label %._crit_edge183.thread.sink.split

93:                                               ; preds = %91
  %94 = call i32 @create_intersected_type(ptr noundef nonnull %1, i32 noundef %.1)
  br label %._crit_edge183.thread.sink.split

._crit_edge183.thread.sink.split:                 ; preds = %91, %93
  %.sink = phi i32 [ %94, %93 ], [ %92, %91 ]
  store i32 %.sink, ptr %14, align 4, !tbaa !5
  br label %._crit_edge183.thread

._crit_edge183.thread:                            ; preds = %._crit_edge183.thread.sink.split, %13, %._crit_edge183
  %indvars.iv.next249 = add nuw nsw i64 %indvars.iv248, 1
  %95 = load i32, ptr %7, align 8, !tbaa !11
  %96 = sext i32 %95 to i64
  %97 = icmp slt i64 %indvars.iv.next249, %96
  br i1 %97, label %13, label %._crit_edge188, !llvm.loop !26

._crit_edge188:                                   ; preds = %._crit_edge183.thread, %.lr.ph224
  %98 = getelementptr inbounds i8, ptr %6, i64 304
  %.0124218 = load ptr, ptr %98, align 8, !tbaa !9
  %.not219 = icmp eq ptr %.0124218, null
  br i1 %.not219, label %._crit_edge221, label %.preheader152

.preheader152:                                    ; preds = %._crit_edge188, %._crit_edge217
  %.0124220 = phi ptr [ %.0124, %._crit_edge217 ], [ %.0124218, %._crit_edge188 ]
  %99 = load i32, ptr %.0124220, align 8, !tbaa !27
  %100 = icmp sgt i32 %99, 0
  br i1 %100, label %.lr.ph216, label %._crit_edge217

.lr.ph216:                                        ; preds = %.preheader152
  %101 = getelementptr inbounds i8, ptr %.0124220, i64 4
  %102 = getelementptr inbounds i8, ptr %.0124220, i64 136
  %103 = getelementptr inbounds i8, ptr %.0124220, i64 128
  br label %104

104:                                              ; preds = %.lr.ph216, %.outer._crit_edge.thread
  %indvars.iv277 = phi i64 [ 0, %.lr.ph216 ], [ %indvars.iv.next278, %.outer._crit_edge.thread ]
  %105 = getelementptr inbounds [15 x i32], ptr %101, i64 0, i64 %indvars.iv277
  %106 = load i32, ptr %105, align 4, !tbaa !5
  store i32 %106, ptr %1, align 16, !tbaa !5
  %107 = load i32, ptr %7, align 8, !tbaa !11
  %108 = trunc nuw nsw i64 %indvars.iv277 to i32
  %109 = add nsw i32 %107, %108
  %110 = load i32, ptr %102, align 8, !tbaa !29
  %111 = icmp sgt i32 %110, 0
  br i1 %111, label %.lr.ph190.lr.ph, label %.outer._crit_edge.thread

.lr.ph190.lr.ph:                                  ; preds = %104
  %112 = load ptr, ptr %103, align 8, !tbaa !30
  br label %.lr.ph190

.lr.ph190:                                        ; preds = %.lr.ph190.lr.ph, %.outer
  %113 = phi i32 [ %110, %.lr.ph190.lr.ph ], [ %189, %.outer ]
  %.2.ph213 = phi i32 [ 1, %.lr.ph190.lr.ph ], [ %.3, %.outer ]
  %.2138.ph212 = phi i32 [ 0, %.lr.ph190.lr.ph ], [ %.3139, %.outer ]
  %114 = sext i32 %.2138.ph212 to i64
  %115 = sext i32 %113 to i64
  br label %116

116:                                              ; preds = %.lr.ph190, %120
  %indvars.iv251 = phi i64 [ %114, %.lr.ph190 ], [ %indvars.iv.next252, %120 ]
  %117 = getelementptr inbounds %struct._Fact, ptr %112, i64 %indvars.iv251
  %118 = load i32, ptr %117, align 4, !tbaa !15
  %119 = icmp slt i32 %118, 0
  br i1 %119, label %120, label %122

120:                                              ; preds = %116
  %indvars.iv.next252 = add nsw i64 %indvars.iv251, 1
  %121 = icmp slt i64 %indvars.iv.next252, %115
  br i1 %121, label %116, label %.outer._crit_edge, !llvm.loop !31

122:                                              ; preds = %116
  %123 = trunc nsw i64 %indvars.iv251 to i32
  %124 = zext nneg i32 %118 to i64
  %125 = getelementptr inbounds [50 x i32], ptr @gtype_to_predicate, i64 0, i64 %124
  %126 = load i32, ptr %125, align 4, !tbaa !5
  %.not147 = icmp eq i32 %126, -1
  br i1 %.not147, label %187, label %127

127:                                              ; preds = %122
  %128 = getelementptr inbounds i8, ptr %117, i64 4
  %129 = load i32, ptr %128, align 4, !tbaa !5
  %130 = xor i32 %129, %109
  %131 = icmp eq i32 %130, -1
  br i1 %131, label %132, label %187

132:                                              ; preds = %127
  %133 = icmp eq i32 %.2.ph213, 10
  br i1 %133, label %135, label %.preheader

.preheader:                                       ; preds = %132
  %134 = icmp sgt i32 %.2.ph213, 0
  br i1 %134, label %.lr.ph195.preheader, label %._crit_edge196

.lr.ph195.preheader:                              ; preds = %.preheader
  %wide.trip.count257 = zext nneg i32 %.2.ph213 to i64
  br label %.lr.ph195

135:                                              ; preds = %132
  %136 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, i32 noundef 10)
  call void @exit(i32 noundef 1) #5
  unreachable

.lr.ph195:                                        ; preds = %.lr.ph195.preheader, %140
  %indvars.iv254 = phi i64 [ 0, %.lr.ph195.preheader ], [ %indvars.iv.next255, %140 ]
  %137 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %indvars.iv254
  %138 = load i32, ptr %137, align 4, !tbaa !5
  %139 = icmp slt i32 %126, %138
  br i1 %139, label %._crit_edge196.loopexit.split.loop.exit, label %140

140:                                              ; preds = %.lr.ph195
  %indvars.iv.next255 = add nuw nsw i64 %indvars.iv254, 1
  %exitcond258.not = icmp eq i64 %indvars.iv.next255, %wide.trip.count257
  br i1 %exitcond258.not, label %._crit_edge196, label %.lr.ph195, !llvm.loop !32

._crit_edge196.loopexit.split.loop.exit:          ; preds = %.lr.ph195
  %141 = trunc nuw nsw i64 %indvars.iv254 to i32
  br label %._crit_edge196

._crit_edge196:                                   ; preds = %140, %._crit_edge196.loopexit.split.loop.exit, %.preheader
  %.2134.lcssa = phi i32 [ 0, %.preheader ], [ %141, %._crit_edge196.loopexit.split.loop.exit ], [ %.2.ph213, %140 ]
  %142 = icmp sgt i32 %.2.ph213, %.2134.lcssa
  br i1 %142, label %.lr.ph202.preheader, label %._crit_edge203

.lr.ph202.preheader:                              ; preds = %._crit_edge196
  %143 = sext i32 %.2.ph213 to i64
  %144 = sext i32 %.2134.lcssa to i64
  %145 = sub nsw i64 %143, %144
  %min.iters.check316 = icmp ult i64 %145, 8
  br i1 %min.iters.check316, label %.lr.ph202.preheader350, label %vector.ph317

vector.ph317:                                     ; preds = %.lr.ph202.preheader
  %n.vec319 = and i64 %145, -8
  %ind.end = sub nsw i64 %143, %n.vec319
  br label %vector.body321

vector.body321:                                   ; preds = %vector.body321, %vector.ph317
  %index322 = phi i64 [ 0, %vector.ph317 ], [ %index.next328, %vector.body321 ]
  %offset.idx = sub i64 %143, %index322
  %146 = add nsw i64 %offset.idx, -1
  %147 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %146
  %148 = getelementptr inbounds i8, ptr %147, i64 -12
  %149 = getelementptr inbounds i8, ptr %147, i64 -28
  %wide.load323 = load <4 x i32>, ptr %148, align 4, !tbaa !5
  %wide.load324 = load <4 x i32>, ptr %149, align 4, !tbaa !5
  %150 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %offset.idx
  %151 = getelementptr inbounds i8, ptr %150, i64 -12
  %152 = getelementptr inbounds i8, ptr %150, i64 -28
  store <4 x i32> %wide.load323, ptr %151, align 4, !tbaa !5
  store <4 x i32> %wide.load324, ptr %152, align 4, !tbaa !5
  %index.next328 = add nuw i64 %index322, 8
  %153 = icmp eq i64 %index.next328, %n.vec319
  br i1 %153, label %middle.block314, label %vector.body321, !llvm.loop !33

middle.block314:                                  ; preds = %vector.body321
  %cmp.n329 = icmp eq i64 %145, %n.vec319
  br i1 %cmp.n329, label %._crit_edge203, label %.lr.ph202.preheader350

.lr.ph202.preheader350:                           ; preds = %middle.block314, %.lr.ph202.preheader
  %indvars.iv261.ph = phi i64 [ %143, %.lr.ph202.preheader ], [ %ind.end, %middle.block314 ]
  br label %.lr.ph202

.lr.ph202:                                        ; preds = %.lr.ph202.preheader350, %.lr.ph202
  %indvars.iv261 = phi i64 [ %indvars.iv.next262, %.lr.ph202 ], [ %indvars.iv261.ph, %.lr.ph202.preheader350 ]
  %indvars.iv.next262 = add nsw i64 %indvars.iv261, -1
  %154 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %indvars.iv.next262
  %155 = load i32, ptr %154, align 4, !tbaa !5
  %156 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %indvars.iv261
  store i32 %155, ptr %156, align 4, !tbaa !5
  %157 = icmp sgt i64 %indvars.iv.next262, %144
  br i1 %157, label %.lr.ph202, label %._crit_edge203, !llvm.loop !34

._crit_edge203:                                   ; preds = %.lr.ph202, %middle.block314, %._crit_edge196
  %158 = zext nneg i32 %.2134.lcssa to i64
  %159 = getelementptr inbounds [10 x i32], ptr %1, i64 0, i64 %158
  store i32 %126, ptr %159, align 4, !tbaa !5
  %160 = add nsw i32 %.2.ph213, 1
  %161 = load i32, ptr %102, align 8, !tbaa !29
  %162 = add nsw i32 %161, -1
  %163 = icmp sgt i32 %162, %123
  br i1 %163, label %.lr.ph209, label %._crit_edge210

.loopexit.loopexit:                               ; preds = %.lr.ph206, %middle.block
  %.pre283 = load i32, ptr %102, align 8, !tbaa !29
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit, %173
  %164 = phi i32 [ %.pre283, %.loopexit.loopexit ], [ %168, %173 ]
  %165 = add nsw i32 %164, -1
  %166 = sext i32 %165 to i64
  %167 = icmp slt i64 %indvars.iv.next275, %166
  br i1 %167, label %.lr.ph209, label %._crit_edge210, !llvm.loop !35

.lr.ph209:                                        ; preds = %._crit_edge203, %.loopexit
  %168 = phi i32 [ %164, %.loopexit ], [ %161, %._crit_edge203 ]
  %indvars.iv274 = phi i64 [ %indvars.iv.next275, %.loopexit ], [ %indvars.iv251, %._crit_edge203 ]
  %indvars.iv.next275 = add nsw i64 %indvars.iv274, 1
  %169 = getelementptr inbounds %struct._Fact, ptr %112, i64 %indvars.iv.next275
  %170 = load i32, ptr %169, align 4, !tbaa !15
  %171 = getelementptr inbounds %struct._Fact, ptr %112, i64 %indvars.iv274
  store i32 %170, ptr %171, align 4, !tbaa !15
  %172 = icmp slt i32 %170, 0
  br i1 %172, label %.lr.ph206.preheader, label %173

173:                                              ; preds = %.lr.ph209
  %174 = zext nneg i32 %170 to i64
  %175 = getelementptr inbounds [50 x i32], ptr @garity, i64 0, i64 %174
  %176 = load i32, ptr %175, align 4, !tbaa !5
  %177 = icmp sgt i32 %176, 0
  br i1 %177, label %.lr.ph206.preheader, label %.loopexit

.lr.ph206.preheader:                              ; preds = %.lr.ph209, %173
  %178 = phi i32 [ %176, %173 ], [ 2, %.lr.ph209 ]
  %wide.trip.count271 = zext nneg i32 %178 to i64
  %min.iters.check = icmp ult i32 %178, 8
  br i1 %min.iters.check, label %.lr.ph206.preheader349, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph206.preheader
  %n.vec = and i64 %wide.trip.count271, 2147483640
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %179 = getelementptr inbounds %struct._Fact, ptr %112, i64 %indvars.iv.next275, i32 1, i64 %index
  %180 = getelementptr inbounds i8, ptr %179, i64 16
  %wide.load = load <4 x i32>, ptr %179, align 4, !tbaa !5
  %wide.load313 = load <4 x i32>, ptr %180, align 4, !tbaa !5
  %181 = getelementptr inbounds %struct._Fact, ptr %112, i64 %indvars.iv274, i32 1, i64 %index
  %182 = getelementptr inbounds i8, ptr %181, i64 16
  store <4 x i32> %wide.load, ptr %181, align 4, !tbaa !5
  store <4 x i32> %wide.load313, ptr %182, align 4, !tbaa !5
  %index.next = add nuw i64 %index, 8
  %183 = icmp eq i64 %index.next, %n.vec
  br i1 %183, label %middle.block, label %vector.body, !llvm.loop !36

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count271
  br i1 %cmp.n, label %.loopexit.loopexit, label %.lr.ph206.preheader349

.lr.ph206.preheader349:                           ; preds = %middle.block, %.lr.ph206.preheader
  %indvars.iv268.ph = phi i64 [ 0, %.lr.ph206.preheader ], [ %n.vec, %middle.block ]
  br label %.lr.ph206

.lr.ph206:                                        ; preds = %.lr.ph206.preheader349, %.lr.ph206
  %indvars.iv268 = phi i64 [ %indvars.iv.next269, %.lr.ph206 ], [ %indvars.iv268.ph, %.lr.ph206.preheader349 ]
  %184 = getelementptr inbounds %struct._Fact, ptr %112, i64 %indvars.iv.next275, i32 1, i64 %indvars.iv268
  %185 = load i32, ptr %184, align 4, !tbaa !5
  %186 = getelementptr inbounds %struct._Fact, ptr %112, i64 %indvars.iv274, i32 1, i64 %indvars.iv268
  store i32 %185, ptr %186, align 4, !tbaa !5
  %indvars.iv.next269 = add nuw nsw i64 %indvars.iv268, 1
  %exitcond272.not = icmp eq i64 %indvars.iv.next269, %wide.trip.count271
  br i1 %exitcond272.not, label %.loopexit.loopexit, label %.lr.ph206, !llvm.loop !37

._crit_edge210:                                   ; preds = %.loopexit, %._crit_edge203
  %.lcssa162 = phi i32 [ %162, %._crit_edge203 ], [ %165, %.loopexit ]
  store i32 %.lcssa162, ptr %102, align 8, !tbaa !29
  br label %.outer

187:                                              ; preds = %127, %122
  %188 = add nsw i32 %123, 1
  br label %.outer

.outer:                                           ; preds = %187, %._crit_edge210
  %189 = phi i32 [ %.lcssa162, %._crit_edge210 ], [ %113, %187 ]
  %.3139 = phi i32 [ %123, %._crit_edge210 ], [ %188, %187 ]
  %.3 = phi i32 [ %160, %._crit_edge210 ], [ %.2.ph213, %187 ]
  %190 = icmp slt i32 %.3139, %189
  br i1 %190, label %.lr.ph190, label %.outer._crit_edge, !llvm.loop !31

.outer._crit_edge:                                ; preds = %.outer, %120
  %.2.ph.lcssa163 = phi i32 [ %.2.ph213, %120 ], [ %.3, %.outer ]
  %191 = icmp eq i32 %.2.ph.lcssa163, 1
  br i1 %191, label %.outer._crit_edge.thread, label %192

192:                                              ; preds = %.outer._crit_edge
  %193 = call i32 @find_intersected_type(ptr noundef nonnull %1, i32 noundef %.2.ph.lcssa163)
  %.not146 = icmp eq i32 %193, -1
  br i1 %.not146, label %194, label %.outer._crit_edge.thread.sink.split

194:                                              ; preds = %192
  %195 = call i32 @create_intersected_type(ptr noundef nonnull %1, i32 noundef %.2.ph.lcssa163)
  br label %.outer._crit_edge.thread.sink.split

.outer._crit_edge.thread.sink.split:              ; preds = %192, %194
  %.sink300 = phi i32 [ %195, %194 ], [ %193, %192 ]
  store i32 %.sink300, ptr %105, align 4, !tbaa !5
  br label %.outer._crit_edge.thread

.outer._crit_edge.thread:                         ; preds = %.outer._crit_edge.thread.sink.split, %104, %.outer._crit_edge
  %indvars.iv.next278 = add nuw nsw i64 %indvars.iv277, 1
  %196 = load i32, ptr %.0124220, align 8, !tbaa !27
  %197 = sext i32 %196 to i64
  %198 = icmp slt i64 %indvars.iv.next278, %197
  br i1 %198, label %104, label %._crit_edge217, !llvm.loop !38

._crit_edge217:                                   ; preds = %.outer._crit_edge.thread, %.preheader152
  %199 = getelementptr inbounds i8, ptr %.0124220, i64 248
  %.0124 = load ptr, ptr %199, align 8, !tbaa !9
  %.not = icmp eq ptr %.0124, null
  br i1 %.not, label %._crit_edge221, label %.preheader152, !llvm.loop !39

._crit_edge221:                                   ; preds = %._crit_edge217, %._crit_edge188
  %indvars.iv.next281 = add nuw nsw i64 %indvars.iv280, 1
  %200 = load i32, ptr @gnum_easy_operators, align 4, !tbaa !5
  %201 = sext i32 %200 to i64
  %202 = icmp slt i64 %indvars.iv.next281, %201
  br i1 %202, label %.lr.ph224, label %._crit_edge225, !llvm.loop !40

._crit_edge225:                                   ; preds = %._crit_edge221, %0
  call void @handle_empty_easy_parameters()
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %1) #4
  ret void
}

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) local_unnamed_addr #3

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

; Function Attrs: nounwind uwtable
declare dso_local void @handle_empty_easy_parameters() local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local i32 @find_intersected_type(ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local i32 @create_intersected_type(ptr noundef, i32 noundef) local_unnamed_addr #2

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nofree nounwind "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 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 #3 = { noreturn nounwind "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 #4 = { nounwind }
attributes #5 = { noreturn 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 = !{!12, !6, i64 264}
!14 = !{!12, !10, i64 256}
!15 = !{!16, !6, i64 0}
!16 = !{!"_Fact", !6, i64 0, !7, i64 4}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18, !20, !21}
!20 = !{!"llvm.loop.isvectorized", i32 1}
!21 = !{!"llvm.loop.unroll.runtime.disable"}
!22 = distinct !{!22, !18, !21, !20}
!23 = distinct !{!23, !18}
!24 = distinct !{!24, !18}
!25 = distinct !{!25, !18}
!26 = distinct !{!26, !18}
!27 = !{!28, !6, i64 0}
!28 = !{!"_NormEffect", !6, i64 0, !7, i64 4, !7, i64 64, !10, i64 128, !6, i64 136, !10, i64 144, !6, i64 152, !10, i64 160, !6, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !6, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !6, i64 232, !10, i64 240, !10, i64 248}
!29 = !{!28, !6, i64 136}
!30 = !{!28, !10, i64 128}
!31 = distinct !{!31, !18}
!32 = distinct !{!32, !18}
!33 = distinct !{!33, !18, !20, !21}
!34 = distinct !{!34, !18, !21, !20}
!35 = distinct !{!35, !18}
!36 = distinct !{!36, !18, !20, !21}
!37 = distinct !{!37, !18, !21, !20}
!38 = distinct !{!38, !18}
!39 = distinct !{!39, !18}
!40 = distinct !{!40, !18}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,ReassociatePass,SROAPass,SimplifyCFGPass