; LLVM IR from zisisvakras/crossw :: src (crossu)

; 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.Intersection = type { ptr, i32, i32, i32, i32 }
%struct.Word = type { i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr }
%struct.Map = type { ptr, i32, i32 }

@stderr = external global ptr, align 8
@.str.19 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [41 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 void @perror(ptr noundef) #1

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

; Function Attrs: nounwind willreturn memory(none)
declare ptr @__errno_location() #3

; Function Attrs: nounwind
declare i32 @fprintf(ptr noundef, ptr noundef, ...) #4

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #5

; Function Attrs: nounwind allocsize(0,1)
declare noalias ptr @calloc(i64 noundef, i64 noundef) #6

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #7

declare void @join_map(ptr noundef, ptr noundef) #1

declare i32 @sum_bit(ptr noundef) #1

declare void @write_word(ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: nounwind
declare void @free(ptr noundef) #4

; Function Attrs: nounwind uwtable
define dso_local void @solve_crossword(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, ptr noundef %4) #8 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca ptr, align 8
  %29 = alloca i32, align 4
  %30 = alloca ptr, align 8
  %31 = alloca i32, align 4
  %32 = alloca %struct.Intersection, align 8
  %33 = alloca ptr, align 8
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca %struct.Intersection, align 8
  %38 = alloca ptr, align 8
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !9
  store ptr %4, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #10
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %42

42:                                               ; preds = %90, %5
  %43 = load i32, ptr %11, align 4, !tbaa !9
  %44 = load i32, ptr %9, align 4, !tbaa !9
  %45 = icmp slt i32 %43, %44
  br i1 %45, label %47, label %46

46:                                               ; preds = %42
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #10
  br label %93

47:                                               ; preds = %42
  %48 = load i32, ptr %9, align 4, !tbaa !9
  %49 = sext i32 %48 to i64
  %50 = call noalias ptr @calloc(i64 noundef %49, i64 noundef 4) #11
  %51 = load ptr, ptr %8, align 8, !tbaa !5
  %52 = load i32, ptr %11, align 4, !tbaa !9
  %53 = sext i32 %52 to i64
  %54 = getelementptr inbounds ptr, ptr %51, i64 %53
  %55 = load ptr, ptr %54, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.Word, ptr %55, i32 0, i32 9
  store ptr %50, ptr %56, align 8, !tbaa !11
  %57 = load ptr, ptr %8, align 8, !tbaa !5
  %58 = load i32, ptr %11, align 4, !tbaa !9
  %59 = sext i32 %58 to i64
  %60 = getelementptr inbounds ptr, ptr %57, i64 %59
  %61 = load ptr, ptr %60, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.Word, ptr %61, i32 0, i32 9
  %63 = load ptr, ptr %62, align 8, !tbaa !11
  %64 = icmp eq ptr %63, null
  br i1 %64, label %65, label %68

65:                                               ; preds = %47
  call void @perror(ptr noundef @.str.19)
  %66 = call ptr @__errno_location() #12
  %67 = load i32, ptr %66, align 4, !tbaa !9
  call void @exit(i32 noundef %67) #13
  unreachable

68:                                               ; preds = %47
  %69 = load i32, ptr %9, align 4, !tbaa !9
  %70 = sext i32 %69 to i64
  %71 = call noalias ptr @calloc(i64 noundef %70, i64 noundef 4) #11
  %72 = load ptr, ptr %8, align 8, !tbaa !5
  %73 = load i32, ptr %11, align 4, !tbaa !9
  %74 = sext i32 %73 to i64
  %75 = getelementptr inbounds ptr, ptr %72, i64 %74
  %76 = load ptr, ptr %75, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.Word, ptr %76, i32 0, i32 10
  store ptr %71, ptr %77, align 8, !tbaa !13
  %78 = load ptr, ptr %8, align 8, !tbaa !5
  %79 = load i32, ptr %11, align 4, !tbaa !9
  %80 = sext i32 %79 to i64
  %81 = getelementptr inbounds ptr, ptr %78, i64 %80
  %82 = load ptr, ptr %81, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.Word, ptr %82, i32 0, i32 10
  %84 = load ptr, ptr %83, align 8, !tbaa !13
  %85 = icmp eq ptr %84, null
  br i1 %85, label %86, label %89

86:                                               ; preds = %68
  call void @perror(ptr noundef @.str.20)
  %87 = call ptr @__errno_location() #12
  %88 = load i32, ptr %87, align 4, !tbaa !9
  call void @exit(i32 noundef %88) #13
  unreachable

89:                                               ; preds = %68
  br label %90

90:                                               ; preds = %89
  %91 = load i32, ptr %11, align 4, !tbaa !9
  %92 = add nsw i32 %91, 1
  store i32 %92, ptr %11, align 4, !tbaa !9
  br label %42, !llvm.loop !14

93:                                               ; preds = %46
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #10
  store i32 0, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #10
  %94 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %94, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #10
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %95

95:                                               ; preds = %132, %93
  %96 = load i32, ptr %14, align 4, !tbaa !9
  %97 = load i32, ptr %9, align 4, !tbaa !9
  %98 = icmp slt i32 %96, %97
  br i1 %98, label %100, label %99

99:                                               ; preds = %95
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #10
  br label %135

100:                                              ; preds = %95
  %101 = load ptr, ptr %8, align 8, !tbaa !5
  %102 = load i32, ptr %14, align 4, !tbaa !9
  %103 = sext i32 %102 to i64
  %104 = getelementptr inbounds ptr, ptr %101, i64 %103
  %105 = load ptr, ptr %104, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.Word, ptr %105, i32 0, i32 6
  %107 = load i32, ptr %106, align 8, !tbaa !16
  %108 = load i32, ptr %13, align 4, !tbaa !9
  %109 = add nsw i32 %108, %107
  store i32 %109, ptr %13, align 4, !tbaa !9
  %110 = load ptr, ptr %8, align 8, !tbaa !5
  %111 = load i32, ptr %14, align 4, !tbaa !9
  %112 = sext i32 %111 to i64
  %113 = getelementptr inbounds ptr, ptr %110, i64 %112
  %114 = load ptr, ptr %113, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.Word, ptr %114, i32 0, i32 8
  %116 = load ptr, ptr %115, align 8, !tbaa !17
  %117 = getelementptr inbounds %struct.Map, ptr %116, i32 0, i32 1
  %118 = load i32, ptr %117, align 8, !tbaa !18
  %119 = load i32, ptr %12, align 4, !tbaa !9
  %120 = icmp sgt i32 %118, %119
  br i1 %120, label %121, label %131

121:                                              ; preds = %100
  %122 = load ptr, ptr %8, align 8, !tbaa !5
  %123 = load i32, ptr %14, align 4, !tbaa !9
  %124 = sext i32 %123 to i64
  %125 = getelementptr inbounds ptr, ptr %122, i64 %124
  %126 = load ptr, ptr %125, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.Word, ptr %126, i32 0, i32 8
  %128 = load ptr, ptr %127, align 8, !tbaa !17
  %129 = getelementptr inbounds %struct.Map, ptr %128, i32 0, i32 1
  %130 = load i32, ptr %129, align 8, !tbaa !18
  store i32 %130, ptr %12, align 4, !tbaa !9
  br label %131

131:                                              ; preds = %121, %100
  br label %132

132:                                              ; preds = %131
  %133 = load i32, ptr %14, align 4, !tbaa !9
  %134 = add nsw i32 %133, 1
  store i32 %134, ptr %14, align 4, !tbaa !9
  br label %95, !llvm.loop !20

135:                                              ; preds = %99
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #10
  %136 = load i32, ptr %13, align 4, !tbaa !9
  %137 = sext i32 %136 to i64
  %138 = call noalias ptr @calloc(i64 noundef %137, i64 noundef 16) #11
  store ptr %138, ptr %15, align 8, !tbaa !5
  %139 = load ptr, ptr %15, align 8, !tbaa !5
  %140 = icmp eq ptr %139, null
  br i1 %140, label %141, label %144

141:                                              ; preds = %135
  call void @perror(ptr noundef @.str.21)
  %142 = call ptr @__errno_location() #12
  %143 = load i32, ptr %142, align 4, !tbaa !9
  call void @exit(i32 noundef %143) #13
  unreachable

144:                                              ; preds = %135
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #10
  store i32 0, ptr %16, align 4, !tbaa !9
  br label %145

145:                                              ; preds = %171, %144
  %146 = load i32, ptr %16, align 4, !tbaa !9
  %147 = load i32, ptr %13, align 4, !tbaa !9
  %148 = icmp slt i32 %146, %147
  br i1 %148, label %150, label %149

149:                                              ; preds = %145
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #10
  br label %174

150:                                              ; preds = %145
  %151 = load i32, ptr %12, align 4, !tbaa !9
  %152 = sext i32 %151 to i64
  %153 = mul i64 %152, 8
  %154 = call noalias ptr @malloc(i64 noundef %153) #14
  %155 = load ptr, ptr %15, align 8, !tbaa !5
  %156 = load i32, ptr %16, align 4, !tbaa !9
  %157 = sext i32 %156 to i64
  %158 = getelementptr inbounds %struct.Map, ptr %155, i64 %157
  %159 = getelementptr inbounds %struct.Map, ptr %158, i32 0, i32 0
  store ptr %154, ptr %159, align 8, !tbaa !21
  %160 = load ptr, ptr %15, align 8, !tbaa !5
  %161 = load i32, ptr %16, align 4, !tbaa !9
  %162 = sext i32 %161 to i64
  %163 = getelementptr inbounds %struct.Map, ptr %160, i64 %162
  %164 = getelementptr inbounds %struct.Map, ptr %163, i32 0, i32 0
  %165 = load ptr, ptr %164, align 8, !tbaa !21
  %166 = icmp eq ptr %165, null
  br i1 %166, label %167, label %170

167:                                              ; preds = %150
  call void @perror(ptr noundef @.str.22)
  %168 = call ptr @__errno_location() #12
  %169 = load i32, ptr %168, align 4, !tbaa !9
  call void @exit(i32 noundef %169) #13
  unreachable

170:                                              ; preds = %150
  br label %171

171:                                              ; preds = %170
  %172 = load i32, ptr %16, align 4, !tbaa !9
  %173 = add nsw i32 %172, 1
  store i32 %173, ptr %16, align 4, !tbaa !9
  br label %145, !llvm.loop !22

174:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #10
  store i32 0, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #10
  store i32 0, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #10
  store i32 0, ptr %19, align 4, !tbaa !9
  %175 = load ptr, ptr %8, align 8, !tbaa !5
  %176 = load i32, ptr %9, align 4, !tbaa !9
  %177 = load i32, ptr %18, align 4, !tbaa !9
  call void @prop_word(ptr noundef %175, i32 noundef %176, i32 noundef %177)
  br label %178

178:                                              ; preds = %779, %777, %174
  %179 = load i32, ptr %18, align 4, !tbaa !9
  %180 = load i32, ptr %9, align 4, !tbaa !9
  %181 = icmp slt i32 %179, %180
  br i1 %181, label %182, label %780

182:                                              ; preds = %178
  store i32 0, ptr %19, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #10
  store ptr null, ptr %20, align 8, !tbaa !5
  %183 = load ptr, ptr %7, align 8, !tbaa !5
  %184 = load ptr, ptr %8, align 8, !tbaa !5
  %185 = load i32, ptr %18, align 4, !tbaa !9
  %186 = sext i32 %185 to i64
  %187 = getelementptr inbounds ptr, ptr %184, i64 %186
  %188 = load ptr, ptr %187, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.Word, ptr %188, i32 0, i32 5
  %190 = load i32, ptr %189, align 4, !tbaa !23
  %191 = sub nsw i32 %190, 1
  %192 = sext i32 %191 to i64
  %193 = getelementptr inbounds ptr, ptr %183, i64 %192
  %194 = load ptr, ptr %193, align 8, !tbaa !5
  %195 = load ptr, ptr %8, align 8, !tbaa !5
  %196 = load i32, ptr %18, align 4, !tbaa !9
  %197 = sext i32 %196 to i64
  %198 = getelementptr inbounds ptr, ptr %195, i64 %197
  %199 = load ptr, ptr %198, align 8, !tbaa !5
  %200 = call ptr @find_word(ptr noundef %194, ptr noundef %199)
  store ptr %200, ptr %20, align 8, !tbaa !5
  %201 = icmp eq ptr %200, null
  br i1 %201, label %202, label %433

202:                                              ; preds = %182
  %203 = load i32, ptr %18, align 4, !tbaa !9
  %204 = icmp eq i32 %203, 0
  br i1 %204, label %205, label %208

205:                                              ; preds = %202
  %206 = load ptr, ptr @stderr, align 8, !tbaa !5
  %207 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %206, ptr noundef @.str.23) #10
  call void @exit(i32 noundef 1) #13
  unreachable

208:                                              ; preds = %202
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #10
  %209 = load ptr, ptr %8, align 8, !tbaa !5
  %210 = load i32, ptr %18, align 4, !tbaa !9
  %211 = sext i32 %210 to i64
  %212 = getelementptr inbounds ptr, ptr %209, i64 %211
  %213 = load ptr, ptr %212, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.Word, ptr %213, i32 0, i32 9
  %215 = load ptr, ptr %214, align 8, !tbaa !11
  store ptr %215, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #10
  %216 = load ptr, ptr %8, align 8, !tbaa !5
  %217 = load i32, ptr %18, align 4, !tbaa !9
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds ptr, ptr %216, i64 %218
  %220 = load ptr, ptr %219, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.Word, ptr %220, i32 0, i32 10
  %222 = load ptr, ptr %221, align 8, !tbaa !13
  store ptr %222, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #10
  %223 = load i32, ptr %18, align 4, !tbaa !9
  %224 = sub nsw i32 %223, 1
  store i32 %224, ptr %23, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #10
  %225 = load i32, ptr %18, align 4, !tbaa !9
  %226 = sub nsw i32 %225, 1
  store i32 %226, ptr %24, align 4, !tbaa !9
  br label %227

227:                                              ; preds = %248, %208
  %228 = load i32, ptr %24, align 4, !tbaa !9
  %229 = icmp sge i32 %228, 0
  br i1 %229, label %231, label %230

230:                                              ; preds = %227
  store i32 13, ptr %25, align 4
  br label %251

231:                                              ; preds = %227
  %232 = load ptr, ptr %21, align 8, !tbaa !5
  %233 = load i32, ptr %24, align 4, !tbaa !9
  %234 = sext i32 %233 to i64
  %235 = getelementptr inbounds i32, ptr %232, i64 %234
  %236 = load i32, ptr %235, align 4, !tbaa !9
  %237 = icmp ne i32 %236, 0
  br i1 %237, label %245, label %238

238:                                              ; preds = %231
  %239 = load ptr, ptr %22, align 8, !tbaa !5
  %240 = load i32, ptr %24, align 4, !tbaa !9
  %241 = sext i32 %240 to i64
  %242 = getelementptr inbounds i32, ptr %239, i64 %241
  %243 = load i32, ptr %242, align 4, !tbaa !9
  %244 = icmp ne i32 %243, 0
  br i1 %244, label %245, label %247

245:                                              ; preds = %238, %231
  %246 = load i32, ptr %24, align 4, !tbaa !9
  store i32 %246, ptr %23, align 4, !tbaa !9
  store i32 13, ptr %25, align 4
  br label %251

247:                                              ; preds = %238
  br label %248

248:                                              ; preds = %247
  %249 = load i32, ptr %24, align 4, !tbaa !9
  %250 = add nsw i32 %249, -1
  store i32 %250, ptr %24, align 4, !tbaa !9
  br label %227, !llvm.loop !24

251:                                              ; preds = %245, %230
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #10
  br label %252

252:                                              ; preds = %251
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #10
  %253 = load i32, ptr %23, align 4, !tbaa !9
  store i32 %253, ptr %26, align 4, !tbaa !9
  br label %254

254:                                              ; preds = %282, %252
  %255 = load i32, ptr %26, align 4, !tbaa !9
  %256 = icmp sge i32 %255, 0
  br i1 %256, label %258, label %257

257:                                              ; preds = %254
  store i32 16, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #10
  br label %285

258:                                              ; preds = %254
  %259 = load ptr, ptr %21, align 8, !tbaa !5
  %260 = load i32, ptr %26, align 4, !tbaa !9
  %261 = sext i32 %260 to i64
  %262 = getelementptr inbounds i32, ptr %259, i64 %261
  %263 = load i32, ptr %262, align 4, !tbaa !9
  %264 = load ptr, ptr %22, align 8, !tbaa !5
  %265 = load i32, ptr %26, align 4, !tbaa !9
  %266 = sext i32 %265 to i64
  %267 = getelementptr inbounds i32, ptr %264, i64 %266
  %268 = load i32, ptr %267, align 4, !tbaa !9
  %269 = or i32 %263, %268
  %270 = load ptr, ptr %8, align 8, !tbaa !5
  %271 = load i32, ptr %23, align 4, !tbaa !9
  %272 = sext i32 %271 to i64
  %273 = getelementptr inbounds ptr, ptr %270, i64 %272
  %274 = load ptr, ptr %273, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.Word, ptr %274, i32 0, i32 9
  %276 = load ptr, ptr %275, align 8, !tbaa !11
  %277 = load i32, ptr %26, align 4, !tbaa !9
  %278 = sext i32 %277 to i64
  %279 = getelementptr inbounds i32, ptr %276, i64 %278
  %280 = load i32, ptr %279, align 4, !tbaa !9
  %281 = or i32 %280, %269
  store i32 %281, ptr %279, align 4, !tbaa !9
  br label %282

282:                                              ; preds = %258
  %283 = load i32, ptr %26, align 4, !tbaa !9
  %284 = add nsw i32 %283, -1
  store i32 %284, ptr %26, align 4, !tbaa !9
  br label %254, !llvm.loop !25

285:                                              ; preds = %257
  %286 = load ptr, ptr %8, align 8, !tbaa !5
  %287 = load i32, ptr %23, align 4, !tbaa !9
  %288 = sext i32 %287 to i64
  %289 = getelementptr inbounds ptr, ptr %286, i64 %288
  %290 = load ptr, ptr %289, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.Word, ptr %290, i32 0, i32 9
  %292 = load ptr, ptr %291, align 8, !tbaa !11
  %293 = load i32, ptr %23, align 4, !tbaa !9
  %294 = sext i32 %293 to i64
  %295 = getelementptr inbounds i32, ptr %292, i64 %294
  store i32 0, ptr %295, align 4, !tbaa !9
  br label %296

296:                                              ; preds = %428, %285
  %297 = load i32, ptr %17, align 4, !tbaa !9
  %298 = add nsw i32 %297, -1
  store i32 %298, ptr %17, align 4, !tbaa !9
  %299 = load ptr, ptr %15, align 8, !tbaa !5
  %300 = load i32, ptr %17, align 4, !tbaa !9
  %301 = sext i32 %300 to i64
  %302 = getelementptr inbounds %struct.Map, ptr %299, i64 %301
  %303 = getelementptr inbounds %struct.Map, ptr %302, i32 0, i32 2
  %304 = load i32, ptr %303, align 4, !tbaa !26
  %305 = load ptr, ptr %8, align 8, !tbaa !5
  %306 = load i32, ptr %18, align 4, !tbaa !9
  %307 = sext i32 %306 to i64
  %308 = getelementptr inbounds ptr, ptr %305, i64 %307
  %309 = load ptr, ptr %308, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.Word, ptr %309, i32 0, i32 8
  %311 = load ptr, ptr %310, align 8, !tbaa !17
  %312 = getelementptr inbounds %struct.Map, ptr %311, i32 0, i32 2
  store i32 %304, ptr %312, align 4, !tbaa !26
  %313 = load ptr, ptr %8, align 8, !tbaa !5
  %314 = load i32, ptr %18, align 4, !tbaa !9
  %315 = sext i32 %314 to i64
  %316 = getelementptr inbounds ptr, ptr %313, i64 %315
  %317 = load ptr, ptr %316, align 8, !tbaa !5
  %318 = getelementptr inbounds %struct.Word, ptr %317, i32 0, i32 8
  %319 = load ptr, ptr %318, align 8, !tbaa !17
  %320 = getelementptr inbounds %struct.Map, ptr %319, i32 0, i32 0
  %321 = load ptr, ptr %320, align 8, !tbaa !21
  %322 = load ptr, ptr %15, align 8, !tbaa !5
  %323 = load i32, ptr %17, align 4, !tbaa !9
  %324 = sext i32 %323 to i64
  %325 = getelementptr inbounds %struct.Map, ptr %322, i64 %324
  %326 = getelementptr inbounds %struct.Map, ptr %325, i32 0, i32 0
  %327 = load ptr, ptr %326, align 8, !tbaa !21
  %328 = load ptr, ptr %8, align 8, !tbaa !5
  %329 = load i32, ptr %18, align 4, !tbaa !9
  %330 = sext i32 %329 to i64
  %331 = getelementptr inbounds ptr, ptr %328, i64 %330
  %332 = load ptr, ptr %331, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.Word, ptr %332, i32 0, i32 8
  %334 = load ptr, ptr %333, align 8, !tbaa !17
  %335 = getelementptr inbounds %struct.Map, ptr %334, i32 0, i32 1
  %336 = load i32, ptr %335, align 8, !tbaa !18
  %337 = sext i32 %336 to i64
  %338 = mul i64 %337, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %321, ptr align 8 %327, i64 %338, i1 false)
  %339 = load ptr, ptr %8, align 8, !tbaa !5
  %340 = load i32, ptr %18, align 4, !tbaa !9
  %341 = sext i32 %340 to i64
  %342 = getelementptr inbounds ptr, ptr %339, i64 %341
  %343 = load ptr, ptr %342, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.Word, ptr %343, i32 0, i32 9
  %345 = load ptr, ptr %344, align 8, !tbaa !11
  %346 = load i32, ptr %9, align 4, !tbaa !9
  %347 = sext i32 %346 to i64
  %348 = mul i64 %347, 4
  call void @llvm.memset.p0.i64(ptr align 4 %345, i8 0, i64 %348, i1 false)
  %349 = load i32, ptr %18, align 4, !tbaa !9
  %350 = add nsw i32 %349, -1
  store i32 %350, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #10
  %351 = load ptr, ptr %8, align 8, !tbaa !5
  %352 = load i32, ptr %18, align 4, !tbaa !9
  %353 = sext i32 %352 to i64
  %354 = getelementptr inbounds ptr, ptr %351, i64 %353
  %355 = load ptr, ptr %354, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.Word, ptr %355, i32 0, i32 6
  %357 = load i32, ptr %356, align 8, !tbaa !16
  %358 = sub nsw i32 %357, 1
  store i32 %358, ptr %27, align 4, !tbaa !9
  br label %359

