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

; 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.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 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [75 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @main(i32 noundef %0, ptr noundef %1) #0 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca i32, align 4
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  store i32 0, ptr %3, align 4
  store i32 %0, ptr %4, align 4, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !9
  %29 = load i32, ptr %4, align 4, !tbaa !5
  %30 = icmp slt i32 %29, 2
  br i1 %30, label %31, label %34

31:                                               ; preds = %2
  %32 = load ptr, ptr @stderr, align 8, !tbaa !9
  %33 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %32, ptr noundef @.str) #10
  store i32 1, ptr %3, align 4
  br label %376

34:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #10
  store ptr @.str.1, ptr %6, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #10
  %35 = load ptr, ptr %5, align 8, !tbaa !9
  %36 = getelementptr inbounds ptr, ptr %35, i64 1
  %37 = load ptr, ptr %36, align 8, !tbaa !9
  store ptr %37, ptr %7, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #10
  store i32 0, ptr %8, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #10
  store i32 0, ptr %9, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #10
  store i32 2, ptr %10, align 4, !tbaa !5
  br label %38

38:                                               ; preds = %97, %34
  %39 = load i32, ptr %10, align 4, !tbaa !5
  %40 = load i32, ptr %4, align 4, !tbaa !5
  %41 = icmp slt i32 %39, %40
  br i1 %41, label %43, label %42

42:                                               ; preds = %38
  store i32 2, ptr %11, align 4
  br label %100

43:                                               ; preds = %38
  %44 = load ptr, ptr %5, align 8, !tbaa !9
  %45 = load i32, ptr %10, align 4, !tbaa !5
  %46 = sext i32 %45 to i64
  %47 = getelementptr inbounds ptr, ptr %44, i64 %46
  %48 = load ptr, ptr %47, align 8, !tbaa !9
  %49 = call i32 @strcmp(ptr noundef %48, ptr noundef @.str.2) #11
  %50 = icmp ne i32 %49, 0
  br i1 %50, label %68, label %51

51:                                               ; preds = %43
  %52 = load ptr, ptr %5, align 8, !tbaa !9
  %53 = load i32, ptr %10, align 4, !tbaa !5
  %54 = add nsw i32 %53, 1
  store i32 %54, ptr %10, align 4, !tbaa !5
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds ptr, ptr %52, i64 %55
  %57 = load ptr, ptr %56, align 8, !tbaa !9
  %58 = icmp eq ptr %57, null
  br i1 %58, label %59, label %62

59:                                               ; preds = %51
  %60 = load ptr, ptr @stderr, align 8, !tbaa !9
  %61 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %60, ptr noundef @.str.3) #10
  store i32 1, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %100

62:                                               ; preds = %51
  %63 = load ptr, ptr %5, align 8, !tbaa !9
  %64 = load i32, ptr %10, align 4, !tbaa !5
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds ptr, ptr %63, i64 %65
  %67 = load ptr, ptr %66, align 8, !tbaa !9
  store ptr %67, ptr %6, align 8, !tbaa !9
  br label %96

68:                                               ; preds = %43
  %69 = load ptr, ptr %5, align 8, !tbaa !9
  %70 = load i32, ptr %10, align 4, !tbaa !5
  %71 = sext i32 %70 to i64
  %72 = getelementptr inbounds ptr, ptr %69, i64 %71
  %73 = load ptr, ptr %72, align 8, !tbaa !9
  %74 = call i32 @strcmp(ptr noundef %73, ptr noundef @.str.4) #11
  %75 = icmp ne i32 %74, 0
  br i1 %75, label %77, label %76

76:                                               ; preds = %68
  store i32 1, ptr %8, align 4, !tbaa !5
  br label %95

77:                                               ; preds = %68
  %78 = load ptr, ptr %5, align 8, !tbaa !9
  %79 = load i32, ptr %10, align 4, !tbaa !5
  %80 = sext i32 %79 to i64
  %81 = getelementptr inbounds ptr, ptr %78, i64 %80
  %82 = load ptr, ptr %81, align 8, !tbaa !9
  %83 = call i32 @strcmp(ptr noundef %82, ptr noundef @.str.5) #11
  %84 = icmp ne i32 %83, 0
  br i1 %84, label %86, label %85

85:                                               ; preds = %77
  store i32 1, ptr %9, align 4, !tbaa !5
  br label %94

86:                                               ; preds = %77
  %87 = load ptr, ptr @stderr, align 8, !tbaa !9
  %88 = load ptr, ptr %5, align 8, !tbaa !9
  %89 = load i32, ptr %10, align 4, !tbaa !5
  %90 = sext i32 %89 to i64
  %91 = getelementptr inbounds ptr, ptr %88, i64 %90
  %92 = load ptr, ptr %91, align 8, !tbaa !9
  %93 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %87, ptr noundef @.str.6, ptr noundef %92) #10
  store i32 1, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %100

94:                                               ; preds = %85
  br label %95

95:                                               ; preds = %94, %76
  br label %96

96:                                               ; preds = %95, %62
  br label %97

97:                                               ; preds = %96
  %98 = load i32, ptr %10, align 4, !tbaa !5
  %99 = add nsw i32 %98, 1
  store i32 %99, ptr %10, align 4, !tbaa !5
  br label %38, !llvm.loop !11

100:                                              ; preds = %86, %59, %42
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #10
  %101 = load i32, ptr %11, align 4
  switch i32 %101, label %375 [
    i32 2, label %102
  ]

102:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #10
  store ptr null, ptr %12, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #10
  %103 = load ptr, ptr %7, align 8, !tbaa !9
  call void @init_crossword(ptr noundef %103, ptr noundef %12, ptr noundef %14, ptr noundef %13)
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #10
  %104 = load i32, ptr %13, align 4, !tbaa !5
  %105 = sext i32 %104 to i64
  %106 = call noalias ptr @calloc(i64 noundef %105, i64 noundef 4) #12
  store ptr %106, ptr %15, align 8, !tbaa !9
  %107 = load ptr, ptr %15, align 8, !tbaa !9
  %108 = icmp eq ptr %107, null
  br i1 %108, label %109, label %112

109:                                              ; preds = %102
  call void @perror(ptr noundef @.str.7)
  %110 = call ptr @__errno_location() #13
  %111 = load i32, ptr %110, align 4, !tbaa !5
  call void @exit(i32 noundef %111) #14
  unreachable

112:                                              ; preds = %102
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #10
  %113 = call noalias ptr @calloc(i64 noundef 256, i64 noundef 4) #12
  store ptr %113, ptr %16, align 8, !tbaa !9
  %114 = load ptr, ptr %16, align 8, !tbaa !9
  %115 = icmp eq ptr %114, null
  br i1 %115, label %116, label %119

