; LLVM IR from tsotchke/quantum_geometric_tensor :: src/quantum_geometric/core (tensor_operations)

; 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.ComplexFloat = type { float, float }

@.str.6 = external hidden unnamed_addr constant [25 x i8], align 1
@COMPLEX_FLOAT_ZERO = external hidden constant %struct.ComplexFloat, align 4
@.str.12 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [34 x i8], align 1

declare void @geometric_log_error(ptr noundef, ...) #0

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local zeroext i1 @qg_tensor_contract(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, i64 noundef %5, i64 noundef %6, ptr noundef %7, ptr noundef %8, i64 noundef %9) #4 {
  %11 = alloca i1, align 1
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i32, align 4
  %24 = alloca i64, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i8, align 1
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  %31 = alloca i8, align 1
  %32 = alloca i64, align 8
  %33 = alloca i64, align 8
  %34 = alloca i64, align 8
  %35 = alloca i64, align 8
  %36 = alloca i64, align 8
  %37 = alloca i64, align 8
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca i64, align 8
  %42 = alloca i64, align 8
  %43 = alloca i64, align 8
  %44 = alloca i64, align 8
  %45 = alloca i64, align 8
  %46 = alloca i64, align 8
  %47 = alloca i64, align 8
  %48 = alloca i64, align 8
  %49 = alloca i64, align 8
  %50 = alloca i64, align 8
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca i64, align 8
  %54 = alloca i64, align 8
  %55 = alloca i64, align 8
  %56 = alloca i64, align 8
  %57 = alloca i64, align 8
  %58 = alloca i64, align 8
  %59 = alloca i64, align 8
  %60 = alloca i64, align 8
  %61 = alloca i64, align 8
  %62 = alloca i64, align 8
  %63 = alloca i64, align 8
  %64 = alloca i64, align 8
  %65 = alloca i8, align 1
  %66 = alloca i64, align 8
  %67 = alloca i64, align 8
  %68 = alloca i64, align 8
  %69 = alloca i64, align 8
  %70 = alloca i8, align 1
  %71 = alloca i64, align 8
  %72 = alloca i64, align 8
  %73 = alloca i64, align 8
  %74 = alloca %struct.ComplexFloat, align 4
  store ptr %0, ptr %12, align 8, !tbaa !5
  store ptr %1, ptr %13, align 8, !tbaa !5
  store ptr %2, ptr %14, align 8, !tbaa !5
  store ptr %3, ptr %15, align 8, !tbaa !5
  store ptr %4, ptr %16, align 8, !tbaa !5
  store i64 %5, ptr %17, align 8, !tbaa !9
  store i64 %6, ptr %18, align 8, !tbaa !9
  store ptr %7, ptr %19, align 8, !tbaa !5
  store ptr %8, ptr %20, align 8, !tbaa !5
  store i64 %9, ptr %21, align 8, !tbaa !9
  %75 = load ptr, ptr %12, align 8, !tbaa !5
  %76 = icmp ne ptr %75, null
  br i1 %76, label %77, label %104

77:                                               ; preds = %10
  %78 = load ptr, ptr %13, align 8, !tbaa !5
  %79 = icmp ne ptr %78, null
  br i1 %79, label %80, label %104

80:                                               ; preds = %77
  %81 = load ptr, ptr %14, align 8, !tbaa !5
  %82 = icmp ne ptr %81, null
  br i1 %82, label %83, label %104

83:                                               ; preds = %80
  %84 = load ptr, ptr %15, align 8, !tbaa !5
  %85 = icmp ne ptr %84, null
  br i1 %85, label %86, label %104

86:                                               ; preds = %83
  %87 = load ptr, ptr %16, align 8, !tbaa !5
  %88 = icmp ne ptr %87, null
  br i1 %88, label %89, label %104

89:                                               ; preds = %86
  %90 = load ptr, ptr %19, align 8, !tbaa !5
  %91 = icmp ne ptr %90, null
  br i1 %91, label %92, label %104

92:                                               ; preds = %89
  %93 = load ptr, ptr %20, align 8, !tbaa !5
  %94 = icmp ne ptr %93, null
  br i1 %94, label %95, label %104

95:                                               ; preds = %92
  %96 = load i64, ptr %17, align 8, !tbaa !9
  %97 = icmp eq i64 %96, 0
  br i1 %97, label %104, label %98

98:                                               ; preds = %95
  %99 = load i64, ptr %18, align 8, !tbaa !9
  %100 = icmp eq i64 %99, 0
  br i1 %100, label %104, label %101

101:                                              ; preds = %98
  %102 = load i64, ptr %21, align 8, !tbaa !9
  %103 = icmp eq i64 %102, 0
  br i1 %103, label %104, label %105

104:                                              ; preds = %101, %98, %95, %92, %89, %86, %83, %80, %77, %10
  call void (ptr, ...) @geometric_log_error(ptr noundef @.str.12)
  store i1 false, ptr %11, align 1
  br label %818

105:                                              ; preds = %101
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  store i64 0, ptr %22, align 8, !tbaa !9
  br label %106

106:                                              ; preds = %144, %105
  %107 = load i64, ptr %22, align 8, !tbaa !9
  %108 = load i64, ptr %21, align 8, !tbaa !9
  %109 = icmp ult i64 %107, %108
  br i1 %109, label %111, label %110

110:                                              ; preds = %106
  store i32 2, ptr %23, align 4
  br label %147

111:                                              ; preds = %106
  %112 = load ptr, ptr %19, align 8, !tbaa !5
  %113 = load i64, ptr %22, align 8, !tbaa !9
  %114 = getelementptr inbounds i64, ptr %112, i64 %113
  %115 = load i64, ptr %114, align 8, !tbaa !9
  %116 = load i64, ptr %17, align 8, !tbaa !9
  %117 = icmp uge i64 %115, %116
  br i1 %117, label %125, label %118

118:                                              ; preds = %111
  %119 = load ptr, ptr %20, align 8, !tbaa !5
  %120 = load i64, ptr %22, align 8, !tbaa !9
  %121 = getelementptr inbounds i64, ptr %119, i64 %120
  %122 = load i64, ptr %121, align 8, !tbaa !9
  %123 = load i64, ptr %18, align 8, !tbaa !9
  %124 = icmp uge i64 %122, %123
  br i1 %124, label %125, label %126

125:                                              ; preds = %118, %111
  call void (ptr, ...) @geometric_log_error(ptr noundef @.str.13)
  store i1 false, ptr %11, align 1
  store i32 1, ptr %23, align 4
  br label %147

126:                                              ; preds = %118
  %127 = load ptr, ptr %15, align 8, !tbaa !5
  %128 = load ptr, ptr %19, align 8, !tbaa !5
  %129 = load i64, ptr %22, align 8, !tbaa !9
  %130 = getelementptr inbounds i64, ptr %128, i64 %129
  %131 = load i64, ptr %130, align 8, !tbaa !9
  %132 = getelementptr inbounds i64, ptr %127, i64 %131
  %133 = load i64, ptr %132, align 8, !tbaa !9
  %134 = load ptr, ptr %16, align 8, !tbaa !5
  %135 = load ptr, ptr %20, align 8, !tbaa !5
  %136 = load i64, ptr %22, align 8, !tbaa !9
  %137 = getelementptr inbounds i64, ptr %135, i64 %136
  %138 = load i64, ptr %137, align 8, !tbaa !9
  %139 = getelementptr inbounds i64, ptr %134, i64 %138
  %140 = load i64, ptr %139, align 8, !tbaa !9
  %141 = icmp ne i64 %133, %140
  br i1 %141, label %142, label %143

142:                                              ; preds = %126
  call void (ptr, ...) @geometric_log_error(ptr noundef @.str.14)
  store i1 false, ptr %11, align 1
  store i32 1, ptr %23, align 4
  br label %147

143:                                              ; preds = %126
  br label %144

144:                                              ; preds = %143
  %145 = load i64, ptr %22, align 8, !tbaa !9
  %146 = add i64 %145, 1
  store i64 %146, ptr %22, align 8, !tbaa !9
  br label %106, !llvm.loop !11

147:                                              ; preds = %142, %125, %110
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  %148 = load i32, ptr %23, align 4
  switch i32 %148, label %820 [
    i32 2, label %149
    i32 1, label %818
  ]

149:                                              ; preds = %147
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #7
  %150 = load i64, ptr %17, align 8, !tbaa !9
  %151 = load i64, ptr %18, align 8, !tbaa !9
  %152 = add i64 %150, %151
  %153 = load i64, ptr %21, align 8, !tbaa !9
  %154 = mul i64 2, %153
  %155 = sub i64 %152, %154
  store i64 %155, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %156 = load i64, ptr %24, align 8, !tbaa !9
  %157 = mul i64 %156, 8
  %158 = call ptr @aligned_malloc(i64 noundef %157)
  store ptr %158, ptr %25, align 8, !tbaa !5
  %159 = load ptr, ptr %25, align 8, !tbaa !5
  %160 = icmp ne ptr %159, null
  br i1 %160, label %162, label %161

161:                                              ; preds = %149
  call void (ptr, ...) @geometric_log_error(ptr noundef @.str.6)
  store i1 false, ptr %11, align 1
  store i32 1, ptr %23, align 4
  br label %817

162:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #7
  store i64 0, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #7
  store i64 0, ptr %27, align 8, !tbaa !9
  br label %163

163:                                              ; preds = %200, %162
  %164 = load i64, ptr %27, align 8, !tbaa !9
  %165 = load i64, ptr %17, align 8, !tbaa !9
  %166 = icmp ult i64 %164, %165
  br i1 %166, label %168, label %167

167:                                              ; preds = %163
  store i32 5, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #7
  br label %203

168:                                              ; preds = %163
  call void @llvm.lifetime.start.p0(i64 1, ptr %28) #7
  store i8 0, ptr %28, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #7
  store i64 0, ptr %29, align 8, !tbaa !9
  br label %169

169:                                              ; preds = %183, %168
  %170 = load i64, ptr %29, align 8, !tbaa !9
  %171 = load i64, ptr %21, align 8, !tbaa !9
  %172 = icmp ult i64 %170, %171
  br i1 %172, label %174, label %173

173:                                              ; preds = %169
  store i32 8, ptr %23, align 4
  br label %186

174:                                              ; preds = %169
  %175 = load i64, ptr %27, align 8, !tbaa !9
  %176 = load ptr, ptr %19, align 8, !tbaa !5
  %177 = load i64, ptr %29, align 8, !tbaa !9
  %178 = getelementptr inbounds i64, ptr %176, i64 %177
  %179 = load i64, ptr %178, align 8, !tbaa !9
  %180 = icmp eq i64 %175, %179
  br i1 %180, label %181, label %182

181:                                              ; preds = %174
  store i8 1, ptr %28, align 1, !tbaa !13
  store i32 8, ptr %23, align 4
  br label %186

182:                                              ; preds = %174
  br label %183

183:                                              ; preds = %182
  %184 = load i64, ptr %29, align 8, !tbaa !9
  %185 = add i64 %184, 1
  store i64 %185, ptr %29, align 8, !tbaa !9
  br label %169, !llvm.loop !15

186:                                              ; preds = %181, %173
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #7
  br label %187

187:                                              ; preds = %186
  %188 = load i8, ptr %28, align 1, !tbaa !13, !range !16, !noundef !17
  %189 = trunc i8 %188 to i1
  br i1 %189, label %199, label %190

190:                                              ; preds = %187
  %191 = load ptr, ptr %15, align 8, !tbaa !5
  %192 = load i64, ptr %27, align 8, !tbaa !9
  %193 = getelementptr inbounds i64, ptr %191, i64 %192
  %194 = load i64, ptr %193, align 8, !tbaa !9
  %195 = load ptr, ptr %25, align 8, !tbaa !5
  %196 = load i64, ptr %26, align 8, !tbaa !9
  %197 = add i64 %196, 1
  store i64 %197, ptr %26, align 8, !tbaa !9
  %198 = getelementptr inbounds i64, ptr %195, i64 %196
  store i64 %194, ptr %198, align 8, !tbaa !9
  br label %199

199:                                              ; preds = %190, %187
  call void @llvm.lifetime.end.p0(i64 1, ptr %28) #7
  br label %200

200:                                              ; preds = %199
  %201 = load i64, ptr %27, align 8, !tbaa !9
  %202 = add i64 %201, 1
  store i64 %202, ptr %27, align 8, !tbaa !9
  br label %163, !llvm.loop !18

203:                                              ; preds = %167
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #7
  store i64 0, ptr %30, align 8, !tbaa !9
  br label %204

204:                                              ; preds = %241, %203
  %205 = load i64, ptr %30, align 8, !tbaa !9
  %206 = load i64, ptr %18, align 8, !tbaa !9
  %207 = icmp ult i64 %205, %206
  br i1 %207, label %209, label %208

208:                                              ; preds = %204
  store i32 11, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #7
  br label %244

209:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 1, ptr %31) #7
  store i8 0, ptr %31, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #7
  store i64 0, ptr %32, align 8, !tbaa !9
  br label %210

210:                                              ; preds = %224, %209
  %211 = load i64, ptr %32, align 8, !tbaa !9
  %212 = load i64, ptr %21, align 8, !tbaa !9
  %213 = icmp ult i64 %211, %212
  br i1 %213, label %215, label %214

214:                                              ; preds = %210
  store i32 14, ptr %23, align 4
  br label %227

215:                                              ; preds = %210
  %216 = load i64, ptr %30, align 8, !tbaa !9
  %217 = load ptr, ptr %20, align 8, !tbaa !5
  %218 = load i64, ptr %32, align 8, !tbaa !9
  %219 = getelementptr inbounds i64, ptr %217, i64 %218
  %220 = load i64, ptr %219, align 8, !tbaa !9
  %221 = icmp eq i64 %216, %220
  br i1 %221, label %222, label %223

222:                                              ; preds = %215
  store i8 1, ptr %31, align 1, !tbaa !13
  store i32 14, ptr %23, align 4
  br label %227

223:                                              ; preds = %215
  br label %224

224:                                              ; preds = %223
  %225 = load i64, ptr %32, align 8, !tbaa !9
  %226 = add i64 %225, 1
  store i64 %226, ptr %32, align 8, !tbaa !9
  br label %210, !llvm.loop !19

227:                                              ; preds = %222, %214
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #7
  br label %228

228:                                              ; preds = %227
  %229 = load i8, ptr %31, align 1, !tbaa !13, !range !16, !noundef !17
  %230 = trunc i8 %229 to i1
  br i1 %230, label %240, label %231

231:                                              ; preds = %228
  %232 = load ptr, ptr %16, align 8, !tbaa !5
  %233 = load i64, ptr %30, align 8, !tbaa !9
  %234 = getelementptr inbounds i64, ptr %232, i64 %233
  %235 = load i64, ptr %234, align 8, !tbaa !9
  %236 = load ptr, ptr %25, align 8, !tbaa !5
  %237 = load i64, ptr %26, align 8, !tbaa !9
  %238 = add i64 %237, 1
  store i64 %238, ptr %26, align 8, !tbaa !9
  %239 = getelementptr inbounds i64, ptr %236, i64 %237
  store i64 %235, ptr %239, align 8, !tbaa !9
  br label %240

240:                                              ; preds = %231, %228
  call void @llvm.lifetime.end.p0(i64 1, ptr %31) #7
  br label %241

241:                                              ; preds = %240
  %242 = load i64, ptr %30, align 8, !tbaa !9
  %243 = add i64 %242, 1
  store i64 %243, ptr %30, align 8, !tbaa !9
  br label %204, !llvm.loop !20

244:                                              ; preds = %208
  %245 = load i64, ptr %17, align 8, !tbaa !9
  %246 = icmp eq i64 %245, 2
  br i1 %246, label %247, label %452

247:                                              ; preds = %244
  %248 = load i64, ptr %18, align 8, !tbaa !9
  %249 = icmp eq i64 %248, 2
  br i1 %249, label %250, label %452

250:                                              ; preds = %247
  %251 = load i64, ptr %21, align 8, !tbaa !9
  %252 = icmp eq i64 %251, 1
  br i1 %252, label %253, label %452

253:                                              ; preds = %250
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #7
  %254 = load ptr, ptr %15, align 8, !tbaa !5
  %255 = getelementptr inbounds i64, ptr %254, i64 0
  %256 = load i64, ptr %255, align 8, !tbaa !9
  store i64 %256, ptr %33, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #7
  %257 = load ptr, ptr %15, align 8, !tbaa !5
  %258 = getelementptr inbounds i64, ptr %257, i64 1
  %259 = load i64, ptr %258, align 8, !tbaa !9
  store i64 %259, ptr %34, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #7
  %260 = load ptr, ptr %16, align 8, !tbaa !5
  %261 = getelementptr inbounds i64, ptr %260, i64 1
  %262 = load i64, ptr %261, align 8, !tbaa !9
  store i64 %262, ptr %35, align 8, !tbaa !9
  %263 = load i64, ptr %33, align 8, !tbaa !9
  %264 = icmp uge i64 %263, 512
  br i1 %264, label %265, label %443