359:                                              ; preds = %418, %296
  %360 = load i32, ptr %27, align 4, !tbaa !9
  %361 = icmp sge i32 %360, 0
  br i1 %361, label %363, label %362

362:                                              ; preds = %359
  store i32 21, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #10
  br label %421

363:                                              ; preds = %359
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #10
  %364 = load ptr, ptr %8, align 8, !tbaa !5
  %365 = load i32, ptr %18, align 4, !tbaa !9
  %366 = sext i32 %365 to i64
  %367 = getelementptr inbounds ptr, ptr %364, i64 %366
  %368 = load ptr, ptr %367, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.Word, ptr %368, i32 0, i32 7
  %370 = load ptr, ptr %369, align 8, !tbaa !27
  %371 = load i32, ptr %27, align 4, !tbaa !9
  %372 = sext i32 %371 to i64
  %373 = getelementptr inbounds %struct.Intersection, ptr %370, i64 %372
  %374 = getelementptr inbounds %struct.Intersection, ptr %373, i32 0, i32 0
  %375 = load ptr, ptr %374, align 8, !tbaa !28
  store ptr %375, ptr %28, align 8, !tbaa !5
  %376 = load ptr, ptr %28, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.Word, ptr %376, i32 0, i32 0
  %378 = load i32, ptr %377, align 8, !tbaa !30
  %379 = icmp eq i32 %378, 0
  br i1 %379, label %380, label %417

380:                                              ; preds = %363
  %381 = load ptr, ptr %28, align 8, !tbaa !5
  %382 = getelementptr inbounds %struct.Word, ptr %381, i32 0, i32 10
  %383 = load ptr, ptr %382, align 8, !tbaa !13
  %384 = load i32, ptr %18, align 4, !tbaa !9
  %385 = sext i32 %384 to i64
  %386 = getelementptr inbounds i32, ptr %383, i64 %385
  store i32 0, ptr %386, align 4, !tbaa !9
  %387 = load i32, ptr %17, align 4, !tbaa !9
  %388 = add nsw i32 %387, -1
  store i32 %388, ptr %17, align 4, !tbaa !9
  %389 = load ptr, ptr %15, align 8, !tbaa !5
  %390 = load i32, ptr %17, align 4, !tbaa !9
  %391 = sext i32 %390 to i64
  %392 = getelementptr inbounds %struct.Map, ptr %389, i64 %391
  %393 = getelementptr inbounds %struct.Map, ptr %392, i32 0, i32 2
  %394 = load i32, ptr %393, align 4, !tbaa !26
  %395 = load ptr, ptr %28, align 8, !tbaa !5
  %396 = getelementptr inbounds %struct.Word, ptr %395, i32 0, i32 8
  %397 = load ptr, ptr %396, align 8, !tbaa !17
  %398 = getelementptr inbounds %struct.Map, ptr %397, i32 0, i32 2
  store i32 %394, ptr %398, align 4, !tbaa !26
  %399 = load ptr, ptr %28, align 8, !tbaa !5
  %400 = getelementptr inbounds %struct.Word, ptr %399, i32 0, i32 8
  %401 = load ptr, ptr %400, align 8, !tbaa !17
  %402 = getelementptr inbounds %struct.Map, ptr %401, i32 0, i32 0
  %403 = load ptr, ptr %402, align 8, !tbaa !21
  %404 = load ptr, ptr %15, align 8, !tbaa !5
  %405 = load i32, ptr %17, align 4, !tbaa !9
  %406 = sext i32 %405 to i64
  %407 = getelementptr inbounds %struct.Map, ptr %404, i64 %406
  %408 = getelementptr inbounds %struct.Map, ptr %407, i32 0, i32 0
  %409 = load ptr, ptr %408, align 8, !tbaa !21
  %410 = load ptr, ptr %28, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.Word, ptr %410, i32 0, i32 8
  %412 = load ptr, ptr %411, align 8, !tbaa !17
  %413 = getelementptr inbounds %struct.Map, ptr %412, i32 0, i32 1
  %414 = load i32, ptr %413, align 8, !tbaa !18
  %415 = sext i32 %414 to i64
  %416 = mul i64 %415, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %403, ptr align 8 %409, i64 %416, i1 false)
  br label %417

417:                                              ; preds = %380, %363
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #10
  br label %418

418:                                              ; preds = %417
  %419 = load i32, ptr %27, align 4, !tbaa !9
  %420 = add nsw i32 %419, -1
  store i32 %420, ptr %27, align 4, !tbaa !9
  br label %359, !llvm.loop !31

421:                                              ; preds = %362
  %422 = load ptr, ptr %8, align 8, !tbaa !5
  %423 = load i32, ptr %18, align 4, !tbaa !9
  %424 = sext i32 %423 to i64
  %425 = getelementptr inbounds ptr, ptr %422, i64 %424
  %426 = load ptr, ptr %425, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.Word, ptr %426, i32 0, i32 0
  store i32 0, ptr %427, align 8, !tbaa !30
  br label %428

428:                                              ; preds = %421
  %429 = load i32, ptr %18, align 4, !tbaa !9
  %430 = load i32, ptr %23, align 4, !tbaa !9
  %431 = icmp sgt i32 %429, %430
  br i1 %431, label %296, label %432, !llvm.loop !32

432:                                              ; preds = %428
  store i32 11, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #10
  br label %777

433:                                              ; preds = %182
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #10
  %434 = load i32, ptr %18, align 4, !tbaa !9
  %435 = sub nsw i32 %434, 1
  store i32 %435, ptr %29, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #10
  store ptr null, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #10
  store i32 0, ptr %31, align 4, !tbaa !9
  br label %436

436:                                              ; preds = %565, %433
  %437 = load i32, ptr %31, align 4, !tbaa !9
  %438 = load ptr, ptr %8, align 8, !tbaa !5
  %439 = load i32, ptr %18, align 4, !tbaa !9
  %440 = sext i32 %439 to i64
  %441 = getelementptr inbounds ptr, ptr %438, i64 %440
  %442 = load ptr, ptr %441, align 8, !tbaa !5
  %443 = getelementptr inbounds %struct.Word, ptr %442, i32 0, i32 6
  %444 = load i32, ptr %443, align 8, !tbaa !16
  %445 = icmp slt i32 %437, %444
  br i1 %445, label %447, label %446