116:                                              ; preds = %112
  call void @perror(ptr noundef @.str.8)
  %117 = call ptr @__errno_location() #13
  %118 = load i32, ptr %117, align 4, !tbaa !5
  call void @exit(i32 noundef %118) #14
  unreachable

119:                                              ; preds = %112
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #10
  %120 = load ptr, ptr %12, align 8, !tbaa !9
  %121 = load i32, ptr %14, align 4, !tbaa !5
  %122 = load ptr, ptr %15, align 8, !tbaa !9
  %123 = call i32 @count_words_on_grid(ptr noundef %120, i32 noundef %121, ptr noundef %122)
  store i32 %123, ptr %17, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #10
  %124 = load ptr, ptr %12, align 8, !tbaa !9
  %125 = load i32, ptr %14, align 4, !tbaa !5
  %126 = load i32, ptr %17, align 4, !tbaa !5
  %127 = call ptr @map_words_on_grid(ptr noundef %124, i32 noundef %125, i32 noundef %126)
  store ptr %127, ptr %18, align 8, !tbaa !9
  %128 = load i32, ptr %17, align 4, !tbaa !5
  %129 = icmp slt i32 %128, 1
  br i1 %129, label %130, label %133

130:                                              ; preds = %119
  %131 = load ptr, ptr @stderr, align 8, !tbaa !9
  %132 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %131, ptr noundef @.str.9) #10
  store i32 1, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %374

133:                                              ; preds = %119
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #10
  store ptr null, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #10
  store ptr null, ptr %20, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #10
  %134 = load ptr, ptr %6, align 8, !tbaa !9
  %135 = load i32, ptr %13, align 4, !tbaa !5
  %136 = load ptr, ptr %15, align 8, !tbaa !9
  %137 = load ptr, ptr %16, align 8, !tbaa !9
  %138 = call ptr @init_dictionary(ptr noundef %134, i32 noundef %135, ptr noundef %20, ptr noundef %19, ptr noundef %136, ptr noundef %137)
  store ptr %138, ptr %21, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #10
  %139 = load ptr, ptr %21, align 8, !tbaa !9
  %140 = load i32, ptr %13, align 4, !tbaa !5
  %141 = load ptr, ptr %19, align 8, !tbaa !9
  %142 = load ptr, ptr %15, align 8, !tbaa !9
  %143 = load ptr, ptr %16, align 8, !tbaa !9
  %144 = call ptr @init_dict_maps(ptr noundef %139, i32 noundef %140, ptr noundef %141, ptr noundef %142, ptr noundef %143)
  store ptr %144, ptr %22, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #10
  store i32 0, ptr %23, align 4, !tbaa !5
  br label %145

145:                                              ; preds = %256, %133
  %146 = load i32, ptr %23, align 4, !tbaa !5
  %147 = load i32, ptr %17, align 4, !tbaa !5
  %148 = icmp slt i32 %146, %147
  br i1 %148, label %150, label %149

149:                                              ; preds = %145
  store i32 5, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #10
  br label %259

150:                                              ; preds = %145
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #10
  %151 = load ptr, ptr %22, align 8, !tbaa !9
  %152 = load ptr, ptr %18, align 8, !tbaa !9
  %153 = load i32, ptr %23, align 4, !tbaa !5
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds ptr, ptr %152, i64 %154
  %156 = load ptr, ptr %155, align 8, !tbaa !9
  %157 = getelementptr inbounds %struct.Word, ptr %156, i32 0, i32 5
  %158 = load i32, ptr %157, align 4, !tbaa !13
  %159 = sub nsw i32 %158, 1
  %160 = sext i32 %159 to i64
  %161 = getelementptr inbounds ptr, ptr %151, i64 %160
  %162 = load ptr, ptr %161, align 8, !tbaa !9
  %163 = load ptr, ptr %18, align 8, !tbaa !9
  %164 = load i32, ptr %23, align 4, !tbaa !5
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds ptr, ptr %163, i64 %165
  %167 = load ptr, ptr %166, align 8, !tbaa !9
  %168 = getelementptr inbounds %struct.Word, ptr %167, i32 0, i32 5
  %169 = load i32, ptr %168, align 4, !tbaa !13
  %170 = sext i32 %169 to i64
  %171 = getelementptr inbounds ptr, ptr %162, i64 %170
  %172 = load ptr, ptr %171, align 8, !tbaa !9
  store ptr %172, ptr %24, align 8, !tbaa !9
  %173 = call noalias ptr @malloc(i64 noundef 16) #15
  %174 = load ptr, ptr %18, align 8, !tbaa !9
  %175 = load i32, ptr %23, align 4, !tbaa !5
  %176 = sext i32 %175 to i64
  %177 = getelementptr inbounds ptr, ptr %174, i64 %176
  %178 = load ptr, ptr %177, align 8, !tbaa !9
  %179 = getelementptr inbounds %struct.Word, ptr %178, i32 0, i32 8
  store ptr %173, ptr %179, align 8, !tbaa !15
  %180 = load ptr, ptr %18, align 8, !tbaa !9
  %181 = load i32, ptr %23, align 4, !tbaa !5
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds ptr, ptr %180, i64 %182
  %184 = load ptr, ptr %183, align 8, !tbaa !9
  %185 = getelementptr inbounds %struct.Word, ptr %184, i32 0, i32 8
  %186 = load ptr, ptr %185, align 8, !tbaa !15
  %187 = icmp eq ptr %186, null
  br i1 %187, label %188, label %191

188:                                              ; preds = %150
  call void @perror(ptr noundef @.str.10)
  %189 = call ptr @__errno_location() #13
  %190 = load i32, ptr %189, align 4, !tbaa !5
  call void @exit(i32 noundef %190) #14
  unreachable