265:                                              ; preds = %253
  %266 = load i64, ptr %34, align 8, !tbaa !9
  %267 = icmp uge i64 %266, 512
  br i1 %267, label %268, label %443

268:                                              ; preds = %265
  %269 = load i64, ptr %35, align 8, !tbaa !9
  %270 = icmp uge i64 %269, 512
  br i1 %270, label %271, label %443

271:                                              ; preds = %268
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #7
  %272 = load i64, ptr %33, align 8, !tbaa !9
  %273 = load i64, ptr %34, align 8, !tbaa !9
  %274 = call i64 @max(i64 noundef %272, i64 noundef %273)
  %275 = load i64, ptr %35, align 8, !tbaa !9
  %276 = call i64 @max(i64 noundef %274, i64 noundef %275)
  store i64 %276, ptr %36, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #7
  store i64 1, ptr %37, align 8, !tbaa !9
  br label %277

277:                                              ; preds = %281, %271
  %278 = load i64, ptr %37, align 8, !tbaa !9
  %279 = load i64, ptr %36, align 8, !tbaa !9
  %280 = icmp ult i64 %278, %279
  br i1 %280, label %281, label %284

281:                                              ; preds = %277
  %282 = load i64, ptr %37, align 8, !tbaa !9
  %283 = mul i64 %282, 2
  store i64 %283, ptr %37, align 8, !tbaa !9
  br label %277, !llvm.loop !21

284:                                              ; preds = %277
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #7
  %285 = load i64, ptr %37, align 8, !tbaa !9
  %286 = load i64, ptr %37, align 8, !tbaa !9
  %287 = mul i64 %285, %286
  %288 = mul i64 %287, 8
  %289 = call ptr @aligned_malloc(i64 noundef %288)
  store ptr %289, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #7
  %290 = load i64, ptr %37, align 8, !tbaa !9
  %291 = load i64, ptr %37, align 8, !tbaa !9
  %292 = mul i64 %290, %291
  %293 = mul i64 %292, 8
  %294 = call ptr @aligned_malloc(i64 noundef %293)
  store ptr %294, ptr %39, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #7
  %295 = load i64, ptr %37, align 8, !tbaa !9
  %296 = load i64, ptr %37, align 8, !tbaa !9
  %297 = mul i64 %295, %296
  %298 = mul i64 %297, 8
  %299 = call ptr @aligned_malloc(i64 noundef %298)
  store ptr %299, ptr %40, align 8, !tbaa !5
  %300 = load ptr, ptr %38, align 8, !tbaa !5
  %301 = icmp ne ptr %300, null
  br i1 %301, label %302, label %308

302:                                              ; preds = %284
  %303 = load ptr, ptr %39, align 8, !tbaa !5
  %304 = icmp ne ptr %303, null
  br i1 %304, label %305, label %308

305:                                              ; preds = %302
  %306 = load ptr, ptr %40, align 8, !tbaa !5
  %307 = icmp ne ptr %306, null
  br i1 %307, label %313, label %308

308:                                              ; preds = %305, %302, %284
  %309 = load ptr, ptr %38, align 8, !tbaa !5
  call void @free(ptr noundef %309) #7
  %310 = load ptr, ptr %39, align 8, !tbaa !5
  call void @free(ptr noundef %310) #7
  %311 = load ptr, ptr %40, align 8, !tbaa !5
  call void @free(ptr noundef %311) #7
  %312 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %312) #7
  store i1 false, ptr %11, align 1
  store i32 1, ptr %23, align 4
  br label %442

313:                                              ; preds = %305
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #7
  store i64 0, ptr %41, align 8, !tbaa !9
  br label %314

314:                                              ; preds = %328, %313
  %315 = load i64, ptr %41, align 8, !tbaa !9
  %316 = load i64, ptr %37, align 8, !tbaa !9
  %317 = load i64, ptr %37, align 8, !tbaa !9
  %318 = mul i64 %316, %317
  %319 = icmp ult i64 %315, %318
  br i1 %319, label %321, label %320

320:                                              ; preds = %314
  store i32 19, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #7
  br label %331

321:                                              ; preds = %314
  %322 = load ptr, ptr %38, align 8, !tbaa !5
  %323 = load i64, ptr %41, align 8, !tbaa !9
  %324 = getelementptr inbounds %struct.ComplexFloat, ptr %322, i64 %323
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %324, ptr align 4 @COMPLEX_FLOAT_ZERO, i64 8, i1 false), !tbaa.struct !22
  %325 = load ptr, ptr %39, align 8, !tbaa !5
  %326 = load i64, ptr %41, align 8, !tbaa !9
  %327 = getelementptr inbounds %struct.ComplexFloat, ptr %325, i64 %326
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %327, ptr align 4 @COMPLEX_FLOAT_ZERO, i64 8, i1 false), !tbaa.struct !22
  br label %328

328:                                              ; preds = %321
  %329 = load i64, ptr %41, align 8, !tbaa !9
  %330 = add i64 %329, 1
  store i64 %330, ptr %41, align 8, !tbaa !9
  br label %314, !llvm.loop !25

331:                                              ; preds = %320
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #7
  store i64 0, ptr %42, align 8, !tbaa !9
  br label %332

332:                                              ; preds = %362, %331
  %333 = load i64, ptr %42, align 8, !tbaa !9
  %334 = load i64, ptr %33, align 8, !tbaa !9
  %335 = icmp ult i64 %333, %334
  br i1 %335, label %337, label %336

336:                                              ; preds = %332
  store i32 22, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #7
  br label %365

337:                                              ; preds = %332
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #7
  store i64 0, ptr %43, align 8, !tbaa !9
  br label %338

338:                                              ; preds = %358, %337
  %339 = load i64, ptr %43, align 8, !tbaa !9
  %340 = load i64, ptr %34, align 8, !tbaa !9
  %341 = icmp ult i64 %339, %340
  br i1 %341, label %343, label %342

342:                                              ; preds = %338
  store i32 25, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #7
  br label %361

343:                                              ; preds = %338
  %344 = load ptr, ptr %38, align 8, !tbaa !5
  %345 = load i64, ptr %42, align 8, !tbaa !9
  %346 = load i64, ptr %37, align 8, !tbaa !9
  %347 = mul i64 %345, %346
  %348 = load i64, ptr %43, align 8, !tbaa !9
  %349 = add i64 %347, %348
  %350 = getelementptr inbounds %struct.ComplexFloat, ptr %344, i64 %349
  %351 = load ptr, ptr %13, align 8, !tbaa !5
  %352 = load i64, ptr %42, align 8, !tbaa !9
  %353 = load i64, ptr %34, align 8, !tbaa !9
  %354 = mul i64 %352, %353
  %355 = load i64, ptr %43, align 8, !tbaa !9
  %356 = add i64 %354, %355
  %357 = getelementptr inbounds %struct.ComplexFloat, ptr %351, i64 %356
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %350, ptr align 4 %357, i64 8, i1 false), !tbaa.struct !22
  br label %358

358:                                              ; preds = %343
  %359 = load i64, ptr %43, align 8, !tbaa !9
  %360 = add i64 %359, 1
  store i64 %360, ptr %43, align 8, !tbaa !9
  br label %338, !llvm.loop !26

361:                                              ; preds = %342
  br label %362

362:                                              ; preds = %361
  %363 = load i64, ptr %42, align 8, !tbaa !9
  %364 = add i64 %363, 1
  store i64 %364, ptr %42, align 8, !tbaa !9
  br label %332, !llvm.loop !27

365:                                              ; preds = %336
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #7
  store i64 0, ptr %44, align 8, !tbaa !9
  br label %366

366:                                              ; preds = %396, %365
  %367 = load i64, ptr %44, align 8, !tbaa !9
  %368 = load i64, ptr %34, align 8, !tbaa !9
  %369 = icmp ult i64 %367, %368
  br i1 %369, label %371, label %370

370:                                              ; preds = %366
  store i32 28, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #7
  br label %399

371:                                              ; preds = %366
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #7
  store i64 0, ptr %45, align 8, !tbaa !9
  br label %372

372:                                              ; preds = %392, %371
  %373 = load i64, ptr %45, align 8, !tbaa !9
  %374 = load i64, ptr %35, align 8, !tbaa !9
  %375 = icmp ult i64 %373, %374
  br i1 %375, label %377, label %376

376:                                              ; preds = %372
  store i32 31, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #7
  br label %395

377:                                              ; preds = %372
  %378 = load ptr, ptr %39, align 8, !tbaa !5
  %379 = load i64, ptr %44, align 8, !tbaa !9
  %380 = load i64, ptr %37, align 8, !tbaa !9
  %381 = mul i64 %379, %380
  %382 = load i64, ptr %45, align 8, !tbaa !9
  %383 = add i64 %381, %382
  %384 = getelementptr inbounds %struct.ComplexFloat, ptr %378, i64 %383
  %385 = load ptr, ptr %14, align 8, !tbaa !5
  %386 = load i64, ptr %44, align 8, !tbaa !9
  %387 = load i64, ptr %35, align 8, !tbaa !9
  %388 = mul i64 %386, %387
  %389 = load i64, ptr %45, align 8, !tbaa !9
  %390 = add i64 %388, %389
  %391 = getelementptr inbounds %struct.ComplexFloat, ptr %385, i64 %390
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %384, ptr align 4 %391, i64 8, i1 false), !tbaa.struct !22
  br label %392

392:                                              ; preds = %377
  %393 = load i64, ptr %45, align 8, !tbaa !9
  %394 = add i64 %393, 1
  store i64 %394, ptr %45, align 8, !tbaa !9
  br label %372, !llvm.loop !28

395:                                              ; preds = %376
  br label %396

396:                                              ; preds = %395
  %397 = load i64, ptr %44, align 8, !tbaa !9
  %398 = add i64 %397, 1
  store i64 %398, ptr %44, align 8, !tbaa !9
  br label %366, !llvm.loop !29

399:                                              ; preds = %370
  %400 = load ptr, ptr %40, align 8, !tbaa !5
  %401 = load ptr, ptr %38, align 8, !tbaa !5
  %402 = load ptr, ptr %39, align 8, !tbaa !5
  %403 = load i64, ptr %37, align 8, !tbaa !9
  call void @strassen_multiply(ptr noundef %400, ptr noundef %401, ptr noundef %402, i64 noundef %403, i64 noundef 0)
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #7
  store i64 0, ptr %46, align 8, !tbaa !9
  br label %404

404:                                              ; preds = %434, %399
  %405 = load i64, ptr %46, align 8, !tbaa !9
  %406 = load i64, ptr %33, align 8, !tbaa !9
  %407 = icmp ult i64 %405, %406
  br i1 %407, label %409, label %408

408:                                              ; preds = %404
  store i32 34, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #7
  br label %437

409:                                              ; preds = %404
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #7
  store i64 0, ptr %47, align 8, !tbaa !9
  br label %410

410:                                              ; preds = %430, %409
  %411 = load i64, ptr %47, align 8, !tbaa !9
  %412 = load i64, ptr %35, align 8, !tbaa !9
  %413 = icmp ult i64 %411, %412
  br i1 %413, label %415, label %414

414:                                              ; preds = %410
  store i32 37, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #7
  br label %433

415:                                              ; preds = %410
  %416 = load ptr, ptr %12, align 8, !tbaa !5
  %417 = load i64, ptr %46, align 8, !tbaa !9
  %418 = load i64, ptr %35, align 8, !tbaa !9
  %419 = mul i64 %417, %418
  %420 = load i64, ptr %47, align 8, !tbaa !9
  %421 = add i64 %419, %420
  %422 = getelementptr inbounds %struct.ComplexFloat, ptr %416, i64 %421
  %423 = load ptr, ptr %40, align 8, !tbaa !5
  %424 = load i64, ptr %46, align 8, !tbaa !9
  %425 = load i64, ptr %37, align 8, !tbaa !9
  %426 = mul i64 %424, %425
  %427 = load i64, ptr %47, align 8, !tbaa !9
  %428 = add i64 %426, %427
  %429 = getelementptr inbounds %struct.ComplexFloat, ptr %423, i64 %428
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %422, ptr align 4 %429, i64 8, i1 false), !tbaa.struct !22
  br label %430

430:                                              ; preds = %415
  %431 = load i64, ptr %47, align 8, !tbaa !9
  %432 = add i64 %431, 1
  store i64 %432, ptr %47, align 8, !tbaa !9
  br label %410, !llvm.loop !30

433:                                              ; preds = %414
  br label %434

434:                                              ; preds = %433
  %435 = load i64, ptr %46, align 8, !tbaa !9
  %436 = add i64 %435, 1
  store i64 %436, ptr %46, align 8, !tbaa !9
  br label %404, !llvm.loop !31

437:                                              ; preds = %408
  %438 = load ptr, ptr %38, align 8, !tbaa !5
  call void @free(ptr noundef %438) #7
  %439 = load ptr, ptr %39, align 8, !tbaa !5
  call void @free(ptr noundef %439) #7
  %440 = load ptr, ptr %40, align 8, !tbaa !5
  call void @free(ptr noundef %440) #7
  %441 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %441) #7
  store i1 true, ptr %11, align 1
  store i32 1, ptr %23, align 4
  br label %442

442:                                              ; preds = %437, %308
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #7
  br label %451

443:                                              ; preds = %268, %265, %253
  %444 = load ptr, ptr %12, align 8, !tbaa !5
  %445 = load ptr, ptr %13, align 8, !tbaa !5
  %446 = load ptr, ptr %14, align 8, !tbaa !5
  %447 = load i64, ptr %33, align 8, !tbaa !9
  %448 = load i64, ptr %35, align 8, !tbaa !9
  %449 = load i64, ptr %34, align 8, !tbaa !9
  call void @matrix_multiply_blocked(ptr noundef %444, ptr noundef %445, ptr noundef %446, i64 noundef %447, i64 noundef %448, i64 noundef %449)
  %450 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %450) #7
  store i1 true, ptr %11, align 1
  store i32 1, ptr %23, align 4
  br label %451

451:                                              ; preds = %443, %442
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #7
  br label %816

452:                                              ; preds = %250, %247, %244
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #7
  store i64 1, ptr %48, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #7
  store i64 0, ptr %49, align 8, !tbaa !9
  br label %453

453:                                              ; preds = %465, %452
  %454 = load i64, ptr %49, align 8, !tbaa !9
  %455 = load i64, ptr %24, align 8, !tbaa !9
  %456 = icmp ult i64 %454, %455
  br i1 %456, label %458, label %457

457:                                              ; preds = %453
  store i32 40, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #7
  br label %468

458:                                              ; preds = %453
  %459 = load ptr, ptr %25, align 8, !tbaa !5
  %460 = load i64, ptr %49, align 8, !tbaa !9
  %461 = getelementptr inbounds i64, ptr %459, i64 %460
  %462 = load i64, ptr %461, align 8, !tbaa !9
  %463 = load i64, ptr %48, align 8, !tbaa !9
  %464 = mul i64 %463, %462
  store i64 %464, ptr %48, align 8, !tbaa !9
  br label %465

465:                                              ; preds = %458
  %466 = load i64, ptr %49, align 8, !tbaa !9
  %467 = add i64 %466, 1
  store i64 %467, ptr %49, align 8, !tbaa !9
  br label %453, !llvm.loop !32

468:                                              ; preds = %457
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #7
  store i64 0, ptr %50, align 8, !tbaa !9
  br label %469

469:                                              ; preds = %478, %468
  %470 = load i64, ptr %50, align 8, !tbaa !9
  %471 = load i64, ptr %48, align 8, !tbaa !9
  %472 = icmp ult i64 %470, %471
  br i1 %472, label %474, label %473

473:                                              ; preds = %469
  store i32 43, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #7
  br label %481

474:                                              ; preds = %469
  %475 = load ptr, ptr %12, align 8, !tbaa !5
  %476 = load i64, ptr %50, align 8, !tbaa !9
  %477 = getelementptr inbounds %struct.ComplexFloat, ptr %475, i64 %476
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %477, ptr align 4 @COMPLEX_FLOAT_ZERO, i64 8, i1 false), !tbaa.struct !22
  br label %478

478:                                              ; preds = %474
  %479 = load i64, ptr %50, align 8, !tbaa !9
  %480 = add i64 %479, 1
  store i64 %480, ptr %50, align 8, !tbaa !9
  br label %469, !llvm.loop !33