446:                                              ; preds = %436
  store i32 24, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #10
  br label %568

447:                                              ; preds = %436
  call void @llvm.lifetime.start.p0(i64 24, ptr %32) #10
  %448 = load ptr, ptr %8, align 8, !tbaa !5
  %449 = load i32, ptr %18, align 4, !tbaa !9
  %450 = sext i32 %449 to i64
  %451 = getelementptr inbounds ptr, ptr %448, i64 %450
  %452 = load ptr, ptr %451, align 8, !tbaa !5
  %453 = getelementptr inbounds %struct.Word, ptr %452, i32 0, i32 7
  %454 = load ptr, ptr %453, align 8, !tbaa !27
  %455 = load i32, ptr %31, align 4, !tbaa !9
  %456 = sext i32 %455 to i64
  %457 = getelementptr inbounds %struct.Intersection, ptr %454, i64 %456
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %32, ptr align 8 %457, i64 24, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #10
  %458 = getelementptr inbounds %struct.Intersection, ptr %32, i32 0, i32 0
  %459 = load ptr, ptr %458, align 8, !tbaa !28
  store ptr %459, ptr %33, align 8, !tbaa !5
  %460 = load ptr, ptr %33, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.Word, ptr %460, i32 0, i32 0
  %462 = load i32, ptr %461, align 8, !tbaa !30
  %463 = icmp eq i32 %462, 0
  br i1 %463, label %464, label %564

464:                                              ; preds = %447
  %465 = load ptr, ptr %33, align 8, !tbaa !5
  %466 = getelementptr inbounds %struct.Word, ptr %465, i32 0, i32 8
  %467 = load ptr, ptr %466, align 8, !tbaa !17
  %468 = load ptr, ptr %10, align 8, !tbaa !5
  %469 = load ptr, ptr %33, align 8, !tbaa !5
  %470 = getelementptr inbounds %struct.Word, ptr %469, i32 0, i32 5
  %471 = load i32, ptr %470, align 4, !tbaa !23
  %472 = sub nsw i32 %471, 1
  %473 = sext i32 %472 to i64
  %474 = getelementptr inbounds ptr, ptr %468, i64 %473
  %475 = load ptr, ptr %474, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.Intersection, ptr %32, i32 0, i32 3
  %477 = load i32, ptr %476, align 8, !tbaa !34
  %478 = sext i32 %477 to i64
  %479 = getelementptr inbounds ptr, ptr %475, i64 %478
  %480 = load ptr, ptr %479, align 8, !tbaa !5
  %481 = load ptr, ptr %20, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.Intersection, ptr %32, i32 0, i32 4
  %483 = load i32, ptr %482, align 4, !tbaa !35
  %484 = sext i32 %483 to i64
  %485 = getelementptr inbounds i8, ptr %481, i64 %484
  %486 = load i8, ptr %485, align 1, !tbaa !36
  %487 = sext i8 %486 to i32
  %488 = sext i32 %487 to i64
  %489 = getelementptr inbounds %struct.Map, ptr %480, i64 %488
  %490 = call i32 @fc_check(ptr noundef %467, ptr noundef %489)
  %491 = icmp ne i32 %490, 0
  br i1 %491, label %492, label %563

492:                                              ; preds = %464
  %493 = load ptr, ptr %30, align 8, !tbaa !5
  %494 = icmp ne ptr %493, null
  br i1 %494, label %499, label %495

495:                                              ; preds = %492
  %496 = load ptr, ptr %33, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.Word, ptr %496, i32 0, i32 10
  %498 = load ptr, ptr %497, align 8, !tbaa !13
  store ptr %498, ptr %30, align 8, !tbaa !5
  store i32 1, ptr %19, align 4, !tbaa !9
  br label %499

499:                                              ; preds = %495, %492
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #10
  %500 = load i32, ptr %18, align 4, !tbaa !9
  store i32 %500, ptr %34, align 4, !tbaa !9
  br label %501

501:                                              ; preds = %516, %499
  %502 = load i32, ptr %34, align 4, !tbaa !9
  %503 = add nsw i32 %502, -1
  store i32 %503, ptr %34, align 4, !tbaa !9
  %504 = icmp sge i32 %503, 0
  br i1 %504, label %505, label %514

505:                                              ; preds = %501
  %506 = load ptr, ptr %33, align 8, !tbaa !5
  %507 = getelementptr inbounds %struct.Word, ptr %506, i32 0, i32 10
  %508 = load ptr, ptr %507, align 8, !tbaa !13
  %509 = load i32, ptr %34, align 4, !tbaa !9
  %510 = sext i32 %509 to i64
  %511 = getelementptr inbounds i32, ptr %508, i64 %510
  %512 = load i32, ptr %511, align 4, !tbaa !9
  %513 = icmp eq i32 %512, 0
  br label %514

514:                                              ; preds = %505, %501
  %515 = phi i1 [ false, %501 ], [ %513, %505 ]
  br i1 %515, label %516, label %517

516:                                              ; preds = %514
  br label %501, !llvm.loop !37

517:                                              ; preds = %514
  %518 = load i32, ptr %34, align 4, !tbaa !9
  %519 = icmp sge i32 %518, 0
  br i1 %519, label %520, label %529

520:                                              ; preds = %517
  %521 = load i32, ptr %29, align 4, !tbaa !9
  %522 = load i32, ptr %34, align 4, !tbaa !9
  %523 = icmp sgt i32 %521, %522
  br i1 %523, label %524, label %529

524:                                              ; preds = %520
  %525 = load i32, ptr %34, align 4, !tbaa !9
  store i32 %525, ptr %29, align 4, !tbaa !9
  %526 = load ptr, ptr %33, align 8, !tbaa !5
  %527 = getelementptr inbounds %struct.Word, ptr %526, i32 0, i32 10
  %528 = load ptr, ptr %527, align 8, !tbaa !13
  store ptr %528, ptr %30, align 8, !tbaa !5
  br label %529

529:                                              ; preds = %524, %520, %517
  %530 = load ptr, ptr %8, align 8, !tbaa !5
  %531 = load i32, ptr %18, align 4, !tbaa !9
  %532 = sext i32 %531 to i64
  %533 = getelementptr inbounds ptr, ptr %530, i64 %532
  %534 = load ptr, ptr %533, align 8, !tbaa !5
  %535 = getelementptr inbounds %struct.Word, ptr %534, i32 0, i32 8
  %536 = load ptr, ptr %535, align 8, !tbaa !17
  %537 = load ptr, ptr %10, align 8, !tbaa !5
  %538 = load ptr, ptr %8, align 8, !tbaa !5
  %539 = load i32, ptr %18, align 4, !tbaa !9
  %540 = sext i32 %539 to i64
  %541 = getelementptr inbounds ptr, ptr %538, i64 %540
  %542 = load ptr, ptr %541, align 8, !tbaa !5
  %543 = getelementptr inbounds %struct.Word, ptr %542, i32 0, i32 5
  %544 = load i32, ptr %543, align 4, !tbaa !23
  %545 = sub nsw i32 %544, 1
  %546 = sext i32 %545 to i64
  %547 = getelementptr inbounds ptr, ptr %537, i64 %546
  %548 = load ptr, ptr %547, align 8, !tbaa !5
  %549 = getelementptr inbounds %struct.Intersection, ptr %32, i32 0, i32 4
  %550 = load i32, ptr %549, align 4, !tbaa !35
  %551 = sext i32 %550 to i64
  %552 = getelementptr inbounds ptr, ptr %548, i64 %551
  %553 = load ptr, ptr %552, align 8, !tbaa !5
  %554 = load ptr, ptr %20, align 8, !tbaa !5
  %555 = getelementptr inbounds %struct.Intersection, ptr %32, i32 0, i32 4
  %556 = load i32, ptr %555, align 4, !tbaa !35
  %557 = sext i32 %556 to i64
  %558 = getelementptr inbounds i8, ptr %554, i64 %557
  %559 = load i8, ptr %558, align 1, !tbaa !36
  %560 = sext i8 %559 to i32
  %561 = sext i32 %560 to i64
  %562 = getelementptr inbounds %struct.Map, ptr %553, i64 %561
  call void @remove_map(ptr noundef %536, ptr noundef %562)
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #10
  br label %563

563:                                              ; preds = %529, %464
  br label %564

564:                                              ; preds = %563, %447
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #10
  call void @llvm.lifetime.end.p0(i64 24, ptr %32) #10
  br label %565

565:                                              ; preds = %564
  %566 = load i32, ptr %31, align 4, !tbaa !9
  %567 = add nsw i32 %566, 1
  store i32 %567, ptr %31, align 4, !tbaa !9
  br label %436, !llvm.loop !38

568:                                              ; preds = %446
  %569 = load i32, ptr %19, align 4, !tbaa !9
  %570 = icmp ne i32 %569, 0
  br i1 %570, label %571, label %599

571:                                              ; preds = %568
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #10
  %572 = load i32, ptr %29, align 4, !tbaa !9
  store i32 %572, ptr %35, align 4, !tbaa !9
  br label %573

573:                                              ; preds = %595, %571
  %574 = load i32, ptr %35, align 4, !tbaa !9
  %575 = icmp sge i32 %574, 0
  br i1 %575, label %577, label %576

576:                                              ; preds = %573
  store i32 29, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #10
  br label %598

577:                                              ; preds = %573
  %578 = load ptr, ptr %30, align 8, !tbaa !5
  %579 = load i32, ptr %35, align 4, !tbaa !9
  %580 = sext i32 %579 to i64
  %581 = getelementptr inbounds i32, ptr %578, i64 %580
  %582 = load i32, ptr %581, align 4, !tbaa !9
  %583 = load ptr, ptr %8, align 8, !tbaa !5
  %584 = load i32, ptr %18, align 4, !tbaa !9
  %585 = sext i32 %584 to i64
  %586 = getelementptr inbounds ptr, ptr %583, i64 %585
  %587 = load ptr, ptr %586, align 8, !tbaa !5
  %588 = getelementptr inbounds %struct.Word, ptr %587, i32 0, i32 9
  %589 = load ptr, ptr %588, align 8, !tbaa !11
  %590 = load i32, ptr %35, align 4, !tbaa !9
  %591 = sext i32 %590 to i64
  %592 = getelementptr inbounds i32, ptr %589, i64 %591
  %593 = load i32, ptr %592, align 4, !tbaa !9
  %594 = or i32 %593, %582
  store i32 %594, ptr %592, align 4, !tbaa !9
  br label %595

595:                                              ; preds = %577
  %596 = load i32, ptr %35, align 4, !tbaa !9
  %597 = add nsw i32 %596, -1
  store i32 %597, ptr %35, align 4, !tbaa !9
  br label %573, !llvm.loop !39

598:                                              ; preds = %576
  br label %775

599:                                              ; preds = %568
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #10
  store i32 0, ptr %36, align 4, !tbaa !9
  br label %600

600:                                              ; preds = %704, %599
  %601 = load i32, ptr %36, align 4, !tbaa !9
  %602 = load ptr, ptr %8, align 8, !tbaa !5
  %603 = load i32, ptr %18, align 4, !tbaa !9
  %604 = sext i32 %603 to i64
  %605 = getelementptr inbounds ptr, ptr %602, i64 %604
  %606 = load ptr, ptr %605, align 8, !tbaa !5
  %607 = getelementptr inbounds %struct.Word, ptr %606, i32 0, i32 6
  %608 = load i32, ptr %607, align 8, !tbaa !16
  %609 = icmp slt i32 %601, %608
  br i1 %609, label %611, label %610

610:                                              ; preds = %600
  store i32 32, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #10
  br label %707

611:                                              ; preds = %600
  call void @llvm.lifetime.start.p0(i64 24, ptr %37) #10
  %612 = load ptr, ptr %8, align 8, !tbaa !5
  %613 = load i32, ptr %18, align 4, !tbaa !9
  %614 = sext i32 %613 to i64
  %615 = getelementptr inbounds ptr, ptr %612, i64 %614
  %616 = load ptr, ptr %615, align 8, !tbaa !5
  %617 = getelementptr inbounds %struct.Word, ptr %616, i32 0, i32 7
  %618 = load ptr, ptr %617, align 8, !tbaa !27
  %619 = load i32, ptr %36, align 4, !tbaa !9
  %620 = sext i32 %619 to i64
  %621 = getelementptr inbounds %struct.Intersection, ptr %618, i64 %620
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %37, ptr align 8 %621, i64 24, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #10
  %622 = getelementptr inbounds %struct.Intersection, ptr %37, i32 0, i32 0
  %623 = load ptr, ptr %622, align 8, !tbaa !28
  store ptr %623, ptr %38, align 8, !tbaa !5
  %624 = load ptr, ptr %38, align 8, !tbaa !5
  %625 = getelementptr inbounds %struct.Word, ptr %624, i32 0, i32 0
  %626 = load i32, ptr %625, align 8, !tbaa !30
  %627 = icmp eq i32 %626, 0
  br i1 %627, label %628, label %703