191:                                              ; preds = %150
  %192 = load ptr, ptr %24, align 8, !tbaa !9
  %193 = getelementptr inbounds %struct.Map, ptr %192, i32 0, i32 1
  %194 = load i32, ptr %193, align 8, !tbaa !16
  %195 = load ptr, ptr %18, align 8, !tbaa !9
  %196 = load i32, ptr %23, align 4, !tbaa !5
  %197 = sext i32 %196 to i64
  %198 = getelementptr inbounds ptr, ptr %195, i64 %197
  %199 = load ptr, ptr %198, align 8, !tbaa !9
  %200 = getelementptr inbounds %struct.Word, ptr %199, i32 0, i32 8
  %201 = load ptr, ptr %200, align 8, !tbaa !15
  %202 = getelementptr inbounds %struct.Map, ptr %201, i32 0, i32 1
  store i32 %194, ptr %202, align 8, !tbaa !16
  %203 = load ptr, ptr %24, align 8, !tbaa !9
  %204 = getelementptr inbounds %struct.Map, ptr %203, i32 0, i32 1
  %205 = load i32, ptr %204, align 8, !tbaa !16
  %206 = sext i32 %205 to i64
  %207 = mul i64 %206, 8
  %208 = call noalias ptr @malloc(i64 noundef %207) #15
  %209 = load ptr, ptr %18, align 8, !tbaa !9
  %210 = load i32, ptr %23, align 4, !tbaa !5
  %211 = sext i32 %210 to i64
  %212 = getelementptr inbounds ptr, ptr %209, i64 %211
  %213 = load ptr, ptr %212, align 8, !tbaa !9
  %214 = getelementptr inbounds %struct.Word, ptr %213, i32 0, i32 8
  %215 = load ptr, ptr %214, align 8, !tbaa !15
  %216 = getelementptr inbounds %struct.Map, ptr %215, i32 0, i32 0
  store ptr %208, ptr %216, align 8, !tbaa !18
  %217 = load ptr, ptr %18, align 8, !tbaa !9
  %218 = load i32, ptr %23, align 4, !tbaa !5
  %219 = sext i32 %218 to i64
  %220 = getelementptr inbounds ptr, ptr %217, i64 %219
  %221 = load ptr, ptr %220, align 8, !tbaa !9
  %222 = getelementptr inbounds %struct.Word, ptr %221, i32 0, i32 8
  %223 = load ptr, ptr %222, align 8, !tbaa !15
  %224 = getelementptr inbounds %struct.Map, ptr %223, i32 0, i32 0
  %225 = load ptr, ptr %224, align 8, !tbaa !18
  %226 = icmp eq ptr %225, null
  br i1 %226, label %227, label %230

227:                                              ; preds = %191
  call void @perror(ptr noundef @.str.11)
  %228 = call ptr @__errno_location() #13
  %229 = load i32, ptr %228, align 4, !tbaa !5
  call void @exit(i32 noundef %229) #14
  unreachable

230:                                              ; preds = %191
  %231 = load ptr, ptr %18, align 8, !tbaa !9
  %232 = load i32, ptr %23, align 4, !tbaa !5
  %233 = sext i32 %232 to i64
  %234 = getelementptr inbounds ptr, ptr %231, i64 %233
  %235 = load ptr, ptr %234, align 8, !tbaa !9
  %236 = getelementptr inbounds %struct.Word, ptr %235, i32 0, i32 8
  %237 = load ptr, ptr %236, align 8, !tbaa !15
  %238 = getelementptr inbounds %struct.Map, ptr %237, i32 0, i32 0
  %239 = load ptr, ptr %238, align 8, !tbaa !18
  %240 = load ptr, ptr %24, align 8, !tbaa !9
  %241 = getelementptr inbounds %struct.Map, ptr %240, i32 0, i32 0
  %242 = load ptr, ptr %241, align 8, !tbaa !18
  %243 = load ptr, ptr %24, align 8, !tbaa !9
  %244 = getelementptr inbounds %struct.Map, ptr %243, i32 0, i32 1
  %245 = load i32, ptr %244, align 8, !tbaa !16
  %246 = sext i32 %245 to i64
  %247 = mul i64 %246, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %239, ptr align 8 %242, i64 %247, i1 false)
  %248 = load ptr, ptr %18, align 8, !tbaa !9
  %249 = load i32, ptr %23, align 4, !tbaa !5
  %250 = sext i32 %249 to i64
  %251 = getelementptr inbounds ptr, ptr %248, i64 %250
  %252 = load ptr, ptr %251, align 8, !tbaa !9
  %253 = getelementptr inbounds %struct.Word, ptr %252, i32 0, i32 8
  %254 = load ptr, ptr %253, align 8, !tbaa !15
  %255 = call i32 @sum_bit(ptr noundef %254)
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #10
  br label %256

256:                                              ; preds = %230
  %257 = load i32, ptr %23, align 4, !tbaa !5
  %258 = add nsw i32 %257, 1
  store i32 %258, ptr %23, align 4, !tbaa !5
  br label %145, !llvm.loop !19

259:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #10
  %260 = load i32, ptr %17, align 4, !tbaa !5
  %261 = sext i32 %260 to i64
  %262 = mul i64 %261, 8
  %263 = call noalias ptr @malloc(i64 noundef %262) #15
  store ptr %263, ptr %25, align 8, !tbaa !9
  %264 = load ptr, ptr %25, align 8, !tbaa !9
  %265 = icmp eq ptr %264, null
  br i1 %265, label %266, label %269

266:                                              ; preds = %259
  call void @perror(ptr noundef @.str.12)
  %267 = call ptr @__errno_location() #13
  %268 = load i32, ptr %267, align 4, !tbaa !5
  call void @exit(i32 noundef %268) #14
  unreachable

269:                                              ; preds = %259
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #10
  store i32 0, ptr %26, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #10
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %270

270:                                              ; preds = %296, %269
  %271 = load i32, ptr %27, align 4, !tbaa !5
  %272 = load i32, ptr %17, align 4, !tbaa !5
  %273 = icmp slt i32 %271, %272
  br i1 %273, label %275, label %274

274:                                              ; preds = %270
  store i32 8, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #10
  br label %299

275:                                              ; preds = %270
  %276 = load ptr, ptr %18, align 8, !tbaa !9
  %277 = load i32, ptr %27, align 4, !tbaa !5
  %278 = sext i32 %277 to i64
  %279 = getelementptr inbounds ptr, ptr %276, i64 %278
  %280 = load ptr, ptr %279, align 8, !tbaa !9
  %281 = getelementptr inbounds %struct.Word, ptr %280, i32 0, i32 1
  %282 = load i32, ptr %281, align 4, !tbaa !20
  %283 = icmp eq i32 %282, 0
  br i1 %283, label %284, label %295

284:                                              ; preds = %275
  %285 = load ptr, ptr %18, align 8, !tbaa !9
  %286 = load i32, ptr %27, align 4, !tbaa !5
  %287 = sext i32 %286 to i64
  %288 = getelementptr inbounds ptr, ptr %285, i64 %287
  %289 = load ptr, ptr %288, align 8, !tbaa !9
  %290 = load ptr, ptr %25, align 8, !tbaa !9
  %291 = load i32, ptr %26, align 4, !tbaa !5
  %292 = add nsw i32 %291, 1
  store i32 %292, ptr %26, align 4, !tbaa !5
  %293 = sext i32 %291 to i64
  %294 = getelementptr inbounds ptr, ptr %290, i64 %293
  store ptr %289, ptr %294, align 8, !tbaa !9
  br label %295

295:                                              ; preds = %284, %275
  br label %296