481:                                              ; preds = %473
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #7
  %482 = load i64, ptr %17, align 8, !tbaa !9
  %483 = mul i64 %482, 8
  %484 = call ptr @aligned_malloc(i64 noundef %483)
  store ptr %484, ptr %51, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #7
  %485 = load i64, ptr %18, align 8, !tbaa !9
  %486 = mul i64 %485, 8
  %487 = call ptr @aligned_malloc(i64 noundef %486)
  store ptr %487, ptr %52, align 8, !tbaa !5
  %488 = load ptr, ptr %51, align 8, !tbaa !5
  %489 = icmp ne ptr %488, null
  br i1 %489, label %490, label %493

490:                                              ; preds = %481
  %491 = load ptr, ptr %52, align 8, !tbaa !5
  %492 = icmp ne ptr %491, null
  br i1 %492, label %497, label %493

493:                                              ; preds = %490, %481
  %494 = load ptr, ptr %51, align 8, !tbaa !5
  call void @free(ptr noundef %494) #7
  %495 = load ptr, ptr %52, align 8, !tbaa !5
  call void @free(ptr noundef %495) #7
  %496 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %496) #7
  store i1 false, ptr %11, align 1
  store i32 1, ptr %23, align 4
  br label %815

497:                                              ; preds = %490
  %498 = load ptr, ptr %51, align 8, !tbaa !5
  %499 = load i64, ptr %17, align 8, !tbaa !9
  %500 = sub i64 %499, 1
  %501 = getelementptr inbounds i64, ptr %498, i64 %500
  store i64 1, ptr %501, align 8, !tbaa !9
  %502 = load ptr, ptr %52, align 8, !tbaa !5
  %503 = load i64, ptr %18, align 8, !tbaa !9
  %504 = sub i64 %503, 1
  %505 = getelementptr inbounds i64, ptr %502, i64 %504
  store i64 1, ptr %505, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #7
  %506 = load i64, ptr %17, align 8, !tbaa !9
  %507 = sub i64 %506, 1
  store i64 %507, ptr %53, align 8, !tbaa !9
  br label %508

508:                                              ; preds = %526, %497
  %509 = load i64, ptr %53, align 8, !tbaa !9
  %510 = icmp ugt i64 %509, 0
  br i1 %510, label %512, label %511

511:                                              ; preds = %508
  store i32 46, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #7
  br label %529

512:                                              ; preds = %508
  %513 = load ptr, ptr %51, align 8, !tbaa !5
  %514 = load i64, ptr %53, align 8, !tbaa !9
  %515 = getelementptr inbounds i64, ptr %513, i64 %514
  %516 = load i64, ptr %515, align 8, !tbaa !9
  %517 = load ptr, ptr %15, align 8, !tbaa !5
  %518 = load i64, ptr %53, align 8, !tbaa !9
  %519 = getelementptr inbounds i64, ptr %517, i64 %518
  %520 = load i64, ptr %519, align 8, !tbaa !9
  %521 = mul i64 %516, %520
  %522 = load ptr, ptr %51, align 8, !tbaa !5
  %523 = load i64, ptr %53, align 8, !tbaa !9
  %524 = sub i64 %523, 1
  %525 = getelementptr inbounds i64, ptr %522, i64 %524
  store i64 %521, ptr %525, align 8, !tbaa !9
  br label %526

526:                                              ; preds = %512
  %527 = load i64, ptr %53, align 8, !tbaa !9
  %528 = add i64 %527, -1
  store i64 %528, ptr %53, align 8, !tbaa !9
  br label %508, !llvm.loop !34

529:                                              ; preds = %511
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #7
  %530 = load i64, ptr %18, align 8, !tbaa !9
  %531 = sub i64 %530, 1
  store i64 %531, ptr %54, align 8, !tbaa !9
  br label %532

532:                                              ; preds = %550, %529
  %533 = load i64, ptr %54, align 8, !tbaa !9
  %534 = icmp ugt i64 %533, 0
  br i1 %534, label %536, label %535

535:                                              ; preds = %532
  store i32 49, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #7
  br label %553

536:                                              ; preds = %532
  %537 = load ptr, ptr %52, align 8, !tbaa !5
  %538 = load i64, ptr %54, align 8, !tbaa !9
  %539 = getelementptr inbounds i64, ptr %537, i64 %538
  %540 = load i64, ptr %539, align 8, !tbaa !9
  %541 = load ptr, ptr %16, align 8, !tbaa !5
  %542 = load i64, ptr %54, align 8, !tbaa !9
  %543 = getelementptr inbounds i64, ptr %541, i64 %542
  %544 = load i64, ptr %543, align 8, !tbaa !9
  %545 = mul i64 %540, %544
  %546 = load ptr, ptr %52, align 8, !tbaa !5
  %547 = load i64, ptr %54, align 8, !tbaa !9
  %548 = sub i64 %547, 1
  %549 = getelementptr inbounds i64, ptr %546, i64 %548
  store i64 %545, ptr %549, align 8, !tbaa !9
  br label %550

550:                                              ; preds = %536
  %551 = load i64, ptr %54, align 8, !tbaa !9
  %552 = add i64 %551, -1
  store i64 %552, ptr %54, align 8, !tbaa !9
  br label %532, !llvm.loop !35

553:                                              ; preds = %535
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #7
  store i64 1, ptr %55, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #7
  store i64 0, ptr %56, align 8, !tbaa !9
  br label %554

554:                                              ; preds = %569, %553
  %555 = load i64, ptr %56, align 8, !tbaa !9
  %556 = load i64, ptr %21, align 8, !tbaa !9
  %557 = icmp ult i64 %555, %556
  br i1 %557, label %559, label %558

558:                                              ; preds = %554
  store i32 52, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #7
  br label %572

559:                                              ; preds = %554
  %560 = load ptr, ptr %15, align 8, !tbaa !5
  %561 = load ptr, ptr %19, align 8, !tbaa !5
  %562 = load i64, ptr %56, align 8, !tbaa !9
  %563 = getelementptr inbounds i64, ptr %561, i64 %562
  %564 = load i64, ptr %563, align 8, !tbaa !9
  %565 = getelementptr inbounds i64, ptr %560, i64 %564
  %566 = load i64, ptr %565, align 8, !tbaa !9
  %567 = load i64, ptr %55, align 8, !tbaa !9
  %568 = mul i64 %567, %566
  store i64 %568, ptr %55, align 8, !tbaa !9
  br label %569

569:                                              ; preds = %559
  %570 = load i64, ptr %56, align 8, !tbaa !9
  %571 = add i64 %570, 1
  store i64 %571, ptr %56, align 8, !tbaa !9
  br label %554, !llvm.loop !36

572:                                              ; preds = %558
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #7
  store i64 0, ptr %57, align 8, !tbaa !9
  br label %573

573:                                              ; preds = %808, %572
  %574 = load i64, ptr %57, align 8, !tbaa !9
  %575 = load i64, ptr %48, align 8, !tbaa !9
  %576 = icmp ult i64 %574, %575
  br i1 %576, label %578, label %577

577:                                              ; preds = %573
  store i32 55, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #7
  br label %811

578:                                              ; preds = %573
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #7
  store i64 0, ptr %58, align 8, !tbaa !9
  br label %579

579:                                              ; preds = %804, %578
  %580 = load i64, ptr %58, align 8, !tbaa !9
  %581 = load i64, ptr %55, align 8, !tbaa !9
  %582 = icmp ult i64 %580, %581
  br i1 %582, label %584, label %583

583:                                              ; preds = %579
  store i32 58, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #7
  br label %807

584:                                              ; preds = %579
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #7
  store i64 0, ptr %59, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #7
  store i64 0, ptr %60, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #7
  %585 = load i64, ptr %57, align 8, !tbaa !9
  store i64 %585, ptr %61, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #7
  %586 = load i64, ptr %58, align 8, !tbaa !9
  store i64 %586, ptr %62, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #7
  store i64 0, ptr %63, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #7
  store i64 0, ptr %64, align 8, !tbaa !9
  br label %587

587:                                              ; preds = %658, %584
  %588 = load i64, ptr %64, align 8, !tbaa !9
  %589 = load i64, ptr %17, align 8, !tbaa !9
  %590 = icmp ult i64 %588, %589
  br i1 %590, label %592, label %591

591:                                              ; preds = %587
  store i32 61, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #7
  br label %661

592:                                              ; preds = %587
  call void @llvm.lifetime.start.p0(i64 1, ptr %65) #7
  store i8 0, ptr %65, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #7
  store i64 0, ptr %66, align 8, !tbaa !9
  br label %593

593:                                              ; preds = %627, %592
  %594 = load i64, ptr %66, align 8, !tbaa !9
  %595 = load i64, ptr %21, align 8, !tbaa !9
  %596 = icmp ult i64 %594, %595
  br i1 %596, label %598, label %597

597:                                              ; preds = %593
  store i32 64, ptr %23, align 4
  br label %630

598:                                              ; preds = %593
  %599 = load i64, ptr %64, align 8, !tbaa !9
  %600 = load ptr, ptr %19, align 8, !tbaa !5
  %601 = load i64, ptr %66, align 8, !tbaa !9
  %602 = getelementptr inbounds i64, ptr %600, i64 %601
  %603 = load i64, ptr %602, align 8, !tbaa !9
  %604 = icmp eq i64 %599, %603
  br i1 %604, label %605, label %626

605:                                              ; preds = %598
  store i8 1, ptr %65, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #7
  %606 = load i64, ptr %62, align 8, !tbaa !9
  %607 = load ptr, ptr %15, align 8, !tbaa !5
  %608 = load i64, ptr %64, align 8, !tbaa !9
  %609 = getelementptr inbounds i64, ptr %607, i64 %608
  %610 = load i64, ptr %609, align 8, !tbaa !9
  %611 = urem i64 %606, %610
  store i64 %611, ptr %67, align 8, !tbaa !9
  %612 = load ptr, ptr %15, align 8, !tbaa !5
  %613 = load i64, ptr %64, align 8, !tbaa !9
  %614 = getelementptr inbounds i64, ptr %612, i64 %613
  %615 = load i64, ptr %614, align 8, !tbaa !9
  %616 = load i64, ptr %62, align 8, !tbaa !9
  %617 = udiv i64 %616, %615
  store i64 %617, ptr %62, align 8, !tbaa !9
  %618 = load i64, ptr %67, align 8, !tbaa !9
  %619 = load ptr, ptr %51, align 8, !tbaa !5
  %620 = load i64, ptr %64, align 8, !tbaa !9
  %621 = getelementptr inbounds i64, ptr %619, i64 %620
  %622 = load i64, ptr %621, align 8, !tbaa !9
  %623 = mul i64 %618, %622
  %624 = load i64, ptr %59, align 8, !tbaa !9
  %625 = add i64 %624, %623
  store i64 %625, ptr %59, align 8, !tbaa !9
  store i32 64, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #7
  br label %630

626:                                              ; preds = %598
  br label %627

627:                                              ; preds = %626
  %628 = load i64, ptr %66, align 8, !tbaa !9
  %629 = add i64 %628, 1
  store i64 %629, ptr %66, align 8, !tbaa !9
  br label %593, !llvm.loop !37

630:                                              ; preds = %605, %597
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #7
  br label %631

631:                                              ; preds = %630
  %632 = load i8, ptr %65, align 1, !tbaa !13, !range !16, !noundef !17
  %633 = trunc i8 %632 to i1
  br i1 %633, label %657, label %634

634:                                              ; preds = %631
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #7
  %635 = load i64, ptr %61, align 8, !tbaa !9
  %636 = load ptr, ptr %25, align 8, !tbaa !5
  %637 = load i64, ptr %63, align 8, !tbaa !9
  %638 = getelementptr inbounds i64, ptr %636, i64 %637
  %639 = load i64, ptr %638, align 8, !tbaa !9
  %640 = urem i64 %635, %639
  store i64 %640, ptr %68, align 8, !tbaa !9
  %641 = load ptr, ptr %25, align 8, !tbaa !5
  %642 = load i64, ptr %63, align 8, !tbaa !9
  %643 = getelementptr inbounds i64, ptr %641, i64 %642
  %644 = load i64, ptr %643, align 8, !tbaa !9
  %645 = load i64, ptr %61, align 8, !tbaa !9
  %646 = udiv i64 %645, %644
  store i64 %646, ptr %61, align 8, !tbaa !9
  %647 = load i64, ptr %68, align 8, !tbaa !9
  %648 = load ptr, ptr %51, align 8, !tbaa !5
  %649 = load i64, ptr %64, align 8, !tbaa !9
  %650 = getelementptr inbounds i64, ptr %648, i64 %649
  %651 = load i64, ptr %650, align 8, !tbaa !9
  %652 = mul i64 %647, %651
  %653 = load i64, ptr %59, align 8, !tbaa !9
  %654 = add i64 %653, %652
  store i64 %654, ptr %59, align 8, !tbaa !9
  %655 = load i64, ptr %63, align 8, !tbaa !9
  %656 = add i64 %655, 1
  store i64 %656, ptr %63, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #7
  br label %657

657:                                              ; preds = %634, %631
  call void @llvm.lifetime.end.p0(i64 1, ptr %65) #7
  br label %658

658:                                              ; preds = %657
  %659 = load i64, ptr %64, align 8, !tbaa !9
  %660 = add i64 %659, 1
  store i64 %660, ptr %64, align 8, !tbaa !9
  br label %587, !llvm.loop !38

661:                                              ; preds = %591
  %662 = load i64, ptr %17, align 8, !tbaa !9
  %663 = load i64, ptr %21, align 8, !tbaa !9
  %664 = sub i64 %662, %663
  store i64 %664, ptr %63, align 8, !tbaa !9
  %665 = load i64, ptr %57, align 8, !tbaa !9
  store i64 %665, ptr %61, align 8, !tbaa !9
  %666 = load i64, ptr %58, align 8, !tbaa !9
  store i64 %666, ptr %62, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %69) #7
  store i64 0, ptr %69, align 8, !tbaa !9
  br label %667

667:                                              ; preds = %737, %661
  %668 = load i64, ptr %69, align 8, !tbaa !9
  %669 = load i64, ptr %18, align 8, !tbaa !9
  %670 = icmp ult i64 %668, %669
  br i1 %670, label %672, label %671

671:                                              ; preds = %667
  store i32 67, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #7
  br label %740

672:                                              ; preds = %667
  call void @llvm.lifetime.start.p0(i64 1, ptr %70) #7
  store i8 0, ptr %70, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %71) #7
  store i64 0, ptr %71, align 8, !tbaa !9
  br label %673

673:                                              ; preds = %707, %672
  %674 = load i64, ptr %71, align 8, !tbaa !9
  %675 = load i64, ptr %21, align 8, !tbaa !9
  %676 = icmp ult i64 %674, %675
  br i1 %676, label %678, label %677

677:                                              ; preds = %673
  store i32 70, ptr %23, align 4
  br label %710

678:                                              ; preds = %673
  %679 = load i64, ptr %69, align 8, !tbaa !9
  %680 = load ptr, ptr %20, align 8, !tbaa !5
  %681 = load i64, ptr %71, align 8, !tbaa !9
  %682 = getelementptr inbounds i64, ptr %680, i64 %681
  %683 = load i64, ptr %682, align 8, !tbaa !9
  %684 = icmp eq i64 %679, %683
  br i1 %684, label %685, label %706

685:                                              ; preds = %678
  store i8 1, ptr %70, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #7
  %686 = load i64, ptr %62, align 8, !tbaa !9
  %687 = load ptr, ptr %16, align 8, !tbaa !5
  %688 = load i64, ptr %69, align 8, !tbaa !9
  %689 = getelementptr inbounds i64, ptr %687, i64 %688
  %690 = load i64, ptr %689, align 8, !tbaa !9
  %691 = urem i64 %686, %690
  store i64 %691, ptr %72, align 8, !tbaa !9
  %692 = load ptr, ptr %16, align 8, !tbaa !5
  %693 = load i64, ptr %69, align 8, !tbaa !9
  %694 = getelementptr inbounds i64, ptr %692, i64 %693
  %695 = load i64, ptr %694, align 8, !tbaa !9
  %696 = load i64, ptr %62, align 8, !tbaa !9
  %697 = udiv i64 %696, %695
  store i64 %697, ptr %62, align 8, !tbaa !9
  %698 = load i64, ptr %72, align 8, !tbaa !9
  %699 = load ptr, ptr %52, align 8, !tbaa !5
  %700 = load i64, ptr %69, align 8, !tbaa !9
  %701 = getelementptr inbounds i64, ptr %699, i64 %700
  %702 = load i64, ptr %701, align 8, !tbaa !9
  %703 = mul i64 %698, %702
  %704 = load i64, ptr %60, align 8, !tbaa !9
  %705 = add i64 %704, %703
  store i64 %705, ptr %60, align 8, !tbaa !9
  store i32 70, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #7
  br label %710

706:                                              ; preds = %678
  br label %707

707:                                              ; preds = %706
  %708 = load i64, ptr %71, align 8, !tbaa !9
  %709 = add i64 %708, 1
  store i64 %709, ptr %71, align 8, !tbaa !9
  br label %673, !llvm.loop !39