628:                                              ; preds = %611
  %629 = load ptr, ptr %38, align 8, !tbaa !5
  %630 = getelementptr inbounds %struct.Word, ptr %629, i32 0, i32 8
  %631 = load ptr, ptr %630, align 8, !tbaa !17
  %632 = getelementptr inbounds %struct.Map, ptr %631, i32 0, i32 2
  %633 = load i32, ptr %632, align 4, !tbaa !26
  %634 = load ptr, ptr %15, align 8, !tbaa !5
  %635 = load i32, ptr %17, align 4, !tbaa !9
  %636 = sext i32 %635 to i64
  %637 = getelementptr inbounds %struct.Map, ptr %634, i64 %636
  %638 = getelementptr inbounds %struct.Map, ptr %637, i32 0, i32 2
  store i32 %633, ptr %638, align 4, !tbaa !26
  %639 = load ptr, ptr %15, align 8, !tbaa !5
  %640 = load i32, ptr %17, align 4, !tbaa !9
  %641 = sext i32 %640 to i64
  %642 = getelementptr inbounds %struct.Map, ptr %639, i64 %641
  %643 = getelementptr inbounds %struct.Map, ptr %642, i32 0, i32 0
  %644 = load ptr, ptr %643, align 8, !tbaa !21
  %645 = load ptr, ptr %38, align 8, !tbaa !5
  %646 = getelementptr inbounds %struct.Word, ptr %645, i32 0, i32 8
  %647 = load ptr, ptr %646, align 8, !tbaa !17
  %648 = getelementptr inbounds %struct.Map, ptr %647, i32 0, i32 0
  %649 = load ptr, ptr %648, align 8, !tbaa !21
  %650 = load ptr, ptr %38, align 8, !tbaa !5
  %651 = getelementptr inbounds %struct.Word, ptr %650, i32 0, i32 8
  %652 = load ptr, ptr %651, align 8, !tbaa !17
  %653 = getelementptr inbounds %struct.Map, ptr %652, i32 0, i32 1
  %654 = load i32, ptr %653, align 8, !tbaa !18
  %655 = sext i32 %654 to i64
  %656 = mul i64 %655, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %644, ptr align 8 %649, i64 %656, i1 false)
  %657 = load i32, ptr %17, align 4, !tbaa !9
  %658 = add nsw i32 %657, 1
  store i32 %658, ptr %17, align 4, !tbaa !9
  %659 = load ptr, ptr %38, align 8, !tbaa !5
  %660 = getelementptr inbounds %struct.Word, ptr %659, i32 0, i32 8
  %661 = load ptr, ptr %660, align 8, !tbaa !17
  %662 = load ptr, ptr %10, align 8, !tbaa !5
  %663 = load ptr, ptr %38, align 8, !tbaa !5
  %664 = getelementptr inbounds %struct.Word, ptr %663, i32 0, i32 5
  %665 = load i32, ptr %664, align 4, !tbaa !23
  %666 = sub nsw i32 %665, 1
  %667 = sext i32 %666 to i64
  %668 = getelementptr inbounds ptr, ptr %662, i64 %667
  %669 = load ptr, ptr %668, align 8, !tbaa !5
  %670 = getelementptr inbounds %struct.Intersection, ptr %37, i32 0, i32 3
  %671 = load i32, ptr %670, align 8, !tbaa !34
  %672 = sext i32 %671 to i64
  %673 = getelementptr inbounds ptr, ptr %669, i64 %672
  %674 = load ptr, ptr %673, align 8, !tbaa !5
  %675 = load ptr, ptr %20, align 8, !tbaa !5
  %676 = getelementptr inbounds %struct.Intersection, ptr %37, i32 0, i32 4
  %677 = load i32, ptr %676, align 4, !tbaa !35
  %678 = sext i32 %677 to i64
  %679 = getelementptr inbounds i8, ptr %675, i64 %678
  %680 = load i8, ptr %679, align 1, !tbaa !36
  %681 = sext i8 %680 to i32
  %682 = sext i32 %681 to i64
  %683 = getelementptr inbounds %struct.Map, ptr %674, i64 %682
  call void @join_map(ptr noundef %661, ptr noundef %683)
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #10
  %684 = load ptr, ptr %38, align 8, !tbaa !5
  %685 = getelementptr inbounds %struct.Word, ptr %684, i32 0, i32 8
  %686 = load ptr, ptr %685, align 8, !tbaa !17
  %687 = getelementptr inbounds %struct.Map, ptr %686, i32 0, i32 2
  %688 = load i32, ptr %687, align 4, !tbaa !26
  store i32 %688, ptr %39, align 4, !tbaa !9
  %689 = load i32, ptr %39, align 4, !tbaa !9
  %690 = load ptr, ptr %38, align 8, !tbaa !5
  %691 = getelementptr inbounds %struct.Word, ptr %690, i32 0, i32 8
  %692 = load ptr, ptr %691, align 8, !tbaa !17
  %693 = call i32 @sum_bit(ptr noundef %692)
  %694 = icmp ne i32 %689, %693
  br i1 %694, label %695, label %702

695:                                              ; preds = %628
  %696 = load ptr, ptr %38, align 8, !tbaa !5
  %697 = getelementptr inbounds %struct.Word, ptr %696, i32 0, i32 10
  %698 = load ptr, ptr %697, align 8, !tbaa !13
  %699 = load i32, ptr %18, align 4, !tbaa !9
  %700 = sext i32 %699 to i64
  %701 = getelementptr inbounds i32, ptr %698, i64 %700
  store i32 1, ptr %701, align 4, !tbaa !9
  br label %702

702:                                              ; preds = %695, %628
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #10
  br label %703

703:                                              ; preds = %702, %611
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #10
  call void @llvm.lifetime.end.p0(i64 24, ptr %37) #10
  br label %704

704:                                              ; preds = %703
  %705 = load i32, ptr %36, align 4, !tbaa !9
  %706 = add nsw i32 %705, 1
  store i32 %706, ptr %36, align 4, !tbaa !9
  br label %600, !llvm.loop !40

707:                                              ; preds = %610
  %708 = load i32, ptr %18, align 4, !tbaa !9
  %709 = add nsw i32 %708, 1
  store i32 %709, ptr %18, align 4, !tbaa !9
  %710 = load ptr, ptr %8, align 8, !tbaa !5
  %711 = load i32, ptr %18, align 4, !tbaa !9
  %712 = sub nsw i32 %711, 1
  %713 = sext i32 %712 to i64
  %714 = getelementptr inbounds ptr, ptr %710, i64 %713
  %715 = load ptr, ptr %714, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct.Word, ptr %715, i32 0, i32 0
  store i32 1, ptr %716, align 8, !tbaa !30
  %717 = load ptr, ptr %20, align 8, !tbaa !5
  %718 = load ptr, ptr %8, align 8, !tbaa !5
  %719 = load i32, ptr %18, align 4, !tbaa !9
  %720 = sub nsw i32 %719, 1
  %721 = sext i32 %720 to i64
  %722 = getelementptr inbounds ptr, ptr %718, i64 %721
  %723 = load ptr, ptr %722, align 8, !tbaa !5
  %724 = getelementptr inbounds %struct.Word, ptr %723, i32 0, i32 11
  store ptr %717, ptr %724, align 8, !tbaa !41
  %725 = load i32, ptr %18, align 4, !tbaa !9
  %726 = load i32, ptr %9, align 4, !tbaa !9
  %727 = icmp eq i32 %725, %726
  br i1 %727, label %728, label %729

728:                                              ; preds = %707
  store i32 12, ptr %25, align 4
  br label %776

729:                                              ; preds = %707
  %730 = load ptr, ptr %8, align 8, !tbaa !5
  %731 = load i32, ptr %9, align 4, !tbaa !9
  %732 = load i32, ptr %18, align 4, !tbaa !9
  call void @prop_word(ptr noundef %730, i32 noundef %731, i32 noundef %732)
  %733 = load ptr, ptr %8, align 8, !tbaa !5
  %734 = load i32, ptr %18, align 4, !tbaa !9
  %735 = sext i32 %734 to i64
  %736 = getelementptr inbounds ptr, ptr %733, i64 %735
  %737 = load ptr, ptr %736, align 8, !tbaa !5
  %738 = getelementptr inbounds %struct.Word, ptr %737, i32 0, i32 8
  %739 = load ptr, ptr %738, align 8, !tbaa !17
  %740 = getelementptr inbounds %struct.Map, ptr %739, i32 0, i32 2
  %741 = load i32, ptr %740, align 4, !tbaa !26
  %742 = load ptr, ptr %15, align 8, !tbaa !5
  %743 = load i32, ptr %17, align 4, !tbaa !9
  %744 = sext i32 %743 to i64
  %745 = getelementptr inbounds %struct.Map, ptr %742, i64 %744
  %746 = getelementptr inbounds %struct.Map, ptr %745, i32 0, i32 2
  store i32 %741, ptr %746, align 4, !tbaa !26
  %747 = load ptr, ptr %15, align 8, !tbaa !5
  %748 = load i32, ptr %17, align 4, !tbaa !9
  %749 = sext i32 %748 to i64
  %750 = getelementptr inbounds %struct.Map, ptr %747, i64 %749
  %751 = getelementptr inbounds %struct.Map, ptr %750, i32 0, i32 0
  %752 = load ptr, ptr %751, align 8, !tbaa !21
  %753 = load ptr, ptr %8, align 8, !tbaa !5
  %754 = load i32, ptr %18, align 4, !tbaa !9
  %755 = sext i32 %754 to i64
  %756 = getelementptr inbounds ptr, ptr %753, i64 %755
  %757 = load ptr, ptr %756, align 8, !tbaa !5
  %758 = getelementptr inbounds %struct.Word, ptr %757, i32 0, i32 8
  %759 = load ptr, ptr %758, align 8, !tbaa !17
  %760 = getelementptr inbounds %struct.Map, ptr %759, i32 0, i32 0
  %761 = load ptr, ptr %760, align 8, !tbaa !21
  %762 = load ptr, ptr %8, align 8, !tbaa !5
  %763 = load i32, ptr %18, align 4, !tbaa !9
  %764 = sext i32 %763 to i64
  %765 = getelementptr inbounds ptr, ptr %762, i64 %764
  %766 = load ptr, ptr %765, align 8, !tbaa !5
  %767 = getelementptr inbounds %struct.Word, ptr %766, i32 0, i32 8
  %768 = load ptr, ptr %767, align 8, !tbaa !17
  %769 = getelementptr inbounds %struct.Map, ptr %768, i32 0, i32 1
  %770 = load i32, ptr %769, align 8, !tbaa !18
  %771 = sext i32 %770 to i64
  %772 = mul i64 %771, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %752, ptr align 8 %761, i64 %772, i1 false)
  %773 = load i32, ptr %17, align 4, !tbaa !9
  %774 = add nsw i32 %773, 1
  store i32 %774, ptr %17, align 4, !tbaa !9
  br label %775

775:                                              ; preds = %729, %598
  store i32 0, ptr %25, align 4
  br label %776

776:                                              ; preds = %775, %728
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #10
  br label %777

777:                                              ; preds = %776, %432
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #10
  %778 = load i32, ptr %25, align 4
  switch i32 %778, label %821 [
    i32 0, label %779
    i32 11, label %178
    i32 12, label %780
  ]

779:                                              ; preds = %777
  br label %178, !llvm.loop !42

780:                                              ; preds = %777, %178
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #10
  store i32 0, ptr %40, align 4, !tbaa !9
  br label %781

781:                                              ; preds = %800, %780
  %782 = load i32, ptr %40, align 4, !tbaa !9
  %783 = load i32, ptr %9, align 4, !tbaa !9
  %784 = icmp slt i32 %782, %783
  br i1 %784, label %786, label %785

785:                                              ; preds = %781
  store i32 35, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #10
  br label %803

786:                                              ; preds = %781
  %787 = load ptr, ptr %6, align 8, !tbaa !5
  %788 = load ptr, ptr %8, align 8, !tbaa !5
  %789 = load i32, ptr %40, align 4, !tbaa !9
  %790 = sext i32 %789 to i64
  %791 = getelementptr inbounds ptr, ptr %788, i64 %790
  %792 = load ptr, ptr %791, align 8, !tbaa !5
  %793 = load ptr, ptr %8, align 8, !tbaa !5
  %794 = load i32, ptr %40, align 4, !tbaa !9
  %795 = sext i32 %794 to i64
  %796 = getelementptr inbounds ptr, ptr %793, i64 %795
  %797 = load ptr, ptr %796, align 8, !tbaa !5
  %798 = getelementptr inbounds %struct.Word, ptr %797, i32 0, i32 11
  %799 = load ptr, ptr %798, align 8, !tbaa !41
  call void @write_word(ptr noundef %787, ptr noundef %792, ptr noundef %799)
  br label %800

800:                                              ; preds = %786
  %801 = load i32, ptr %40, align 4, !tbaa !9
  %802 = add nsw i32 %801, 1
  store i32 %802, ptr %40, align 4, !tbaa !9
  br label %781, !llvm.loop !43

803:                                              ; preds = %785
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #10
  store i32 0, ptr %41, align 4, !tbaa !9
  br label %804

804:                                              ; preds = %816, %803
  %805 = load i32, ptr %41, align 4, !tbaa !9
  %806 = load i32, ptr %13, align 4, !tbaa !9
  %807 = icmp slt i32 %805, %806
  br i1 %807, label %809, label %808

808:                                              ; preds = %804
  store i32 38, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #10
  br label %819

809:                                              ; preds = %804
  %810 = load ptr, ptr %15, align 8, !tbaa !5
  %811 = load i32, ptr %41, align 4, !tbaa !9
  %812 = sext i32 %811 to i64
  %813 = getelementptr inbounds %struct.Map, ptr %810, i64 %812
  %814 = getelementptr inbounds %struct.Map, ptr %813, i32 0, i32 0
  %815 = load ptr, ptr %814, align 8, !tbaa !21
  call void @free(ptr noundef %815) #10
  br label %816

816:                                              ; preds = %809
  %817 = load i32, ptr %41, align 4, !tbaa !9
  %818 = add nsw i32 %817, 1
  store i32 %818, ptr %41, align 4, !tbaa !9
  br label %804, !llvm.loop !44

819:                                              ; preds = %808
  %820 = load ptr, ptr %15, align 8, !tbaa !5
  call void @free(ptr noundef %820) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #10
  ret void

821:                                              ; preds = %777
  unreachable
}

declare void @prop_word(ptr noundef, i32 noundef, i32 noundef) #1

declare ptr @find_word(ptr noundef, ptr noundef) #1

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

declare i32 @fc_check(ptr noundef, ptr noundef) #1