296:                                              ; preds = %295
  %297 = load i32, ptr %27, align 4, !tbaa !5
  %298 = add nsw i32 %297, 1
  store i32 %298, ptr %27, align 4, !tbaa !5
  br label %270, !llvm.loop !21

299:                                              ; preds = %274
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #10
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %300

300:                                              ; preds = %326, %299
  %301 = load i32, ptr %28, align 4, !tbaa !5
  %302 = load i32, ptr %17, align 4, !tbaa !5
  %303 = icmp slt i32 %301, %302
  br i1 %303, label %305, label %304

304:                                              ; preds = %300
  store i32 11, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #10
  br label %329

305:                                              ; preds = %300
  %306 = load ptr, ptr %18, align 8, !tbaa !9
  %307 = load i32, ptr %28, align 4, !tbaa !5
  %308 = sext i32 %307 to i64
  %309 = getelementptr inbounds ptr, ptr %306, i64 %308
  %310 = load ptr, ptr %309, align 8, !tbaa !9
  %311 = getelementptr inbounds %struct.Word, ptr %310, i32 0, i32 1
  %312 = load i32, ptr %311, align 4, !tbaa !20
  %313 = icmp eq i32 %312, 1
  br i1 %313, label %314, label %325

314:                                              ; preds = %305
  %315 = load ptr, ptr %18, align 8, !tbaa !9
  %316 = load i32, ptr %28, align 4, !tbaa !5
  %317 = sext i32 %316 to i64
  %318 = getelementptr inbounds ptr, ptr %315, i64 %317
  %319 = load ptr, ptr %318, align 8, !tbaa !9
  %320 = load ptr, ptr %25, align 8, !tbaa !9
  %321 = load i32, ptr %26, align 4, !tbaa !5
  %322 = add nsw i32 %321, 1
  store i32 %322, ptr %26, align 4, !tbaa !5
  %323 = sext i32 %321 to i64
  %324 = getelementptr inbounds ptr, ptr %320, i64 %323
  store ptr %319, ptr %324, align 8, !tbaa !9
  br label %325

325:                                              ; preds = %314, %305
  br label %326

326:                                              ; preds = %325
  %327 = load i32, ptr %28, align 4, !tbaa !5
  %328 = add nsw i32 %327, 1
  store i32 %328, ptr %28, align 4, !tbaa !5
  br label %300, !llvm.loop !22

329:                                              ; preds = %304
  %330 = load i32, ptr %8, align 4, !tbaa !5
  %331 = icmp ne i32 %330, 0
  br i1 %331, label %332, label %343

332:                                              ; preds = %329
  %333 = load ptr, ptr %12, align 8, !tbaa !9
  %334 = load ptr, ptr %25, align 8, !tbaa !9
  %335 = load ptr, ptr %22, align 8, !tbaa !9
  %336 = load i32, ptr %17, align 4, !tbaa !5
  call void @check_crossword(ptr noundef %333, ptr noundef %334, ptr noundef %335, i32 noundef %336)
  %337 = load i32, ptr %9, align 4, !tbaa !5
  %338 = icmp ne i32 %337, 0
  br i1 %338, label %339, label %342

339:                                              ; preds = %332
  %340 = load ptr, ptr %12, align 8, !tbaa !9
  %341 = load i32, ptr %14, align 4, !tbaa !5
  call void @draw_crossword(ptr noundef %340, i32 noundef %341)
  br label %342

342:                                              ; preds = %339, %332
  br label %359

343:                                              ; preds = %329
  %344 = load ptr, ptr %12, align 8, !tbaa !9
  %345 = load ptr, ptr %21, align 8, !tbaa !9
  %346 = load ptr, ptr %18, align 8, !tbaa !9
  %347 = load i32, ptr %17, align 4, !tbaa !5
  %348 = load ptr, ptr %22, align 8, !tbaa !9
  call void @solve_crossword(ptr noundef %344, ptr noundef %345, ptr noundef %346, i32 noundef %347, ptr noundef %348)
  %349 = load i32, ptr %9, align 4, !tbaa !5
  %350 = icmp ne i32 %349, 0
  br i1 %350, label %351, label %354

351:                                              ; preds = %343
  %352 = load ptr, ptr %12, align 8, !tbaa !9
  %353 = load i32, ptr %14, align 4, !tbaa !5
  call void @draw_crossword(ptr noundef %352, i32 noundef %353)
  br label %358

354:                                              ; preds = %343
  %355 = load ptr, ptr %12, align 8, !tbaa !9
  %356 = load ptr, ptr %25, align 8, !tbaa !9
  %357 = load i32, ptr %17, align 4, !tbaa !5
  call void @print_solution(ptr noundef %355, ptr noundef %356, i32 noundef %357)
  br label %358

358:                                              ; preds = %354, %351
  br label %359

359:                                              ; preds = %358, %342
  %360 = load ptr, ptr %25, align 8, !tbaa !9
  call void @free(ptr noundef %360) #10
  %361 = load ptr, ptr %21, align 8, !tbaa !9
  %362 = load i32, ptr %13, align 4, !tbaa !5
  %363 = load ptr, ptr %20, align 8, !tbaa !9
  call void @free_dictionary(ptr noundef %361, i32 noundef %362, ptr noundef %363)
  %364 = load ptr, ptr %19, align 8, !tbaa !9
  call void @free(ptr noundef %364) #10
  %365 = load ptr, ptr %22, align 8, !tbaa !9
  %366 = load i32, ptr %13, align 4, !tbaa !5
  call void @free_maps(ptr noundef %365, i32 noundef %366)
  %367 = load ptr, ptr %15, align 8, !tbaa !9
  call void @free(ptr noundef %367) #10
  %368 = load ptr, ptr %16, align 8, !tbaa !9
  call void @free(ptr noundef %368) #10
  %369 = load ptr, ptr %18, align 8, !tbaa !9
  %370 = load i32, ptr %17, align 4, !tbaa !5
  call void @free_words(ptr noundef %369, i32 noundef %370)
  %371 = load ptr, ptr %12, align 8, !tbaa !9
  %372 = load ptr, ptr %371, align 8, !tbaa !9
  call void @free(ptr noundef %372) #10
  %373 = load ptr, ptr %12, align 8, !tbaa !9
  call void @free(ptr noundef %373) #10
  store i32 0, ptr %3, align 4
  store i32 1, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #10
  br label %374

374:                                              ; preds = %359, %130
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #10
  br label %375

375:                                              ; preds = %374, %100
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #10
  br label %376

376:                                              ; preds = %375, %31
  %377 = load i32, ptr %3, align 4
  ret i32 %377
}

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

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

; Function Attrs: nounwind willreturn memory(read)
declare i32 @strcmp(ptr noundef, ptr noundef) #3

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