710:                                              ; preds = %685, %677
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #7
  br label %711

711:                                              ; preds = %710
  %712 = load i8, ptr %70, align 1, !tbaa !13, !range !16, !noundef !17
  %713 = trunc i8 %712 to i1
  br i1 %713, label %736, label %714

714:                                              ; preds = %711
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #7
  %715 = load i64, ptr %61, align 8, !tbaa !9
  %716 = load ptr, ptr %25, align 8, !tbaa !5
  %717 = load i64, ptr %63, align 8, !tbaa !9
  %718 = getelementptr inbounds i64, ptr %716, i64 %717
  %719 = load i64, ptr %718, align 8, !tbaa !9
  %720 = udiv i64 %715, %719
  %721 = load ptr, ptr %25, align 8, !tbaa !5
  %722 = load i64, ptr %63, align 8, !tbaa !9
  %723 = getelementptr inbounds i64, ptr %721, i64 %722
  %724 = load i64, ptr %723, align 8, !tbaa !9
  %725 = urem i64 %720, %724
  store i64 %725, ptr %73, align 8, !tbaa !9
  %726 = load i64, ptr %73, align 8, !tbaa !9
  %727 = load ptr, ptr %52, align 8, !tbaa !5
  %728 = load i64, ptr %69, align 8, !tbaa !9
  %729 = getelementptr inbounds i64, ptr %727, i64 %728
  %730 = load i64, ptr %729, align 8, !tbaa !9
  %731 = mul i64 %726, %730
  %732 = load i64, ptr %60, align 8, !tbaa !9
  %733 = add i64 %732, %731
  store i64 %733, ptr %60, align 8, !tbaa !9
  %734 = load i64, ptr %63, align 8, !tbaa !9
  %735 = add i64 %734, 1
  store i64 %735, ptr %63, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #7
  br label %736

736:                                              ; preds = %714, %711
  call void @llvm.lifetime.end.p0(i64 1, ptr %70) #7
  br label %737

737:                                              ; preds = %736
  %738 = load i64, ptr %69, align 8, !tbaa !9
  %739 = add i64 %738, 1
  store i64 %739, ptr %69, align 8, !tbaa !9
  br label %667, !llvm.loop !40

740:                                              ; preds = %671
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #7
  %741 = load ptr, ptr %13, align 8, !tbaa !5
  %742 = load i64, ptr %59, align 8, !tbaa !9
  %743 = getelementptr inbounds %struct.ComplexFloat, ptr %741, i64 %742
  %744 = getelementptr inbounds %struct.ComplexFloat, ptr %743, i32 0, i32 0
  %745 = load float, ptr %744, align 4, !tbaa !41
  %746 = load ptr, ptr %14, align 8, !tbaa !5
  %747 = load i64, ptr %60, align 8, !tbaa !9
  %748 = getelementptr inbounds %struct.ComplexFloat, ptr %746, i64 %747
  %749 = getelementptr inbounds %struct.ComplexFloat, ptr %748, i32 0, i32 0
  %750 = load float, ptr %749, align 4, !tbaa !41
  %751 = load ptr, ptr %13, align 8, !tbaa !5
  %752 = load i64, ptr %59, align 8, !tbaa !9
  %753 = getelementptr inbounds %struct.ComplexFloat, ptr %751, i64 %752
  %754 = getelementptr inbounds %struct.ComplexFloat, ptr %753, i32 0, i32 1
  %755 = load float, ptr %754, align 4, !tbaa !43
  %756 = load ptr, ptr %14, align 8, !tbaa !5
  %757 = load i64, ptr %60, align 8, !tbaa !9
  %758 = getelementptr inbounds %struct.ComplexFloat, ptr %756, i64 %757
  %759 = getelementptr inbounds %struct.ComplexFloat, ptr %758, i32 0, i32 1
  %760 = load float, ptr %759, align 4, !tbaa !43
  %761 = fmul float %755, %760
  %762 = fneg float %761
  %763 = call float @llvm.fmuladd.f32(float %745, float %750, float %762)
  %764 = getelementptr inbounds %struct.ComplexFloat, ptr %74, i32 0, i32 0
  store float %763, ptr %764, align 4, !tbaa !41
  %765 = load ptr, ptr %13, align 8, !tbaa !5
  %766 = load i64, ptr %59, align 8, !tbaa !9
  %767 = getelementptr inbounds %struct.ComplexFloat, ptr %765, i64 %766
  %768 = getelementptr inbounds %struct.ComplexFloat, ptr %767, i32 0, i32 0
  %769 = load float, ptr %768, align 4, !tbaa !41
  %770 = load ptr, ptr %14, align 8, !tbaa !5
  %771 = load i64, ptr %60, align 8, !tbaa !9
  %772 = getelementptr inbounds %struct.ComplexFloat, ptr %770, i64 %771
  %773 = getelementptr inbounds %struct.ComplexFloat, ptr %772, i32 0, i32 1
  %774 = load float, ptr %773, align 4, !tbaa !43
  %775 = load ptr, ptr %13, align 8, !tbaa !5
  %776 = load i64, ptr %59, align 8, !tbaa !9
  %777 = getelementptr inbounds %struct.ComplexFloat, ptr %775, i64 %776
  %778 = getelementptr inbounds %struct.ComplexFloat, ptr %777, i32 0, i32 1
  %779 = load float, ptr %778, align 4, !tbaa !43
  %780 = load ptr, ptr %14, align 8, !tbaa !5
  %781 = load i64, ptr %60, align 8, !tbaa !9
  %782 = getelementptr inbounds %struct.ComplexFloat, ptr %780, i64 %781
  %783 = getelementptr inbounds %struct.ComplexFloat, ptr %782, i32 0, i32 0
  %784 = load float, ptr %783, align 4, !tbaa !41
  %785 = fmul float %779, %784
  %786 = call float @llvm.fmuladd.f32(float %769, float %774, float %785)
  %787 = getelementptr inbounds %struct.ComplexFloat, ptr %74, i32 0, i32 1
  store float %786, ptr %787, align 4, !tbaa !43
  %788 = getelementptr inbounds %struct.ComplexFloat, ptr %74, i32 0, i32 0
  %789 = load float, ptr %788, align 4, !tbaa !41
  %790 = load ptr, ptr %12, align 8, !tbaa !5
  %791 = load i64, ptr %57, align 8, !tbaa !9
  %792 = getelementptr inbounds %struct.ComplexFloat, ptr %790, i64 %791
  %793 = getelementptr inbounds %struct.ComplexFloat, ptr %792, i32 0, i32 0
  %794 = load float, ptr %793, align 4, !tbaa !41
  %795 = fadd float %794, %789
  store float %795, ptr %793, align 4, !tbaa !41
  %796 = getelementptr inbounds %struct.ComplexFloat, ptr %74, i32 0, i32 1
  %797 = load float, ptr %796, align 4, !tbaa !43
  %798 = load ptr, ptr %12, align 8, !tbaa !5
  %799 = load i64, ptr %57, align 8, !tbaa !9
  %800 = getelementptr inbounds %struct.ComplexFloat, ptr %798, i64 %799
  %801 = getelementptr inbounds %struct.ComplexFloat, ptr %800, i32 0, i32 1
  %802 = load float, ptr %801, align 4, !tbaa !43
  %803 = fadd float %802, %797
  store float %803, ptr %801, align 4, !tbaa !43
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #7
  br label %804

804:                                              ; preds = %740
  %805 = load i64, ptr %58, align 8, !tbaa !9
  %806 = add i64 %805, 1
  store i64 %806, ptr %58, align 8, !tbaa !9
  br label %579, !llvm.loop !44

807:                                              ; preds = %583
  br label %808

808:                                              ; preds = %807
  %809 = load i64, ptr %57, align 8, !tbaa !9
  %810 = add i64 %809, 1
  store i64 %810, ptr %57, align 8, !tbaa !9
  br label %573, !llvm.loop !45

811:                                              ; preds = %577
  %812 = load ptr, ptr %51, align 8, !tbaa !5
  call void @free(ptr noundef %812) #7
  %813 = load ptr, ptr %52, align 8, !tbaa !5
  call void @free(ptr noundef %813) #7
  %814 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %814) #7
  store i1 true, ptr %11, align 1
  store i32 1, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #7
  br label %815

815:                                              ; preds = %811, %493
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #7
  br label %816

816:                                              ; preds = %815, %451
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #7
  br label %817

817:                                              ; preds = %816, %161
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  br label %818

818:                                              ; preds = %817, %147, %104
  %819 = load i1, ptr %11, align 1
  ret i1 %819

820:                                              ; preds = %147
  unreachable
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @aligned_malloc(i64 noundef) #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @max(i64 noundef, i64 noundef) #5

; Function Attrs: nounwind uwtable
declare hidden void @strassen_multiply(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef) #4

; Function Attrs: nounwind uwtable
declare hidden void @matrix_multiply_blocked(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef) #4

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #6