declare void @remove_map(ptr noundef, ptr noundef) #1

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 = { 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 #3 = { nounwind willreturn memory(none) "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 "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 #5 = { nounwind allocsize(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 #6 = { nounwind allocsize(0,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 #7 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #8 = { 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 #9 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #10 = { nounwind }
attributes #11 = { nounwind allocsize(0,1) }
attributes #12 = { nounwind willreturn memory(none) }
attributes #13 = { noreturn nounwind }
attributes #14 = { nounwind allocsize(0) }

!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 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 48}
!12 = !{!"Word", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64}
!13 = !{!12, !6, i64 56}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = !{!12, !10, i64 24}
!17 = !{!12, !6, i64 40}
!18 = !{!19, !10, i64 8}
!19 = !{!"Map", !6, i64 0, !10, i64 8, !10, i64 12}
!20 = distinct !{!20, !15}
!21 = !{!19, !6, i64 0}
!22 = distinct !{!22, !15}
!23 = !{!12, !10, i64 20}
!24 = distinct !{!24, !15}
!25 = distinct !{!25, !15}
!26 = !{!19, !10, i64 12}
!27 = !{!12, !6, i64 32}
!28 = !{!29, !6, i64 0}
!29 = !{!"Intersection", !6, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20}
!30 = !{!12, !10, i64 0}
!31 = distinct !{!31, !15}
!32 = distinct !{!32, !15}
!33 = !{i64 0, i64 8, !5, i64 8, i64 4, !9, i64 12, i64 4, !9, i64 16, i64 4, !9, i64 20, i64 4, !9}
!34 = !{!29, !10, i64 16}
!35 = !{!29, !10, i64 20}
!36 = !{!7, !7, i64 0}
!37 = distinct !{!37, !15}
!38 = distinct !{!38, !15}
!39 = distinct !{!39, !15}
!40 = distinct !{!40, !15}
!41 = !{!12, !6, i64 64}
!42 = distinct !{!42, !15}
!43 = distinct !{!43, !15}
!44 = distinct !{!44, !15}


; 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.Map = type { ptr, i32, i32 }
%struct.Intersection = type { ptr, i32, i32, i32, i32 }

@stderr = external local_unnamed_addr global ptr, align 8
@.str.19 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [41 x i8], align 1

; Function Attrs: nofree nounwind
declare void @perror(ptr nocapture noundef readonly) local_unnamed_addr #0

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

; Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)
declare ptr @__errno_location() local_unnamed_addr #2

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

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

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

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #5

declare void @join_map(ptr noundef, ptr noundef) local_unnamed_addr #6

declare i32 @sum_bit(ptr noundef) local_unnamed_addr #6

declare void @write_word(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #6

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

; Function Attrs: nounwind uwtable
define dso_local void @solve_crossword(ptr noundef %0, ptr nocapture noundef readonly %1, ptr noundef %2, i32 noundef %3, ptr nocapture noundef readonly %4) local_unnamed_addr #8 {
  %6 = icmp sgt i32 %3, 0
  br i1 %6, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %5
  %7 = zext nneg i32 %3 to i64
  br label %10

8:                                                ; preds = %22
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %7
  br i1 %exitcond.not, label %.preheader279, label %10, !llvm.loop !5

.preheader279:                                    ; preds = %8
  br i1 %6, label %.lr.ph289.preheader, label %._crit_edge

.lr.ph289.preheader:                              ; preds = %.preheader279
  %xtraiter = and i64 %7, 1
  %9 = icmp eq i32 %3, 1
  br i1 %9, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph289.preheader.new

.lr.ph289.preheader.new:                          ; preds = %.lr.ph289.preheader
  %unroll_iter = and i64 %7, 2147483646
  br label %.lr.ph289

10:                                               ; preds = %.lr.ph, %8
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %8 ]
  %11 = tail call noalias ptr @calloc(i64 noundef %7, i64 noundef 4) #11
  %12 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv
  %13 = load ptr, ptr %12, align 8, !tbaa !7
  %14 = getelementptr inbounds i8, ptr %13, i64 48
  store ptr %11, ptr %14, align 8, !tbaa !11
  %15 = load ptr, ptr %12, align 8, !tbaa !7
  %16 = getelementptr inbounds i8, ptr %15, i64 48
  %17 = load ptr, ptr %16, align 8, !tbaa !11
  %18 = icmp eq ptr %17, null
  br i1 %18, label %19, label %22

19:                                               ; preds = %10
  tail call void @perror(ptr noundef nonnull @.str.19) #12
  %20 = tail call ptr @__errno_location() #13
  %21 = load i32, ptr %20, align 4, !tbaa !14
  tail call void @exit(i32 noundef %21) #14
  unreachable

22:                                               ; preds = %10
  %23 = tail call noalias ptr @calloc(i64 noundef %7, i64 noundef 4) #11
  %24 = getelementptr inbounds i8, ptr %15, i64 56
  store ptr %23, ptr %24, align 8, !tbaa !15
  %25 = load ptr, ptr %12, align 8, !tbaa !7
  %26 = getelementptr inbounds i8, ptr %25, i64 56
  %27 = load ptr, ptr %26, align 8, !tbaa !15
  %28 = icmp eq ptr %27, null
  br i1 %28, label %29, label %8

29:                                               ; preds = %22
  tail call void @perror(ptr noundef nonnull @.str.20) #12
  %30 = tail call ptr @__errno_location() #13
  %31 = load i32, ptr %30, align 4, !tbaa !14
  tail call void @exit(i32 noundef %31) #14
  unreachable

._crit_edge.loopexit.unr-lcssa:                   ; preds = %.lr.ph289, %.lr.ph289.preheader
  %.lcssa483.ph = phi i32 [ poison, %.lr.ph289.preheader ], [ %60, %.lr.ph289 ]
  %spec.select.lcssa.ph = phi i32 [ poison, %.lr.ph289.preheader ], [ %spec.select.1, %.lr.ph289 ]
  %indvars.iv358.unr = phi i64 [ 0, %.lr.ph289.preheader ], [ %indvars.iv.next359.1, %.lr.ph289 ]
  %.0218288.unr = phi i32 [ 0, %.lr.ph289.preheader ], [ %spec.select.1, %.lr.ph289 ]
  %.0219287.unr = phi i32 [ %3, %.lr.ph289.preheader ], [ %60, %.lr.ph289 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge.loopexit, label %.lr.ph289.epil

.lr.ph289.epil:                                   ; preds = %._crit_edge.loopexit.unr-lcssa
  %32 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv358.unr
  %33 = load ptr, ptr %32, align 8, !tbaa !7
  %34 = getelementptr inbounds i8, ptr %33, i64 24
  %35 = load i32, ptr %34, align 8, !tbaa !16
  %36 = add nsw i32 %35, %.0219287.unr
  %37 = getelementptr inbounds i8, ptr %33, i64 40
  %38 = load ptr, ptr %37, align 8, !tbaa !17
  %39 = getelementptr inbounds i8, ptr %38, i64 8
  %40 = load i32, ptr %39, align 8, !tbaa !18
  %spec.select.epil = tail call i32 @llvm.smax.i32(i32 %40, i32 %.0218288.unr)
  br label %._crit_edge.loopexit

._crit_edge.loopexit:                             ; preds = %._crit_edge.loopexit.unr-lcssa, %.lr.ph289.epil
  %.lcssa483 = phi i32 [ %.lcssa483.ph, %._crit_edge.loopexit.unr-lcssa ], [ %36, %.lr.ph289.epil ]
  %spec.select.lcssa = phi i32 [ %spec.select.lcssa.ph, %._crit_edge.loopexit.unr-lcssa ], [ %spec.select.epil, %.lr.ph289.epil ]
  %41 = zext nneg i32 %spec.select.lcssa to i64
  %42 = shl nuw nsw i64 %41, 3
  br label %._crit_edge

._crit_edge:                                      ; preds = %5, %._crit_edge.loopexit, %.preheader279
  %.0219.lcssa = phi i32 [ %3, %.preheader279 ], [ %.lcssa483, %._crit_edge.loopexit ], [ %3, %5 ]
  %.0218.lcssa = phi i64 [ 0, %.preheader279 ], [ %42, %._crit_edge.loopexit ], [ 0, %5 ]
  %43 = sext i32 %.0219.lcssa to i64
  %44 = tail call noalias ptr @calloc(i64 noundef %43, i64 noundef 16) #11
  %45 = icmp eq ptr %44, null
  br i1 %45, label %65, label %.preheader278

.preheader278:                                    ; preds = %._crit_edge
  %46 = icmp sgt i32 %.0219.lcssa, 0
  br i1 %46, label %.lr.ph292, label %._crit_edge293

.lr.ph292:                                        ; preds = %.preheader278
  %wide.trip.count366 = zext nneg i32 %.0219.lcssa to i64
  br label %71

.lr.ph289:                                        ; preds = %.lr.ph289, %.lr.ph289.preheader.new
  %indvars.iv358 = phi i64 [ 0, %.lr.ph289.preheader.new ], [ %indvars.iv.next359.1, %.lr.ph289 ]
  %.0218288 = phi i32 [ 0, %.lr.ph289.preheader.new ], [ %spec.select.1, %.lr.ph289 ]
  %.0219287 = phi i32 [ %3, %.lr.ph289.preheader.new ], [ %60, %.lr.ph289 ]
  %niter = phi i64 [ 0, %.lr.ph289.preheader.new ], [ %niter.next.1, %.lr.ph289 ]
  %47 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv358
  %48 = load ptr, ptr %47, align 8, !tbaa !7
  %49 = getelementptr inbounds i8, ptr %48, i64 24
  %50 = load i32, ptr %49, align 8, !tbaa !16
  %51 = add nsw i32 %50, %.0219287
  %52 = getelementptr inbounds i8, ptr %48, i64 40
  %53 = load ptr, ptr %52, align 8, !tbaa !17
  %54 = getelementptr inbounds i8, ptr %53, i64 8
  %55 = load i32, ptr %54, align 8, !tbaa !18
  %spec.select = tail call i32 @llvm.smax.i32(i32 %55, i32 %.0218288)
  %indvars.iv.next359 = or disjoint i64 %indvars.iv358, 1
  %56 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv.next359
  %57 = load ptr, ptr %56, align 8, !tbaa !7
  %58 = getelementptr inbounds i8, ptr %57, i64 24
  %59 = load i32, ptr %58, align 8, !tbaa !16
  %60 = add nsw i32 %59, %51
  %61 = getelementptr inbounds i8, ptr %57, i64 40
  %62 = load ptr, ptr %61, align 8, !tbaa !17
  %63 = getelementptr inbounds i8, ptr %62, i64 8
  %64 = load i32, ptr %63, align 8, !tbaa !18
  %spec.select.1 = tail call i32 @llvm.smax.i32(i32 %64, i32 %spec.select)
  %indvars.iv.next359.1 = add nuw nsw i64 %indvars.iv358, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph289, !llvm.loop !20

65:                                               ; preds = %._crit_edge
  tail call void @perror(ptr noundef nonnull @.str.21) #12
  %66 = tail call ptr @__errno_location() #13
  %67 = load i32, ptr %66, align 4, !tbaa !14
  tail call void @exit(i32 noundef %67) #14
  unreachable

68:                                               ; preds = %71
  %indvars.iv.next364 = add nuw nsw i64 %indvars.iv363, 1
  %exitcond367.not = icmp eq i64 %indvars.iv.next364, %wide.trip.count366
  br i1 %exitcond367.not, label %._crit_edge293, label %71, !llvm.loop !21

._crit_edge293:                                   ; preds = %68, %.preheader278
  tail call void @prop_word(ptr noundef %2, i32 noundef %3, i32 noundef 0) #15
  %invariant.gep337 = getelementptr i8, ptr %1, i64 -8
  br i1 %6, label %.lr.ph342, label %.preheader

.lr.ph342:                                        ; preds = %._crit_edge293
  %invariant.gep = getelementptr i8, ptr %4, i64 -8
  %69 = zext nneg i32 %3 to i64
  %70 = shl nuw nsw i64 %69, 2
  br label %78

71:                                               ; preds = %.lr.ph292, %68
  %indvars.iv363 = phi i64 [ 0, %.lr.ph292 ], [ %indvars.iv.next364, %68 ]
  %72 = tail call noalias ptr @malloc(i64 noundef %.0218.lcssa) #16
  %73 = getelementptr inbounds %struct.Map, ptr %44, i64 %indvars.iv363
  store ptr %72, ptr %73, align 8, !tbaa !22
  %74 = icmp eq ptr %72, null
  br i1 %74, label %75, label %68

75:                                               ; preds = %71
  tail call void @perror(ptr noundef nonnull @.str.22) #12
  %76 = tail call ptr @__errno_location() #13
  %77 = load i32, ptr %76, align 4, !tbaa !14
  tail call void @exit(i32 noundef %77) #14
  unreachable

78:                                               ; preds = %.lr.ph342, %.loopexit
  %.0225340 = phi i32 [ 0, %.lr.ph342 ], [ %.8, %.loopexit ]
  %.0227339 = phi i32 [ 0, %.lr.ph342 ], [ %.4231, %.loopexit ]
  %79 = sext i32 %.0227339 to i64
  %80 = getelementptr inbounds ptr, ptr %2, i64 %79
  %81 = load ptr, ptr %80, align 8, !tbaa !7
  %82 = getelementptr inbounds i8, ptr %81, i64 20
  %83 = load i32, ptr %82, align 4, !tbaa !23
  %84 = sext i32 %83 to i64
  %gep338 = getelementptr ptr, ptr %invariant.gep337, i64 %84
  %85 = load ptr, ptr %gep338, align 8, !tbaa !7
  %86 = tail call ptr @find_word(ptr noundef %85, ptr noundef %81) #15
  %87 = icmp eq ptr %86, null
  br i1 %87, label %88, label %218

88:                                               ; preds = %78
  %89 = icmp eq i32 %.0227339, 0
  br i1 %89, label %90, label %93

90:                                               ; preds = %88
  %91 = load ptr, ptr @stderr, align 8, !tbaa !7
  %92 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %91, ptr noundef nonnull @.str.23) #17
  tail call void @exit(i32 noundef 1) #14
  unreachable

93:                                               ; preds = %88
  %94 = load ptr, ptr %80, align 8, !tbaa !7
  %95 = getelementptr inbounds i8, ptr %94, i64 48
  %96 = load ptr, ptr %95, align 8, !tbaa !11
  %97 = getelementptr inbounds i8, ptr %94, i64 56
  %98 = load ptr, ptr %97, align 8, !tbaa !15
  %99 = add nsw i32 %.0227339, -1
  %100 = icmp sgt i32 %.0227339, 0
  br i1 %100, label %.lr.ph319, label %._crit_edge329

.lr.ph319:                                        ; preds = %93, %107
  %.0248317 = phi i32 [ %108, %107 ], [ %99, %93 ]
  %101 = zext nneg i32 %.0248317 to i64
  %102 = getelementptr inbounds i32, ptr %96, i64 %101
  %103 = load i32, ptr %102, align 4, !tbaa !14
  %.not264 = icmp eq i32 %103, 0
  br i1 %.not264, label %104, label %.lr.ph328