declare void @init_crossword(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

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

declare void @perror(ptr noundef) #4

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

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

declare i32 @count_words_on_grid(ptr noundef, i32 noundef, ptr noundef) #4

declare ptr @map_words_on_grid(ptr noundef, i32 noundef, i32 noundef) #4

declare ptr @init_dictionary(ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

declare ptr @init_dict_maps(ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) #4

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

; 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) #9

declare i32 @sum_bit(ptr noundef) #4

declare void @check_crossword(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #4

declare void @draw_crossword(ptr noundef, i32 noundef) #4

declare void @solve_crossword(ptr noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef) #4

declare void @print_solution(ptr noundef, ptr noundef, i32 noundef) #4

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

declare void @free_dictionary(ptr noundef, i32 noundef, ptr noundef) #4

declare void @free_maps(ptr noundef, i32 noundef) #4

declare void @free_words(ptr noundef, i32 noundef) #4

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { 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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nounwind willreturn memory(read) "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 = { "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,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 #6 = { 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 #7 = { 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 #8 = { 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 #9 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #10 = { nounwind }
attributes #11 = { nounwind willreturn memory(read) }
attributes #12 = { nounwind allocsize(0,1) }
attributes #13 = { nounwind willreturn memory(none) }
attributes #14 = { noreturn nounwind }
attributes #15 = { 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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = !{!14, !6, i64 20}
!14 = !{!"Word", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64}
!15 = !{!14, !10, i64 40}
!16 = !{!17, !6, i64 8}
!17 = !{!"Map", !10, i64 0, !6, i64 8, !6, i64 12}
!18 = !{!17, !10, i64 0}
!19 = distinct !{!19, !12}
!20 = !{!14, !6, i64 4}
!21 = distinct !{!21, !12}
!22 = distinct !{!22, !12}


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

@stderr = external local_unnamed_addr global ptr, align 8
@.str = external hidden unnamed_addr constant [22 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [75 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @main(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #0 {
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = icmp slt i32 %0, 2
  br i1 %8, label %9, label %12

9:                                                ; preds = %2
  %10 = load ptr, ptr @stderr, align 8, !tbaa !5
  %11 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %10, ptr noundef nonnull @.str) #12
  br label %.thread

12:                                               ; preds = %2
  %13 = getelementptr inbounds i8, ptr %1, i64 8
  %14 = load ptr, ptr %13, align 8, !tbaa !5
  %.not121134.not = icmp eq i32 %0, 2
  br i1 %.not121134.not, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %12, %35
  %.0101138 = phi ptr [ %.1102, %35 ], [ @.str.1, %12 ]
  %.0104137 = phi i32 [ %.1105, %35 ], [ 0, %12 ]
  %.0106136 = phi i32 [ %.1107, %35 ], [ 0, %12 ]
  %.0108135 = phi i32 [ %36, %35 ], [ 2, %12 ]
  %15 = sext i32 %.0108135 to i64
  %16 = getelementptr inbounds ptr, ptr %1, i64 %15
  %17 = load ptr, ptr %16, align 8, !tbaa !5
  %18 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %17, ptr noundef nonnull dereferenceable(1) @.str.2) #13
  %.not = icmp eq i32 %18, 0
  br i1 %.not, label %19, label %28

19:                                               ; preds = %.lr.ph
  %20 = add nsw i32 %.0108135, 1
  %21 = sext i32 %20 to i64
  %22 = getelementptr inbounds ptr, ptr %1, i64 %21
  %23 = load ptr, ptr %22, align 8, !tbaa !5
  %24 = icmp eq ptr %23, null
  br i1 %24, label %25, label %35

25:                                               ; preds = %19
  %26 = load ptr, ptr @stderr, align 8, !tbaa !5
  %27 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %26, ptr noundef nonnull @.str.3) #12
  br label %.thread

28:                                               ; preds = %.lr.ph
  %29 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %17, ptr noundef nonnull dereferenceable(1) @.str.4) #13
  %.not119 = icmp eq i32 %29, 0
  br i1 %.not119, label %35, label %30

30:                                               ; preds = %28
  %31 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %17, ptr noundef nonnull dereferenceable(1) @.str.5) #13
  %.not120 = icmp eq i32 %31, 0
  br i1 %.not120, label %35, label %32

32:                                               ; preds = %30
  %33 = load ptr, ptr @stderr, align 8, !tbaa !5
  %34 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %33, ptr noundef nonnull @.str.6, ptr noundef %17) #12
  br label %.thread

35:                                               ; preds = %30, %28, %19
  %.1109 = phi i32 [ %20, %19 ], [ %.0108135, %28 ], [ %.0108135, %30 ]
  %.1107 = phi i32 [ %.0106136, %19 ], [ %.0106136, %28 ], [ 1, %30 ]
  %.1105 = phi i32 [ %.0104137, %19 ], [ 1, %28 ], [ %.0104137, %30 ]
  %.1102 = phi ptr [ %23, %19 ], [ %.0101138, %28 ], [ %.0101138, %30 ]
  %36 = add nsw i32 %.1109, 1
  %.not121 = icmp slt i32 %36, %0
  br i1 %.not121, label %.lr.ph, label %._crit_edge.loopexit, !llvm.loop !9

._crit_edge.loopexit:                             ; preds = %35
  %37 = icmp eq i32 %.1105, 0
  %38 = icmp eq i32 %.1107, 0
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %12
  %.0106.lcssa = phi i1 [ true, %12 ], [ %38, %._crit_edge.loopexit ]
  %.0104.lcssa = phi i1 [ true, %12 ], [ %37, %._crit_edge.loopexit ]
  %.0101.lcssa = phi ptr [ @.str.1, %12 ], [ %.1102, %._crit_edge.loopexit ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #14
  store ptr null, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #14
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #14
  call void @init_crossword(ptr noundef %14, ptr noundef nonnull %3, ptr noundef nonnull %5, ptr noundef nonnull %4) #14
  %39 = load i32, ptr %4, align 4, !tbaa !11
  %40 = sext i32 %39 to i64
  %41 = call noalias ptr @calloc(i64 noundef %40, i64 noundef 4) #15
  %42 = icmp eq ptr %41, null
  br i1 %42, label %43, label %46

43:                                               ; preds = %._crit_edge
  call void @perror(ptr noundef nonnull @.str.7) #16
  %44 = tail call ptr @__errno_location() #17
  %45 = load i32, ptr %44, align 4, !tbaa !11
  call void @exit(i32 noundef %45) #18
  unreachable

46:                                               ; preds = %._crit_edge
  %47 = call noalias dereferenceable_or_null(1024) ptr @calloc(i64 noundef 256, i64 noundef 4) #15
  %48 = icmp eq ptr %47, null
  br i1 %48, label %49, label %52

49:                                               ; preds = %46
  call void @perror(ptr noundef nonnull @.str.8) #16
  %50 = tail call ptr @__errno_location() #17
  %51 = load i32, ptr %50, align 4, !tbaa !11
  call void @exit(i32 noundef %51) #18
  unreachable

52:                                               ; preds = %46
  %53 = load ptr, ptr %3, align 8, !tbaa !5
  %54 = load i32, ptr %5, align 4, !tbaa !11
  %55 = call i32 @count_words_on_grid(ptr noundef %53, i32 noundef %54, ptr noundef nonnull %41) #14
  %56 = load ptr, ptr %3, align 8, !tbaa !5
  %57 = load i32, ptr %5, align 4, !tbaa !11
  %58 = call ptr @map_words_on_grid(ptr noundef %56, i32 noundef %57, i32 noundef %55) #14
  %59 = icmp slt i32 %55, 1
  br i1 %59, label %60, label %63

60:                                               ; preds = %52
  %61 = load ptr, ptr @stderr, align 8, !tbaa !5
  %62 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %61, ptr noundef nonnull @.str.9) #12
  br label %190