attributes #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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind 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 #5 = { inlinehint 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 #6 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #7 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = !{!14, !14, i64 0}
!14 = !{!"_Bool", !7, i64 0}
!15 = distinct !{!15, !12}
!16 = !{i8 0, i8 2}
!17 = !{}
!18 = distinct !{!18, !12}
!19 = distinct !{!19, !12}
!20 = distinct !{!20, !12}
!21 = distinct !{!21, !12}
!22 = !{i64 0, i64 4, !23, i64 4, i64 4, !23}
!23 = !{!24, !24, i64 0}
!24 = !{!"float", !7, i64 0}
!25 = distinct !{!25, !12}
!26 = distinct !{!26, !12}
!27 = distinct !{!27, !12}
!28 = distinct !{!28, !12}
!29 = distinct !{!29, !12}
!30 = distinct !{!30, !12}
!31 = distinct !{!31, !12}
!32 = distinct !{!32, !12}
!33 = distinct !{!33, !12}
!34 = distinct !{!34, !12}
!35 = distinct !{!35, !12}
!36 = distinct !{!36, !12}
!37 = distinct !{!37, !12}
!38 = distinct !{!38, !12}
!39 = distinct !{!39, !12}
!40 = distinct !{!40, !12}
!41 = !{!42, !24, i64 0}
!42 = !{!"", !24, i64 0, !24, i64 4}
!43 = !{!42, !24, i64 4}
!44 = distinct !{!44, !12}
!45 = distinct !{!45, !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"

%struct.ComplexFloat = type { float, float }

@.str.6 = external hidden unnamed_addr constant [25 x i8], align 1
@COMPLEX_FLOAT_ZERO = external hidden local_unnamed_addr constant %struct.ComplexFloat, align 4
@.str.12 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [34 x i8], align 1

declare void @geometric_log_error(ptr noundef, ...) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local noundef zeroext i1 @qg_tensor_contract(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef readonly %3, ptr noundef readonly %4, i64 noundef %5, i64 noundef %6, ptr noundef readonly %7, ptr noundef readonly %8, i64 noundef %9) local_unnamed_addr #2 {
  %11 = insertelement <4 x ptr> poison, ptr %0, i64 0
  %12 = insertelement <4 x ptr> %11, ptr %1, i64 1
  %13 = insertelement <4 x ptr> %12, ptr %2, i64 2
  %14 = insertelement <4 x ptr> %13, ptr %3, i64 3
  %15 = icmp eq <4 x ptr> %14, zeroinitializer
  %16 = icmp eq ptr %4, null
  %17 = icmp eq ptr %7, null
  %18 = icmp eq ptr %8, null
  %19 = icmp eq i64 %5, 0
  %20 = icmp eq i64 %6, 0
  %21 = icmp eq i64 %9, 0
  %22 = bitcast <4 x i1> %15 to i4
  %23 = icmp ne i4 %22, 0
  %op.rdx = or i1 %23, %16
  %op.rdx641 = or i1 %17, %18
  %op.rdx642 = or i1 %19, %20
  %op.rdx643 = or i1 %op.rdx, %op.rdx641
  %op.rdx644 = or i1 %op.rdx642, %21
  %op.rdx645 = or i1 %op.rdx643, %op.rdx644
  br i1 %op.rdx645, label %24, label %.preheader440

24:                                               ; preds = %10
  tail call void (ptr, ...) @geometric_log_error(ptr noundef nonnull @.str.12) #5
  br label %.thread

25:                                               ; preds = %33
  %26 = add nuw i64 %.0326441, 1
  %exitcond.not = icmp eq i64 %26, %9
  br i1 %exitcond.not, label %39, label %.preheader440, !llvm.loop !5

.preheader440:                                    ; preds = %10, %25
  %.0326441 = phi i64 [ %26, %25 ], [ 0, %10 ]
  %27 = getelementptr inbounds i64, ptr %7, i64 %.0326441
  %28 = load i64, ptr %27, align 8, !tbaa !7
  %.not = icmp ult i64 %28, %5
  br i1 %.not, label %29, label %32

29:                                               ; preds = %.preheader440
  %30 = getelementptr inbounds i64, ptr %8, i64 %.0326441
  %31 = load i64, ptr %30, align 8, !tbaa !7
  %.not402 = icmp ult i64 %31, %6
  br i1 %.not402, label %33, label %32

32:                                               ; preds = %29, %.preheader440
  tail call void (ptr, ...) @geometric_log_error(ptr noundef nonnull @.str.13) #5
  br label %.thread

33:                                               ; preds = %29
  %34 = getelementptr inbounds i64, ptr %3, i64 %28
  %35 = load i64, ptr %34, align 8, !tbaa !7
  %36 = getelementptr inbounds i64, ptr %4, i64 %31
  %37 = load i64, ptr %36, align 8, !tbaa !7
  %.not403 = icmp eq i64 %35, %37
  br i1 %.not403, label %25, label %38

38:                                               ; preds = %33
  tail call void (ptr, ...) @geometric_log_error(ptr noundef nonnull @.str.14) #5
  br label %.thread

39:                                               ; preds = %25
  %40 = add i64 %6, %5
  %41 = shl i64 %9, 1
  %42 = sub i64 %40, %41
  %43 = shl i64 %42, 3
  %44 = tail call ptr @aligned_malloc(i64 noundef %43)
  %.not404 = icmp eq ptr %44, null
  br i1 %.not404, label %45, label %.lr.ph.preheader

45:                                               ; preds = %39
  tail call void (ptr, ...) @geometric_log_error(ptr noundef nonnull @.str.6) #5
  br label %.thread

.lr.ph.preheader:                                 ; preds = %39, %.loopexit438
  %.0328445 = phi i64 [ %.1329, %.loopexit438 ], [ 0, %39 ]
  %.0335443 = phi i64 [ %55, %.loopexit438 ], [ 0, %39 ]
  br label %.lr.ph

46:                                               ; preds = %.lr.ph
  %47 = add nuw i64 %.0362442, 1
  %exitcond520.not = icmp eq i64 %47, %9
  br i1 %exitcond520.not, label %.critedge, label %.lr.ph, !llvm.loop !11

.lr.ph:                                           ; preds = %.lr.ph.preheader, %46
  %.0362442 = phi i64 [ %47, %46 ], [ 0, %.lr.ph.preheader ]
  %48 = getelementptr inbounds i64, ptr %7, i64 %.0362442
  %49 = load i64, ptr %48, align 8, !tbaa !7
  %50 = icmp eq i64 %.0335443, %49
  br i1 %50, label %.loopexit438, label %46

.critedge:                                        ; preds = %46
  %51 = getelementptr inbounds i64, ptr %3, i64 %.0335443
  %52 = load i64, ptr %51, align 8, !tbaa !7
  %53 = add i64 %.0328445, 1
  %54 = getelementptr inbounds i64, ptr %44, i64 %.0328445
  store i64 %52, ptr %54, align 8, !tbaa !7
  br label %.loopexit438

.loopexit438:                                     ; preds = %.lr.ph, %.critedge
  %.1329 = phi i64 [ %53, %.critedge ], [ %.0328445, %.lr.ph ]
  %55 = add nuw i64 %.0335443, 1
  %exitcond521.not = icmp eq i64 %55, %5
  br i1 %exitcond521.not, label %.lr.ph447.preheader, label %.lr.ph.preheader, !llvm.loop !12

.lr.ph447.preheader:                              ; preds = %.loopexit438, %.loopexit
  %.2330450 = phi i64 [ %.3331, %.loopexit ], [ %.1329, %.loopexit438 ]
  %.0363448 = phi i64 [ %70, %.loopexit ], [ 0, %.loopexit438 ]
  br label %.lr.ph447

56:                                               ; preds = %.loopexit
  %57 = icmp eq i64 %5, 2
  %58 = icmp eq i64 %6, 2
  %or.cond19 = and i1 %57, %58
  %59 = icmp eq i64 %9, 1
  %or.cond21 = and i1 %or.cond19, %59
  br i1 %or.cond21, label %71, label %.preheader434

.preheader434:                                    ; preds = %56
  %.not509 = icmp eq i64 %40, %41
  br i1 %.not509, label %.lr.ph455, label %.lr.ph453.preheader

.lr.ph453.preheader:                              ; preds = %.preheader434
  %umax = tail call i64 @llvm.umax.i64(i64 %42, i64 1)
  %xtraiter = and i64 %umax, 7
  %60 = icmp ult i64 %42, 8
  br i1 %60, label %.preheader433.unr-lcssa, label %.lr.ph453.preheader.new

.lr.ph453.preheader.new:                          ; preds = %.lr.ph453.preheader
  %unroll_iter = and i64 %umax, -8
  br label %.lr.ph453

61:                                               ; preds = %.lr.ph447
  %62 = add nuw i64 %.0375446, 1
  %exitcond522.not = icmp eq i64 %62, %9
  br i1 %exitcond522.not, label %.critedge408, label %.lr.ph447, !llvm.loop !13

.lr.ph447:                                        ; preds = %.lr.ph447.preheader, %61
  %.0375446 = phi i64 [ %62, %61 ], [ 0, %.lr.ph447.preheader ]
  %63 = getelementptr inbounds i64, ptr %8, i64 %.0375446
  %64 = load i64, ptr %63, align 8, !tbaa !7
  %65 = icmp eq i64 %.0363448, %64
  br i1 %65, label %.loopexit, label %61

.critedge408:                                     ; preds = %61
  %66 = getelementptr inbounds i64, ptr %4, i64 %.0363448
  %67 = load i64, ptr %66, align 8, !tbaa !7
  %68 = add i64 %.2330450, 1
  %69 = getelementptr inbounds i64, ptr %44, i64 %.2330450
  store i64 %67, ptr %69, align 8, !tbaa !7
  br label %.loopexit

.loopexit:                                        ; preds = %.lr.ph447, %.critedge408
  %.3331 = phi i64 [ %68, %.critedge408 ], [ %.2330450, %.lr.ph447 ]
  %70 = add nuw i64 %.0363448, 1
  %exitcond523.not = icmp eq i64 %70, %6
  br i1 %exitcond523.not, label %56, label %.lr.ph447.preheader, !llvm.loop !14

71:                                               ; preds = %56
  %72 = load i64, ptr %3, align 8, !tbaa !7
  %73 = getelementptr inbounds i8, ptr %3, i64 8
  %74 = load i64, ptr %73, align 8, !tbaa !7
  %75 = getelementptr inbounds i8, ptr %4, i64 8
  %76 = load i64, ptr %75, align 8, !tbaa !7
  %77 = icmp ugt i64 %72, 511
  %78 = icmp ugt i64 %74, 511
  %or.cond23 = select i1 %77, i1 %78, i1 false
  %79 = icmp ugt i64 %76, 511
  %or.cond25 = select i1 %or.cond23, i1 %79, i1 false
  br i1 %or.cond25, label %80, label %253

80:                                               ; preds = %71
  %81 = tail call i64 @max(i64 noundef %72, i64 noundef %74)
  %82 = tail call i64 @max(i64 noundef %81, i64 noundef %76)
  br label %83

83:                                               ; preds = %83, %80
  %.0376 = phi i64 [ 1, %80 ], [ %85, %83 ]
  %84 = icmp ult i64 %.0376, %82
  %85 = shl i64 %.0376, 1
  br i1 %84, label %83, label %86, !llvm.loop !15

86:                                               ; preds = %83
  %87 = mul i64 %.0376, %.0376
  %88 = shl i64 %87, 3
  %89 = tail call ptr @aligned_malloc(i64 noundef %88)
  %90 = ptrtoint ptr %89 to i64
  %91 = tail call ptr @aligned_malloc(i64 noundef %88)
  %92 = ptrtoint ptr %91 to i64
  %93 = tail call ptr @aligned_malloc(i64 noundef %88)
  %94 = icmp ne ptr %89, null
  %95 = icmp ne ptr %91, null
  %or.cond27 = select i1 %94, i1 %95, i1 false
  %96 = icmp ne ptr %93, null
  %or.cond29 = select i1 %or.cond27, i1 %96, i1 false
  br i1 %or.cond29, label %.preheader425, label %109

.preheader425:                                    ; preds = %86
  %.not516 = icmp eq i64 %87, 0
  br i1 %.not516, label %.preheader424, label %.lr.ph499

.lr.ph499:                                        ; preds = %.preheader425
  %97 = load i64, ptr @COMPLEX_FLOAT_ZERO, align 4
  %min.iters.check560 = icmp ult i64 %87, 6
  %98 = sub i64 %92, %90
  %diff.check = icmp ult i64 %98, 32
  %or.cond = select i1 %min.iters.check560, i1 true, i1 %diff.check
  br i1 %or.cond, label %scalar.ph559.preheader, label %vector.ph561

scalar.ph559.preheader:                           ; preds = %middle.block558, %.lr.ph499
  %.0373498.ph = phi i64 [ 0, %.lr.ph499 ], [ %n.vec563, %middle.block558 ]
  %xtraiter659 = and i64 %87, 3
  %lcmp.mod660.not = icmp eq i64 %xtraiter659, 0
  br i1 %lcmp.mod660.not, label %scalar.ph559.prol.loopexit, label %scalar.ph559.prol

scalar.ph559.prol:                                ; preds = %scalar.ph559.preheader, %scalar.ph559.prol
  %.0373498.prol = phi i64 [ %101, %scalar.ph559.prol ], [ %.0373498.ph, %scalar.ph559.preheader ]
  %prol.iter661 = phi i64 [ %prol.iter661.next, %scalar.ph559.prol ], [ 0, %scalar.ph559.preheader ]
  %99 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i64 %.0373498.prol
  store i64 %97, ptr %99, align 4
  %100 = getelementptr inbounds %struct.ComplexFloat, ptr %91, i64 %.0373498.prol
  store i64 %97, ptr %100, align 4
  %101 = add nuw i64 %.0373498.prol, 1
  %prol.iter661.next = add i64 %prol.iter661, 1
  %prol.iter661.cmp.not = icmp eq i64 %prol.iter661.next, %xtraiter659
  br i1 %prol.iter661.cmp.not, label %scalar.ph559.prol.loopexit, label %scalar.ph559.prol, !llvm.loop !16

scalar.ph559.prol.loopexit:                       ; preds = %scalar.ph559.prol, %scalar.ph559.preheader
  %.0373498.unr = phi i64 [ %.0373498.ph, %scalar.ph559.preheader ], [ %101, %scalar.ph559.prol ]
  %102 = sub i64 %.0373498.ph, %87
  %103 = icmp ugt i64 %102, -4
  br i1 %103, label %.preheader424, label %scalar.ph559

vector.ph561:                                     ; preds = %.lr.ph499
  %n.vec563 = and i64 %87, -4
  %broadcast.splatinsert567 = insertelement <2 x i64> poison, i64 %97, i64 0
  %broadcast.splat568 = shufflevector <2 x i64> %broadcast.splatinsert567, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body565

vector.body565:                                   ; preds = %vector.body565, %vector.ph561
  %index566 = phi i64 [ 0, %vector.ph561 ], [ %index.next569, %vector.body565 ]
  %104 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i64 %index566
  %105 = getelementptr inbounds i8, ptr %104, i64 16
  store <2 x i64> %broadcast.splat568, ptr %104, align 4
  store <2 x i64> %broadcast.splat568, ptr %105, align 4
  %106 = getelementptr inbounds %struct.ComplexFloat, ptr %91, i64 %index566
  %107 = getelementptr inbounds i8, ptr %106, i64 16
  store <2 x i64> %broadcast.splat568, ptr %106, align 4
  store <2 x i64> %broadcast.splat568, ptr %107, align 4
  %index.next569 = add nuw i64 %index566, 4
  %108 = icmp eq i64 %index.next569, %n.vec563
  br i1 %108, label %middle.block558, label %vector.body565, !llvm.loop !18

middle.block558:                                  ; preds = %vector.body565
  %cmp.n570 = icmp eq i64 %87, %n.vec563
  br i1 %cmp.n570, label %.preheader424, label %scalar.ph559.preheader

109:                                              ; preds = %86
  tail call void @free(ptr noundef %89) #5
  tail call void @free(ptr noundef %91) #5
  tail call void @free(ptr noundef %93) #5
  tail call void @free(ptr noundef %44) #5
  br label %.thread

.preheader424:                                    ; preds = %scalar.ph559.prol.loopexit, %scalar.ph559, %middle.block558, %.preheader425
  %umax539 = tail call i64 @llvm.umax.i64(i64 %74, i64 1)
  %umax541 = tail call i64 @llvm.umax.i64(i64 %72, i64 1)
  %110 = shl i64 %umax539, 3
  %scevgep = getelementptr i8, ptr %89, i64 %110
  %111 = add i64 %umax541, -1
  %112 = shl i64 %111, 3
  %113 = mul i64 %112, %.0376
  %scevgep572 = getelementptr i8, ptr %scevgep, i64 %113
  %114 = mul i64 %74, %111
  %115 = add i64 %114, %umax539
  %116 = shl i64 %115, 3
  %scevgep573 = getelementptr i8, ptr %1, i64 %116
  %min.iters.check577 = icmp ult i64 %74, 8
  %bound0 = icmp ult ptr %89, %scevgep573
  %bound1 = icmp ugt ptr %scevgep572, %1
  %found.conflict = and i1 %bound0, %bound1
  %117 = or i64 %.0376, %74
  %118 = and i64 %117, 1152921504606846976
  %119 = icmp ne i64 %118, 0
  %120 = or i1 %found.conflict, %119
  %n.vec580 = and i64 %umax539, -4
  %cmp.n586 = icmp eq i64 %74, %n.vec580
  %xtraiter662 = and i64 %umax539, 3
  %lcmp.mod663.not = icmp eq i64 %xtraiter662, 0
  br label %.preheader423

scalar.ph559:                                     ; preds = %scalar.ph559.prol.loopexit, %scalar.ph559
  %.0373498 = phi i64 [ %132, %scalar.ph559 ], [ %.0373498.unr, %scalar.ph559.prol.loopexit ]
  %121 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i64 %.0373498
  store i64 %97, ptr %121, align 4
  %122 = getelementptr inbounds %struct.ComplexFloat, ptr %91, i64 %.0373498
  store i64 %97, ptr %122, align 4
  %123 = add nuw i64 %.0373498, 1
  %124 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i64 %123
  store i64 %97, ptr %124, align 4
  %125 = getelementptr inbounds %struct.ComplexFloat, ptr %91, i64 %123
  store i64 %97, ptr %125, align 4
  %126 = add nuw i64 %.0373498, 2
  %127 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i64 %126
  store i64 %97, ptr %127, align 4
  %128 = getelementptr inbounds %struct.ComplexFloat, ptr %91, i64 %126
  store i64 %97, ptr %128, align 4
  %129 = add nuw i64 %.0373498, 3
  %130 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i64 %129
  store i64 %97, ptr %130, align 4
  %131 = getelementptr inbounds %struct.ComplexFloat, ptr %91, i64 %129
  store i64 %97, ptr %131, align 4
  %132 = add nuw i64 %.0373498, 4
  %exitcond537.not.3 = icmp eq i64 %132, %87
  br i1 %exitcond537.not.3, label %.preheader424, label %scalar.ph559, !llvm.loop !21

.preheader423:                                    ; preds = %.preheader424, %.loopexit633
  %.0372501 = phi i64 [ 0, %.preheader424 ], [ %148, %.loopexit633 ]
  %133 = mul i64 %.0372501, %.0376
  %134 = getelementptr %struct.ComplexFloat, ptr %89, i64 %133
  %135 = mul i64 %.0372501, %74
  %136 = getelementptr %struct.ComplexFloat, ptr %1, i64 %135
  %brmerge = select i1 %min.iters.check577, i1 true, i1 %120
  br i1 %brmerge, label %scalar.ph576.preheader, label %vector.body582

scalar.ph576.preheader:                           ; preds = %.preheader423, %middle.block575
  %.0371500.ph = phi i64 [ 0, %.preheader423 ], [ %n.vec580, %middle.block575 ]
  br i1 %lcmp.mod663.not, label %scalar.ph576.prol.loopexit, label %scalar.ph576.prol

scalar.ph576.prol:                                ; preds = %scalar.ph576.preheader, %scalar.ph576.prol
  %.0371500.prol = phi i64 [ %140, %scalar.ph576.prol ], [ %.0371500.ph, %scalar.ph576.preheader ]
  %prol.iter664 = phi i64 [ %prol.iter664.next, %scalar.ph576.prol ], [ 0, %scalar.ph576.preheader ]
  %137 = getelementptr %struct.ComplexFloat, ptr %134, i64 %.0371500.prol
  %138 = getelementptr %struct.ComplexFloat, ptr %136, i64 %.0371500.prol
  %139 = load i64, ptr %138, align 4
  store i64 %139, ptr %137, align 4
  %140 = add nuw i64 %.0371500.prol, 1
  %prol.iter664.next = add i64 %prol.iter664, 1
  %prol.iter664.cmp.not = icmp eq i64 %prol.iter664.next, %xtraiter662
  br i1 %prol.iter664.cmp.not, label %scalar.ph576.prol.loopexit, label %scalar.ph576.prol, !llvm.loop !22

scalar.ph576.prol.loopexit:                       ; preds = %scalar.ph576.prol, %scalar.ph576.preheader
  %.0371500.unr = phi i64 [ %.0371500.ph, %scalar.ph576.preheader ], [ %140, %scalar.ph576.prol ]
  %141 = sub i64 %.0371500.ph, %umax539
  %142 = icmp ugt i64 %141, -4
  br i1 %142, label %.loopexit633, label %scalar.ph576

vector.body582:                                   ; preds = %.preheader423, %vector.body582
  %index583 = phi i64 [ %index.next585, %vector.body582 ], [ 0, %.preheader423 ]
  %143 = getelementptr %struct.ComplexFloat, ptr %134, i64 %index583
  %144 = getelementptr %struct.ComplexFloat, ptr %136, i64 %index583
  %145 = getelementptr i8, ptr %144, i64 16
  %wide.load = load <2 x i64>, ptr %144, align 4, !alias.scope !23
  %wide.load584 = load <2 x i64>, ptr %145, align 4, !alias.scope !23
  %146 = getelementptr i8, ptr %143, i64 16
  store <2 x i64> %wide.load, ptr %143, align 4, !alias.scope !26, !noalias !23
  store <2 x i64> %wide.load584, ptr %146, align 4, !alias.scope !26, !noalias !23
  %index.next585 = add nuw i64 %index583, 4
  %147 = icmp eq i64 %index.next585, %n.vec580
  br i1 %147, label %middle.block575, label %vector.body582, !llvm.loop !28

middle.block575:                                  ; preds = %vector.body582
  br i1 %cmp.n586, label %.loopexit633, label %scalar.ph576.preheader

.loopexit633:                                     ; preds = %scalar.ph576.prol.loopexit, %scalar.ph576, %middle.block575
  %148 = add nuw i64 %.0372501, 1
  %exitcond542.not = icmp eq i64 %148, %umax541
  br i1 %exitcond542.not, label %.preheader421.preheader, label %.preheader423, !llvm.loop !29

.preheader421.preheader:                          ; preds = %.loopexit633
  %umax544 = tail call i64 @llvm.umax.i64(i64 %76, i64 1)
  %149 = shl i64 %umax544, 3
  %scevgep588 = getelementptr i8, ptr %91, i64 %149
  %150 = add i64 %umax539, -1
  %151 = shl i64 %150, 3
  %152 = mul i64 %151, %.0376
  %scevgep589 = getelementptr i8, ptr %scevgep588, i64 %152
  %153 = mul i64 %76, %150
  %154 = add i64 %153, %umax544
  %155 = shl i64 %154, 3
  %scevgep590 = getelementptr i8, ptr %2, i64 %155
  %min.iters.check598 = icmp ult i64 %76, 8
  %bound0591 = icmp ult ptr %91, %scevgep590
  %bound1592 = icmp ugt ptr %scevgep589, %2
  %found.conflict593 = and i1 %bound0591, %bound1592
  %156 = or i64 %.0376, %76
  %157 = and i64 %156, 1152921504606846976
  %158 = icmp ne i64 %157, 0
  %159 = or i1 %found.conflict593, %158
  %n.vec601 = and i64 %umax544, -4
  %cmp.n608 = icmp eq i64 %76, %n.vec601
  %xtraiter665 = and i64 %umax544, 3
  %lcmp.mod666.not = icmp eq i64 %xtraiter665, 0
  br label %.preheader421

scalar.ph576:                                     ; preds = %scalar.ph576.prol.loopexit, %scalar.ph576
  %.0371500 = phi i64 [ %175, %scalar.ph576 ], [ %.0371500.unr, %scalar.ph576.prol.loopexit ]
  %160 = getelementptr %struct.ComplexFloat, ptr %134, i64 %.0371500
  %161 = getelementptr %struct.ComplexFloat, ptr %136, i64 %.0371500
  %162 = load i64, ptr %161, align 4
  store i64 %162, ptr %160, align 4
  %163 = add nuw i64 %.0371500, 1
  %164 = getelementptr %struct.ComplexFloat, ptr %134, i64 %163
  %165 = getelementptr %struct.ComplexFloat, ptr %136, i64 %163
  %166 = load i64, ptr %165, align 4
  store i64 %166, ptr %164, align 4
  %167 = add nuw i64 %.0371500, 2
  %168 = getelementptr %struct.ComplexFloat, ptr %134, i64 %167
  %169 = getelementptr %struct.ComplexFloat, ptr %136, i64 %167
  %170 = load i64, ptr %169, align 4
  store i64 %170, ptr %168, align 4
  %171 = add nuw i64 %.0371500, 3
  %172 = getelementptr %struct.ComplexFloat, ptr %134, i64 %171
  %173 = getelementptr %struct.ComplexFloat, ptr %136, i64 %171
  %174 = load i64, ptr %173, align 4
  store i64 %174, ptr %172, align 4
  %175 = add nuw i64 %.0371500, 4
  %exitcond540.not.3 = icmp eq i64 %74, %175
  br i1 %exitcond540.not.3, label %.loopexit633, label %scalar.ph576, !llvm.loop !30

.preheader421:                                    ; preds = %.preheader421.preheader, %.loopexit632
  %.0370503 = phi i64 [ %203, %.loopexit632 ], [ 0, %.preheader421.preheader ]
  %176 = mul i64 %.0370503, %.0376
  %177 = getelementptr %struct.ComplexFloat, ptr %91, i64 %176
  %178 = mul i64 %.0370503, %76
  %179 = getelementptr %struct.ComplexFloat, ptr %2, i64 %178
  %brmerge703 = select i1 %min.iters.check598, i1 true, i1 %159
  br i1 %brmerge703, label %scalar.ph597.preheader, label %vector.body603

scalar.ph597.preheader:                           ; preds = %.preheader421, %middle.block596
  %.0369502.ph = phi i64 [ 0, %.preheader421 ], [ %n.vec601, %middle.block596 ]
  br i1 %lcmp.mod666.not, label %scalar.ph597.prol.loopexit, label %scalar.ph597.prol

scalar.ph597.prol:                                ; preds = %scalar.ph597.preheader, %scalar.ph597.prol
  %.0369502.prol = phi i64 [ %183, %scalar.ph597.prol ], [ %.0369502.ph, %scalar.ph597.preheader ]
  %prol.iter667 = phi i64 [ %prol.iter667.next, %scalar.ph597.prol ], [ 0, %scalar.ph597.preheader ]
  %180 = getelementptr %struct.ComplexFloat, ptr %177, i64 %.0369502.prol
  %181 = getelementptr %struct.ComplexFloat, ptr %179, i64 %.0369502.prol
  %182 = load i64, ptr %181, align 4
  store i64 %182, ptr %180, align 4
  %183 = add nuw i64 %.0369502.prol, 1
  %prol.iter667.next = add i64 %prol.iter667, 1
  %prol.iter667.cmp.not = icmp eq i64 %prol.iter667.next, %xtraiter665
  br i1 %prol.iter667.cmp.not, label %scalar.ph597.prol.loopexit, label %scalar.ph597.prol, !llvm.loop !31

scalar.ph597.prol.loopexit:                       ; preds = %scalar.ph597.prol, %scalar.ph597.preheader
  %.0369502.unr = phi i64 [ %.0369502.ph, %scalar.ph597.preheader ], [ %183, %scalar.ph597.prol ]
  %184 = sub i64 %.0369502.ph, %umax544
  %185 = icmp ugt i64 %184, -4
  br i1 %185, label %.loopexit632, label %scalar.ph597

vector.body603:                                   ; preds = %.preheader421, %vector.body603
  %index604 = phi i64 [ %index.next607, %vector.body603 ], [ 0, %.preheader421 ]
  %186 = getelementptr %struct.ComplexFloat, ptr %177, i64 %index604
  %187 = getelementptr %struct.ComplexFloat, ptr %179, i64 %index604
  %188 = getelementptr i8, ptr %187, i64 16
  %wide.load605 = load <2 x i64>, ptr %187, align 4, !alias.scope !32
  %wide.load606 = load <2 x i64>, ptr %188, align 4, !alias.scope !32
  %189 = getelementptr i8, ptr %186, i64 16
  store <2 x i64> %wide.load605, ptr %186, align 4, !alias.scope !35, !noalias !32
  store <2 x i64> %wide.load606, ptr %189, align 4, !alias.scope !35, !noalias !32
  %index.next607 = add nuw i64 %index604, 4
  %190 = icmp eq i64 %index.next607, %n.vec601
  br i1 %190, label %middle.block596, label %vector.body603, !llvm.loop !37

middle.block596:                                  ; preds = %vector.body603
  br i1 %cmp.n608, label %.loopexit632, label %scalar.ph597.preheader

191:                                              ; preds = %.loopexit632
  tail call void @strassen_multiply(ptr noundef nonnull %93, ptr noundef nonnull %89, ptr noundef nonnull %91, i64 noundef %.0376, i64 noundef 0)
  %192 = add i64 %umax541, -1
  %193 = mul i64 %76, %192
  %194 = shl i64 %umax544, 3
  %195 = add i64 %193, %umax544
  %196 = shl i64 %195, 3
  %scevgep610 = getelementptr i8, ptr %0, i64 %196
  %scevgep611 = getelementptr i8, ptr %93, i64 %194
  %197 = shl i64 %192, 3
  %198 = mul i64 %197, %.0376
  %scevgep612 = getelementptr i8, ptr %scevgep611, i64 %198
  %min.iters.check620 = icmp ult i64 %76, 8
  %bound0613 = icmp ugt ptr %scevgep612, %0
  %bound1614 = icmp ult ptr %93, %scevgep610
  %found.conflict615 = and i1 %bound0613, %bound1614
  %199 = or i64 %76, %.0376
  %200 = and i64 %199, 1152921504606846976
  %201 = icmp ne i64 %200, 0
  %202 = or i1 %found.conflict615, %201
  %n.vec623 = and i64 %umax544, -4
  %cmp.n630 = icmp eq i64 %76, %n.vec623
  %xtraiter668 = and i64 %umax544, 3
  %lcmp.mod669.not = icmp eq i64 %xtraiter668, 0
  br label %.preheader

.loopexit632:                                     ; preds = %scalar.ph597.prol.loopexit, %scalar.ph597, %middle.block596
  %203 = add nuw i64 %.0370503, 1
  %exitcond546.not = icmp eq i64 %203, %umax539
  br i1 %exitcond546.not, label %191, label %.preheader421, !llvm.loop !38

scalar.ph597:                                     ; preds = %scalar.ph597.prol.loopexit, %scalar.ph597
  %.0369502 = phi i64 [ %219, %scalar.ph597 ], [ %.0369502.unr, %scalar.ph597.prol.loopexit ]
  %204 = getelementptr %struct.ComplexFloat, ptr %177, i64 %.0369502
  %205 = getelementptr %struct.ComplexFloat, ptr %179, i64 %.0369502
  %206 = load i64, ptr %205, align 4
  store i64 %206, ptr %204, align 4
  %207 = add nuw i64 %.0369502, 1
  %208 = getelementptr %struct.ComplexFloat, ptr %177, i64 %207
  %209 = getelementptr %struct.ComplexFloat, ptr %179, i64 %207
  %210 = load i64, ptr %209, align 4
  store i64 %210, ptr %208, align 4
  %211 = add nuw i64 %.0369502, 2
  %212 = getelementptr %struct.ComplexFloat, ptr %177, i64 %211
  %213 = getelementptr %struct.ComplexFloat, ptr %179, i64 %211
  %214 = load i64, ptr %213, align 4
  store i64 %214, ptr %212, align 4
  %215 = add nuw i64 %.0369502, 3
  %216 = getelementptr %struct.ComplexFloat, ptr %177, i64 %215
  %217 = getelementptr %struct.ComplexFloat, ptr %179, i64 %215
  %218 = load i64, ptr %217, align 4
  store i64 %218, ptr %216, align 4
  %219 = add nuw i64 %.0369502, 4
  %exitcond545.not.3 = icmp eq i64 %76, %219
  br i1 %exitcond545.not.3, label %.loopexit632, label %scalar.ph597, !llvm.loop !39

.preheader:                                       ; preds = %191, %.loopexit631
  %.0368505 = phi i64 [ 0, %191 ], [ %236, %.loopexit631 ]
  %220 = mul i64 %.0368505, %76
  %221 = getelementptr %struct.ComplexFloat, ptr %0, i64 %220
  %222 = mul i64 %.0368505, %.0376
  %223 = getelementptr %struct.ComplexFloat, ptr %93, i64 %222
  %brmerge704 = select i1 %min.iters.check620, i1 true, i1 %202
  br i1 %brmerge704, label %scalar.ph619.preheader, label %vector.body625

scalar.ph619.preheader:                           ; preds = %.preheader, %middle.block618
  %.0367504.ph = phi i64 [ 0, %.preheader ], [ %n.vec623, %middle.block618 ]
  br i1 %lcmp.mod669.not, label %scalar.ph619.prol.loopexit, label %scalar.ph619.prol

scalar.ph619.prol:                                ; preds = %scalar.ph619.preheader, %scalar.ph619.prol
  %.0367504.prol = phi i64 [ %227, %scalar.ph619.prol ], [ %.0367504.ph, %scalar.ph619.preheader ]
  %prol.iter670 = phi i64 [ %prol.iter670.next, %scalar.ph619.prol ], [ 0, %scalar.ph619.preheader ]
  %224 = getelementptr %struct.ComplexFloat, ptr %221, i64 %.0367504.prol
  %225 = getelementptr %struct.ComplexFloat, ptr %223, i64 %.0367504.prol
  %226 = load i64, ptr %225, align 4
  store i64 %226, ptr %224, align 4
  %227 = add nuw i64 %.0367504.prol, 1
  %prol.iter670.next = add i64 %prol.iter670, 1
  %prol.iter670.cmp.not = icmp eq i64 %prol.iter670.next, %xtraiter668
  br i1 %prol.iter670.cmp.not, label %scalar.ph619.prol.loopexit, label %scalar.ph619.prol, !llvm.loop !40

scalar.ph619.prol.loopexit:                       ; preds = %scalar.ph619.prol, %scalar.ph619.preheader
  %.0367504.unr = phi i64 [ %.0367504.ph, %scalar.ph619.preheader ], [ %227, %scalar.ph619.prol ]
  %228 = sub i64 %.0367504.ph, %umax544
  %229 = icmp ugt i64 %228, -4
  br i1 %229, label %.loopexit631, label %scalar.ph619

vector.body625:                                   ; preds = %.preheader, %vector.body625
  %index626 = phi i64 [ %index.next629, %vector.body625 ], [ 0, %.preheader ]
  %230 = getelementptr %struct.ComplexFloat, ptr %221, i64 %index626
  %231 = getelementptr %struct.ComplexFloat, ptr %223, i64 %index626
  %232 = getelementptr i8, ptr %231, i64 16
  %wide.load627 = load <2 x i64>, ptr %231, align 4, !alias.scope !41
  %wide.load628 = load <2 x i64>, ptr %232, align 4, !alias.scope !41
  %233 = getelementptr i8, ptr %230, i64 16
  store <2 x i64> %wide.load627, ptr %230, align 4, !alias.scope !44, !noalias !41
  store <2 x i64> %wide.load628, ptr %233, align 4, !alias.scope !44, !noalias !41
  %index.next629 = add nuw i64 %index626, 4
  %234 = icmp eq i64 %index.next629, %n.vec623
  br i1 %234, label %middle.block618, label %vector.body625, !llvm.loop !46

middle.block618:                                  ; preds = %vector.body625
  br i1 %cmp.n630, label %.loopexit631, label %scalar.ph619.preheader

235:                                              ; preds = %.loopexit631
  tail call void @free(ptr noundef %89) #5
  tail call void @free(ptr noundef %91) #5
  tail call void @free(ptr noundef nonnull %93) #5
  tail call void @free(ptr noundef %44) #5
  br label %.thread

.loopexit631:                                     ; preds = %scalar.ph619.prol.loopexit, %scalar.ph619, %middle.block618
  %236 = add nuw i64 %.0368505, 1
  %exitcond549.not = icmp eq i64 %236, %umax541
  br i1 %exitcond549.not, label %235, label %.preheader, !llvm.loop !47

scalar.ph619:                                     ; preds = %scalar.ph619.prol.loopexit, %scalar.ph619
  %.0367504 = phi i64 [ %252, %scalar.ph619 ], [ %.0367504.unr, %scalar.ph619.prol.loopexit ]
  %237 = getelementptr %struct.ComplexFloat, ptr %221, i64 %.0367504
  %238 = getelementptr %struct.ComplexFloat, ptr %223, i64 %.0367504
  %239 = load i64, ptr %238, align 4
  store i64 %239, ptr %237, align 4
  %240 = add nuw i64 %.0367504, 1
  %241 = getelementptr %struct.ComplexFloat, ptr %221, i64 %240
  %242 = getelementptr %struct.ComplexFloat, ptr %223, i64 %240
  %243 = load i64, ptr %242, align 4
  store i64 %243, ptr %241, align 4
  %244 = add nuw i64 %.0367504, 2
  %245 = getelementptr %struct.ComplexFloat, ptr %221, i64 %244
  %246 = getelementptr %struct.ComplexFloat, ptr %223, i64 %244
  %247 = load i64, ptr %246, align 4
  store i64 %247, ptr %245, align 4
  %248 = add nuw i64 %.0367504, 3
  %249 = getelementptr %struct.ComplexFloat, ptr %221, i64 %248
  %250 = getelementptr %struct.ComplexFloat, ptr %223, i64 %248
  %251 = load i64, ptr %250, align 4
  store i64 %251, ptr %249, align 4
  %252 = add nuw i64 %.0367504, 4
  %exitcond548.not.3 = icmp eq i64 %76, %252
  br i1 %exitcond548.not.3, label %.loopexit631, label %scalar.ph619, !llvm.loop !48

253:                                              ; preds = %71
  tail call void @matrix_multiply_blocked(ptr noundef %0, ptr noundef %1, ptr noundef %2, i64 noundef %72, i64 noundef %76, i64 noundef %74)
  tail call void @free(ptr noundef %44) #5
  br label %.thread

.preheader433.unr-lcssa:                          ; preds = %.lr.ph453, %.lr.ph453.preheader
  %.lcssa646.ph = phi i64 [ poison, %.lr.ph453.preheader ], [ %292, %.lr.ph453 ]
  %.0365452.unr = phi i64 [ 0, %.lr.ph453.preheader ], [ %293, %.lr.ph453 ]
  %.0366451.unr = phi i64 [ 1, %.lr.ph453.preheader ], [ %292, %.lr.ph453 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.preheader433, label %.lr.ph453.epil

.lr.ph453.epil:                                   ; preds = %.preheader433.unr-lcssa, %.lr.ph453.epil
  %.0365452.epil = phi i64 [ %257, %.lr.ph453.epil ], [ %.0365452.unr, %.preheader433.unr-lcssa ]
  %.0366451.epil = phi i64 [ %256, %.lr.ph453.epil ], [ %.0366451.unr, %.preheader433.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph453.epil ], [ 0, %.preheader433.unr-lcssa ]
  %254 = getelementptr inbounds i64, ptr %44, i64 %.0365452.epil
  %255 = load i64, ptr %254, align 8, !tbaa !7
  %256 = mul i64 %255, %.0366451.epil
  %257 = add nuw i64 %.0365452.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %.preheader433, label %.lr.ph453.epil, !llvm.loop !49

.preheader433:                                    ; preds = %.lr.ph453.epil, %.preheader433.unr-lcssa
  %.lcssa646 = phi i64 [ %.lcssa646.ph, %.preheader433.unr-lcssa ], [ %256, %.lr.ph453.epil ]
  %.not510 = icmp eq i64 %.lcssa646, 0
  br i1 %.not510, label %._crit_edge, label %.lr.ph455

.lr.ph455:                                        ; preds = %.preheader434, %.preheader433
  %.0366.lcssa552 = phi i64 [ %.lcssa646, %.preheader433 ], [ 1, %.preheader434 ]
  %258 = load i64, ptr @COMPLEX_FLOAT_ZERO, align 4
  %min.iters.check = icmp ult i64 %.0366.lcssa552, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

scalar.ph.preheader:                              ; preds = %middle.block, %.lr.ph455
  %.0364454.ph = phi i64 [ 0, %.lr.ph455 ], [ %n.vec, %middle.block ]
  br label %scalar.ph

vector.ph:                                        ; preds = %.lr.ph455
  %n.vec = and i64 %.0366.lcssa552, -4
  %broadcast.splatinsert = insertelement <2 x i64> poison, i64 %258, i64 0
  %broadcast.splat = shufflevector <2 x i64> %broadcast.splatinsert, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %259 = getelementptr inbounds %struct.ComplexFloat, ptr %0, i64 %index
  %260 = getelementptr inbounds i8, ptr %259, i64 16
  store <2 x i64> %broadcast.splat, ptr %259, align 4
  store <2 x i64> %broadcast.splat, ptr %260, align 4
  %index.next = add nuw i64 %index, 4
  %261 = icmp eq i64 %index.next, %n.vec
  br i1 %261, label %middle.block, label %vector.body, !llvm.loop !50

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

.lr.ph453:                                        ; preds = %.lr.ph453, %.lr.ph453.preheader.new
  %.0365452 = phi i64 [ 0, %.lr.ph453.preheader.new ], [ %293, %.lr.ph453 ]
  %.0366451 = phi i64 [ 1, %.lr.ph453.preheader.new ], [ %292, %.lr.ph453 ]
  %niter = phi i64 [ 0, %.lr.ph453.preheader.new ], [ %niter.next.7, %.lr.ph453 ]
  %262 = getelementptr inbounds i64, ptr %44, i64 %.0365452
  %263 = load i64, ptr %262, align 8, !tbaa !7
  %264 = mul i64 %263, %.0366451
  %265 = or disjoint i64 %.0365452, 1
  %266 = getelementptr inbounds i64, ptr %44, i64 %265
  %267 = load i64, ptr %266, align 8, !tbaa !7
  %268 = mul i64 %267, %264
  %269 = or disjoint i64 %.0365452, 2
  %270 = getelementptr inbounds i64, ptr %44, i64 %269
  %271 = load i64, ptr %270, align 8, !tbaa !7
  %272 = mul i64 %271, %268
  %273 = or disjoint i64 %.0365452, 3
  %274 = getelementptr inbounds i64, ptr %44, i64 %273
  %275 = load i64, ptr %274, align 8, !tbaa !7
  %276 = mul i64 %275, %272
  %277 = or disjoint i64 %.0365452, 4
  %278 = getelementptr inbounds i64, ptr %44, i64 %277
  %279 = load i64, ptr %278, align 8, !tbaa !7
  %280 = mul i64 %279, %276
  %281 = or disjoint i64 %.0365452, 5
  %282 = getelementptr inbounds i64, ptr %44, i64 %281
  %283 = load i64, ptr %282, align 8, !tbaa !7
  %284 = mul i64 %283, %280
  %285 = or disjoint i64 %.0365452, 6
  %286 = getelementptr inbounds i64, ptr %44, i64 %285
  %287 = load i64, ptr %286, align 8, !tbaa !7
  %288 = mul i64 %287, %284
  %289 = or disjoint i64 %.0365452, 7
  %290 = getelementptr inbounds i64, ptr %44, i64 %289
  %291 = load i64, ptr %290, align 8, !tbaa !7
  %292 = mul i64 %291, %288
  %293 = add nuw i64 %.0365452, 8
  %niter.next.7 = add i64 %niter, 8
  %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
  br i1 %niter.ncmp.7, label %.preheader433.unr-lcssa, label %.lr.ph453, !llvm.loop !51

._crit_edge:                                      ; preds = %scalar.ph, %middle.block, %.preheader433
  %.not510555 = phi i1 [ true, %.preheader433 ], [ false, %middle.block ], [ false, %scalar.ph ]
  %.0366.lcssa553 = phi i64 [ 0, %.preheader433 ], [ %.0366.lcssa552, %middle.block ], [ %.0366.lcssa552, %scalar.ph ]
  %294 = shl i64 %5, 3
  %295 = tail call ptr @aligned_malloc(i64 noundef %294)
  %296 = shl i64 %6, 3
  %297 = tail call ptr @aligned_malloc(i64 noundef %296)
  %298 = icmp ne ptr %295, null
  %299 = icmp ne ptr %297, null
  %or.cond31 = select i1 %298, i1 %299, i1 false
  br i1 %or.cond31, label %303, label %302

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0364454 = phi i64 [ %301, %scalar.ph ], [ %.0364454.ph, %scalar.ph.preheader ]
  %300 = getelementptr inbounds %struct.ComplexFloat, ptr %0, i64 %.0364454
  store i64 %258, ptr %300, align 4
  %301 = add nuw i64 %.0364454, 1
  %exitcond525.not = icmp eq i64 %301, %.0366.lcssa552
  br i1 %exitcond525.not, label %._crit_edge, label %scalar.ph, !llvm.loop !52

302:                                              ; preds = %._crit_edge
  tail call void @free(ptr noundef %295) #5
  tail call void @free(ptr noundef %297) #5
  tail call void @free(ptr noundef %44) #5
  br label %.thread

303:                                              ; preds = %._crit_edge
  %304 = add i64 %5, -1
  %305 = getelementptr inbounds i64, ptr %295, i64 %304
  store i64 1, ptr %305, align 8, !tbaa !7
  %306 = add i64 %6, -1
  %307 = getelementptr inbounds i64, ptr %297, i64 %306
  store i64 1, ptr %307, align 8, !tbaa !7
  %.not405456 = icmp eq i64 %304, 0
  br i1 %.not405456, label %.preheader432, label %.lr.ph459.preheader

.lr.ph459.preheader:                              ; preds = %303
  %308 = shl i64 %5, 3
  %309 = getelementptr i8, ptr %295, i64 %308
  %scevgep635 = getelementptr i8, ptr %309, i64 -8
  %load_initial636 = load i64, ptr %scevgep635, align 8
  %310 = add i64 %5, -2
  %xtraiter648 = and i64 %304, 3
  %lcmp.mod649.not = icmp eq i64 %xtraiter648, 0
  br i1 %lcmp.mod649.not, label %.lr.ph459.prol.loopexit, label %.lr.ph459.prol.preheader

.lr.ph459.prol.preheader:                         ; preds = %.lr.ph459.preheader
  %invariant.gep685 = getelementptr i8, ptr %295, i64 -8
  br label %.lr.ph459.prol

.lr.ph459.prol:                                   ; preds = %.lr.ph459.prol, %.lr.ph459.prol.preheader
  %store_forwarded637.prol = phi i64 [ %load_initial636, %.lr.ph459.prol.preheader ], [ %313, %.lr.ph459.prol ]
  %.0361457.prol = phi i64 [ %304, %.lr.ph459.prol.preheader ], [ %314, %.lr.ph459.prol ]
  %prol.iter = phi i64 [ 0, %.lr.ph459.prol.preheader ], [ %prol.iter.next, %.lr.ph459.prol ]
  %311 = getelementptr inbounds i64, ptr %3, i64 %.0361457.prol
  %312 = load i64, ptr %311, align 8, !tbaa !7
  %313 = mul i64 %312, %store_forwarded637.prol
  %gep686 = getelementptr i64, ptr %invariant.gep685, i64 %.0361457.prol
  store i64 %313, ptr %gep686, align 8, !tbaa !7
  %314 = add i64 %.0361457.prol, -1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter648
  br i1 %prol.iter.cmp.not, label %.lr.ph459.prol.loopexit, label %.lr.ph459.prol, !llvm.loop !53

.lr.ph459.prol.loopexit:                          ; preds = %.lr.ph459.prol, %.lr.ph459.preheader
  %store_forwarded637.unr = phi i64 [ %load_initial636, %.lr.ph459.preheader ], [ %313, %.lr.ph459.prol ]
  %.0361457.unr = phi i64 [ %304, %.lr.ph459.preheader ], [ %314, %.lr.ph459.prol ]
  %315 = icmp ult i64 %310, 3
  br i1 %315, label %.preheader432, label %.lr.ph459.preheader.new

.lr.ph459.preheader.new:                          ; preds = %.lr.ph459.prol.loopexit
  %invariant.gep687 = getelementptr i8, ptr %295, i64 -8
  %invariant.gep689 = getelementptr i8, ptr %295, i64 -8
  %invariant.gep691 = getelementptr i8, ptr %295, i64 -8
  %invariant.gep693 = getelementptr i8, ptr %295, i64 -8
  br label %.lr.ph459

.preheader432:                                    ; preds = %.lr.ph459.prol.loopexit, %.lr.ph459, %303
  %.not406460 = icmp eq i64 %306, 0
  br i1 %.not406460, label %.lr.ph465.preheader, label %.lr.ph462.preheader

.lr.ph465.preheader:                              ; preds = %.lr.ph462.prol.loopexit, %.lr.ph462, %.preheader432
  %316 = add i64 %9, -1
  %xtraiter653 = and i64 %9, 3
  %317 = icmp ult i64 %316, 3
  br i1 %317, label %.preheader430.unr-lcssa, label %.lr.ph465.preheader.new

.lr.ph465.preheader.new:                          ; preds = %.lr.ph465.preheader
  %unroll_iter657 = and i64 %9, -4
  br label %.lr.ph465

.lr.ph462.preheader:                              ; preds = %.preheader432
  %318 = shl i64 %6, 3
  %319 = getelementptr i8, ptr %297, i64 %318
  %scevgep634 = getelementptr i8, ptr %319, i64 -8
  %load_initial = load i64, ptr %scevgep634, align 8
  %320 = add i64 %6, -2
  %xtraiter650 = and i64 %306, 3
  %lcmp.mod651.not = icmp eq i64 %xtraiter650, 0
  br i1 %lcmp.mod651.not, label %.lr.ph462.prol.loopexit, label %.lr.ph462.prol.preheader

.lr.ph462.prol.preheader:                         ; preds = %.lr.ph462.preheader
  %invariant.gep = getelementptr i8, ptr %297, i64 -8
  br label %.lr.ph462.prol

.lr.ph462.prol:                                   ; preds = %.lr.ph462.prol, %.lr.ph462.prol.preheader
  %store_forwarded.prol = phi i64 [ %load_initial, %.lr.ph462.prol.preheader ], [ %323, %.lr.ph462.prol ]
  %.0360461.prol = phi i64 [ %306, %.lr.ph462.prol.preheader ], [ %324, %.lr.ph462.prol ]
  %prol.iter652 = phi i64 [ 0, %.lr.ph462.prol.preheader ], [ %prol.iter652.next, %.lr.ph462.prol ]
  %321 = getelementptr inbounds i64, ptr %4, i64 %.0360461.prol
  %322 = load i64, ptr %321, align 8, !tbaa !7
  %323 = mul i64 %322, %store_forwarded.prol
  %gep = getelementptr i64, ptr %invariant.gep, i64 %.0360461.prol
  store i64 %323, ptr %gep, align 8, !tbaa !7
  %324 = add i64 %.0360461.prol, -1
  %prol.iter652.next = add i64 %prol.iter652, 1
  %prol.iter652.cmp.not = icmp eq i64 %prol.iter652.next, %xtraiter650
  br i1 %prol.iter652.cmp.not, label %.lr.ph462.prol.loopexit, label %.lr.ph462.prol, !llvm.loop !54

.lr.ph462.prol.loopexit:                          ; preds = %.lr.ph462.prol, %.lr.ph462.preheader
  %store_forwarded.unr = phi i64 [ %load_initial, %.lr.ph462.preheader ], [ %323, %.lr.ph462.prol ]
  %.0360461.unr = phi i64 [ %306, %.lr.ph462.preheader ], [ %324, %.lr.ph462.prol ]
  %325 = icmp ult i64 %320, 3
  br i1 %325, label %.lr.ph465.preheader, label %.lr.ph462.preheader.new

.lr.ph462.preheader.new:                          ; preds = %.lr.ph462.prol.loopexit
  %invariant.gep695 = getelementptr i8, ptr %297, i64 -8
  %invariant.gep697 = getelementptr i8, ptr %297, i64 -8
  %invariant.gep699 = getelementptr i8, ptr %297, i64 -8
  %invariant.gep701 = getelementptr i8, ptr %297, i64 -8
  br label %.lr.ph462

.lr.ph459:                                        ; preds = %.lr.ph459, %.lr.ph459.preheader.new
  %store_forwarded637 = phi i64 [ %store_forwarded637.unr, %.lr.ph459.preheader.new ], [ %340, %.lr.ph459 ]
  %.0361457 = phi i64 [ %.0361457.unr, %.lr.ph459.preheader.new ], [ %341, %.lr.ph459 ]
  %326 = getelementptr inbounds i64, ptr %3, i64 %.0361457
  %327 = load i64, ptr %326, align 8, !tbaa !7
  %328 = mul i64 %327, %store_forwarded637
  %gep688 = getelementptr i64, ptr %invariant.gep687, i64 %.0361457
  store i64 %328, ptr %gep688, align 8, !tbaa !7
  %329 = add i64 %.0361457, -1
  %330 = getelementptr inbounds i64, ptr %3, i64 %329
  %331 = load i64, ptr %330, align 8, !tbaa !7
  %332 = mul i64 %331, %328
  %gep690 = getelementptr i64, ptr %invariant.gep689, i64 %329
  store i64 %332, ptr %gep690, align 8, !tbaa !7
  %333 = add i64 %.0361457, -2
  %334 = getelementptr inbounds i64, ptr %3, i64 %333
  %335 = load i64, ptr %334, align 8, !tbaa !7
  %336 = mul i64 %335, %332
  %gep692 = getelementptr i64, ptr %invariant.gep691, i64 %333
  store i64 %336, ptr %gep692, align 8, !tbaa !7
  %337 = add i64 %.0361457, -3
  %338 = getelementptr inbounds i64, ptr %3, i64 %337
  %339 = load i64, ptr %338, align 8, !tbaa !7
  %340 = mul i64 %339, %336
  %gep694 = getelementptr i64, ptr %invariant.gep693, i64 %337
  store i64 %340, ptr %gep694, align 8, !tbaa !7
  %341 = add i64 %.0361457, -4
  %.not405.3 = icmp eq i64 %341, 0
  br i1 %.not405.3, label %.preheader432, label %.lr.ph459, !llvm.loop !55

.lr.ph462:                                        ; preds = %.lr.ph462, %.lr.ph462.preheader.new
  %store_forwarded = phi i64 [ %store_forwarded.unr, %.lr.ph462.preheader.new ], [ %356, %.lr.ph462 ]
  %.0360461 = phi i64 [ %.0360461.unr, %.lr.ph462.preheader.new ], [ %357, %.lr.ph462 ]
  %342 = getelementptr inbounds i64, ptr %4, i64 %.0360461
  %343 = load i64, ptr %342, align 8, !tbaa !7
  %344 = mul i64 %343, %store_forwarded
  %gep696 = getelementptr i64, ptr %invariant.gep695, i64 %.0360461
  store i64 %344, ptr %gep696, align 8, !tbaa !7
  %345 = add i64 %.0360461, -1
  %346 = getelementptr inbounds i64, ptr %4, i64 %345
  %347 = load i64, ptr %346, align 8, !tbaa !7
  %348 = mul i64 %347, %344
  %gep698 = getelementptr i64, ptr %invariant.gep697, i64 %345
  store i64 %348, ptr %gep698, align 8, !tbaa !7
  %349 = add i64 %.0360461, -2
  %350 = getelementptr inbounds i64, ptr %4, i64 %349
  %351 = load i64, ptr %350, align 8, !tbaa !7
  %352 = mul i64 %351, %348
  %gep700 = getelementptr i64, ptr %invariant.gep699, i64 %349
  store i64 %352, ptr %gep700, align 8, !tbaa !7
  %353 = add i64 %.0360461, -3
  %354 = getelementptr inbounds i64, ptr %4, i64 %353
  %355 = load i64, ptr %354, align 8, !tbaa !7
  %356 = mul i64 %355, %352
  %gep702 = getelementptr i64, ptr %invariant.gep701, i64 %353
  store i64 %356, ptr %gep702, align 8, !tbaa !7
  %357 = add i64 %.0360461, -4
  %.not406.3 = icmp eq i64 %357, 0
  br i1 %.not406.3, label %.lr.ph465.preheader, label %.lr.ph462, !llvm.loop !56

.preheader430.unr-lcssa:                          ; preds = %.lr.ph465, %.lr.ph465.preheader
  %.lcssa.ph = phi i64 [ poison, %.lr.ph465.preheader ], [ %453, %.lr.ph465 ]
  %.0358464.unr = phi i64 [ 0, %.lr.ph465.preheader ], [ %454, %.lr.ph465 ]
  %.0359463.unr = phi i64 [ 1, %.lr.ph465.preheader ], [ %453, %.lr.ph465 ]
  %lcmp.mod655.not = icmp eq i64 %xtraiter653, 0
  br i1 %lcmp.mod655.not, label %.preheader430, label %.lr.ph465.epil

.lr.ph465.epil:                                   ; preds = %.preheader430.unr-lcssa, %.lr.ph465.epil
  %.0358464.epil = phi i64 [ %363, %.lr.ph465.epil ], [ %.0358464.unr, %.preheader430.unr-lcssa ]
  %.0359463.epil = phi i64 [ %362, %.lr.ph465.epil ], [ %.0359463.unr, %.preheader430.unr-lcssa ]
  %epil.iter654 = phi i64 [ %epil.iter654.next, %.lr.ph465.epil ], [ 0, %.preheader430.unr-lcssa ]
  %358 = getelementptr inbounds i64, ptr %7, i64 %.0358464.epil
  %359 = load i64, ptr %358, align 8, !tbaa !7
  %360 = getelementptr inbounds i64, ptr %3, i64 %359
  %361 = load i64, ptr %360, align 8, !tbaa !7
  %362 = mul i64 %361, %.0359463.epil
  %363 = add nuw i64 %.0358464.epil, 1
  %epil.iter654.next = add i64 %epil.iter654, 1
  %epil.iter654.cmp.not = icmp eq i64 %epil.iter654.next, %xtraiter653
  br i1 %epil.iter654.cmp.not, label %.preheader430, label %.lr.ph465.epil, !llvm.loop !57

.preheader430:                                    ; preds = %.lr.ph465.epil, %.preheader430.unr-lcssa
  %.lcssa = phi i64 [ %.lcssa.ph, %.preheader430.unr-lcssa ], [ %362, %.lr.ph465.epil ]
  br i1 %.not510555, label %._crit_edge488, label %.preheader429.lr.ph

.preheader429.lr.ph:                              ; preds = %.preheader430
  %.not513 = icmp eq i64 %.lcssa, 0
  %364 = sub i64 %5, %9
  br i1 %.not513, label %._crit_edge488, label %.preheader429.us.preheader

.preheader429.us.preheader:                       ; preds = %.preheader429.lr.ph
  %umax528 = tail call i64 @llvm.umax.i64(i64 %5, i64 1)
  %umax533 = tail call i64 @llvm.umax.i64(i64 %6, i64 1)
  br label %.preheader429.us

.preheader429.us:                                 ; preds = %.preheader429.us.preheader, %._crit_edge485.us
  %.0357487.us = phi i64 [ %430, %._crit_edge485.us ], [ 0, %.preheader429.us.preheader ]
  %365 = getelementptr inbounds %struct.ComplexFloat, ptr %0, i64 %.0357487.us
  %366 = load <2 x float>, ptr %365, align 4, !tbaa !58
  br label %.preheader427.us.us.preheader

367:                                              ; preds = %404
  %368 = getelementptr inbounds %struct.ComplexFloat, ptr %1, i64 %.2355.us.us
  %369 = load float, ptr %368, align 4, !tbaa !60
  %370 = getelementptr inbounds %struct.ComplexFloat, ptr %2, i64 %.2352.us
  %371 = getelementptr inbounds i8, ptr %368, i64 4
  %372 = load float, ptr %371, align 4, !tbaa !62
  %373 = fneg float %372
  %374 = load <2 x float>, ptr %370, align 4, !tbaa !58
  %375 = insertelement <2 x float> poison, float %372, i64 0
  %376 = insertelement <2 x float> %375, float %373, i64 1
  %377 = fmul <2 x float> %374, %376
  %378 = shufflevector <2 x float> %377, <2 x float> poison, <2 x i32> <i32 1, i32 0>
  %379 = insertelement <2 x float> poison, float %369, i64 0
  %380 = shufflevector <2 x float> %379, <2 x float> poison, <2 x i32> zeroinitializer
  %381 = tail call <2 x float> @llvm.fmuladd.v2f32(<2 x float> %380, <2 x float> %374, <2 x float> %378)
  %382 = fadd <2 x float> %406, %381
  store <2 x float> %382, ptr %365, align 4, !tbaa !58
  %383 = add nuw i64 %.0356484.us, 1
  %exitcond535.not = icmp eq i64 %383, %.lcssa
  br i1 %exitcond535.not, label %._crit_edge485.us, label %.preheader427.us.us.preheader, !llvm.loop !63

384:                                              ; preds = %.lr.ph477.us
  %385 = add nuw i64 %.0332476.us, 1
  %exitcond532.not = icmp eq i64 %385, %9
  br i1 %exitcond532.not, label %._crit_edge478.us, label %.lr.ph477.us, !llvm.loop !64

._crit_edge478.us:                                ; preds = %384
  %386 = getelementptr inbounds i64, ptr %44, i64 %.2342481.us
  %387 = load i64, ptr %386, align 8, !tbaa !7
  %388 = udiv i64 %.0357487.us, %387
  %389 = urem i64 %388, %387
  %390 = getelementptr inbounds i64, ptr %297, i64 %.0334482.us
  %391 = load i64, ptr %390, align 8, !tbaa !7
  %392 = mul i64 %391, %389
  %393 = add i64 %.2342481.us, 1
  br label %404

.lr.ph477.us:                                     ; preds = %.lr.ph477.us.preheader, %384
  %.0332476.us = phi i64 [ %385, %384 ], [ 0, %.lr.ph477.us.preheader ]
  %394 = getelementptr inbounds i64, ptr %8, i64 %.0332476.us
  %395 = load i64, ptr %394, align 8, !tbaa !7
  %396 = icmp eq i64 %.0334482.us, %395
  br i1 %396, label %.thread416.us, label %384

.thread416.us:                                    ; preds = %.lr.ph477.us
  %397 = getelementptr inbounds i64, ptr %4, i64 %.0334482.us
  %398 = load i64, ptr %397, align 8, !tbaa !7
  %399 = urem i64 %.2346480.us, %398
  %400 = udiv i64 %.2346480.us, %398
  %401 = getelementptr inbounds i64, ptr %297, i64 %.0334482.us
  %402 = load i64, ptr %401, align 8, !tbaa !7
  %403 = mul i64 %402, %399
  br label %404

404:                                              ; preds = %.thread416.us, %._crit_edge478.us
  %.3347419.us = phi i64 [ %.2346480.us, %._crit_edge478.us ], [ %400, %.thread416.us ]
  %.pn.us = phi i64 [ %392, %._crit_edge478.us ], [ %403, %.thread416.us ]
  %.3343.us = phi i64 [ %393, %._crit_edge478.us ], [ %.2342481.us, %.thread416.us ]
  %.2352.us = add i64 %.pn.us, %.0350479.us
  %405 = add nuw i64 %.0334482.us, 1
  %exitcond534.not = icmp eq i64 %405, %umax533
  br i1 %exitcond534.not, label %367, label %.lr.ph477.us.preheader, !llvm.loop !65

.lr.ph477.us.preheader:                           ; preds = %420, %404
  %.0334482.us = phi i64 [ %405, %404 ], [ 0, %420 ]
  %.2342481.us = phi i64 [ %.3343.us, %404 ], [ %364, %420 ]
  %.2346480.us = phi i64 [ %.3347419.us, %404 ], [ %.0356484.us, %420 ]
  %.0350479.us = phi i64 [ %.2352.us, %404 ], [ 0, %420 ]
  br label %.lr.ph477.us

.preheader427.us.us.preheader:                    ; preds = %367, %.preheader429.us
  %.0356484.us = phi i64 [ 0, %.preheader429.us ], [ %383, %367 ]
  %406 = phi <2 x float> [ %366, %.preheader429.us ], [ %382, %367 ]
  br label %.preheader427.us.us

.preheader427.us.us:                              ; preds = %.preheader427.us.us.preheader, %420
  %.0339474.us.us = phi i64 [ %421, %420 ], [ 0, %.preheader427.us.us.preheader ]
  %.0340473.us.us = phi i64 [ %.1341.us.us, %420 ], [ 0, %.preheader427.us.us.preheader ]
  %.0344472.us.us = phi i64 [ %.1345415.us.us, %420 ], [ %.0356484.us, %.preheader427.us.us.preheader ]
  %.0348471.us.us = phi i64 [ %.1349.us.us, %420 ], [ %.0357487.us, %.preheader427.us.us.preheader ]
  %.0353470.us.us = phi i64 [ %.2355.us.us, %420 ], [ 0, %.preheader427.us.us.preheader ]
  br label %409

407:                                              ; preds = %409
  %408 = add nuw i64 %.0337467.us.us, 1
  %exitcond527.not = icmp eq i64 %408, %9
  br i1 %exitcond527.not, label %._crit_edge469.us.us, label %409, !llvm.loop !66

409:                                              ; preds = %407, %.preheader427.us.us
  %.0337467.us.us = phi i64 [ 0, %.preheader427.us.us ], [ %408, %407 ]
  %410 = getelementptr inbounds i64, ptr %7, i64 %.0337467.us.us
  %411 = load i64, ptr %410, align 8, !tbaa !7
  %412 = icmp eq i64 %.0339474.us.us, %411
  br i1 %412, label %.thread412.us.us, label %407

.thread412.us.us:                                 ; preds = %409
  %413 = getelementptr inbounds i64, ptr %3, i64 %.0339474.us.us
  %414 = load i64, ptr %413, align 8, !tbaa !7
  %415 = urem i64 %.0344472.us.us, %414
  %416 = udiv i64 %.0344472.us.us, %414
  %417 = getelementptr inbounds i64, ptr %295, i64 %.0339474.us.us
  %418 = load i64, ptr %417, align 8, !tbaa !7
  %419 = mul i64 %418, %415
  br label %420

420:                                              ; preds = %._crit_edge469.us.us, %.thread412.us.us
  %.1345415.us.us = phi i64 [ %.0344472.us.us, %._crit_edge469.us.us ], [ %416, %.thread412.us.us ]
  %.pn420.us.us = phi i64 [ %428, %._crit_edge469.us.us ], [ %419, %.thread412.us.us ]
  %.1349.us.us = phi i64 [ %425, %._crit_edge469.us.us ], [ %.0348471.us.us, %.thread412.us.us ]
  %.1341.us.us = phi i64 [ %429, %._crit_edge469.us.us ], [ %.0340473.us.us, %.thread412.us.us ]
  %.2355.us.us = add i64 %.pn420.us.us, %.0353470.us.us
  %421 = add nuw i64 %.0339474.us.us, 1
  %exitcond529.not = icmp eq i64 %421, %umax528
  br i1 %exitcond529.not, label %.lr.ph477.us.preheader, label %.preheader427.us.us, !llvm.loop !67

._crit_edge469.us.us:                             ; preds = %407
  %422 = getelementptr inbounds i64, ptr %44, i64 %.0340473.us.us
  %423 = load i64, ptr %422, align 8, !tbaa !7
  %424 = urem i64 %.0348471.us.us, %423
  %425 = udiv i64 %.0348471.us.us, %423
  %426 = getelementptr inbounds i64, ptr %295, i64 %.0339474.us.us
  %427 = load i64, ptr %426, align 8, !tbaa !7
  %428 = mul i64 %427, %424
  %429 = add i64 %.0340473.us.us, 1
  br label %420

._crit_edge485.us:                                ; preds = %367
  %430 = add nuw i64 %.0357487.us, 1
  %exitcond536.not = icmp eq i64 %430, %.0366.lcssa553
  br i1 %exitcond536.not, label %._crit_edge488, label %.preheader429.us, !llvm.loop !68

.lr.ph465:                                        ; preds = %.lr.ph465, %.lr.ph465.preheader.new
  %.0358464 = phi i64 [ 0, %.lr.ph465.preheader.new ], [ %454, %.lr.ph465 ]
  %.0359463 = phi i64 [ 1, %.lr.ph465.preheader.new ], [ %453, %.lr.ph465 ]
  %niter658 = phi i64 [ 0, %.lr.ph465.preheader.new ], [ %niter658.next.3, %.lr.ph465 ]
  %431 = getelementptr inbounds i64, ptr %7, i64 %.0358464
  %432 = load i64, ptr %431, align 8, !tbaa !7
  %433 = getelementptr inbounds i64, ptr %3, i64 %432
  %434 = load i64, ptr %433, align 8, !tbaa !7
  %435 = mul i64 %434, %.0359463
  %436 = or disjoint i64 %.0358464, 1
  %437 = getelementptr inbounds i64, ptr %7, i64 %436
  %438 = load i64, ptr %437, align 8, !tbaa !7
  %439 = getelementptr inbounds i64, ptr %3, i64 %438
  %440 = load i64, ptr %439, align 8, !tbaa !7
  %441 = mul i64 %440, %435
  %442 = or disjoint i64 %.0358464, 2
  %443 = getelementptr inbounds i64, ptr %7, i64 %442
  %444 = load i64, ptr %443, align 8, !tbaa !7
  %445 = getelementptr inbounds i64, ptr %3, i64 %444
  %446 = load i64, ptr %445, align 8, !tbaa !7
  %447 = mul i64 %446, %441
  %448 = or disjoint i64 %.0358464, 3
  %449 = getelementptr inbounds i64, ptr %7, i64 %448
  %450 = load i64, ptr %449, align 8, !tbaa !7
  %451 = getelementptr inbounds i64, ptr %3, i64 %450
  %452 = load i64, ptr %451, align 8, !tbaa !7
  %453 = mul i64 %452, %447
  %454 = add nuw i64 %.0358464, 4
  %niter658.next.3 = add i64 %niter658, 4
  %niter658.ncmp.3 = icmp eq i64 %niter658.next.3, %unroll_iter657
  br i1 %niter658.ncmp.3, label %.preheader430.unr-lcssa, label %.lr.ph465, !llvm.loop !69

._crit_edge488:                                   ; preds = %._crit_edge485.us, %.preheader429.lr.ph, %.preheader430
  tail call void @free(ptr noundef %295) #5
  tail call void @free(ptr noundef %297) #5
  tail call void @free(ptr noundef %44) #5
  br label %.thread

.thread:                                          ; preds = %38, %32, %45, %302, %._crit_edge488, %253, %235, %109, %24
  %.6 = phi i1 [ false, %24 ], [ false, %45 ], [ true, %253 ], [ true, %235 ], [ false, %109 ], [ true, %._crit_edge488 ], [ false, %302 ], [ false, %32 ], [ false, %38 ]
  ret i1 %.6
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @aligned_malloc(i64 noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @max(i64 noundef, i64 noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
declare hidden void @strassen_multiply(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden void @matrix_multiply_blocked(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <2 x float> @llvm.fmuladd.v2f32(<2 x float>, <2 x float>, <2 x float>) #4

attributes #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 = { 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 #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint 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 #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { 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 = !{!"long", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = distinct !{!11, !6}
!12 = distinct !{!12, !6}
!13 = distinct !{!13, !6}
!14 = distinct !{!14, !6}
!15 = distinct !{!15, !6}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.unroll.disable"}
!18 = distinct !{!18, !6, !19, !20}
!19 = !{!"llvm.loop.isvectorized", i32 1}
!20 = !{!"llvm.loop.unroll.runtime.disable"}
!21 = distinct !{!21, !6, !19}
!22 = distinct !{!22, !17}
!23 = !{!24}
!24 = distinct !{!24, !25}
!25 = distinct !{!25, !"LVerDomain"}
!26 = !{!27}
!27 = distinct !{!27, !25}
!28 = distinct !{!28, !6, !19, !20}
!29 = distinct !{!29, !6}
!30 = distinct !{!30, !6, !19}
!31 = distinct !{!31, !17}
!32 = !{!33}
!33 = distinct !{!33, !34}
!34 = distinct !{!34, !"LVerDomain"}
!35 = !{!36}
!36 = distinct !{!36, !34}
!37 = distinct !{!37, !6, !19, !20}
!38 = distinct !{!38, !6}
!39 = distinct !{!39, !6, !19}
!40 = distinct !{!40, !17}
!41 = !{!42}
!42 = distinct !{!42, !43}
!43 = distinct !{!43, !"LVerDomain"}
!44 = !{!45}
!45 = distinct !{!45, !43}
!46 = distinct !{!46, !6, !19, !20}
!47 = distinct !{!47, !6}
!48 = distinct !{!48, !6, !19}
!49 = distinct !{!49, !17}
!50 = distinct !{!50, !6, !19, !20}
!51 = distinct !{!51, !6}
!52 = distinct !{!52, !6, !20, !19}
!53 = distinct !{!53, !17}
!54 = distinct !{!54, !17}
!55 = distinct !{!55, !6}
!56 = distinct !{!56, !6}
!57 = distinct !{!57, !17}
!58 = !{!59, !59, i64 0}
!59 = !{!"float", !9, i64 0}
!60 = !{!61, !59, i64 0}
!61 = !{!"", !59, i64 0, !59, i64 4}
!62 = !{!61, !59, i64 4}
!63 = distinct !{!63, !6}
!64 = distinct !{!64, !6}
!65 = distinct !{!65, !6}
!66 = distinct !{!66, !6}
!67 = distinct !{!67, !6}
!68 = distinct !{!68, !6}
!69 = distinct !{!69, !6}


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