104:                                              ; preds = %.lr.ph319
  %105 = getelementptr inbounds i32, ptr %98, i64 %101
  %106 = load i32, ptr %105, align 4, !tbaa !14
  %.not265 = icmp eq i32 %106, 0
  br i1 %.not265, label %107, label %.lr.ph328

107:                                              ; preds = %104
  %108 = add nsw i32 %.0248317, -1
  %109 = icmp sgt i32 %.0248317, 0
  br i1 %109, label %.lr.ph319, label %.lr.ph328, !llvm.loop !24

.lr.ph328:                                        ; preds = %.lr.ph319, %104, %107
  %.0243401 = phi i32 [ %99, %107 ], [ %.0248317, %104 ], [ %.0248317, %.lr.ph319 ]
  %110 = zext nneg i32 %.0243401 to i64
  %111 = getelementptr inbounds ptr, ptr %2, i64 %110
  %112 = load ptr, ptr %111, align 8, !tbaa !7
  %113 = getelementptr inbounds i8, ptr %112, i64 48
  %114 = load ptr, ptr %113, align 8, !tbaa !11
  %115 = add nuw nsw i64 %110, 1
  %min.iters.check = icmp ult i32 %.0243401, 7
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

scalar.ph.preheader:                              ; preds = %middle.block, %vector.memcheck, %.lr.ph328
  %indvars.iv380.ph = phi i64 [ %110, %vector.memcheck ], [ %110, %.lr.ph328 ], [ %ind.end, %middle.block ]
  %116 = and i64 %indvars.iv380.ph, 1
  %lcmp.mod489.not.not = icmp eq i64 %116, 0
  br i1 %lcmp.mod489.not.not, label %scalar.ph.prol, label %scalar.ph.prol.loopexit

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader
  %117 = getelementptr inbounds i32, ptr %96, i64 %indvars.iv380.ph
  %118 = load i32, ptr %117, align 4, !tbaa !14
  %119 = getelementptr inbounds i32, ptr %98, i64 %indvars.iv380.ph
  %120 = load i32, ptr %119, align 4, !tbaa !14
  %121 = or i32 %120, %118
  %122 = getelementptr inbounds i32, ptr %114, i64 %indvars.iv380.ph
  %123 = load i32, ptr %122, align 4, !tbaa !14
  %124 = or i32 %121, %123
  store i32 %124, ptr %122, align 4, !tbaa !14
  %indvars.iv.next381.prol = add nsw i64 %indvars.iv380.ph, -1
  br label %scalar.ph.prol.loopexit

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv380.unr = phi i64 [ %indvars.iv380.ph, %scalar.ph.preheader ], [ %indvars.iv.next381.prol, %scalar.ph.prol ]
  %125 = icmp eq i64 %indvars.iv380.ph, 0
  br i1 %125, label %._crit_edge329, label %scalar.ph

vector.memcheck:                                  ; preds = %.lr.ph328
  %scevgep = getelementptr i8, ptr %114, i64 4
  %126 = shl nuw nsw i64 %110, 2
  %scevgep426 = getelementptr i8, ptr %scevgep, i64 %126
  %scevgep427 = getelementptr i8, ptr %96, i64 4
  %scevgep428 = getelementptr i8, ptr %scevgep427, i64 %126
  %scevgep429 = getelementptr i8, ptr %98, i64 4
  %scevgep430 = getelementptr i8, ptr %scevgep429, i64 %126
  %bound0 = icmp ult ptr %114, %scevgep428
  %bound1 = icmp ult ptr %96, %scevgep426
  %found.conflict = and i1 %bound0, %bound1
  %bound0431 = icmp ult ptr %114, %scevgep430
  %bound1432 = icmp ult ptr %98, %scevgep426
  %found.conflict433 = and i1 %bound0431, %bound1432
  %conflict.rdx = or i1 %found.conflict, %found.conflict433
  br i1 %conflict.rdx, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %115, 4294967288
  %ind.end = sub nsw i64 %110, %n.vec
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = sub i64 %110, %index
  %127 = getelementptr inbounds i32, ptr %96, i64 %offset.idx
  %128 = getelementptr inbounds i8, ptr %127, i64 -12
  %129 = getelementptr inbounds i8, ptr %127, i64 -28
  %wide.load = load <4 x i32>, ptr %128, align 4, !tbaa !14, !alias.scope !25
  %wide.load434 = load <4 x i32>, ptr %129, align 4, !tbaa !14, !alias.scope !25
  %130 = getelementptr inbounds i32, ptr %98, i64 %offset.idx
  %131 = getelementptr inbounds i8, ptr %130, i64 -12
  %132 = getelementptr inbounds i8, ptr %130, i64 -28
  %wide.load436 = load <4 x i32>, ptr %131, align 4, !tbaa !14, !alias.scope !28
  %wide.load438 = load <4 x i32>, ptr %132, align 4, !tbaa !14, !alias.scope !28
  %133 = or <4 x i32> %wide.load436, %wide.load
  %134 = or <4 x i32> %wide.load438, %wide.load434
  %135 = getelementptr inbounds i32, ptr %114, i64 %offset.idx
  %136 = getelementptr inbounds i8, ptr %135, i64 -12
  %137 = getelementptr inbounds i8, ptr %135, i64 -28
  %wide.load440 = load <4 x i32>, ptr %136, align 4, !tbaa !14, !alias.scope !30, !noalias !32
  %wide.load442 = load <4 x i32>, ptr %137, align 4, !tbaa !14, !alias.scope !30, !noalias !32
  %138 = or <4 x i32> %133, %wide.load440
  %139 = or <4 x i32> %134, %wide.load442
  store <4 x i32> %138, ptr %136, align 4, !tbaa !14, !alias.scope !30, !noalias !32
  store <4 x i32> %139, ptr %137, align 4, !tbaa !14, !alias.scope !30, !noalias !32
  %index.next = add nuw i64 %index, 8
  %140 = icmp eq i64 %index.next, %n.vec
  br i1 %140, label %middle.block, label %vector.body, !llvm.loop !33

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

._crit_edge329:                                   ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block, %93
  %.0243400 = phi i32 [ %99, %93 ], [ %.0243401, %middle.block ], [ %.0243401, %scalar.ph ], [ %.0243401, %scalar.ph.prol.loopexit ]
  %141 = sext i32 %.0243400 to i64
  %142 = getelementptr inbounds ptr, ptr %2, i64 %141
  %143 = load ptr, ptr %142, align 8, !tbaa !7
  %144 = getelementptr inbounds i8, ptr %143, i64 48
  %145 = load ptr, ptr %144, align 8, !tbaa !11
  %146 = getelementptr inbounds i32, ptr %145, i64 %141
  store i32 0, ptr %146, align 4, !tbaa !14
  br label %163

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv380 = phi i64 [ %indvars.iv.next381.1, %scalar.ph ], [ %indvars.iv380.unr, %scalar.ph.prol.loopexit ]
  %147 = getelementptr inbounds i32, ptr %96, i64 %indvars.iv380
  %148 = load i32, ptr %147, align 4, !tbaa !14
  %149 = getelementptr inbounds i32, ptr %98, i64 %indvars.iv380
  %150 = load i32, ptr %149, align 4, !tbaa !14
  %151 = or i32 %150, %148
  %152 = getelementptr inbounds i32, ptr %114, i64 %indvars.iv380
  %153 = load i32, ptr %152, align 4, !tbaa !14
  %154 = or i32 %151, %153
  store i32 %154, ptr %152, align 4, !tbaa !14
  %indvars.iv.next381 = add nsw i64 %indvars.iv380, -1
  %155 = getelementptr inbounds i32, ptr %96, i64 %indvars.iv.next381
  %156 = load i32, ptr %155, align 4, !tbaa !14
  %157 = getelementptr inbounds i32, ptr %98, i64 %indvars.iv.next381
  %158 = load i32, ptr %157, align 4, !tbaa !14
  %159 = or i32 %158, %156
  %160 = getelementptr inbounds i32, ptr %114, i64 %indvars.iv.next381
  %161 = load i32, ptr %160, align 4, !tbaa !14
  %162 = or i32 %159, %161
  store i32 %162, ptr %160, align 4, !tbaa !14
  %indvars.iv.next381.1 = add nsw i64 %indvars.iv380, -2
  %.not417.1 = icmp eq i64 %indvars.iv.next381, 0
  br i1 %.not417.1, label %._crit_edge329, label %scalar.ph, !llvm.loop !36

163:                                              ; preds = %._crit_edge335, %._crit_edge329
  %164 = phi ptr [ %189, %._crit_edge335 ], [ %94, %._crit_edge329 ]
  %indvars.iv386 = phi i64 [ %indvars.iv.next387, %._crit_edge335 ], [ %79, %._crit_edge329 ]
  %.1226 = phi i32 [ %.2.lcssa, %._crit_edge335 ], [ %.0225340, %._crit_edge329 ]
  %165 = add nsw i32 %.1226, -1
  %166 = sext i32 %165 to i64
  %167 = getelementptr inbounds %struct.Map, ptr %44, i64 %166
  %168 = getelementptr inbounds i8, ptr %167, i64 12
  %169 = load i32, ptr %168, align 4, !tbaa !37
  %170 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv386
  %171 = getelementptr inbounds i8, ptr %164, i64 40
  %172 = load ptr, ptr %171, align 8, !tbaa !17
  %173 = getelementptr inbounds i8, ptr %172, i64 12
  store i32 %169, ptr %173, align 4, !tbaa !37
  %174 = load ptr, ptr %172, align 8, !tbaa !22
  %175 = load ptr, ptr %167, align 8, !tbaa !22
  %176 = getelementptr inbounds i8, ptr %172, i64 8
  %177 = load i32, ptr %176, align 8, !tbaa !18
  %178 = sext i32 %177 to i64
  %179 = shl nsw i64 %178, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %174, ptr align 8 %175, i64 %179, i1 false)
  %180 = load ptr, ptr %170, align 8, !tbaa !7
  %181 = getelementptr inbounds i8, ptr %180, i64 48
  %182 = load ptr, ptr %181, align 8, !tbaa !11
  tail call void @llvm.memset.p0.i64(ptr align 4 %182, i8 0, i64 %70, i1 false)
  %indvars.iv.next387 = add nsw i64 %indvars.iv386, -1
  %183 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv.next387
  %184 = load ptr, ptr %183, align 8, !tbaa !7
  %185 = getelementptr inbounds i8, ptr %184, i64 24
  %186 = load i32, ptr %185, align 8, !tbaa !16
  %187 = icmp sgt i32 %186, 0
  br i1 %187, label %.lr.ph334.preheader, label %._crit_edge335

.lr.ph334.preheader:                              ; preds = %163
  %188 = zext nneg i32 %186 to i64
  br label %.lr.ph334

._crit_edge335.loopexit:                          ; preds = %216
  %.pre = load ptr, ptr %183, align 8, !tbaa !7
  br label %._crit_edge335

._crit_edge335:                                   ; preds = %._crit_edge335.loopexit, %163
  %189 = phi ptr [ %184, %163 ], [ %.pre, %._crit_edge335.loopexit ]
  %.2.lcssa = phi i32 [ %165, %163 ], [ %.3, %._crit_edge335.loopexit ]
  store i32 0, ptr %189, align 8, !tbaa !38
  %190 = icmp sgt i64 %indvars.iv.next387, %141
  br i1 %190, label %163, label %.loopexit.loopexit, !llvm.loop !39

.lr.ph334:                                        ; preds = %.lr.ph334.preheader, %216
  %indvars.iv383 = phi i64 [ %188, %.lr.ph334.preheader ], [ %indvars.iv.next384, %216 ]
  %.2331 = phi i32 [ %165, %.lr.ph334.preheader ], [ %.3, %216 ]
  %indvars.iv.next384 = add nsw i64 %indvars.iv383, -1
  %191 = load ptr, ptr %183, align 8, !tbaa !7
  %192 = getelementptr inbounds i8, ptr %191, i64 32
  %193 = load ptr, ptr %192, align 8, !tbaa !40
  %194 = getelementptr inbounds %struct.Intersection, ptr %193, i64 %indvars.iv.next384
  %195 = load ptr, ptr %194, align 8, !tbaa !41
  %196 = load i32, ptr %195, align 8, !tbaa !38
  %197 = icmp eq i32 %196, 0
  br i1 %197, label %198, label %216

198:                                              ; preds = %.lr.ph334
  %199 = getelementptr inbounds i8, ptr %195, i64 56
  %200 = load ptr, ptr %199, align 8, !tbaa !15
  %201 = getelementptr inbounds i32, ptr %200, i64 %indvars.iv.next387
  store i32 0, ptr %201, align 4, !tbaa !14
  %202 = add nsw i32 %.2331, -1
  %203 = sext i32 %202 to i64
  %204 = getelementptr inbounds %struct.Map, ptr %44, i64 %203
  %205 = getelementptr inbounds i8, ptr %204, i64 12
  %206 = load i32, ptr %205, align 4, !tbaa !37
  %207 = getelementptr inbounds i8, ptr %195, i64 40
  %208 = load ptr, ptr %207, align 8, !tbaa !17
  %209 = getelementptr inbounds i8, ptr %208, i64 12
  store i32 %206, ptr %209, align 4, !tbaa !37
  %210 = load ptr, ptr %208, align 8, !tbaa !22
  %211 = load ptr, ptr %204, align 8, !tbaa !22
  %212 = getelementptr inbounds i8, ptr %208, i64 8
  %213 = load i32, ptr %212, align 8, !tbaa !18
  %214 = sext i32 %213 to i64
  %215 = shl nsw i64 %214, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %210, ptr align 8 %211, i64 %215, i1 false)
  br label %216

216:                                              ; preds = %198, %.lr.ph334
  %.3 = phi i32 [ %202, %198 ], [ %.2331, %.lr.ph334 ]
  %217 = icmp ugt i64 %indvars.iv383, 1
  br i1 %217, label %.lr.ph334, label %._crit_edge335.loopexit, !llvm.loop !43

218:                                              ; preds = %78
  %219 = load ptr, ptr %80, align 8, !tbaa !7
  %220 = getelementptr inbounds i8, ptr %219, i64 24
  %221 = load i32, ptr %220, align 8, !tbaa !16
  %222 = icmp sgt i32 %221, 0
  br i1 %222, label %.lr.ph301.preheader, label %._crit_edge314