63:                                               ; preds = %52
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #14
  store ptr null, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #14
  store ptr null, ptr %7, align 8, !tbaa !5
  %64 = load i32, ptr %4, align 4, !tbaa !11
  %65 = call ptr @init_dictionary(ptr noundef %.0101.lcssa, i32 noundef %64, ptr noundef nonnull %7, ptr noundef nonnull %6, ptr noundef nonnull %41, ptr noundef nonnull %47) #14
  %66 = load i32, ptr %4, align 4, !tbaa !11
  %67 = load ptr, ptr %6, align 8, !tbaa !5
  %68 = call ptr @init_dict_maps(ptr noundef %65, i32 noundef %66, ptr noundef %67, ptr noundef nonnull %41, ptr noundef nonnull %47) #14
  %invariant.gep = getelementptr i8, ptr %68, i64 -8
  %wide.trip.count = zext nneg i32 %55 to i64
  br label %74

69:                                               ; preds = %107
  %70 = shl nuw nsw i64 %wide.trip.count, 3
  %71 = call noalias ptr @malloc(i64 noundef %70) #19
  %72 = icmp eq ptr %71, null
  br i1 %72, label %113, label %.lr.ph144.preheader

.lr.ph144.preheader:                              ; preds = %69
  %xtraiter = and i64 %wide.trip.count, 1
  %73 = icmp eq i32 %55, 1
  br i1 %73, label %.lr.ph148.preheader.unr-lcssa, label %.lr.ph144.preheader.new

.lr.ph144.preheader.new:                          ; preds = %.lr.ph144.preheader
  %unroll_iter = and i64 %wide.trip.count, 2147483646
  br label %.lr.ph144

74:                                               ; preds = %63, %107
  %indvars.iv = phi i64 [ 0, %63 ], [ %indvars.iv.next, %107 ]
  %75 = getelementptr inbounds ptr, ptr %58, i64 %indvars.iv
  %76 = load ptr, ptr %75, align 8, !tbaa !5
  %77 = getelementptr inbounds i8, ptr %76, i64 20
  %78 = load i32, ptr %77, align 4, !tbaa !13
  %79 = sext i32 %78 to i64
  %gep = getelementptr ptr, ptr %invariant.gep, i64 %79
  %80 = load ptr, ptr %gep, align 8, !tbaa !5
  %81 = getelementptr inbounds ptr, ptr %80, i64 %79
  %82 = load ptr, ptr %81, align 8, !tbaa !5
  %83 = call noalias dereferenceable_or_null(16) ptr @malloc(i64 noundef 16) #19
  %84 = getelementptr inbounds i8, ptr %76, i64 40
  store ptr %83, ptr %84, align 8, !tbaa !15
  %85 = load ptr, ptr %75, align 8, !tbaa !5
  %86 = getelementptr inbounds i8, ptr %85, i64 40
  %87 = load ptr, ptr %86, align 8, !tbaa !15
  %88 = icmp eq ptr %87, null
  br i1 %88, label %89, label %92

89:                                               ; preds = %74
  call void @perror(ptr noundef nonnull @.str.10) #16
  %90 = tail call ptr @__errno_location() #17
  %91 = load i32, ptr %90, align 4, !tbaa !11
  call void @exit(i32 noundef %91) #18
  unreachable

92:                                               ; preds = %74
  %93 = getelementptr inbounds i8, ptr %82, i64 8
  %94 = load i32, ptr %93, align 8, !tbaa !16
  %95 = getelementptr inbounds i8, ptr %87, i64 8
  store i32 %94, ptr %95, align 8, !tbaa !16
  %96 = sext i32 %94 to i64
  %97 = shl nsw i64 %96, 3
  %98 = call noalias ptr @malloc(i64 noundef %97) #19
  store ptr %98, ptr %87, align 8, !tbaa !18
  %99 = load ptr, ptr %75, align 8, !tbaa !5
  %100 = getelementptr inbounds i8, ptr %99, i64 40
  %101 = load ptr, ptr %100, align 8, !tbaa !15
  %102 = load ptr, ptr %101, align 8, !tbaa !18
  %103 = icmp eq ptr %102, null
  br i1 %103, label %104, label %107

104:                                              ; preds = %92
  call void @perror(ptr noundef nonnull @.str.11) #16
  %105 = tail call ptr @__errno_location() #17
  %106 = load i32, ptr %105, align 4, !tbaa !11
  call void @exit(i32 noundef %106) #18
  unreachable

107:                                              ; preds = %92
  %108 = load ptr, ptr %82, align 8, !tbaa !18
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %102, ptr align 8 %108, i64 %97, i1 false)
  %109 = load ptr, ptr %75, align 8, !tbaa !5
  %110 = getelementptr inbounds i8, ptr %109, i64 40
  %111 = load ptr, ptr %110, align 8, !tbaa !15
  %112 = call i32 @sum_bit(ptr noundef %111) #14
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %69, label %74, !llvm.loop !19

113:                                              ; preds = %69
  call void @perror(ptr noundef nonnull @.str.12) #16
  %114 = tail call ptr @__errno_location() #17
  %115 = load i32, ptr %114, align 4, !tbaa !11
  call void @exit(i32 noundef %115) #18
  unreachable