.lr.ph301.preheader:                              ; preds = %218
  %223 = add nsw i32 %.0227339, -1
  %224 = zext i32 %.0227339 to i64
  br label %.lr.ph301

._crit_edge302:                                   ; preds = %298
  %.not = icmp eq i32 %.2234, 0
  br i1 %.not, label %.preheader275, label %.preheader276

.preheader276:                                    ; preds = %._crit_edge302
  %225 = icmp sgt i32 %.2242, -1
  br i1 %225, label %.lr.ph308, label %.loopexit

.lr.ph308:                                        ; preds = %.preheader276
  %226 = getelementptr inbounds i8, ptr %299, i64 48
  %227 = load ptr, ptr %226, align 8, !tbaa !11
  %228 = zext nneg i32 %.2242 to i64
  %229 = add nuw nsw i64 %228, 1
  %min.iters.check456 = icmp ult i32 %.2242, 7
  br i1 %min.iters.check456, label %scalar.ph455.preheader, label %vector.memcheck446

scalar.ph455.preheader:                           ; preds = %middle.block454, %vector.memcheck446, %.lr.ph308
  %indvars.iv374.ph = phi i64 [ %228, %vector.memcheck446 ], [ %228, %.lr.ph308 ], [ %ind.end460, %middle.block454 ]
  %230 = add nsw i64 %indvars.iv374.ph, 1
  %xtraiter486 = and i64 %230, 3
  %lcmp.mod487.not = icmp eq i64 %xtraiter486, 0
  br i1 %lcmp.mod487.not, label %scalar.ph455.prol.loopexit, label %scalar.ph455.prol

scalar.ph455.prol:                                ; preds = %scalar.ph455.preheader, %scalar.ph455.prol
  %indvars.iv374.prol = phi i64 [ %indvars.iv.next375.prol, %scalar.ph455.prol ], [ %indvars.iv374.ph, %scalar.ph455.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph455.prol ], [ 0, %scalar.ph455.preheader ]
  %231 = getelementptr inbounds i32, ptr %.3239, i64 %indvars.iv374.prol
  %232 = load i32, ptr %231, align 4, !tbaa !14
  %233 = getelementptr inbounds i32, ptr %227, i64 %indvars.iv374.prol
  %234 = load i32, ptr %233, align 4, !tbaa !14
  %235 = or i32 %234, %232
  store i32 %235, ptr %233, align 4, !tbaa !14
  %indvars.iv.next375.prol = add nsw i64 %indvars.iv374.prol, -1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter486
  br i1 %prol.iter.cmp.not, label %scalar.ph455.prol.loopexit, label %scalar.ph455.prol, !llvm.loop !44

scalar.ph455.prol.loopexit:                       ; preds = %scalar.ph455.prol, %scalar.ph455.preheader
  %indvars.iv374.unr = phi i64 [ %indvars.iv374.ph, %scalar.ph455.preheader ], [ %indvars.iv.next375.prol, %scalar.ph455.prol ]
  %236 = icmp ult i64 %indvars.iv374.ph, 3
  br i1 %236, label %.loopexit, label %scalar.ph455

vector.memcheck446:                               ; preds = %.lr.ph308
  %scevgep447 = getelementptr i8, ptr %227, i64 4
  %237 = shl nuw nsw i64 %228, 2
  %scevgep448 = getelementptr i8, ptr %scevgep447, i64 %237
  %scevgep449 = getelementptr i8, ptr %.3239, i64 4
  %scevgep450 = getelementptr i8, ptr %scevgep449, i64 %237
  %bound0451 = icmp ult ptr %227, %scevgep450
  %bound1452 = icmp ult ptr %.3239, %scevgep448
  %found.conflict453 = and i1 %bound0451, %bound1452
  br i1 %found.conflict453, label %scalar.ph455.preheader, label %vector.ph457

vector.ph457:                                     ; preds = %vector.memcheck446
  %n.vec459 = and i64 %229, 4294967288
  %ind.end460 = sub nsw i64 %228, %n.vec459
  br label %vector.body462

vector.body462:                                   ; preds = %vector.body462, %vector.ph457
  %index463 = phi i64 [ 0, %vector.ph457 ], [ %index.next475, %vector.body462 ]
  %offset.idx464 = sub i64 %228, %index463
  %238 = getelementptr inbounds i32, ptr %.3239, i64 %offset.idx464
  %239 = getelementptr inbounds i8, ptr %238, i64 -12
  %240 = getelementptr inbounds i8, ptr %238, i64 -28
  %wide.load465 = load <4 x i32>, ptr %239, align 4, !tbaa !14, !alias.scope !46
  %wide.load467 = load <4 x i32>, ptr %240, align 4, !tbaa !14, !alias.scope !46
  %241 = getelementptr inbounds i32, ptr %227, i64 %offset.idx464
  %242 = getelementptr inbounds i8, ptr %241, i64 -12
  %243 = getelementptr inbounds i8, ptr %241, i64 -28
  %wide.load469 = load <4 x i32>, ptr %242, align 4, !tbaa !14, !alias.scope !49, !noalias !46
  %wide.load471 = load <4 x i32>, ptr %243, align 4, !tbaa !14, !alias.scope !49, !noalias !46
  %244 = or <4 x i32> %wide.load469, %wide.load465
  %245 = or <4 x i32> %wide.load471, %wide.load467
  store <4 x i32> %244, ptr %242, align 4, !tbaa !14, !alias.scope !49, !noalias !46
  store <4 x i32> %245, ptr %243, align 4, !tbaa !14, !alias.scope !49, !noalias !46
  %index.next475 = add nuw i64 %index463, 8
  %246 = icmp eq i64 %index.next475, %n.vec459
  br i1 %246, label %middle.block454, label %vector.body462, !llvm.loop !51

middle.block454:                                  ; preds = %vector.body462
  %cmp.n476 = icmp eq i64 %229, %n.vec459
  br i1 %cmp.n476, label %.loopexit, label %scalar.ph455.preheader

.preheader275:                                    ; preds = %._crit_edge302
  %247 = icmp sgt i32 %301, 0
  br i1 %247, label %.lr.ph313, label %._crit_edge314

.lr.ph301:                                        ; preds = %.lr.ph301.preheader, %298
  %indvars.iv371 = phi i64 [ 0, %.lr.ph301.preheader ], [ %indvars.iv.next372, %298 ]
  %248 = phi ptr [ %219, %.lr.ph301.preheader ], [ %299, %298 ]
  %.0232299 = phi i32 [ 0, %.lr.ph301.preheader ], [ %.2234, %298 ]
  %.0236297 = phi ptr [ null, %.lr.ph301.preheader ], [ %.3239, %298 ]
  %.0240296 = phi i32 [ %223, %.lr.ph301.preheader ], [ %.2242, %298 ]
  %249 = getelementptr inbounds i8, ptr %248, i64 32
  %250 = load ptr, ptr %249, align 8, !tbaa !40
  %251 = getelementptr inbounds %struct.Intersection, ptr %250, i64 %indvars.iv371
  %.sroa.035.0.copyload = load ptr, ptr %251, align 8, !tbaa !7
  %252 = load i32, ptr %.sroa.035.0.copyload, align 8, !tbaa !38
  %253 = icmp eq i32 %252, 0
  br i1 %253, label %254, label %298

254:                                              ; preds = %.lr.ph301
  %.sroa.538.0..sroa_idx = getelementptr inbounds i8, ptr %251, i64 20
  %.sroa.538.0.copyload = load i32, ptr %.sroa.538.0..sroa_idx, align 4, !tbaa !14
  %.sroa.437.0..sroa_idx = getelementptr inbounds i8, ptr %251, i64 16
  %.sroa.437.0.copyload = load i32, ptr %.sroa.437.0..sroa_idx, align 8, !tbaa !14
  %255 = getelementptr inbounds i8, ptr %.sroa.035.0.copyload, i64 40
  %256 = load ptr, ptr %255, align 8, !tbaa !17
  %257 = getelementptr inbounds i8, ptr %.sroa.035.0.copyload, i64 20
  %258 = load i32, ptr %257, align 4, !tbaa !23
  %259 = sext i32 %258 to i64
  %gep = getelementptr ptr, ptr %invariant.gep, i64 %259
  %260 = load ptr, ptr %gep, align 8, !tbaa !7
  %261 = sext i32 %.sroa.437.0.copyload to i64
  %262 = getelementptr inbounds ptr, ptr %260, i64 %261
  %263 = load ptr, ptr %262, align 8, !tbaa !7
  %264 = sext i32 %.sroa.538.0.copyload to i64
  %265 = getelementptr inbounds i8, ptr %86, i64 %264
  %266 = load i8, ptr %265, align 1, !tbaa !52
  %267 = sext i8 %266 to i64
  %268 = getelementptr inbounds %struct.Map, ptr %263, i64 %267
  %269 = tail call i32 @fc_check(ptr noundef %256, ptr noundef %268) #15
  %.not261 = icmp eq i32 %269, 0
  br i1 %.not261, label %298, label %270

270:                                              ; preds = %254
  %.not262 = icmp eq ptr %.0236297, null
  br i1 %.not262, label %271, label %274

271:                                              ; preds = %270
  %272 = getelementptr inbounds i8, ptr %.sroa.035.0.copyload, i64 56
  %273 = load ptr, ptr %272, align 8, !tbaa !15
  br label %274

274:                                              ; preds = %271, %270
  %.1237 = phi ptr [ %.0236297, %270 ], [ %273, %271 ]
  %.1233 = phi i32 [ %.0232299, %270 ], [ 1, %271 ]
  %275 = getelementptr inbounds i8, ptr %.sroa.035.0.copyload, i64 56
  br label %276

276:                                              ; preds = %279, %274
  %indvars.iv368 = phi i64 [ %280, %279 ], [ %224, %274 ]
  %277 = trunc nuw i64 %indvars.iv368 to i32
  %278 = icmp sgt i32 %277, 0
  br i1 %278, label %279, label %.critedge266

279:                                              ; preds = %276
  %280 = add nsw i64 %indvars.iv368, -1
  %281 = load ptr, ptr %275, align 8, !tbaa !15
  %282 = getelementptr inbounds i32, ptr %281, i64 %280
  %283 = load i32, ptr %282, align 4, !tbaa !14
  %284 = icmp eq i32 %283, 0
  br i1 %284, label %276, label %.critedge, !llvm.loop !53

.critedge:                                        ; preds = %279
  %285 = trunc i64 %280 to i32
  %.not263 = icmp slt i32 %.0240296, %277
  %spec.select273 = select i1 %.not263, i32 %.0240296, i32 %285
  %spec.select274 = select i1 %.not263, ptr %.1237, ptr %281
  br label %.critedge266

.critedge266:                                     ; preds = %276, %.critedge
  %.1241 = phi i32 [ %spec.select273, %.critedge ], [ %.0240296, %276 ]
  %.2238 = phi ptr [ %spec.select274, %.critedge ], [ %.1237, %276 ]
  %286 = load ptr, ptr %80, align 8, !tbaa !7
  %287 = getelementptr inbounds i8, ptr %286, i64 40
  %288 = load ptr, ptr %287, align 8, !tbaa !17
  %289 = getelementptr inbounds i8, ptr %286, i64 20
  %290 = load i32, ptr %289, align 4, !tbaa !23
  %291 = sext i32 %290 to i64
  %gep295 = getelementptr ptr, ptr %invariant.gep, i64 %291
  %292 = load ptr, ptr %gep295, align 8, !tbaa !7
  %293 = getelementptr inbounds ptr, ptr %292, i64 %264
  %294 = load ptr, ptr %293, align 8, !tbaa !7
  %295 = load i8, ptr %265, align 1, !tbaa !52
  %296 = sext i8 %295 to i64
  %297 = getelementptr inbounds %struct.Map, ptr %294, i64 %296
  tail call void @remove_map(ptr noundef %288, ptr noundef %297) #15
  br label %298

298:                                              ; preds = %254, %.critedge266, %.lr.ph301
  %.2242 = phi i32 [ %.1241, %.critedge266 ], [ %.0240296, %254 ], [ %.0240296, %.lr.ph301 ]
  %.3239 = phi ptr [ %.2238, %.critedge266 ], [ %.0236297, %254 ], [ %.0236297, %.lr.ph301 ]
  %.2234 = phi i32 [ %.1233, %.critedge266 ], [ %.0232299, %254 ], [ %.0232299, %.lr.ph301 ]
  %indvars.iv.next372 = add nuw nsw i64 %indvars.iv371, 1
  %299 = load ptr, ptr %80, align 8, !tbaa !7
  %300 = getelementptr inbounds i8, ptr %299, i64 24
  %301 = load i32, ptr %300, align 8, !tbaa !16
  %302 = sext i32 %301 to i64
  %303 = icmp slt i64 %indvars.iv.next372, %302
  br i1 %303, label %.lr.ph301, label %._crit_edge302, !llvm.loop !54

scalar.ph455:                                     ; preds = %scalar.ph455.prol.loopexit, %scalar.ph455
  %indvars.iv374 = phi i64 [ %indvars.iv.next375.3, %scalar.ph455 ], [ %indvars.iv374.unr, %scalar.ph455.prol.loopexit ]
  %304 = getelementptr inbounds i32, ptr %.3239, i64 %indvars.iv374
  %305 = load i32, ptr %304, align 4, !tbaa !14
  %306 = getelementptr inbounds i32, ptr %227, i64 %indvars.iv374
  %307 = load i32, ptr %306, align 4, !tbaa !14
  %308 = or i32 %307, %305
  store i32 %308, ptr %306, align 4, !tbaa !14
  %indvars.iv.next375 = add nsw i64 %indvars.iv374, -1
  %309 = getelementptr inbounds i32, ptr %.3239, i64 %indvars.iv.next375
  %310 = load i32, ptr %309, align 4, !tbaa !14
  %311 = getelementptr inbounds i32, ptr %227, i64 %indvars.iv.next375
  %312 = load i32, ptr %311, align 4, !tbaa !14
  %313 = or i32 %312, %310
  store i32 %313, ptr %311, align 4, !tbaa !14
  %indvars.iv.next375.1 = add nsw i64 %indvars.iv374, -2
  %314 = getelementptr inbounds i32, ptr %.3239, i64 %indvars.iv.next375.1
  %315 = load i32, ptr %314, align 4, !tbaa !14
  %316 = getelementptr inbounds i32, ptr %227, i64 %indvars.iv.next375.1
  %317 = load i32, ptr %316, align 4, !tbaa !14
  %318 = or i32 %317, %315
  store i32 %318, ptr %316, align 4, !tbaa !14
  %indvars.iv.next375.2 = add nsw i64 %indvars.iv374, -3
  %319 = getelementptr inbounds i32, ptr %.3239, i64 %indvars.iv.next375.2
  %320 = load i32, ptr %319, align 4, !tbaa !14
  %321 = getelementptr inbounds i32, ptr %227, i64 %indvars.iv.next375.2
  %322 = load i32, ptr %321, align 4, !tbaa !14
  %323 = or i32 %322, %320
  store i32 %323, ptr %321, align 4, !tbaa !14
  %indvars.iv.next375.3 = add nsw i64 %indvars.iv374, -4
  %.not416.3 = icmp eq i64 %indvars.iv.next375.2, 0
  br i1 %.not416.3, label %.loopexit, label %scalar.ph455, !llvm.loop !55