.lr.ph148.preheader.unr-lcssa:                    ; preds = %144, %.lr.ph144.preheader
  %.1.lcssa.ph = phi i32 [ poison, %.lr.ph144.preheader ], [ %.1.1, %144 ]
  %indvars.iv153.unr = phi i64 [ 0, %.lr.ph144.preheader ], [ %indvars.iv.next154.1, %144 ]
  %.096142.unr = phi i32 [ 0, %.lr.ph144.preheader ], [ %.1.1, %144 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph148.preheader, label %.lr.ph144.epil

.lr.ph144.epil:                                   ; preds = %.lr.ph148.preheader.unr-lcssa
  %116 = getelementptr inbounds ptr, ptr %58, i64 %indvars.iv153.unr
  %117 = load ptr, ptr %116, align 8, !tbaa !5
  %118 = getelementptr inbounds i8, ptr %117, i64 4
  %119 = load i32, ptr %118, align 4, !tbaa !20
  %120 = icmp eq i32 %119, 0
  br i1 %120, label %121, label %.lr.ph148.preheader

121:                                              ; preds = %.lr.ph144.epil
  %122 = add nsw i32 %.096142.unr, 1
  %123 = sext i32 %.096142.unr to i64
  %124 = getelementptr inbounds ptr, ptr %71, i64 %123
  store ptr %117, ptr %124, align 8, !tbaa !5
  br label %.lr.ph148.preheader

.lr.ph148.preheader:                              ; preds = %.lr.ph144.epil, %121, %.lr.ph148.preheader.unr-lcssa
  %.1.lcssa = phi i32 [ %.1.lcssa.ph, %.lr.ph148.preheader.unr-lcssa ], [ %122, %121 ], [ %.096142.unr, %.lr.ph144.epil ]
  %smax = call i32 @llvm.smax.i32(i32 %55, i32 1)
  %wide.trip.count161 = zext nneg i32 %smax to i64
  %xtraiter170 = and i64 %wide.trip.count161, 1
  %125 = icmp eq i32 %55, 1
  br i1 %125, label %._crit_edge149.unr-lcssa, label %.lr.ph148.preheader.new

.lr.ph148.preheader.new:                          ; preds = %.lr.ph148.preheader
  %unroll_iter172 = and i64 %wide.trip.count161, 2147483646
  br label %.lr.ph148

.lr.ph144:                                        ; preds = %144, %.lr.ph144.preheader.new
  %indvars.iv153 = phi i64 [ 0, %.lr.ph144.preheader.new ], [ %indvars.iv.next154.1, %144 ]
  %.096142 = phi i32 [ 0, %.lr.ph144.preheader.new ], [ %.1.1, %144 ]
  %niter = phi i64 [ 0, %.lr.ph144.preheader.new ], [ %niter.next.1, %144 ]
  %126 = getelementptr inbounds ptr, ptr %58, i64 %indvars.iv153
  %127 = load ptr, ptr %126, align 8, !tbaa !5
  %128 = getelementptr inbounds i8, ptr %127, i64 4
  %129 = load i32, ptr %128, align 4, !tbaa !20
  %130 = icmp eq i32 %129, 0
  br i1 %130, label %131, label %.lr.ph144.1

131:                                              ; preds = %.lr.ph144
  %132 = add nsw i32 %.096142, 1
  %133 = sext i32 %.096142 to i64
  %134 = getelementptr inbounds ptr, ptr %71, i64 %133
  store ptr %127, ptr %134, align 8, !tbaa !5
  br label %.lr.ph144.1

.lr.ph144.1:                                      ; preds = %.lr.ph144, %131
  %.1 = phi i32 [ %132, %131 ], [ %.096142, %.lr.ph144 ]
  %indvars.iv.next154 = or disjoint i64 %indvars.iv153, 1
  %135 = getelementptr inbounds ptr, ptr %58, i64 %indvars.iv.next154
  %136 = load ptr, ptr %135, align 8, !tbaa !5
  %137 = getelementptr inbounds i8, ptr %136, i64 4
  %138 = load i32, ptr %137, align 4, !tbaa !20
  %139 = icmp eq i32 %138, 0
  br i1 %139, label %140, label %144

140:                                              ; preds = %.lr.ph144.1
  %141 = add nsw i32 %.1, 1
  %142 = sext i32 %.1 to i64
  %143 = getelementptr inbounds ptr, ptr %71, i64 %142
  store ptr %136, ptr %143, align 8, !tbaa !5
  br label %144

144:                                              ; preds = %140, %.lr.ph144.1
  %.1.1 = phi i32 [ %141, %140 ], [ %.1, %.lr.ph144.1 ]
  %indvars.iv.next154.1 = add nuw nsw i64 %indvars.iv153, 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 %.lr.ph148.preheader.unr-lcssa, label %.lr.ph144, !llvm.loop !21

._crit_edge149.unr-lcssa:                         ; preds = %172, %.lr.ph148.preheader
  %indvars.iv158.unr = phi i64 [ 0, %.lr.ph148.preheader ], [ %indvars.iv.next159.1, %172 ]
  %.2146.unr = phi i32 [ %.1.lcssa, %.lr.ph148.preheader ], [ %.3.1, %172 ]
  %lcmp.mod171.not = icmp eq i64 %xtraiter170, 0
  br i1 %lcmp.mod171.not, label %._crit_edge149, label %.lr.ph148.epil

.lr.ph148.epil:                                   ; preds = %._crit_edge149.unr-lcssa
  %145 = getelementptr inbounds ptr, ptr %58, i64 %indvars.iv158.unr
  %146 = load ptr, ptr %145, align 8, !tbaa !5
  %147 = getelementptr inbounds i8, ptr %146, i64 4
  %148 = load i32, ptr %147, align 4, !tbaa !20
  %149 = icmp eq i32 %148, 1
  br i1 %149, label %150, label %._crit_edge149

150:                                              ; preds = %.lr.ph148.epil
  %151 = sext i32 %.2146.unr to i64
  %152 = getelementptr inbounds ptr, ptr %71, i64 %151
  store ptr %146, ptr %152, align 8, !tbaa !5
  br label %._crit_edge149

._crit_edge149:                                   ; preds = %.lr.ph148.epil, %150, %._crit_edge149.unr-lcssa
  %153 = load ptr, ptr %3, align 8, !tbaa !5
  br i1 %.0104.lcssa, label %177, label %173

.lr.ph148:                                        ; preds = %172, %.lr.ph148.preheader.new
  %indvars.iv158 = phi i64 [ 0, %.lr.ph148.preheader.new ], [ %indvars.iv.next159.1, %172 ]
  %.2146 = phi i32 [ %.1.lcssa, %.lr.ph148.preheader.new ], [ %.3.1, %172 ]
  %niter173 = phi i64 [ 0, %.lr.ph148.preheader.new ], [ %niter173.next.1, %172 ]
  %154 = getelementptr inbounds ptr, ptr %58, i64 %indvars.iv158
  %155 = load ptr, ptr %154, align 8, !tbaa !5
  %156 = getelementptr inbounds i8, ptr %155, i64 4
  %157 = load i32, ptr %156, align 4, !tbaa !20
  %158 = icmp eq i32 %157, 1
  br i1 %158, label %159, label %.lr.ph148.1

159:                                              ; preds = %.lr.ph148
  %160 = add nsw i32 %.2146, 1
  %161 = sext i32 %.2146 to i64
  %162 = getelementptr inbounds ptr, ptr %71, i64 %161
  store ptr %155, ptr %162, align 8, !tbaa !5
  br label %.lr.ph148.1

.lr.ph148.1:                                      ; preds = %.lr.ph148, %159
  %.3 = phi i32 [ %160, %159 ], [ %.2146, %.lr.ph148 ]
  %indvars.iv.next159 = or disjoint i64 %indvars.iv158, 1
  %163 = getelementptr inbounds ptr, ptr %58, i64 %indvars.iv.next159
  %164 = load ptr, ptr %163, align 8, !tbaa !5
  %165 = getelementptr inbounds i8, ptr %164, i64 4
  %166 = load i32, ptr %165, align 4, !tbaa !20
  %167 = icmp eq i32 %166, 1
  br i1 %167, label %168, label %172

168:                                              ; preds = %.lr.ph148.1
  %169 = add nsw i32 %.3, 1
  %170 = sext i32 %.3 to i64
  %171 = getelementptr inbounds ptr, ptr %71, i64 %170
  store ptr %164, ptr %171, align 8, !tbaa !5
  br label %172

172:                                              ; preds = %168, %.lr.ph148.1
  %.3.1 = phi i32 [ %169, %168 ], [ %.3, %.lr.ph148.1 ]
  %indvars.iv.next159.1 = add nuw nsw i64 %indvars.iv158, 2
  %niter173.next.1 = add i64 %niter173, 2
  %niter173.ncmp.1 = icmp eq i64 %niter173.next.1, %unroll_iter172
  br i1 %niter173.ncmp.1, label %._crit_edge149.unr-lcssa, label %.lr.ph148, !llvm.loop !22

173:                                              ; preds = %._crit_edge149
  call void @check_crossword(ptr noundef %153, ptr noundef nonnull %71, ptr noundef %68, i32 noundef %55) #14
  br i1 %.0106.lcssa, label %182, label %174

174:                                              ; preds = %173
  %175 = load ptr, ptr %3, align 8, !tbaa !5
  %176 = load i32, ptr %5, align 4, !tbaa !11
  call void @draw_crossword(ptr noundef %175, i32 noundef %176) #14
  br label %182

177:                                              ; preds = %._crit_edge149
  call void @solve_crossword(ptr noundef %153, ptr noundef %65, ptr noundef nonnull %58, i32 noundef %55, ptr noundef %68) #14
  %178 = load ptr, ptr %3, align 8, !tbaa !5
  br i1 %.0106.lcssa, label %181, label %179

179:                                              ; preds = %177
  %180 = load i32, ptr %5, align 4, !tbaa !11
  call void @draw_crossword(ptr noundef %178, i32 noundef %180) #14
  br label %182

181:                                              ; preds = %177
  call void @print_solution(ptr noundef %178, ptr noundef nonnull %71, i32 noundef %55) #14
  br label %182

182:                                              ; preds = %179, %181, %173, %174
  call void @free(ptr noundef %71) #14
  %183 = load i32, ptr %4, align 4, !tbaa !11
  %184 = load ptr, ptr %7, align 8, !tbaa !5
  call void @free_dictionary(ptr noundef %65, i32 noundef %183, ptr noundef %184) #14
  %185 = load ptr, ptr %6, align 8, !tbaa !5
  call void @free(ptr noundef %185) #14
  %186 = load i32, ptr %4, align 4, !tbaa !11
  call void @free_maps(ptr noundef %68, i32 noundef %186) #14
  call void @free(ptr noundef %41) #14
  call void @free(ptr noundef %47) #14
  call void @free_words(ptr noundef nonnull %58, i32 noundef %55) #14
  %187 = load ptr, ptr %3, align 8, !tbaa !5
  %188 = load ptr, ptr %187, align 8, !tbaa !5
  call void @free(ptr noundef %188) #14
  %189 = load ptr, ptr %3, align 8, !tbaa !5
  call void @free(ptr noundef %189) #14
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #14
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #14
  br label %190

190:                                              ; preds = %182, %60
  %.198 = phi i32 [ 1, %60 ], [ 0, %182 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #14
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #14
  br label %.thread

.thread:                                          ; preds = %25, %32, %190, %9
  %.3100 = phi i32 [ 1, %9 ], [ %.198, %190 ], [ 1, %32 ], [ 1, %25 ]
  ret i32 %.3100
}

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

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i32 @strcmp(ptr nocapture noundef, ptr nocapture noundef) local_unnamed_addr #3

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

declare void @init_crossword(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

; 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 #5

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

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

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

declare i32 @count_words_on_grid(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #4

declare ptr @map_words_on_grid(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #4

declare ptr @init_dictionary(ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

declare ptr @init_dict_maps(ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

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

; 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) #9

declare i32 @sum_bit(ptr noundef) local_unnamed_addr #4

declare void @check_crossword(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

declare void @draw_crossword(ptr noundef, i32 noundef) local_unnamed_addr #4

declare void @solve_crossword(ptr noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #4

declare void @print_solution(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

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

declare void @free_dictionary(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #4

declare void @free_maps(ptr noundef, i32 noundef) local_unnamed_addr #4

declare void @free_words(ptr noundef, i32 noundef) local_unnamed_addr #4

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nofree nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { mustprogress nofree nounwind willreturn memory(argmem: read) "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 = { "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 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 #6 = { 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 #7 = { 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 #8 = { 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 #9 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #10 = { 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 #11 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #12 = { cold nounwind }
attributes #13 = { nounwind willreturn memory(read) }
attributes #14 = { nounwind }
attributes #15 = { nounwind allocsize(0,1) }
attributes #16 = { cold }
attributes #17 = { nounwind willreturn memory(none) }
attributes #18 = { noreturn nounwind }
attributes #19 = { 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 = distinct !{!9, !10}
!10 = !{!"llvm.loop.mustprogress"}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !12, i64 20}
!14 = !{!"Word", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64}
!15 = !{!14, !6, i64 40}
!16 = !{!17, !12, i64 8}
!17 = !{!"Map", !6, i64 0, !12, i64 8, !12, i64 12}
!18 = !{!17, !6, i64 0}
!19 = distinct !{!19, !10}
!20 = !{!14, !12, i64 4}
!21 = distinct !{!21, !10}
!22 = distinct !{!22, !10}


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