._crit_edge314:                                   ; preds = %369, %218, %.preheader275
  %.4.lcssa = phi i32 [ %.0225340, %.preheader275 ], [ %.0225340, %218 ], [ %.5, %369 ]
  %.lcssa283 = phi ptr [ %299, %.preheader275 ], [ %219, %218 ], [ %370, %369 ]
  %324 = add nsw i32 %.0227339, 1
  store i32 1, ptr %.lcssa283, align 8, !tbaa !38
  %325 = getelementptr inbounds i8, ptr %.lcssa283, i64 64
  store ptr %86, ptr %325, align 8, !tbaa !56
  %326 = icmp eq i32 %324, %3
  br i1 %326, label %.thread, label %375

.lr.ph313:                                        ; preds = %.preheader275, %369
  %indvars.iv377 = phi i64 [ %indvars.iv.next378, %369 ], [ 0, %.preheader275 ]
  %327 = phi ptr [ %370, %369 ], [ %299, %.preheader275 ]
  %.4311 = phi i32 [ %.5, %369 ], [ %.0225340, %.preheader275 ]
  %328 = getelementptr inbounds i8, ptr %327, i64 32
  %329 = load ptr, ptr %328, align 8, !tbaa !40
  %330 = getelementptr inbounds %struct.Intersection, ptr %329, i64 %indvars.iv377
  %.sroa.0.0.copyload = load ptr, ptr %330, align 8, !tbaa !7
  %331 = load i32, ptr %.sroa.0.0.copyload, align 8, !tbaa !38
  %332 = icmp eq i32 %331, 0
  br i1 %332, label %333, label %369

333:                                              ; preds = %.lr.ph313
  %.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %330, i64 20
  %.sroa.5.0.copyload = load i32, ptr %.sroa.5.0..sroa_idx, align 4, !tbaa !14
  %.sroa.416.0..sroa_idx = getelementptr inbounds i8, ptr %330, i64 16
  %.sroa.416.0.copyload = load i32, ptr %.sroa.416.0..sroa_idx, align 8, !tbaa !14
  %334 = getelementptr inbounds i8, ptr %.sroa.0.0.copyload, i64 40
  %335 = load ptr, ptr %334, align 8, !tbaa !17
  %336 = getelementptr inbounds i8, ptr %335, i64 12
  %337 = load i32, ptr %336, align 4, !tbaa !37
  %338 = sext i32 %.4311 to i64
  %339 = getelementptr inbounds %struct.Map, ptr %44, i64 %338
  %340 = getelementptr inbounds i8, ptr %339, i64 12
  store i32 %337, ptr %340, align 4, !tbaa !37
  %341 = load ptr, ptr %339, align 8, !tbaa !22
  %342 = load ptr, ptr %335, align 8, !tbaa !22
  %343 = getelementptr inbounds i8, ptr %335, i64 8
  %344 = load i32, ptr %343, align 8, !tbaa !18
  %345 = sext i32 %344 to i64
  %346 = shl nsw i64 %345, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %341, ptr align 8 %342, i64 %346, i1 false)
  %347 = add nsw i32 %.4311, 1
  %348 = load ptr, ptr %334, align 8, !tbaa !17
  %349 = getelementptr inbounds i8, ptr %.sroa.0.0.copyload, i64 20
  %350 = load i32, ptr %349, align 4, !tbaa !23
  %351 = sext i32 %350 to i64
  %gep310 = getelementptr ptr, ptr %invariant.gep, i64 %351
  %352 = load ptr, ptr %gep310, align 8, !tbaa !7
  %353 = sext i32 %.sroa.416.0.copyload to i64
  %354 = getelementptr inbounds ptr, ptr %352, i64 %353
  %355 = load ptr, ptr %354, align 8, !tbaa !7
  %356 = sext i32 %.sroa.5.0.copyload to i64
  %357 = getelementptr inbounds i8, ptr %86, i64 %356
  %358 = load i8, ptr %357, align 1, !tbaa !52
  %359 = sext i8 %358 to i64
  %360 = getelementptr inbounds %struct.Map, ptr %355, i64 %359
  tail call void @join_map(ptr noundef %348, ptr noundef %360) #15
  %361 = load ptr, ptr %334, align 8, !tbaa !17
  %362 = getelementptr inbounds i8, ptr %361, i64 12
  %363 = load i32, ptr %362, align 4, !tbaa !37
  %364 = tail call i32 @sum_bit(ptr noundef %361) #15
  %.not260 = icmp eq i32 %363, %364
  br i1 %.not260, label %369, label %365

365:                                              ; preds = %333
  %366 = getelementptr inbounds i8, ptr %.sroa.0.0.copyload, i64 56
  %367 = load ptr, ptr %366, align 8, !tbaa !15
  %368 = getelementptr inbounds i32, ptr %367, i64 %79
  store i32 1, ptr %368, align 4, !tbaa !14
  br label %369

369:                                              ; preds = %333, %365, %.lr.ph313
  %.5 = phi i32 [ %.4311, %.lr.ph313 ], [ %347, %365 ], [ %347, %333 ]
  %indvars.iv.next378 = add nuw nsw i64 %indvars.iv377, 1
  %370 = load ptr, ptr %80, align 8, !tbaa !7
  %371 = getelementptr inbounds i8, ptr %370, i64 24
  %372 = load i32, ptr %371, align 8, !tbaa !16
  %373 = sext i32 %372 to i64
  %374 = icmp slt i64 %indvars.iv.next378, %373
  br i1 %374, label %.lr.ph313, label %._crit_edge314, !llvm.loop !57

375:                                              ; preds = %._crit_edge314
  tail call void @prop_word(ptr noundef nonnull %2, i32 noundef %3, i32 noundef %324) #15
  %376 = sext i32 %324 to i64
  %377 = getelementptr inbounds ptr, ptr %2, i64 %376
  %378 = load ptr, ptr %377, align 8, !tbaa !7
  %379 = getelementptr inbounds i8, ptr %378, i64 40
  %380 = load ptr, ptr %379, align 8, !tbaa !17
  %381 = getelementptr inbounds i8, ptr %380, i64 12
  %382 = load i32, ptr %381, align 4, !tbaa !37
  %383 = sext i32 %.4.lcssa to i64
  %384 = getelementptr inbounds %struct.Map, ptr %44, i64 %383
  %385 = getelementptr inbounds i8, ptr %384, i64 12
  store i32 %382, ptr %385, align 4, !tbaa !37
  %386 = load ptr, ptr %384, align 8, !tbaa !22
  %387 = load ptr, ptr %380, align 8, !tbaa !22
  %388 = getelementptr inbounds i8, ptr %380, i64 8
  %389 = load i32, ptr %388, align 8, !tbaa !18
  %390 = sext i32 %389 to i64
  %391 = shl nsw i64 %390, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %386, ptr align 8 %387, i64 %391, i1 false)
  %392 = add nsw i32 %.4.lcssa, 1
  br label %.loopexit

.loopexit.loopexit:                               ; preds = %._crit_edge335
  %393 = trunc nsw i64 %indvars.iv.next387 to i32
  br label %.loopexit

.loopexit:                                        ; preds = %scalar.ph455.prol.loopexit, %scalar.ph455, %middle.block454, %.loopexit.loopexit, %.preheader276, %375
  %.4231 = phi i32 [ %324, %375 ], [ %.0227339, %.preheader276 ], [ %393, %.loopexit.loopexit ], [ %.0227339, %middle.block454 ], [ %.0227339, %scalar.ph455 ], [ %.0227339, %scalar.ph455.prol.loopexit ]
  %.8 = phi i32 [ %392, %375 ], [ %.0225340, %.preheader276 ], [ %.2.lcssa, %.loopexit.loopexit ], [ %.0225340, %middle.block454 ], [ %.0225340, %scalar.ph455 ], [ %.0225340, %scalar.ph455.prol.loopexit ]
  %394 = icmp slt i32 %.4231, %3
  br i1 %394, label %78, label %.thread

.thread:                                          ; preds = %.loopexit, %._crit_edge314
  br i1 %6, label %.lr.ph345.preheader, label %.preheader

.lr.ph345.preheader:                              ; preds = %.thread
  %wide.trip.count392 = zext nneg i32 %3 to i64
  br label %.lr.ph345

.preheader:                                       ; preds = %.lr.ph345, %._crit_edge293, %.thread
  br i1 %46, label %.lr.ph347.preheader, label %._crit_edge348

.lr.ph347.preheader:                              ; preds = %.preheader
  %wide.trip.count397 = zext nneg i32 %.0219.lcssa to i64
  br label %.lr.ph347

.lr.ph345:                                        ; preds = %.lr.ph345.preheader, %.lr.ph345
  %indvars.iv389 = phi i64 [ 0, %.lr.ph345.preheader ], [ %indvars.iv.next390, %.lr.ph345 ]
  %395 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv389
  %396 = load ptr, ptr %395, align 8, !tbaa !7
  %397 = getelementptr inbounds i8, ptr %396, i64 64
  %398 = load ptr, ptr %397, align 8, !tbaa !56
  tail call void @write_word(ptr noundef %0, ptr noundef %396, ptr noundef %398) #15
  %indvars.iv.next390 = add nuw nsw i64 %indvars.iv389, 1
  %exitcond393.not = icmp eq i64 %indvars.iv.next390, %wide.trip.count392
  br i1 %exitcond393.not, label %.preheader, label %.lr.ph345, !llvm.loop !58

._crit_edge348:                                   ; preds = %.lr.ph347, %.preheader
  tail call void @free(ptr noundef %44) #15
  ret void

.lr.ph347:                                        ; preds = %.lr.ph347.preheader, %.lr.ph347
  %indvars.iv394 = phi i64 [ 0, %.lr.ph347.preheader ], [ %indvars.iv.next395, %.lr.ph347 ]
  %399 = getelementptr inbounds %struct.Map, ptr %44, i64 %indvars.iv394
  %400 = load ptr, ptr %399, align 8, !tbaa !22
  tail call void @free(ptr noundef %400) #15
  %indvars.iv.next395 = add nuw nsw i64 %indvars.iv394, 1
  %exitcond398.not = icmp eq i64 %indvars.iv.next395, %wide.trip.count397
  br i1 %exitcond398.not, label %._crit_edge348, label %.lr.ph347, !llvm.loop !59
}

declare void @prop_word(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #6

declare ptr @find_word(ptr noundef, ptr noundef) local_unnamed_addr #6

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

declare i32 @fc_check(ptr noundef, ptr noundef) local_unnamed_addr #6

declare void @remove_map(ptr noundef, ptr noundef) local_unnamed_addr #6

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

attributes #0 = { 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 #1 = { 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 #2 = { mustprogress nofree nosync nounwind willreturn memory(none) "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 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "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 = { mustprogress nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #5 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #6 = { "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 #7 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #8 = { 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 #9 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #10 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #11 = { nounwind allocsize(0,1) }
attributes #12 = { cold }
attributes #13 = { nounwind willreturn memory(none) }
attributes #14 = { noreturn nounwind }
attributes #15 = { nounwind }
attributes #16 = { nounwind allocsize(0) }
attributes #17 = { cold 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 = distinct !{!5, !6}
!6 = !{!"llvm.loop.mustprogress"}
!7 = !{!8, !8, i64 0}
!8 = !{!"any pointer", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = !{!12, !8, i64 48}
!12 = !{!"Word", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !8, i64 32, !8, i64 40, !8, i64 48, !8, i64 56, !8, i64 64}
!13 = !{!"int", !9, i64 0}
!14 = !{!13, !13, i64 0}
!15 = !{!12, !8, i64 56}
!16 = !{!12, !13, i64 24}
!17 = !{!12, !8, i64 40}
!18 = !{!19, !13, i64 8}
!19 = !{!"Map", !8, i64 0, !13, i64 8, !13, i64 12}
!20 = distinct !{!20, !6}
!21 = distinct !{!21, !6}
!22 = !{!19, !8, i64 0}
!23 = !{!12, !13, i64 20}
!24 = distinct !{!24, !6}
!25 = !{!26}
!26 = distinct !{!26, !27}
!27 = distinct !{!27, !"LVerDomain"}
!28 = !{!29}
!29 = distinct !{!29, !27}
!30 = !{!31}
!31 = distinct !{!31, !27}
!32 = !{!26, !29}
!33 = distinct !{!33, !6, !34, !35}
!34 = !{!"llvm.loop.isvectorized", i32 1}
!35 = !{!"llvm.loop.unroll.runtime.disable"}
!36 = distinct !{!36, !6, !34}
!37 = !{!19, !13, i64 12}
!38 = !{!12, !13, i64 0}
!39 = distinct !{!39, !6}
!40 = !{!12, !8, i64 32}
!41 = !{!42, !8, i64 0}
!42 = !{!"Intersection", !8, i64 0, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20}
!43 = distinct !{!43, !6}
!44 = distinct !{!44, !45}
!45 = !{!"llvm.loop.unroll.disable"}
!46 = !{!47}
!47 = distinct !{!47, !48}
!48 = distinct !{!48, !"LVerDomain"}
!49 = !{!50}
!50 = distinct !{!50, !48}
!51 = distinct !{!51, !6, !34, !35}
!52 = !{!9, !9, i64 0}
!53 = distinct !{!53, !6}
!54 = distinct !{!54, !6}
!55 = distinct !{!55, !6, !34}
!56 = !{!12, !8, i64 64}
!57 = distinct !{!57, !6}
!58 = distinct !{!58, !6}
!59 = distinct !{!59, !6}


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