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

; 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 }
%struct.quantum_geometric_tensor_t = type { i32, ptr, i64, ptr, ptr, i8, i8, i8, i32, i64, i64 }

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

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @geometric_tensor_multiply(ptr noundef %0, ptr noundef %1, ptr noundef %2) #4 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i64, align 8
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  %31 = alloca i64, align 8
  %32 = alloca %struct.ComplexFloat, align 4
  %33 = alloca i64, align 8
  %34 = alloca %struct.ComplexFloat, align 4
  %35 = alloca %struct.ComplexFloat, align 4
  %36 = alloca %struct.ComplexFloat, align 4
  %37 = alloca i64, align 8
  %38 = alloca i64, align 8
  %39 = alloca i64, align 8
  %40 = alloca i64, 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 ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca i64, align 8
  %49 = alloca i64, align 8
  %50 = alloca i64, align 8
  %51 = alloca i64, align 8
  %52 = alloca i64, 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 %struct.ComplexFloat, align 4
  %60 = alloca i64, align 8
  %61 = alloca ptr, align 8
  %62 = alloca ptr, align 8
  %63 = alloca i64, align 8
  %64 = alloca i64, align 8
  %65 = alloca %struct.ComplexFloat, align 4
  %66 = alloca %struct.ComplexFloat, align 4
  %67 = alloca %struct.ComplexFloat, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  %68 = load ptr, ptr %5, align 8, !tbaa !5
  %69 = icmp eq ptr %68, null
  br i1 %69, label %70, label %71

70:                                               ; preds = %3
  store i32 -1, ptr %4, align 4
  br label %829

71:                                               ; preds = %3
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = icmp eq ptr %72, null
  br i1 %73, label %74, label %75

74:                                               ; preds = %71
  store i32 -1, ptr %4, align 4
  br label %829

75:                                               ; preds = %71
  %76 = load ptr, ptr %7, align 8, !tbaa !5
  %77 = icmp eq ptr %76, null
  br i1 %77, label %78, label %79

78:                                               ; preds = %75
  store i32 -1, ptr %4, align 4
  br label %829

79:                                               ; preds = %75
  %80 = load ptr, ptr %6, align 8, !tbaa !5
  %81 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %80, i32 0, i32 2
  %82 = load i64, ptr %81, align 8, !tbaa !9
  %83 = load ptr, ptr %7, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %83, i32 0, i32 2
  %85 = load i64, ptr %84, align 8, !tbaa !9
  %86 = icmp eq i64 %82, %85
  br i1 %86, label %88, label %87

87:                                               ; preds = %79
  store i32 -1, ptr %4, align 4
  br label %829

88:                                               ; preds = %79
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #9
  %89 = load ptr, ptr %6, align 8, !tbaa !5
  %90 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %89, i32 0, i32 2
  %91 = load i64, ptr %90, align 8, !tbaa !9
  %92 = mul i64 %91, 8
  %93 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %92) #10
  store ptr %93, ptr %8, align 8, !tbaa !5
  %94 = load ptr, ptr %8, align 8, !tbaa !5
  %95 = icmp ne ptr %94, null
  br i1 %95, label %97, label %96

96:                                               ; preds = %88
  store i32 -2, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %828

97:                                               ; preds = %88
  %98 = load ptr, ptr %6, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %98, i32 0, i32 2
  %100 = load i64, ptr %99, align 8, !tbaa !9
  %101 = icmp eq i64 %100, 2
  br i1 %101, label %102, label %473

102:                                              ; preds = %97
  %103 = load ptr, ptr %6, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %103, i32 0, i32 1
  %105 = load ptr, ptr %104, align 8, !tbaa !14
  %106 = getelementptr inbounds i64, ptr %105, i64 1
  %107 = load i64, ptr %106, align 8, !tbaa !15
  %108 = load ptr, ptr %7, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %108, i32 0, i32 1
  %110 = load ptr, ptr %109, align 8, !tbaa !14
  %111 = getelementptr inbounds i64, ptr %110, i64 0
  %112 = load i64, ptr %111, align 8, !tbaa !15
  %113 = icmp eq i64 %107, %112
  br i1 %113, label %114, label %473

114:                                              ; preds = %102
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #9
  %115 = load ptr, ptr %6, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %115, i32 0, i32 1
  %117 = load ptr, ptr %116, align 8, !tbaa !14
  %118 = getelementptr inbounds i64, ptr %117, i64 0
  %119 = load i64, ptr %118, align 8, !tbaa !15
  store i64 %119, ptr %10, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #9
  %120 = load ptr, ptr %6, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %120, i32 0, i32 1
  %122 = load ptr, ptr %121, align 8, !tbaa !14
  %123 = getelementptr inbounds i64, ptr %122, i64 1
  %124 = load i64, ptr %123, align 8, !tbaa !15
  store i64 %124, ptr %11, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #9
  %125 = load ptr, ptr %7, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %125, i32 0, i32 1
  %127 = load ptr, ptr %126, align 8, !tbaa !14
  %128 = getelementptr inbounds i64, ptr %127, i64 1
  %129 = load i64, ptr %128, align 8, !tbaa !15
  store i64 %129, ptr %12, align 8, !tbaa !15
  %130 = load ptr, ptr %5, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %130, i32 0, i32 3
  %132 = load ptr, ptr %131, align 8, !tbaa !16
  %133 = load i64, ptr %10, align 8, !tbaa !15
  %134 = load i64, ptr %12, align 8, !tbaa !15
  %135 = mul i64 %133, %134
  %136 = mul i64 %135, 8
  call void @llvm.memset.p0.i64(ptr align 4 %132, i8 0, i64 %136, i1 false)
  %137 = load i64, ptr %10, align 8, !tbaa !15
  %138 = icmp uge i64 %137, 128
  br i1 %138, label %139, label %317

139:                                              ; preds = %114
  %140 = load i64, ptr %11, align 8, !tbaa !15
  %141 = icmp uge i64 %140, 128
  br i1 %141, label %142, label %317

142:                                              ; preds = %139
  %143 = load i64, ptr %12, align 8, !tbaa !15
  %144 = icmp uge i64 %143, 128
  br i1 %144, label %145, label %317

145:                                              ; preds = %142
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %146 = load i64, ptr %10, align 8, !tbaa !15
  %147 = load i64, ptr %11, align 8, !tbaa !15
  %148 = call i64 @max(i64 noundef %146, i64 noundef %147)
  %149 = load i64, ptr %12, align 8, !tbaa !15
  %150 = call i64 @max(i64 noundef %148, i64 noundef %149)
  store i64 %150, ptr %13, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #9
  store i64 1, ptr %14, align 8, !tbaa !15
  br label %151

151:                                              ; preds = %155, %145
  %152 = load i64, ptr %14, align 8, !tbaa !15
  %153 = load i64, ptr %13, align 8, !tbaa !15
  %154 = icmp ult i64 %152, %153
  br i1 %154, label %155, label %158

155:                                              ; preds = %151
  %156 = load i64, ptr %14, align 8, !tbaa !15
  %157 = mul i64 %156, 2
  store i64 %157, ptr %14, align 8, !tbaa !15
  br label %151, !llvm.loop !17

158:                                              ; preds = %151
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #9
  %159 = load i64, ptr %14, align 8, !tbaa !15
  %160 = load i64, ptr %14, align 8, !tbaa !15
  %161 = mul i64 %159, %160
  %162 = mul i64 %161, 8
  %163 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %162) #10
  store ptr %163, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #9
  %164 = load i64, ptr %14, align 8, !tbaa !15
  %165 = load i64, ptr %14, align 8, !tbaa !15
  %166 = mul i64 %164, %165
  %167 = mul i64 %166, 8
  %168 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %167) #10
  store ptr %168, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #9
  %169 = load i64, ptr %14, align 8, !tbaa !15
  %170 = load i64, ptr %14, align 8, !tbaa !15
  %171 = mul i64 %169, %170
  %172 = mul i64 %171, 8
  %173 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %172) #10
  store ptr %173, ptr %17, align 8, !tbaa !5
  %174 = load ptr, ptr %15, align 8, !tbaa !5
  %175 = icmp ne ptr %174, null
  br i1 %175, label %176, label %182

176:                                              ; preds = %158
  %177 = load ptr, ptr %16, align 8, !tbaa !5
  %178 = icmp ne ptr %177, null
  br i1 %178, label %179, label %182

179:                                              ; preds = %176
  %180 = load ptr, ptr %17, align 8, !tbaa !5
  %181 = icmp ne ptr %180, null
  br i1 %181, label %187, label %182

182:                                              ; preds = %179, %176, %158
  %183 = load ptr, ptr %15, align 8, !tbaa !5
  call void @free(ptr noundef %183) #9
  %184 = load ptr, ptr %16, align 8, !tbaa !5
  call void @free(ptr noundef %184) #9
  %185 = load ptr, ptr %17, align 8, !tbaa !5
  call void @free(ptr noundef %185) #9
  %186 = load ptr, ptr %8, align 8, !tbaa !5
  call void @free(ptr noundef %186) #9
  store i32 -2, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %314

187:                                              ; preds = %179
  %188 = load ptr, ptr %15, align 8, !tbaa !5
  %189 = load i64, ptr %14, align 8, !tbaa !15
  %190 = load i64, ptr %14, align 8, !tbaa !15
  %191 = mul i64 %189, %190
  %192 = mul i64 %191, 8
  call void @llvm.memset.p0.i64(ptr align 4 %188, i8 0, i64 %192, i1 false)
  %193 = load ptr, ptr %16, align 8, !tbaa !5
  %194 = load i64, ptr %14, align 8, !tbaa !15
  %195 = load i64, ptr %14, align 8, !tbaa !15
  %196 = mul i64 %194, %195
  %197 = mul i64 %196, 8
  call void @llvm.memset.p0.i64(ptr align 4 %193, i8 0, i64 %197, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #9
  store i64 0, ptr %18, align 8, !tbaa !15
  br label %198

198:                                              ; preds = %230, %187
  %199 = load i64, ptr %18, align 8, !tbaa !15
  %200 = load i64, ptr %10, align 8, !tbaa !15
  %201 = icmp ult i64 %199, %200
  br i1 %201, label %203, label %202

202:                                              ; preds = %198
  store i32 4, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #9
  br label %233

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

204:                                              ; preds = %226, %203
  %205 = load i64, ptr %19, align 8, !tbaa !15
  %206 = load i64, ptr %11, align 8, !tbaa !15
  %207 = icmp ult i64 %205, %206
  br i1 %207, label %209, label %208

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

209:                                              ; preds = %204
  %210 = load ptr, ptr %15, align 8, !tbaa !5
  %211 = load i64, ptr %18, align 8, !tbaa !15
  %212 = load i64, ptr %14, align 8, !tbaa !15
  %213 = mul i64 %211, %212
  %214 = load i64, ptr %19, align 8, !tbaa !15
  %215 = add i64 %213, %214
  %216 = getelementptr inbounds %struct.ComplexFloat, ptr %210, i64 %215
  %217 = load ptr, ptr %6, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %217, i32 0, i32 3
  %219 = load ptr, ptr %218, align 8, !tbaa !16
  %220 = load i64, ptr %18, align 8, !tbaa !15
  %221 = load i64, ptr %11, align 8, !tbaa !15
  %222 = mul i64 %220, %221
  %223 = load i64, ptr %19, align 8, !tbaa !15
  %224 = add i64 %222, %223
  %225 = getelementptr inbounds %struct.ComplexFloat, ptr %219, i64 %224
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %216, ptr align 4 %225, i64 8, i1 false), !tbaa.struct !19
  br label %226

226:                                              ; preds = %209
  %227 = load i64, ptr %19, align 8, !tbaa !15
  %228 = add i64 %227, 1
  store i64 %228, ptr %19, align 8, !tbaa !15
  br label %204, !llvm.loop !22

229:                                              ; preds = %208
  br label %230

230:                                              ; preds = %229
  %231 = load i64, ptr %18, align 8, !tbaa !15
  %232 = add i64 %231, 1
  store i64 %232, ptr %18, align 8, !tbaa !15
  br label %198, !llvm.loop !23

233:                                              ; preds = %202
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #9
  store i64 0, ptr %20, align 8, !tbaa !15
  br label %234

234:                                              ; preds = %266, %233
  %235 = load i64, ptr %20, align 8, !tbaa !15
  %236 = load i64, ptr %11, align 8, !tbaa !15
  %237 = icmp ult i64 %235, %236
  br i1 %237, label %239, label %238

238:                                              ; preds = %234
  store i32 10, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #9
  br label %269

239:                                              ; preds = %234
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #9
  store i64 0, ptr %21, align 8, !tbaa !15
  br label %240

240:                                              ; preds = %262, %239
  %241 = load i64, ptr %21, align 8, !tbaa !15
  %242 = load i64, ptr %12, align 8, !tbaa !15
  %243 = icmp ult i64 %241, %242
  br i1 %243, label %245, label %244

244:                                              ; preds = %240
  store i32 13, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #9
  br label %265

245:                                              ; preds = %240
  %246 = load ptr, ptr %16, align 8, !tbaa !5
  %247 = load i64, ptr %20, align 8, !tbaa !15
  %248 = load i64, ptr %14, align 8, !tbaa !15
  %249 = mul i64 %247, %248
  %250 = load i64, ptr %21, align 8, !tbaa !15
  %251 = add i64 %249, %250
  %252 = getelementptr inbounds %struct.ComplexFloat, ptr %246, i64 %251
  %253 = load ptr, ptr %7, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %253, i32 0, i32 3
  %255 = load ptr, ptr %254, align 8, !tbaa !16
  %256 = load i64, ptr %20, align 8, !tbaa !15
  %257 = load i64, ptr %12, align 8, !tbaa !15
  %258 = mul i64 %256, %257
  %259 = load i64, ptr %21, align 8, !tbaa !15
  %260 = add i64 %258, %259
  %261 = getelementptr inbounds %struct.ComplexFloat, ptr %255, i64 %260
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %252, ptr align 4 %261, i64 8, i1 false), !tbaa.struct !19
  br label %262

262:                                              ; preds = %245
  %263 = load i64, ptr %21, align 8, !tbaa !15
  %264 = add i64 %263, 1
  store i64 %264, ptr %21, align 8, !tbaa !15
  br label %240, !llvm.loop !24

265:                                              ; preds = %244
  br label %266

266:                                              ; preds = %265
  %267 = load i64, ptr %20, align 8, !tbaa !15
  %268 = add i64 %267, 1
  store i64 %268, ptr %20, align 8, !tbaa !15
  br label %234, !llvm.loop !25

269:                                              ; preds = %238
  %270 = load ptr, ptr %17, align 8, !tbaa !5
  %271 = load ptr, ptr %15, align 8, !tbaa !5
  %272 = load ptr, ptr %16, align 8, !tbaa !5
  %273 = load i64, ptr %14, align 8, !tbaa !15
  %274 = load i64, ptr %14, align 8, !tbaa !15
  call void @strassen_multiply_recursive(ptr noundef %270, ptr noundef %271, ptr noundef %272, i64 noundef %273, i64 noundef %274)
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #9
  store i64 0, ptr %22, align 8, !tbaa !15
  br label %275

275:                                              ; preds = %307, %269
  %276 = load i64, ptr %22, align 8, !tbaa !15
  %277 = load i64, ptr %10, align 8, !tbaa !15
  %278 = icmp ult i64 %276, %277
  br i1 %278, label %280, label %279

279:                                              ; preds = %275
  store i32 16, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #9
  br label %310

280:                                              ; preds = %275
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #9
  store i64 0, ptr %23, align 8, !tbaa !15
  br label %281

281:                                              ; preds = %303, %280
  %282 = load i64, ptr %23, align 8, !tbaa !15
  %283 = load i64, ptr %12, align 8, !tbaa !15
  %284 = icmp ult i64 %282, %283
  br i1 %284, label %286, label %285

285:                                              ; preds = %281
  store i32 19, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #9
  br label %306

286:                                              ; preds = %281
  %287 = load ptr, ptr %5, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %287, i32 0, i32 3
  %289 = load ptr, ptr %288, align 8, !tbaa !16
  %290 = load i64, ptr %22, align 8, !tbaa !15
  %291 = load i64, ptr %12, align 8, !tbaa !15
  %292 = mul i64 %290, %291
  %293 = load i64, ptr %23, align 8, !tbaa !15
  %294 = add i64 %292, %293
  %295 = getelementptr inbounds %struct.ComplexFloat, ptr %289, i64 %294
  %296 = load ptr, ptr %17, align 8, !tbaa !5
  %297 = load i64, ptr %22, align 8, !tbaa !15
  %298 = load i64, ptr %14, align 8, !tbaa !15
  %299 = mul i64 %297, %298
  %300 = load i64, ptr %23, align 8, !tbaa !15
  %301 = add i64 %299, %300
  %302 = getelementptr inbounds %struct.ComplexFloat, ptr %296, i64 %301
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %295, ptr align 4 %302, i64 8, i1 false), !tbaa.struct !19
  br label %303

303:                                              ; preds = %286
  %304 = load i64, ptr %23, align 8, !tbaa !15
  %305 = add i64 %304, 1
  store i64 %305, ptr %23, align 8, !tbaa !15
  br label %281, !llvm.loop !26

306:                                              ; preds = %285
  br label %307

307:                                              ; preds = %306
  %308 = load i64, ptr %22, align 8, !tbaa !15
  %309 = add i64 %308, 1
  store i64 %309, ptr %22, align 8, !tbaa !15
  br label %275, !llvm.loop !27

310:                                              ; preds = %279
  %311 = load ptr, ptr %15, align 8, !tbaa !5
  call void @free(ptr noundef %311) #9
  %312 = load ptr, ptr %16, align 8, !tbaa !5
  call void @free(ptr noundef %312) #9
  %313 = load ptr, ptr %17, align 8, !tbaa !5
  call void @free(ptr noundef %313) #9
  store i32 0, ptr %9, align 4
  br label %314

314:                                              ; preds = %310, %182
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  %315 = load i32, ptr %9, align 4
  switch i32 %315, label %472 [
    i32 0, label %316
  ]

316:                                              ; preds = %314
  br label %438

317:                                              ; preds = %142, %139, %114
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #9
  store i64 0, ptr %24, align 8, !tbaa !15
  br label %318

318:                                              ; preds = %434, %317
  %319 = load i64, ptr %24, align 8, !tbaa !15
  %320 = load i64, ptr %10, align 8, !tbaa !15
  %321 = icmp ult i64 %319, %320
  br i1 %321, label %323, label %322

322:                                              ; preds = %318
  store i32 22, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #9
  br label %437

323:                                              ; preds = %318
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #9
  store i64 0, ptr %25, align 8, !tbaa !15
  br label %324

324:                                              ; preds = %430, %323
  %325 = load i64, ptr %25, align 8, !tbaa !15
  %326 = load i64, ptr %12, align 8, !tbaa !15
  %327 = icmp ult i64 %325, %326
  br i1 %327, label %329, label %328

328:                                              ; preds = %324
  store i32 25, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #9
  br label %433

329:                                              ; preds = %324
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #9
  store i64 0, ptr %26, align 8, !tbaa !15
  br label %330

330:                                              ; preds = %426, %329
  %331 = load i64, ptr %26, align 8, !tbaa !15
  %332 = load i64, ptr %11, align 8, !tbaa !15
  %333 = icmp ult i64 %331, %332
  br i1 %333, label %335, label %334

334:                                              ; preds = %330
  store i32 28, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #9
  br label %429

335:                                              ; preds = %330
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #9
  %336 = load i64, ptr %24, align 8, !tbaa !15
  %337 = add i64 %336, 32
  %338 = load i64, ptr %10, align 8, !tbaa !15
  %339 = call i64 @min(i64 noundef %337, i64 noundef %338)
  store i64 %339, ptr %27, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #9
  %340 = load i64, ptr %25, align 8, !tbaa !15
  %341 = add i64 %340, 32
  %342 = load i64, ptr %12, align 8, !tbaa !15
  %343 = call i64 @min(i64 noundef %341, i64 noundef %342)
  store i64 %343, ptr %28, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #9
  %344 = load i64, ptr %26, align 8, !tbaa !15
  %345 = add i64 %344, 32
  %346 = load i64, ptr %11, align 8, !tbaa !15
  %347 = call i64 @min(i64 noundef %345, i64 noundef %346)
  store i64 %347, ptr %29, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #9
  %348 = load i64, ptr %24, align 8, !tbaa !15
  store i64 %348, ptr %30, align 8, !tbaa !15
  br label %349

349:                                              ; preds = %422, %335
  %350 = load i64, ptr %30, align 8, !tbaa !15
  %351 = load i64, ptr %27, align 8, !tbaa !15
  %352 = icmp ult i64 %350, %351
  br i1 %352, label %354, label %353

353:                                              ; preds = %349
  store i32 31, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #9
  br label %425

354:                                              ; preds = %349
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #9
  %355 = load i64, ptr %25, align 8, !tbaa !15
  store i64 %355, ptr %31, align 8, !tbaa !15
  br label %356

356:                                              ; preds = %418, %354
  %357 = load i64, ptr %31, align 8, !tbaa !15
  %358 = load i64, ptr %28, align 8, !tbaa !15
  %359 = icmp ult i64 %357, %358
  br i1 %359, label %361, label %360

360:                                              ; preds = %356
  store i32 34, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #9
  br label %421

361:                                              ; preds = %356
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #9
  call void @llvm.memset.p0.i64(ptr align 4 %32, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #9
  %362 = load i64, ptr %26, align 8, !tbaa !15
  store i64 %362, ptr %33, align 8, !tbaa !15
  br label %363

363:                                              ; preds = %393, %361
  %364 = load i64, ptr %33, align 8, !tbaa !15
  %365 = load i64, ptr %29, align 8, !tbaa !15
  %366 = icmp ult i64 %364, %365
  br i1 %366, label %368, label %367

367:                                              ; preds = %363
  store i32 37, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #9
  br label %396

368:                                              ; preds = %363
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #9
  %369 = load ptr, ptr %6, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %369, i32 0, i32 3
  %371 = load ptr, ptr %370, align 8, !tbaa !16
  %372 = load i64, ptr %30, align 8, !tbaa !15
  %373 = load i64, ptr %11, align 8, !tbaa !15
  %374 = mul i64 %372, %373
  %375 = load i64, ptr %33, align 8, !tbaa !15
  %376 = add i64 %374, %375
  %377 = getelementptr inbounds %struct.ComplexFloat, ptr %371, i64 %376
  %378 = load ptr, ptr %7, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %378, i32 0, i32 3
  %380 = load ptr, ptr %379, align 8, !tbaa !16
  %381 = load i64, ptr %33, align 8, !tbaa !15
  %382 = load i64, ptr %12, align 8, !tbaa !15
  %383 = mul i64 %381, %382
  %384 = load i64, ptr %31, align 8, !tbaa !15
  %385 = add i64 %383, %384
  %386 = getelementptr inbounds %struct.ComplexFloat, ptr %380, i64 %385
  %387 = load <2 x float>, ptr %377, align 4
  %388 = load <2 x float>, ptr %386, align 4
  %389 = call <2 x float> @complex_float_multiply(<2 x float> %387, <2 x float> %388)
  store <2 x float> %389, ptr %35, align 4
  %390 = load <2 x float>, ptr %32, align 4
  %391 = load <2 x float>, ptr %35, align 4
  %392 = call <2 x float> @complex_float_add(<2 x float> %390, <2 x float> %391)
  store <2 x float> %392, ptr %34, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %32, ptr align 4 %34, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #9
  br label %393

393:                                              ; preds = %368
  %394 = load i64, ptr %33, align 8, !tbaa !15
  %395 = add i64 %394, 1
  store i64 %395, ptr %33, align 8, !tbaa !15
  br label %363, !llvm.loop !28

396:                                              ; preds = %367
  %397 = load ptr, ptr %5, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %397, i32 0, i32 3
  %399 = load ptr, ptr %398, align 8, !tbaa !16
  %400 = load i64, ptr %30, align 8, !tbaa !15
  %401 = load i64, ptr %12, align 8, !tbaa !15
  %402 = mul i64 %400, %401
  %403 = load i64, ptr %31, align 8, !tbaa !15
  %404 = add i64 %402, %403
  %405 = getelementptr inbounds %struct.ComplexFloat, ptr %399, i64 %404
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #9
  %406 = load ptr, ptr %5, align 8, !tbaa !5
  %407 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %406, i32 0, i32 3
  %408 = load ptr, ptr %407, align 8, !tbaa !16
  %409 = load i64, ptr %30, align 8, !tbaa !15
  %410 = load i64, ptr %12, align 8, !tbaa !15
  %411 = mul i64 %409, %410
  %412 = load i64, ptr %31, align 8, !tbaa !15
  %413 = add i64 %411, %412
  %414 = getelementptr inbounds %struct.ComplexFloat, ptr %408, i64 %413
  %415 = load <2 x float>, ptr %414, align 4
  %416 = load <2 x float>, ptr %32, align 4
  %417 = call <2 x float> @complex_float_add(<2 x float> %415, <2 x float> %416)
  store <2 x float> %417, ptr %36, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %405, ptr align 4 %36, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #9
  br label %418

418:                                              ; preds = %396
  %419 = load i64, ptr %31, align 8, !tbaa !15
  %420 = add i64 %419, 1
  store i64 %420, ptr %31, align 8, !tbaa !15
  br label %356, !llvm.loop !29

421:                                              ; preds = %360
  br label %422

422:                                              ; preds = %421
  %423 = load i64, ptr %30, align 8, !tbaa !15
  %424 = add i64 %423, 1
  store i64 %424, ptr %30, align 8, !tbaa !15
  br label %349, !llvm.loop !30

425:                                              ; preds = %353
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #9
  br label %426

426:                                              ; preds = %425
  %427 = load i64, ptr %26, align 8, !tbaa !15
  %428 = add i64 %427, 32
  store i64 %428, ptr %26, align 8, !tbaa !15
  br label %330, !llvm.loop !31

429:                                              ; preds = %334
  br label %430

430:                                              ; preds = %429
  %431 = load i64, ptr %25, align 8, !tbaa !15
  %432 = add i64 %431, 32
  store i64 %432, ptr %25, align 8, !tbaa !15
  br label %324, !llvm.loop !32

433:                                              ; preds = %328
  br label %434

434:                                              ; preds = %433
  %435 = load i64, ptr %24, align 8, !tbaa !15
  %436 = add i64 %435, 32
  store i64 %436, ptr %24, align 8, !tbaa !15
  br label %318, !llvm.loop !33

437:                                              ; preds = %322
  br label %438

438:                                              ; preds = %437, %316
  %439 = load ptr, ptr %5, align 8, !tbaa !5
  %440 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %439, i32 0, i32 3
  %441 = load ptr, ptr %440, align 8, !tbaa !16
  %442 = load i64, ptr %10, align 8, !tbaa !15
  %443 = load i64, ptr %12, align 8, !tbaa !15
  %444 = mul i64 %442, %443
  %445 = call zeroext i1 @check_numerical_stability(ptr noundef %441, i64 noundef %444)
  br i1 %445, label %448, label %446

446:                                              ; preds = %438
  %447 = load ptr, ptr %8, align 8, !tbaa !5
  call void @free(ptr noundef %447) #9
  store i32 -24, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %472

448:                                              ; preds = %438
  %449 = load i64, ptr %10, align 8, !tbaa !15
  %450 = load ptr, ptr %8, align 8, !tbaa !5
  %451 = getelementptr inbounds i64, ptr %450, i64 0
  store i64 %449, ptr %451, align 8, !tbaa !15
  %452 = load i64, ptr %12, align 8, !tbaa !15
  %453 = load ptr, ptr %8, align 8, !tbaa !5
  %454 = getelementptr inbounds i64, ptr %453, i64 1
  store i64 %452, ptr %454, align 8, !tbaa !15
  %455 = load ptr, ptr %8, align 8, !tbaa !5
  %456 = load ptr, ptr %5, align 8, !tbaa !5
  %457 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %456, i32 0, i32 1
  store ptr %455, ptr %457, align 8, !tbaa !14
  %458 = load ptr, ptr %5, align 8, !tbaa !5
  %459 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %458, i32 0, i32 2
  store i64 2, ptr %459, align 8, !tbaa !9
  %460 = load i64, ptr %10, align 8, !tbaa !15
  %461 = load i64, ptr %12, align 8, !tbaa !15
  %462 = mul i64 %460, %461
  %463 = load ptr, ptr %5, align 8, !tbaa !5
  %464 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %463, i32 0, i32 9
  store i64 %462, ptr %464, align 8, !tbaa !34
  %465 = load i64, ptr %10, align 8, !tbaa !15
  %466 = load i64, ptr %12, align 8, !tbaa !15
  %467 = mul i64 %465, %466
  %468 = add i64 %467, 7
  %469 = and i64 %468, -8
  %470 = load ptr, ptr %5, align 8, !tbaa !5
  %471 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %470, i32 0, i32 10
  store i64 %469, ptr %471, align 8, !tbaa !35
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %472

472:                                              ; preds = %448, %446, %314
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #9
  br label %828

473:                                              ; preds = %102, %97
  %474 = load ptr, ptr %6, align 8, !tbaa !5
  %475 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %474, i32 0, i32 1
  %476 = load ptr, ptr %475, align 8, !tbaa !14
  %477 = load ptr, ptr %6, align 8, !tbaa !5
  %478 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %477, i32 0, i32 2
  %479 = load i64, ptr %478, align 8, !tbaa !9
  %480 = sub i64 %479, 1
  %481 = getelementptr inbounds i64, ptr %476, i64 %480
  %482 = load i64, ptr %481, align 8, !tbaa !15
  %483 = load ptr, ptr %7, align 8, !tbaa !5
  %484 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %483, i32 0, i32 1
  %485 = load ptr, ptr %484, align 8, !tbaa !14
  %486 = getelementptr inbounds i64, ptr %485, i64 0
  %487 = load i64, ptr %486, align 8, !tbaa !15
  %488 = icmp ne i64 %482, %487
  br i1 %488, label %489, label %491

489:                                              ; preds = %473
  %490 = load ptr, ptr %8, align 8, !tbaa !5
  call void @free(ptr noundef %490) #9
  store i32 -22, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %828

491:                                              ; preds = %473
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #9
  store i64 1, ptr %37, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #9
  store i64 0, ptr %38, align 8, !tbaa !15
  br label %492

492:                                              ; preds = %509, %491
  %493 = load i64, ptr %38, align 8, !tbaa !15
  %494 = load ptr, ptr %6, align 8, !tbaa !5
  %495 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %494, i32 0, i32 2
  %496 = load i64, ptr %495, align 8, !tbaa !9
  %497 = sub i64 %496, 1
  %498 = icmp ult i64 %493, %497
  br i1 %498, label %500, label %499

499:                                              ; preds = %492
  store i32 40, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #9
  br label %512

500:                                              ; preds = %492
  %501 = load ptr, ptr %6, align 8, !tbaa !5
  %502 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %501, i32 0, i32 1
  %503 = load ptr, ptr %502, align 8, !tbaa !14
  %504 = load i64, ptr %38, align 8, !tbaa !15
  %505 = getelementptr inbounds i64, ptr %503, i64 %504
  %506 = load i64, ptr %505, align 8, !tbaa !15
  %507 = load i64, ptr %37, align 8, !tbaa !15
  %508 = mul i64 %507, %506
  store i64 %508, ptr %37, align 8, !tbaa !15
  br label %509

509:                                              ; preds = %500
  %510 = load i64, ptr %38, align 8, !tbaa !15
  %511 = add i64 %510, 1
  store i64 %511, ptr %38, align 8, !tbaa !15
  br label %492, !llvm.loop !36

512:                                              ; preds = %499
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #9
  store i64 1, ptr %39, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #9
  store i64 1, ptr %40, align 8, !tbaa !15
  br label %513

513:                                              ; preds = %529, %512
  %514 = load i64, ptr %40, align 8, !tbaa !15
  %515 = load ptr, ptr %7, align 8, !tbaa !5
  %516 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %515, i32 0, i32 2
  %517 = load i64, ptr %516, align 8, !tbaa !9
  %518 = icmp ult i64 %514, %517
  br i1 %518, label %520, label %519

519:                                              ; preds = %513
  store i32 43, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #9
  br label %532

520:                                              ; preds = %513
  %521 = load ptr, ptr %7, align 8, !tbaa !5
  %522 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %521, i32 0, i32 1
  %523 = load ptr, ptr %522, align 8, !tbaa !14
  %524 = load i64, ptr %40, align 8, !tbaa !15
  %525 = getelementptr inbounds i64, ptr %523, i64 %524
  %526 = load i64, ptr %525, align 8, !tbaa !15
  %527 = load i64, ptr %39, align 8, !tbaa !15
  %528 = mul i64 %527, %526
  store i64 %528, ptr %39, align 8, !tbaa !15
  br label %529

529:                                              ; preds = %520
  %530 = load i64, ptr %40, align 8, !tbaa !15
  %531 = add i64 %530, 1
  store i64 %531, ptr %40, align 8, !tbaa !15
  br label %513, !llvm.loop !37

532:                                              ; preds = %519
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #9
  %533 = load ptr, ptr %6, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %533, i32 0, i32 2
  %535 = load i64, ptr %534, align 8, !tbaa !9
  %536 = load ptr, ptr %7, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %536, i32 0, i32 2
  %538 = load i64, ptr %537, align 8, !tbaa !9
  %539 = add i64 %535, %538
  %540 = sub i64 %539, 2
  store i64 %540, ptr %41, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #9
  store i64 0, ptr %42, align 8, !tbaa !15
  br label %541

541:                                              ; preds = %559, %532
  %542 = load i64, ptr %42, align 8, !tbaa !15
  %543 = load ptr, ptr %6, align 8, !tbaa !5
  %544 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %543, i32 0, i32 2
  %545 = load i64, ptr %544, align 8, !tbaa !9
  %546 = sub i64 %545, 1
  %547 = icmp ult i64 %542, %546
  br i1 %547, label %549, label %548

548:                                              ; preds = %541
  store i32 46, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #9
  br label %562

549:                                              ; preds = %541
  %550 = load ptr, ptr %6, align 8, !tbaa !5
  %551 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %550, i32 0, i32 1
  %552 = load ptr, ptr %551, align 8, !tbaa !14
  %553 = load i64, ptr %42, align 8, !tbaa !15
  %554 = getelementptr inbounds i64, ptr %552, i64 %553
  %555 = load i64, ptr %554, align 8, !tbaa !15
  %556 = load ptr, ptr %8, align 8, !tbaa !5
  %557 = load i64, ptr %42, align 8, !tbaa !15
  %558 = getelementptr inbounds i64, ptr %556, i64 %557
  store i64 %555, ptr %558, align 8, !tbaa !15
  br label %559

559:                                              ; preds = %549
  %560 = load i64, ptr %42, align 8, !tbaa !15
  %561 = add i64 %560, 1
  store i64 %561, ptr %42, align 8, !tbaa !15
  br label %541, !llvm.loop !38

562:                                              ; preds = %548
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #9
  store i64 0, ptr %43, align 8, !tbaa !15
  br label %563

563:                                              ; preds = %587, %562
  %564 = load i64, ptr %43, align 8, !tbaa !15
  %565 = load ptr, ptr %7, align 8, !tbaa !5
  %566 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %565, i32 0, i32 2
  %567 = load i64, ptr %566, align 8, !tbaa !9
  %568 = sub i64 %567, 1
  %569 = icmp ult i64 %564, %568
  br i1 %569, label %571, label %570

570:                                              ; preds = %563
  store i32 49, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #9
  br label %590

571:                                              ; preds = %563
  %572 = load ptr, ptr %7, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %572, i32 0, i32 1
  %574 = load ptr, ptr %573, align 8, !tbaa !14
  %575 = load i64, ptr %43, align 8, !tbaa !15
  %576 = add i64 %575, 1
  %577 = getelementptr inbounds i64, ptr %574, i64 %576
  %578 = load i64, ptr %577, align 8, !tbaa !15
  %579 = load ptr, ptr %8, align 8, !tbaa !5
  %580 = load ptr, ptr %6, align 8, !tbaa !5
  %581 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %580, i32 0, i32 2
  %582 = load i64, ptr %581, align 8, !tbaa !9
  %583 = sub i64 %582, 1
  %584 = load i64, ptr %43, align 8, !tbaa !15
  %585 = add i64 %583, %584
  %586 = getelementptr inbounds i64, ptr %579, i64 %585
  store i64 %578, ptr %586, align 8, !tbaa !15
  br label %587

587:                                              ; preds = %571
  %588 = load i64, ptr %43, align 8, !tbaa !15
  %589 = add i64 %588, 1
  store i64 %589, ptr %43, align 8, !tbaa !15
  br label %563, !llvm.loop !39

590:                                              ; preds = %570
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #9
  %591 = load i64, ptr %37, align 8, !tbaa !15
  %592 = load i64, ptr %39, align 8, !tbaa !15
  %593 = mul i64 %591, %592
  store i64 %593, ptr %44, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #9
  %594 = load i64, ptr %44, align 8, !tbaa !15
  %595 = add i64 %594, 7
  %596 = and i64 %595, -8
  store i64 %596, ptr %45, align 8, !tbaa !15
  %597 = load ptr, ptr %5, align 8, !tbaa !5
  %598 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %597, i32 0, i32 3
  %599 = load ptr, ptr %598, align 8, !tbaa !16
  %600 = load i64, ptr %45, align 8, !tbaa !15
  %601 = mul i64 %600, 8
  call void @llvm.memset.p0.i64(ptr align 4 %599, i8 0, i64 %601, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #9
  %602 = load ptr, ptr %6, align 8, !tbaa !5
  %603 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %602, i32 0, i32 2
  %604 = load i64, ptr %603, align 8, !tbaa !9
  %605 = mul i64 %604, 8
  %606 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %605) #10
  store ptr %606, ptr %46, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #9
  %607 = load ptr, ptr %7, align 8, !tbaa !5
  %608 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %607, i32 0, i32 2
  %609 = load i64, ptr %608, align 8, !tbaa !9
  %610 = mul i64 %609, 8
  %611 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %610) #10
  store ptr %611, ptr %47, align 8, !tbaa !5
  %612 = load ptr, ptr %46, align 8, !tbaa !5
  %613 = icmp ne ptr %612, null
  br i1 %613, label %614, label %617

614:                                              ; preds = %590
  %615 = load ptr, ptr %47, align 8, !tbaa !5
  %616 = icmp ne ptr %615, null
  br i1 %616, label %620, label %617

617:                                              ; preds = %614, %590
  %618 = load ptr, ptr %46, align 8, !tbaa !5
  call void @free(ptr noundef %618) #9
  %619 = load ptr, ptr %47, align 8, !tbaa !5
  call void @free(ptr noundef %619) #9
  store i32 -2, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %827

620:                                              ; preds = %614
  %621 = load ptr, ptr %46, align 8, !tbaa !5
  %622 = load ptr, ptr %6, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %622, i32 0, i32 1
  %624 = load ptr, ptr %623, align 8, !tbaa !14
  %625 = load ptr, ptr %6, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %625, i32 0, i32 2
  %627 = load i64, ptr %626, align 8, !tbaa !9
  call void @calculate_strides(ptr noundef %621, ptr noundef %624, i64 noundef %627)
  %628 = load ptr, ptr %47, align 8, !tbaa !5
  %629 = load ptr, ptr %7, align 8, !tbaa !5
  %630 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %629, i32 0, i32 1
  %631 = load ptr, ptr %630, align 8, !tbaa !14
  %632 = load ptr, ptr %7, align 8, !tbaa !5
  %633 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %632, i32 0, i32 2
  %634 = load i64, ptr %633, align 8, !tbaa !9
  call void @calculate_strides(ptr noundef %628, ptr noundef %631, i64 noundef %634)
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #9
  %635 = load i64, ptr %37, align 8, !tbaa !15
  store i64 %635, ptr %48, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #9
  %636 = load ptr, ptr %6, align 8, !tbaa !5
  %637 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %636, i32 0, i32 1
  %638 = load ptr, ptr %637, align 8, !tbaa !14
  %639 = load ptr, ptr %6, align 8, !tbaa !5
  %640 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %639, i32 0, i32 2
  %641 = load i64, ptr %640, align 8, !tbaa !9
  %642 = sub i64 %641, 1
  %643 = getelementptr inbounds i64, ptr %638, i64 %642
  %644 = load i64, ptr %643, align 8, !tbaa !15
  store i64 %644, ptr %49, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #9
  %645 = load i64, ptr %39, align 8, !tbaa !15
  store i64 %645, ptr %50, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #9
  store i64 0, ptr %51, align 8, !tbaa !15
  br label %646

646:                                              ; preds = %800, %620
  %647 = load i64, ptr %51, align 8, !tbaa !15
  %648 = load i64, ptr %48, align 8, !tbaa !15
  %649 = icmp ult i64 %647, %648
  br i1 %649, label %651, label %650

650:                                              ; preds = %646
  store i32 52, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #9
  br label %803

651:                                              ; preds = %646
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #9
  store i64 0, ptr %52, align 8, !tbaa !15
  br label %652

652:                                              ; preds = %796, %651
  %653 = load i64, ptr %52, align 8, !tbaa !15
  %654 = load i64, ptr %50, align 8, !tbaa !15
  %655 = icmp ult i64 %653, %654
  br i1 %655, label %657, label %656

656:                                              ; preds = %652
  store i32 55, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #9
  br label %799

657:                                              ; preds = %652
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #9
  store i64 0, ptr %53, align 8, !tbaa !15
  br label %658

658:                                              ; preds = %792, %657
  %659 = load i64, ptr %53, align 8, !tbaa !15
  %660 = load i64, ptr %49, align 8, !tbaa !15
  %661 = icmp ult i64 %659, %660
  br i1 %661, label %663, label %662

662:                                              ; preds = %658
  store i32 58, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #9
  br label %795

663:                                              ; preds = %658
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #9
  %664 = load i64, ptr %51, align 8, !tbaa !15
  %665 = add i64 %664, 32
  %666 = load i64, ptr %48, align 8, !tbaa !15
  %667 = call i64 @min(i64 noundef %665, i64 noundef %666)
  store i64 %667, ptr %54, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #9
  %668 = load i64, ptr %52, align 8, !tbaa !15
  %669 = add i64 %668, 32
  %670 = load i64, ptr %50, align 8, !tbaa !15
  %671 = call i64 @min(i64 noundef %669, i64 noundef %670)
  store i64 %671, ptr %55, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #9
  %672 = load i64, ptr %53, align 8, !tbaa !15
  %673 = add i64 %672, 32
  %674 = load i64, ptr %49, align 8, !tbaa !15
  %675 = call i64 @min(i64 noundef %673, i64 noundef %674)
  store i64 %675, ptr %56, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #9
  %676 = load i64, ptr %51, align 8, !tbaa !15
  store i64 %676, ptr %57, align 8, !tbaa !15
  br label %677

677:                                              ; preds = %788, %663
  %678 = load i64, ptr %57, align 8, !tbaa !15
  %679 = load i64, ptr %54, align 8, !tbaa !15
  %680 = icmp ult i64 %678, %679
  br i1 %680, label %682, label %681

681:                                              ; preds = %677
  store i32 61, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #9
  br label %791

682:                                              ; preds = %677
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #9
  %683 = load i64, ptr %52, align 8, !tbaa !15
  store i64 %683, ptr %58, align 8, !tbaa !15
  br label %684

684:                                              ; preds = %784, %682
  %685 = load i64, ptr %58, align 8, !tbaa !15
  %686 = load i64, ptr %55, align 8, !tbaa !15
  %687 = icmp ult i64 %685, %686
  br i1 %687, label %689, label %688

688:                                              ; preds = %684
  store i32 64, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #9
  br label %787

689:                                              ; preds = %684
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #9
  call void @llvm.memset.p0.i64(ptr align 4 %59, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #9
  %690 = load i64, ptr %53, align 8, !tbaa !15
  store i64 %690, ptr %60, align 8, !tbaa !15
  br label %691

691:                                              ; preds = %759, %689
  %692 = load i64, ptr %60, align 8, !tbaa !15
  %693 = load i64, ptr %56, align 8, !tbaa !15
  %694 = icmp ult i64 %692, %693
  br i1 %694, label %696, label %695

695:                                              ; preds = %691
  store i32 67, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #9
  br label %762

696:                                              ; preds = %691
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #9
  %697 = load ptr, ptr %6, align 8, !tbaa !5
  %698 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %697, i32 0, i32 2
  %699 = load i64, ptr %698, align 8, !tbaa !9
  %700 = mul i64 %699, 8
  %701 = alloca i8, i64 %700, align 16
  store ptr %701, ptr %61, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #9
  %702 = load ptr, ptr %7, align 8, !tbaa !5
  %703 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %702, i32 0, i32 2
  %704 = load i64, ptr %703, align 8, !tbaa !9
  %705 = mul i64 %704, 8
  %706 = alloca i8, i64 %705, align 16
  store ptr %706, ptr %62, align 8, !tbaa !5
  %707 = load ptr, ptr %61, align 8, !tbaa !5
  %708 = load i64, ptr %57, align 8, !tbaa !15
  %709 = load i64, ptr %49, align 8, !tbaa !15
  %710 = mul i64 %708, %709
  %711 = load i64, ptr %60, align 8, !tbaa !15
  %712 = add i64 %710, %711
  %713 = load ptr, ptr %6, align 8, !tbaa !5
  %714 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %713, i32 0, i32 1
  %715 = load ptr, ptr %714, align 8, !tbaa !14
  %716 = load ptr, ptr %6, align 8, !tbaa !5
  %717 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %716, i32 0, i32 2
  %718 = load i64, ptr %717, align 8, !tbaa !9
  call void @linear_to_indices(ptr noundef %707, i64 noundef %712, ptr noundef %715, i64 noundef %718)
  %719 = load ptr, ptr %62, align 8, !tbaa !5
  %720 = load i64, ptr %60, align 8, !tbaa !15
  %721 = load i64, ptr %50, align 8, !tbaa !15
  %722 = mul i64 %720, %721
  %723 = load i64, ptr %58, align 8, !tbaa !15
  %724 = add i64 %722, %723
  %725 = load ptr, ptr %7, align 8, !tbaa !5
  %726 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %725, i32 0, i32 1
  %727 = load ptr, ptr %726, align 8, !tbaa !14
  %728 = load ptr, ptr %7, align 8, !tbaa !5
  %729 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %728, i32 0, i32 2
  %730 = load i64, ptr %729, align 8, !tbaa !9
  call void @linear_to_indices(ptr noundef %719, i64 noundef %724, ptr noundef %727, i64 noundef %730)
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #9
  %731 = load ptr, ptr %61, align 8, !tbaa !5
  %732 = load ptr, ptr %46, align 8, !tbaa !5
  %733 = load ptr, ptr %6, align 8, !tbaa !5
  %734 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %733, i32 0, i32 2
  %735 = load i64, ptr %734, align 8, !tbaa !9
  %736 = call i64 @indices_to_linear(ptr noundef %731, ptr noundef %732, i64 noundef %735)
  store i64 %736, ptr %63, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #9
  %737 = load ptr, ptr %62, align 8, !tbaa !5
  %738 = load ptr, ptr %47, align 8, !tbaa !5
  %739 = load ptr, ptr %7, align 8, !tbaa !5
  %740 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %739, i32 0, i32 2
  %741 = load i64, ptr %740, align 8, !tbaa !9
  %742 = call i64 @indices_to_linear(ptr noundef %737, ptr noundef %738, i64 noundef %741)
  store i64 %742, ptr %64, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #9
  %743 = load ptr, ptr %6, align 8, !tbaa !5
  %744 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %743, i32 0, i32 3
  %745 = load ptr, ptr %744, align 8, !tbaa !16
  %746 = load i64, ptr %63, align 8, !tbaa !15
  %747 = getelementptr inbounds %struct.ComplexFloat, ptr %745, i64 %746
  %748 = load ptr, ptr %7, align 8, !tbaa !5
  %749 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %748, i32 0, i32 3
  %750 = load ptr, ptr %749, align 8, !tbaa !16
  %751 = load i64, ptr %64, align 8, !tbaa !15
  %752 = getelementptr inbounds %struct.ComplexFloat, ptr %750, i64 %751
  %753 = load <2 x float>, ptr %747, align 4
  %754 = load <2 x float>, ptr %752, align 4
  %755 = call <2 x float> @complex_float_multiply(<2 x float> %753, <2 x float> %754)
  store <2 x float> %755, ptr %66, align 4
  %756 = load <2 x float>, ptr %59, align 4
  %757 = load <2 x float>, ptr %66, align 4
  %758 = call <2 x float> @complex_float_add(<2 x float> %756, <2 x float> %757)
  store <2 x float> %758, ptr %65, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %59, ptr align 4 %65, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #9
  br label %759

759:                                              ; preds = %696
  %760 = load i64, ptr %60, align 8, !tbaa !15
  %761 = add i64 %760, 1
  store i64 %761, ptr %60, align 8, !tbaa !15
  br label %691, !llvm.loop !40

762:                                              ; preds = %695
  %763 = load ptr, ptr %5, align 8, !tbaa !5
  %764 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %763, i32 0, i32 3
  %765 = load ptr, ptr %764, align 8, !tbaa !16
  %766 = load i64, ptr %57, align 8, !tbaa !15
  %767 = load i64, ptr %50, align 8, !tbaa !15
  %768 = mul i64 %766, %767
  %769 = load i64, ptr %58, align 8, !tbaa !15
  %770 = add i64 %768, %769
  %771 = getelementptr inbounds %struct.ComplexFloat, ptr %765, i64 %770
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #9
  %772 = load ptr, ptr %5, align 8, !tbaa !5
  %773 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %772, i32 0, i32 3
  %774 = load ptr, ptr %773, align 8, !tbaa !16
  %775 = load i64, ptr %57, align 8, !tbaa !15
  %776 = load i64, ptr %50, align 8, !tbaa !15
  %777 = mul i64 %775, %776
  %778 = load i64, ptr %58, align 8, !tbaa !15
  %779 = add i64 %777, %778
  %780 = getelementptr inbounds %struct.ComplexFloat, ptr %774, i64 %779
  %781 = load <2 x float>, ptr %780, align 4
  %782 = load <2 x float>, ptr %59, align 4
  %783 = call <2 x float> @complex_float_add(<2 x float> %781, <2 x float> %782)
  store <2 x float> %783, ptr %67, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %771, ptr align 4 %67, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #9
  br label %784

784:                                              ; preds = %762
  %785 = load i64, ptr %58, align 8, !tbaa !15
  %786 = add i64 %785, 1
  store i64 %786, ptr %58, align 8, !tbaa !15
  br label %684, !llvm.loop !41

787:                                              ; preds = %688
  br label %788

788:                                              ; preds = %787
  %789 = load i64, ptr %57, align 8, !tbaa !15
  %790 = add i64 %789, 1
  store i64 %790, ptr %57, align 8, !tbaa !15
  br label %677, !llvm.loop !42

791:                                              ; preds = %681
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #9
  br label %792

792:                                              ; preds = %791
  %793 = load i64, ptr %53, align 8, !tbaa !15
  %794 = add i64 %793, 32
  store i64 %794, ptr %53, align 8, !tbaa !15
  br label %658, !llvm.loop !43

795:                                              ; preds = %662
  br label %796

796:                                              ; preds = %795
  %797 = load i64, ptr %52, align 8, !tbaa !15
  %798 = add i64 %797, 32
  store i64 %798, ptr %52, align 8, !tbaa !15
  br label %652, !llvm.loop !44

799:                                              ; preds = %656
  br label %800

800:                                              ; preds = %799
  %801 = load i64, ptr %51, align 8, !tbaa !15
  %802 = add i64 %801, 32
  store i64 %802, ptr %51, align 8, !tbaa !15
  br label %646, !llvm.loop !45

803:                                              ; preds = %650
  %804 = load ptr, ptr %46, align 8, !tbaa !5
  call void @free(ptr noundef %804) #9
  %805 = load ptr, ptr %47, align 8, !tbaa !5
  call void @free(ptr noundef %805) #9
  %806 = load ptr, ptr %5, align 8, !tbaa !5
  %807 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %806, i32 0, i32 3
  %808 = load ptr, ptr %807, align 8, !tbaa !16
  %809 = load i64, ptr %44, align 8, !tbaa !15
  %810 = call zeroext i1 @check_numerical_stability(ptr noundef %808, i64 noundef %809)
  br i1 %810, label %813, label %811

811:                                              ; preds = %803
  %812 = load ptr, ptr %8, align 8, !tbaa !5
  call void @free(ptr noundef %812) #9
  store i32 -24, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %826

813:                                              ; preds = %803
  %814 = load ptr, ptr %8, align 8, !tbaa !5
  %815 = load ptr, ptr %5, align 8, !tbaa !5
  %816 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %815, i32 0, i32 1
  store ptr %814, ptr %816, align 8, !tbaa !14
  %817 = load i64, ptr %41, align 8, !tbaa !15
  %818 = load ptr, ptr %5, align 8, !tbaa !5
  %819 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %818, i32 0, i32 2
  store i64 %817, ptr %819, align 8, !tbaa !9
  %820 = load i64, ptr %44, align 8, !tbaa !15
  %821 = load ptr, ptr %5, align 8, !tbaa !5
  %822 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %821, i32 0, i32 9
  store i64 %820, ptr %822, align 8, !tbaa !34
  %823 = load i64, ptr %45, align 8, !tbaa !15
  %824 = load ptr, ptr %5, align 8, !tbaa !5
  %825 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %824, i32 0, i32 10
  store i64 %823, ptr %825, align 8, !tbaa !35
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %826

826:                                              ; preds = %813, %811
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #9
  br label %827

827:                                              ; preds = %826, %617
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #9
  br label %828

828:                                              ; preds = %827, %489, %472, %96
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #9
  br label %829

829:                                              ; preds = %828, %87, %78, %74, %70
  %830 = load i32, ptr %4, align 4
  ret i32 %830
}

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_add(<2 x float>, <2 x float>) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_multiply(<2 x float>, <2 x float>) #7

; Function Attrs: nounwind uwtable
declare hidden zeroext i1 @check_numerical_stability(ptr noundef, i64 noundef) #8

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

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

; Function Attrs: nounwind uwtable
declare hidden i64 @indices_to_linear(ptr noundef, ptr noundef, i64 noundef) #8

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind allocsize(1) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind "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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nounwind uwtable "min-legal-vector-width"="64" "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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { 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 #7 = { inlinehint nounwind uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #9 = { nounwind }
attributes #10 = { nounwind allocsize(1) }

!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, !12, i64 16}
!10 = !{!"quantum_geometric_tensor_t", !11, i64 0, !6, i64 8, !12, i64 16, !6, i64 24, !6, i64 32, !13, i64 40, !13, i64 41, !13, i64 42, !11, i64 44, !12, i64 48, !12, i64 56}
!11 = !{!"int", !7, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{!10, !6, i64 8}
!15 = !{!12, !12, i64 0}
!16 = !{!10, !6, i64 24}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{i64 0, i64 4, !20, i64 4, i64 4, !20}
!20 = !{!21, !21, i64 0}
!21 = !{!"float", !7, i64 0}
!22 = distinct !{!22, !18}
!23 = distinct !{!23, !18}
!24 = distinct !{!24, !18}
!25 = distinct !{!25, !18}
!26 = distinct !{!26, !18}
!27 = distinct !{!27, !18}
!28 = distinct !{!28, !18}
!29 = distinct !{!29, !18}
!30 = distinct !{!30, !18}
!31 = distinct !{!31, !18}
!32 = distinct !{!32, !18}
!33 = distinct !{!33, !18}
!34 = !{!10, !12, i64 48}
!35 = !{!10, !12, i64 56}
!36 = distinct !{!36, !18}
!37 = distinct !{!37, !18}
!38 = distinct !{!38, !18}
!39 = distinct !{!39, !18}
!40 = distinct !{!40, !18}
!41 = distinct !{!41, !18}
!42 = distinct !{!42, !18}
!43 = distinct !{!43, !18}
!44 = distinct !{!44, !18}
!45 = distinct !{!45, !18}


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

%struct.ComplexFloat = type { float, float }

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized,aligned") allocsize(1) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @aligned_alloc(i64 allocalign noundef, i64 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 range(i32 -24, 1) i32 @geometric_tensor_multiply(ptr noundef %0, ptr noundef readonly %1, ptr noundef readonly %2) local_unnamed_addr #2 {
  %4 = icmp eq ptr %0, null
  %5 = icmp eq ptr %1, null
  %or.cond342 = or i1 %4, %5
  %6 = icmp eq ptr %2, null
  %or.cond343 = or i1 %or.cond342, %6
  br i1 %or.cond343, label %489, label %7

7:                                                ; preds = %3
  %8 = getelementptr inbounds i8, ptr %1, i64 16
  %9 = load i64, ptr %8, align 8, !tbaa !5
  %10 = getelementptr inbounds i8, ptr %2, i64 16
  %11 = load i64, ptr %10, align 8, !tbaa !5
  %12 = icmp eq i64 %9, %11
  br i1 %12, label %13, label %489

13:                                               ; preds = %7
  %14 = shl i64 %9, 3
  %15 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %14) #7
  %16 = ptrtoint ptr %15 to i64
  %.not = icmp eq ptr %15, null
  br i1 %.not, label %489, label %17

17:                                               ; preds = %13
  %18 = icmp eq i64 %9, 2
  %19 = getelementptr inbounds i8, ptr %1, i64 8
  %20 = load ptr, ptr %19, align 8, !tbaa !13
  %21 = ptrtoint ptr %20 to i64
  br i1 %18, label %22, label %._crit_edge495

._crit_edge495:                                   ; preds = %17
  %.phi.trans.insert496 = getelementptr inbounds i8, ptr %2, i64 8
  %.pre497 = load ptr, ptr %.phi.trans.insert496, align 8, !tbaa !13
  %.pre498 = load i64, ptr %.pre497, align 8, !tbaa !14
  br label %238

22:                                               ; preds = %17
  %23 = getelementptr inbounds i8, ptr %20, i64 8
  %24 = load i64, ptr %23, align 8, !tbaa !14
  %25 = getelementptr inbounds i8, ptr %2, i64 8
  %26 = load ptr, ptr %25, align 8, !tbaa !13
  %27 = load i64, ptr %26, align 8, !tbaa !14
  %28 = icmp eq i64 %24, %27
  br i1 %28, label %29, label %238

29:                                               ; preds = %22
  %30 = load i64, ptr %20, align 8, !tbaa !14
  %31 = getelementptr inbounds i8, ptr %26, i64 8
  %32 = load i64, ptr %31, align 8, !tbaa !14
  %33 = getelementptr inbounds i8, ptr %0, i64 24
  %34 = load ptr, ptr %33, align 8, !tbaa !15
  %35 = mul i64 %32, %30
  %36 = shl i64 %35, 3
  tail call void @llvm.memset.p0.i64(ptr align 4 %34, i8 0, i64 %36, i1 false)
  %37 = icmp ugt i64 %30, 127
  %38 = icmp ugt i64 %24, 127
  %or.cond = and i1 %38, %37
  %39 = icmp ugt i64 %32, 127
  %or.cond3 = select i1 %or.cond, i1 %39, i1 false
  br i1 %or.cond3, label %90, label %.preheader351

.preheader351:                                    ; preds = %29
  %.not470 = icmp eq i64 %30, 0
  br i1 %.not470, label %.loopexit352, label %.preheader350.lr.ph

.preheader350.lr.ph:                              ; preds = %.preheader351
  %.not471 = icmp eq i64 %32, 0
  %40 = getelementptr inbounds i8, ptr %1, i64 24
  %41 = getelementptr inbounds i8, ptr %2, i64 24
  %.not472 = icmp eq i64 %24, 0
  %or.cond522 = or i1 %.not471, %.not472
  br i1 %or.cond522, label %.loopexit352, label %.preheader350.us.us

.preheader350.us.us:                              ; preds = %.preheader350.lr.ph, %._crit_edge439.split.us.us.us
  %.0310451.us.us = phi i64 [ %42, %._crit_edge439.split.us.us.us ], [ 0, %.preheader350.lr.ph ]
  %42 = add i64 %.0310451.us.us, 32
  br label %.preheader349.us.us.us

.preheader349.us.us.us:                           ; preds = %._crit_edge435.us.us.us, %.preheader350.us.us
  %.0314438.us.us.us = phi i64 [ 0, %.preheader350.us.us ], [ %43, %._crit_edge435.us.us.us ]
  %43 = add i64 %.0314438.us.us.us, 32
  br label %44

44:                                               ; preds = %.loopexit.us.us.us, %.preheader349.us.us.us
  %.0315433.us.us.us = phi i64 [ 0, %.preheader349.us.us.us ], [ %47, %.loopexit.us.us.us ]
  %45 = tail call i64 @min(i64 noundef %42, i64 noundef %30)
  %46 = tail call i64 @min(i64 noundef %43, i64 noundef %32)
  %47 = add i64 %.0315433.us.us.us, 32
  %48 = tail call i64 @min(i64 noundef %47, i64 noundef %24)
  %49 = icmp ult i64 %.0310451.us.us, %45
  %50 = icmp ult i64 %.0314438.us.us.us, %46
  %or.cond523 = select i1 %49, i1 %50, i1 false
  br i1 %or.cond523, label %.preheader348.lr.ph.split.us.us.us.us, label %.loopexit.us.us.us

.loopexit.us.us.us:                               ; preds = %._crit_edge422.split.us429.us.us.us, %._crit_edge422.split.us.us.us.us.us.us, %44
  %51 = icmp ult i64 %47, %24
  br i1 %51, label %44, label %._crit_edge435.us.us.us, !llvm.loop !16

.preheader348.lr.ph.split.us.us.us.us:            ; preds = %44
  %52 = icmp ult i64 %.0315433.us.us.us, %48
  br i1 %52, label %.preheader348.us.us.us.us.us, label %.preheader348.us.us445.us.us

.preheader348.us.us445.us.us:                     ; preds = %.preheader348.lr.ph.split.us.us.us.us, %._crit_edge422.split.us429.us.us.us
  %.0316425.us.us446.us.us = phi i64 [ %61, %._crit_edge422.split.us429.us.us.us ], [ %.0310451.us.us, %.preheader348.lr.ph.split.us.us.us.us ]
  %53 = mul i64 %.0316425.us.us446.us.us, %32
  br label %.preheader347.us427.us.us.us

.preheader347.us427.us.us.us:                     ; preds = %.preheader347.us427.us.us.us, %.preheader348.us.us445.us.us
  %.0317421.us428.us.us.us = phi i64 [ %.0314438.us.us.us, %.preheader348.us.us445.us.us ], [ %59, %.preheader347.us427.us.us.us ]
  %54 = load ptr, ptr %33, align 8, !tbaa !15
  %55 = getelementptr %struct.ComplexFloat, ptr %54, i64 %53
  %56 = getelementptr %struct.ComplexFloat, ptr %55, i64 %.0317421.us428.us.us.us
  %57 = load <2 x float>, ptr %56, align 4
  %58 = tail call <2 x float> @complex_float_add(<2 x float> %57, <2 x float> zeroinitializer)
  store <2 x float> %58, ptr %56, align 4
  %59 = add nuw i64 %.0317421.us428.us.us.us, 1
  %60 = icmp ult i64 %59, %46
  br i1 %60, label %.preheader347.us427.us.us.us, label %._crit_edge422.split.us429.us.us.us, !llvm.loop !18

._crit_edge422.split.us429.us.us.us:              ; preds = %.preheader347.us427.us.us.us
  %61 = add nuw i64 %.0316425.us.us446.us.us, 1
  %62 = icmp ult i64 %61, %45
  br i1 %62, label %.preheader348.us.us445.us.us, label %.loopexit.us.us.us, !llvm.loop !19

.preheader348.us.us.us.us.us:                     ; preds = %.preheader348.lr.ph.split.us.us.us.us, %._crit_edge422.split.us.us.us.us.us.us
  %.0316425.us.us.us.us.us = phi i64 [ %86, %._crit_edge422.split.us.us.us.us.us.us ], [ %.0310451.us.us, %.preheader348.lr.ph.split.us.us.us.us ]
  %63 = mul i64 %.0316425.us.us.us.us.us, %24
  %64 = mul i64 %.0316425.us.us.us.us.us, %32
  br label %.preheader347.us.us.us.us.us.us

.preheader347.us.us.us.us.us.us:                  ; preds = %._crit_edge419.us.us.us.us.us.us, %.preheader348.us.us.us.us.us
  %.0317421.us.us.us.us.us.us = phi i64 [ %.0314438.us.us.us, %.preheader348.us.us.us.us.us ], [ %84, %._crit_edge419.us.us.us.us.us.us ]
  br label %65

65:                                               ; preds = %65, %.preheader347.us.us.us.us.us.us
  %.sroa.0100.5417.us.us.us.us.us.us = phi <2 x float> [ zeroinitializer, %.preheader347.us.us.us.us.us.us ], [ %76, %65 ]
  %.0318416.us.us.us.us.us.us = phi i64 [ %.0315433.us.us.us, %.preheader347.us.us.us.us.us.us ], [ %77, %65 ]
  %66 = load ptr, ptr %40, align 8, !tbaa !15
  %67 = getelementptr %struct.ComplexFloat, ptr %66, i64 %63
  %68 = getelementptr %struct.ComplexFloat, ptr %67, i64 %.0318416.us.us.us.us.us.us
  %69 = load ptr, ptr %41, align 8, !tbaa !15
  %70 = mul i64 %.0318416.us.us.us.us.us.us, %32
  %71 = getelementptr %struct.ComplexFloat, ptr %69, i64 %70
  %72 = getelementptr %struct.ComplexFloat, ptr %71, i64 %.0317421.us.us.us.us.us.us
  %73 = load <2 x float>, ptr %68, align 4
  %74 = load <2 x float>, ptr %72, align 4
  %75 = tail call <2 x float> @complex_float_multiply(<2 x float> %73, <2 x float> %74)
  %76 = tail call <2 x float> @complex_float_add(<2 x float> %.sroa.0100.5417.us.us.us.us.us.us, <2 x float> %75)
  %77 = add nuw i64 %.0318416.us.us.us.us.us.us, 1
  %78 = icmp ult i64 %77, %48
  br i1 %78, label %65, label %._crit_edge419.us.us.us.us.us.us, !llvm.loop !20

._crit_edge419.us.us.us.us.us.us:                 ; preds = %65
  %79 = load ptr, ptr %33, align 8, !tbaa !15
  %80 = getelementptr %struct.ComplexFloat, ptr %79, i64 %64
  %81 = getelementptr %struct.ComplexFloat, ptr %80, i64 %.0317421.us.us.us.us.us.us
  %82 = load <2 x float>, ptr %81, align 4
  %83 = tail call <2 x float> @complex_float_add(<2 x float> %82, <2 x float> %76)
  store <2 x float> %83, ptr %81, align 4
  %84 = add nuw i64 %.0317421.us.us.us.us.us.us, 1
  %85 = icmp ult i64 %84, %46
  br i1 %85, label %.preheader347.us.us.us.us.us.us, label %._crit_edge422.split.us.us.us.us.us.us, !llvm.loop !18

._crit_edge422.split.us.us.us.us.us.us:           ; preds = %._crit_edge419.us.us.us.us.us.us
  %86 = add nuw i64 %.0316425.us.us.us.us.us, 1
  %87 = icmp ult i64 %86, %45
  br i1 %87, label %.preheader348.us.us.us.us.us, label %.loopexit.us.us.us, !llvm.loop !19

._crit_edge435.us.us.us:                          ; preds = %.loopexit.us.us.us
  %88 = icmp ult i64 %43, %32
  br i1 %88, label %.preheader349.us.us.us, label %._crit_edge439.split.us.us.us, !llvm.loop !21

._crit_edge439.split.us.us.us:                    ; preds = %._crit_edge435.us.us.us
  %89 = icmp ult i64 %42, %30
  br i1 %89, label %.preheader350.us.us, label %.loopexit352, !llvm.loop !22

90:                                               ; preds = %29
  %91 = tail call i64 @max(i64 noundef %30, i64 noundef %24)
  %92 = tail call i64 @max(i64 noundef %91, i64 noundef %32)
  br label %93

93:                                               ; preds = %93, %90
  %.0300 = phi i64 [ 1, %90 ], [ %95, %93 ]
  %94 = icmp ult i64 %.0300, %92
  %95 = shl i64 %.0300, 1
  br i1 %94, label %93, label %96, !llvm.loop !23

96:                                               ; preds = %93
  %97 = shl i64 %.0300, 3
  %98 = mul i64 %97, %.0300
  %99 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %98) #7
  %100 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %98) #7
  %101 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %98) #7
  %102 = icmp ne ptr %99, null
  %103 = icmp ne ptr %100, null
  %or.cond5 = and i1 %102, %103
  %104 = icmp ne ptr %101, null
  %or.cond7 = and i1 %or.cond5, %104
  br i1 %or.cond7, label %105, label %.thread

.thread:                                          ; preds = %96
  tail call void @free(ptr noundef %99) #8
  tail call void @free(ptr noundef %100) #8
  tail call void @free(ptr noundef %101) #8
  tail call void @free(ptr noundef %15) #8
  br label %489

105:                                              ; preds = %96
  tail call void @llvm.memset.p0.i64(ptr nonnull align 64 %99, i8 0, i64 %98, i1 false)
  tail call void @llvm.memset.p0.i64(ptr nonnull align 64 %100, i8 0, i64 %98, i1 false)
  %106 = getelementptr inbounds i8, ptr %1, i64 24
  %107 = load ptr, ptr %106, align 8, !tbaa !15
  %108 = shl i64 %24, 3
  %scevgep = getelementptr i8, ptr %99, i64 %108
  %109 = shl i64 %30, 3
  %110 = add i64 %109, -8
  %111 = mul i64 %110, %.0300
  %scevgep548 = getelementptr i8, ptr %scevgep, i64 %111
  %112 = mul i64 %24, %30
  %113 = shl i64 %112, 3
  %scevgep549 = getelementptr i8, ptr %107, i64 %113
  %min.iters.check553 = icmp ult i64 %24, 8
  %bound0 = icmp ult ptr %99, %scevgep549
  %bound1 = icmp ult ptr %107, %scevgep548
  %found.conflict = and i1 %bound0, %bound1
  %.mask = and i64 %.0300, 1152921504606846976
  %stride.check = icmp ne i64 %.mask, 0
  %114 = or i1 %found.conflict, %stride.check
  %stride.check550 = icmp slt i64 %108, 0
  %115 = or i1 %114, %stride.check550
  %n.vec556 = and i64 %24, -4
  %cmp.n563 = icmp eq i64 %24, %n.vec556
  %xtraiter607 = and i64 %24, 3
  %lcmp.mod608.not = icmp eq i64 %xtraiter607, 0
  br label %.preheader346

.preheader346:                                    ; preds = %105, %.loopexit586
  %.0301459 = phi i64 [ 0, %105 ], [ %141, %.loopexit586 ]
  %116 = mul i64 %.0301459, %.0300
  %117 = getelementptr %struct.ComplexFloat, ptr %99, i64 %116
  %118 = mul i64 %.0301459, %24
  %119 = getelementptr %struct.ComplexFloat, ptr %107, i64 %118
  %brmerge = select i1 %min.iters.check553, i1 true, i1 %115
  br i1 %brmerge, label %scalar.ph552.preheader, label %vector.body558

scalar.ph552.preheader:                           ; preds = %.preheader346, %middle.block551
  %.0302458.ph = phi i64 [ 0, %.preheader346 ], [ %n.vec556, %middle.block551 ]
  br i1 %lcmp.mod608.not, label %scalar.ph552.prol.loopexit, label %scalar.ph552.prol

scalar.ph552.prol:                                ; preds = %scalar.ph552.preheader, %scalar.ph552.prol
  %.0302458.prol = phi i64 [ %123, %scalar.ph552.prol ], [ %.0302458.ph, %scalar.ph552.preheader ]
  %prol.iter609 = phi i64 [ %prol.iter609.next, %scalar.ph552.prol ], [ 0, %scalar.ph552.preheader ]
  %120 = getelementptr %struct.ComplexFloat, ptr %117, i64 %.0302458.prol
  %121 = getelementptr %struct.ComplexFloat, ptr %119, i64 %.0302458.prol
  %122 = load i64, ptr %121, align 4
  store i64 %122, ptr %120, align 8
  %123 = add nuw i64 %.0302458.prol, 1
  %prol.iter609.next = add i64 %prol.iter609, 1
  %prol.iter609.cmp.not = icmp eq i64 %prol.iter609.next, %xtraiter607
  br i1 %prol.iter609.cmp.not, label %scalar.ph552.prol.loopexit, label %scalar.ph552.prol, !llvm.loop !24

scalar.ph552.prol.loopexit:                       ; preds = %scalar.ph552.prol, %scalar.ph552.preheader
  %.0302458.unr = phi i64 [ %.0302458.ph, %scalar.ph552.preheader ], [ %123, %scalar.ph552.prol ]
  %124 = sub i64 %.0302458.ph, %24
  %125 = icmp ugt i64 %124, -4
  br i1 %125, label %.loopexit586, label %scalar.ph552

vector.body558:                                   ; preds = %.preheader346, %vector.body558
  %index559 = phi i64 [ %index.next562, %vector.body558 ], [ 0, %.preheader346 ]
  %126 = getelementptr %struct.ComplexFloat, ptr %117, i64 %index559
  %127 = getelementptr %struct.ComplexFloat, ptr %119, i64 %index559
  %128 = getelementptr i8, ptr %127, i64 16
  %wide.load560 = load <2 x i64>, ptr %127, align 4, !alias.scope !26
  %wide.load561 = load <2 x i64>, ptr %128, align 4, !alias.scope !26
  %129 = getelementptr i8, ptr %126, i64 16
  store <2 x i64> %wide.load560, ptr %126, align 8, !alias.scope !29, !noalias !26
  store <2 x i64> %wide.load561, ptr %129, align 8, !alias.scope !29, !noalias !26
  %index.next562 = add nuw i64 %index559, 4
  %130 = icmp eq i64 %index.next562, %n.vec556
  br i1 %130, label %middle.block551, label %vector.body558, !llvm.loop !31

middle.block551:                                  ; preds = %vector.body558
  br i1 %cmp.n563, label %.loopexit586, label %scalar.ph552.preheader

.preheader345:                                    ; preds = %.loopexit586
  %131 = getelementptr inbounds i8, ptr %2, i64 24
  %132 = load ptr, ptr %131, align 8, !tbaa !15
  %133 = shl i64 %32, 3
  %scevgep565 = getelementptr i8, ptr %100, i64 %133
  %134 = shl i64 %24, 3
  %135 = add i64 %134, -8
  %136 = mul i64 %135, %.0300
  %scevgep566 = getelementptr i8, ptr %scevgep565, i64 %136
  %137 = mul i64 %24, %32
  %138 = shl i64 %137, 3
  %scevgep567 = getelementptr i8, ptr %132, i64 %138
  %min.iters.check575 = icmp ult i64 %32, 8
  %bound0568 = icmp ult ptr %100, %scevgep567
  %bound1569 = icmp ult ptr %132, %scevgep566
  %found.conflict570 = and i1 %bound0568, %bound1569
  %.mask587 = and i64 %.0300, 1152921504606846976
  %stride.check571 = icmp ne i64 %.mask587, 0
  %139 = or i1 %found.conflict570, %stride.check571
  %stride.check572 = icmp slt i64 %133, 0
  %140 = or i1 %139, %stride.check572
  %n.vec578 = and i64 %32, -4
  %cmp.n585 = icmp eq i64 %32, %n.vec578
  %xtraiter610 = and i64 %32, 3
  %lcmp.mod611.not = icmp eq i64 %xtraiter610, 0
  br label %.preheader344

.loopexit586:                                     ; preds = %scalar.ph552.prol.loopexit, %scalar.ph552, %middle.block551
  %141 = add nuw i64 %.0301459, 1
  %exitcond489.not = icmp eq i64 %141, %30
  br i1 %exitcond489.not, label %.preheader345, label %.preheader346, !llvm.loop !34

scalar.ph552:                                     ; preds = %scalar.ph552.prol.loopexit, %scalar.ph552
  %.0302458 = phi i64 [ %157, %scalar.ph552 ], [ %.0302458.unr, %scalar.ph552.prol.loopexit ]
  %142 = getelementptr %struct.ComplexFloat, ptr %117, i64 %.0302458
  %143 = getelementptr %struct.ComplexFloat, ptr %119, i64 %.0302458
  %144 = load i64, ptr %143, align 4
  store i64 %144, ptr %142, align 8
  %145 = add nuw i64 %.0302458, 1
  %146 = getelementptr %struct.ComplexFloat, ptr %117, i64 %145
  %147 = getelementptr %struct.ComplexFloat, ptr %119, i64 %145
  %148 = load i64, ptr %147, align 4
  store i64 %148, ptr %146, align 8
  %149 = add nuw i64 %.0302458, 2
  %150 = getelementptr %struct.ComplexFloat, ptr %117, i64 %149
  %151 = getelementptr %struct.ComplexFloat, ptr %119, i64 %149
  %152 = load i64, ptr %151, align 4
  store i64 %152, ptr %150, align 8
  %153 = add nuw i64 %.0302458, 3
  %154 = getelementptr %struct.ComplexFloat, ptr %117, i64 %153
  %155 = getelementptr %struct.ComplexFloat, ptr %119, i64 %153
  %156 = load i64, ptr %155, align 4
  store i64 %156, ptr %154, align 8
  %157 = add nuw i64 %.0302458, 4
  %exitcond488.not.3 = icmp eq i64 %157, %24
  br i1 %exitcond488.not.3, label %.loopexit586, label %scalar.ph552, !llvm.loop !35

.preheader344:                                    ; preds = %.preheader345, %.loopexit
  %.0303461 = phi i64 [ 0, %.preheader345 ], [ %175, %.loopexit ]
  %158 = mul i64 %.0303461, %.0300
  %159 = getelementptr %struct.ComplexFloat, ptr %100, i64 %158
  %160 = mul i64 %.0303461, %32
  %161 = getelementptr %struct.ComplexFloat, ptr %132, i64 %160
  %brmerge630 = select i1 %min.iters.check575, i1 true, i1 %140
  br i1 %brmerge630, label %scalar.ph574.preheader, label %vector.body580

scalar.ph574.preheader:                           ; preds = %.preheader344, %middle.block573
  %.0304460.ph = phi i64 [ 0, %.preheader344 ], [ %n.vec578, %middle.block573 ]
  br i1 %lcmp.mod611.not, label %scalar.ph574.prol.loopexit, label %scalar.ph574.prol

scalar.ph574.prol:                                ; preds = %scalar.ph574.preheader, %scalar.ph574.prol
  %.0304460.prol = phi i64 [ %165, %scalar.ph574.prol ], [ %.0304460.ph, %scalar.ph574.preheader ]
  %prol.iter612 = phi i64 [ %prol.iter612.next, %scalar.ph574.prol ], [ 0, %scalar.ph574.preheader ]
  %162 = getelementptr %struct.ComplexFloat, ptr %159, i64 %.0304460.prol
  %163 = getelementptr %struct.ComplexFloat, ptr %161, i64 %.0304460.prol
  %164 = load i64, ptr %163, align 4
  store i64 %164, ptr %162, align 8
  %165 = add nuw i64 %.0304460.prol, 1
  %prol.iter612.next = add i64 %prol.iter612, 1
  %prol.iter612.cmp.not = icmp eq i64 %prol.iter612.next, %xtraiter610
  br i1 %prol.iter612.cmp.not, label %scalar.ph574.prol.loopexit, label %scalar.ph574.prol, !llvm.loop !36

scalar.ph574.prol.loopexit:                       ; preds = %scalar.ph574.prol, %scalar.ph574.preheader
  %.0304460.unr = phi i64 [ %.0304460.ph, %scalar.ph574.preheader ], [ %165, %scalar.ph574.prol ]
  %166 = sub i64 %.0304460.ph, %32
  %167 = icmp ugt i64 %166, -4
  br i1 %167, label %.loopexit, label %scalar.ph574

vector.body580:                                   ; preds = %.preheader344, %vector.body580
  %index581 = phi i64 [ %index.next584, %vector.body580 ], [ 0, %.preheader344 ]
  %168 = getelementptr %struct.ComplexFloat, ptr %159, i64 %index581
  %169 = getelementptr %struct.ComplexFloat, ptr %161, i64 %index581
  %170 = getelementptr i8, ptr %169, i64 16
  %wide.load582 = load <2 x i64>, ptr %169, align 4, !alias.scope !37
  %wide.load583 = load <2 x i64>, ptr %170, align 4, !alias.scope !37
  %171 = getelementptr i8, ptr %168, i64 16
  store <2 x i64> %wide.load582, ptr %168, align 8, !alias.scope !40, !noalias !37
  store <2 x i64> %wide.load583, ptr %171, align 8, !alias.scope !40, !noalias !37
  %index.next584 = add nuw i64 %index581, 4
  %172 = icmp eq i64 %index.next584, %n.vec578
  br i1 %172, label %middle.block573, label %vector.body580, !llvm.loop !42

middle.block573:                                  ; preds = %vector.body580
  br i1 %cmp.n585, label %.loopexit, label %scalar.ph574.preheader

173:                                              ; preds = %.loopexit
  tail call void @strassen_multiply_recursive(ptr noundef nonnull %101, ptr noundef nonnull %99, ptr noundef nonnull %100, i64 noundef %.0300, i64 noundef %.0300)
  %xtraiter613 = and i64 %32, 3
  %174 = icmp ult i64 %32, 4
  %unroll_iter616 = and i64 %32, -4
  %lcmp.mod615.not = icmp eq i64 %xtraiter613, 0
  br label %.preheader

.loopexit:                                        ; preds = %scalar.ph574.prol.loopexit, %scalar.ph574, %middle.block573
  %175 = add nuw i64 %.0303461, 1
  %exitcond492.not = icmp eq i64 %175, %24
  br i1 %exitcond492.not, label %173, label %.preheader344, !llvm.loop !43

scalar.ph574:                                     ; preds = %scalar.ph574.prol.loopexit, %scalar.ph574
  %.0304460 = phi i64 [ %191, %scalar.ph574 ], [ %.0304460.unr, %scalar.ph574.prol.loopexit ]
  %176 = getelementptr %struct.ComplexFloat, ptr %159, i64 %.0304460
  %177 = getelementptr %struct.ComplexFloat, ptr %161, i64 %.0304460
  %178 = load i64, ptr %177, align 4
  store i64 %178, ptr %176, align 8
  %179 = add nuw i64 %.0304460, 1
  %180 = getelementptr %struct.ComplexFloat, ptr %159, i64 %179
  %181 = getelementptr %struct.ComplexFloat, ptr %161, i64 %179
  %182 = load i64, ptr %181, align 4
  store i64 %182, ptr %180, align 8
  %183 = add nuw i64 %.0304460, 2
  %184 = getelementptr %struct.ComplexFloat, ptr %159, i64 %183
  %185 = getelementptr %struct.ComplexFloat, ptr %161, i64 %183
  %186 = load i64, ptr %185, align 4
  store i64 %186, ptr %184, align 8
  %187 = add nuw i64 %.0304460, 3
  %188 = getelementptr %struct.ComplexFloat, ptr %159, i64 %187
  %189 = getelementptr %struct.ComplexFloat, ptr %161, i64 %187
  %190 = load i64, ptr %189, align 4
  store i64 %190, ptr %188, align 8
  %191 = add nuw i64 %.0304460, 4
  %exitcond491.not.3 = icmp eq i64 %191, %32
  br i1 %exitcond491.not.3, label %.loopexit, label %scalar.ph574, !llvm.loop !44

.preheader:                                       ; preds = %173, %.epilog-lcssa
  %.0308463 = phi i64 [ 0, %173 ], [ %201, %.epilog-lcssa ]
  %192 = mul i64 %.0308463, %32
  %193 = mul i64 %.0308463, %.0300
  %194 = getelementptr %struct.ComplexFloat, ptr %101, i64 %193
  br i1 %174, label %.unr-lcssa, label %.preheader.new

.unr-lcssa:                                       ; preds = %.preheader.new, %.preheader
  %.0309462.unr = phi i64 [ 0, %.preheader ], [ %225, %.preheader.new ]
  br i1 %lcmp.mod615.not, label %.epilog-lcssa, label %.epil.preheader

.epil.preheader:                                  ; preds = %.unr-lcssa, %.epil.preheader
  %.0309462.epil = phi i64 [ %200, %.epil.preheader ], [ %.0309462.unr, %.unr-lcssa ]
  %epil.iter614 = phi i64 [ %epil.iter614.next, %.epil.preheader ], [ 0, %.unr-lcssa ]
  %195 = load ptr, ptr %33, align 8, !tbaa !15
  %196 = getelementptr %struct.ComplexFloat, ptr %195, i64 %192
  %197 = getelementptr %struct.ComplexFloat, ptr %196, i64 %.0309462.epil
  %198 = getelementptr %struct.ComplexFloat, ptr %194, i64 %.0309462.epil
  %199 = load i64, ptr %198, align 8
  store i64 %199, ptr %197, align 4
  %200 = add nuw i64 %.0309462.epil, 1
  %epil.iter614.next = add i64 %epil.iter614, 1
  %epil.iter614.cmp.not = icmp eq i64 %epil.iter614.next, %xtraiter613
  br i1 %epil.iter614.cmp.not, label %.epilog-lcssa, label %.epil.preheader, !llvm.loop !45

.epilog-lcssa:                                    ; preds = %.epil.preheader, %.unr-lcssa
  %201 = add nuw i64 %.0308463, 1
  %exitcond494.not = icmp eq i64 %201, %30
  br i1 %exitcond494.not, label %226, label %.preheader, !llvm.loop !46

.preheader.new:                                   ; preds = %.preheader, %.preheader.new
  %.0309462 = phi i64 [ %225, %.preheader.new ], [ 0, %.preheader ]
  %niter617 = phi i64 [ %niter617.next.3, %.preheader.new ], [ 0, %.preheader ]
  %202 = load ptr, ptr %33, align 8, !tbaa !15
  %203 = getelementptr %struct.ComplexFloat, ptr %202, i64 %192
  %204 = getelementptr %struct.ComplexFloat, ptr %203, i64 %.0309462
  %205 = getelementptr %struct.ComplexFloat, ptr %194, i64 %.0309462
  %206 = load i64, ptr %205, align 8
  store i64 %206, ptr %204, align 4
  %207 = or disjoint i64 %.0309462, 1
  %208 = load ptr, ptr %33, align 8, !tbaa !15
  %209 = getelementptr %struct.ComplexFloat, ptr %208, i64 %192
  %210 = getelementptr %struct.ComplexFloat, ptr %209, i64 %207
  %211 = getelementptr %struct.ComplexFloat, ptr %194, i64 %207
  %212 = load i64, ptr %211, align 8
  store i64 %212, ptr %210, align 4
  %213 = or disjoint i64 %.0309462, 2
  %214 = load ptr, ptr %33, align 8, !tbaa !15
  %215 = getelementptr %struct.ComplexFloat, ptr %214, i64 %192
  %216 = getelementptr %struct.ComplexFloat, ptr %215, i64 %213
  %217 = getelementptr %struct.ComplexFloat, ptr %194, i64 %213
  %218 = load i64, ptr %217, align 8
  store i64 %218, ptr %216, align 4
  %219 = or disjoint i64 %.0309462, 3
  %220 = load ptr, ptr %33, align 8, !tbaa !15
  %221 = getelementptr %struct.ComplexFloat, ptr %220, i64 %192
  %222 = getelementptr %struct.ComplexFloat, ptr %221, i64 %219
  %223 = getelementptr %struct.ComplexFloat, ptr %194, i64 %219
  %224 = load i64, ptr %223, align 8
  store i64 %224, ptr %222, align 4
  %225 = add nuw i64 %.0309462, 4
  %niter617.next.3 = add nuw i64 %niter617, 4
  %niter617.ncmp.3 = icmp eq i64 %niter617.next.3, %unroll_iter616
  br i1 %niter617.ncmp.3, label %.unr-lcssa, label %.preheader.new, !llvm.loop !47

226:                                              ; preds = %.epilog-lcssa
  tail call void @free(ptr noundef %99) #8
  tail call void @free(ptr noundef %100) #8
  tail call void @free(ptr noundef nonnull %101) #8
  br label %.loopexit352

.loopexit352:                                     ; preds = %._crit_edge439.split.us.us.us, %.preheader350.lr.ph, %226, %.preheader351
  %227 = load ptr, ptr %33, align 8, !tbaa !15
  %228 = tail call zeroext i1 @check_numerical_stability(ptr noundef %227, i64 noundef %35)
  br i1 %228, label %230, label %229

229:                                              ; preds = %.loopexit352
  tail call void @free(ptr noundef %15) #8
  br label %489

230:                                              ; preds = %.loopexit352
  store i64 %30, ptr %15, align 64, !tbaa !14
  %231 = getelementptr inbounds i8, ptr %15, i64 8
  store i64 %32, ptr %231, align 8, !tbaa !14
  %232 = getelementptr inbounds i8, ptr %0, i64 8
  store ptr %15, ptr %232, align 8, !tbaa !13
  %233 = getelementptr inbounds i8, ptr %0, i64 16
  store i64 2, ptr %233, align 8, !tbaa !5
  %234 = getelementptr inbounds i8, ptr %0, i64 48
  store i64 %35, ptr %234, align 8, !tbaa !48
  %235 = add i64 %35, 7
  %236 = and i64 %235, -8
  %237 = getelementptr inbounds i8, ptr %0, i64 56
  store i64 %236, ptr %237, align 8, !tbaa !49
  br label %489

238:                                              ; preds = %._crit_edge495, %22
  %239 = phi i64 [ %.pre498, %._crit_edge495 ], [ %27, %22 ]
  %240 = phi ptr [ %.pre497, %._crit_edge495 ], [ %26, %22 ]
  %241 = ptrtoint ptr %240 to i64
  %242 = getelementptr inbounds i8, ptr %1, i64 8
  %243 = getelementptr i64, ptr %20, i64 %9
  %244 = getelementptr i8, ptr %243, i64 -8
  %245 = load i64, ptr %244, align 8, !tbaa !14
  %246 = getelementptr inbounds i8, ptr %2, i64 8
  %.not341 = icmp eq i64 %245, %239
  br i1 %.not341, label %.preheader360, label %250

.preheader360:                                    ; preds = %238
  %247 = add i64 %9, -1
  %.not464 = icmp eq i64 %247, 0
  br i1 %.not464, label %._crit_edge373, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %.preheader360
  %248 = add i64 %9, -2
  %xtraiter = and i64 %247, 7
  %249 = icmp ult i64 %248, 7
  br i1 %249, label %.preheader359.unr-lcssa, label %.lr.ph.preheader.new

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

250:                                              ; preds = %238
  tail call void @free(ptr noundef nonnull %15) #8
  br label %489

.preheader359.unr-lcssa:                          ; preds = %.lr.ph, %.lr.ph.preheader
  %.lcssa594.ph = phi i64 [ poison, %.lr.ph.preheader ], [ %287, %.lr.ph ]
  %.0319362.unr = phi i64 [ 1, %.lr.ph.preheader ], [ %287, %.lr.ph ]
  %.0322361.unr = phi i64 [ 0, %.lr.ph.preheader ], [ %288, %.lr.ph ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.preheader359, label %.lr.ph.epil

.lr.ph.epil:                                      ; preds = %.preheader359.unr-lcssa, %.lr.ph.epil
  %.0319362.epil = phi i64 [ %253, %.lr.ph.epil ], [ %.0319362.unr, %.preheader359.unr-lcssa ]
  %.0322361.epil = phi i64 [ %254, %.lr.ph.epil ], [ %.0322361.unr, %.preheader359.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph.epil ], [ 0, %.preheader359.unr-lcssa ]
  %251 = getelementptr inbounds i64, ptr %20, i64 %.0322361.epil
  %252 = load i64, ptr %251, align 8, !tbaa !14
  %253 = mul i64 %252, %.0319362.epil
  %254 = add nuw i64 %.0322361.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 %.preheader359, label %.lr.ph.epil, !llvm.loop !50

.preheader359:                                    ; preds = %.lr.ph.epil, %.preheader359.unr-lcssa
  %.lcssa594 = phi i64 [ %.lcssa594.ph, %.preheader359.unr-lcssa ], [ %253, %.lr.ph.epil ]
  %255 = icmp ugt i64 %9, 1
  br i1 %255, label %.lr.ph366.preheader, label %.lr.ph370.preheader

.lr.ph366.preheader:                              ; preds = %.preheader359
  %xtraiter596 = and i64 %247, 7
  %256 = icmp ult i64 %248, 7
  br i1 %256, label %._crit_edge.unr-lcssa, label %.lr.ph366.preheader.new

.lr.ph366.preheader.new:                          ; preds = %.lr.ph366.preheader
  %unroll_iter600 = and i64 %247, -8
  br label %.lr.ph366

.lr.ph:                                           ; preds = %.lr.ph, %.lr.ph.preheader.new
  %.0319362 = phi i64 [ 1, %.lr.ph.preheader.new ], [ %287, %.lr.ph ]
  %.0322361 = phi i64 [ 0, %.lr.ph.preheader.new ], [ %288, %.lr.ph ]
  %niter = phi i64 [ 0, %.lr.ph.preheader.new ], [ %niter.next.7, %.lr.ph ]
  %257 = getelementptr inbounds i64, ptr %20, i64 %.0322361
  %258 = load i64, ptr %257, align 8, !tbaa !14
  %259 = mul i64 %258, %.0319362
  %260 = or disjoint i64 %.0322361, 1
  %261 = getelementptr inbounds i64, ptr %20, i64 %260
  %262 = load i64, ptr %261, align 8, !tbaa !14
  %263 = mul i64 %262, %259
  %264 = or disjoint i64 %.0322361, 2
  %265 = getelementptr inbounds i64, ptr %20, i64 %264
  %266 = load i64, ptr %265, align 8, !tbaa !14
  %267 = mul i64 %266, %263
  %268 = or disjoint i64 %.0322361, 3
  %269 = getelementptr inbounds i64, ptr %20, i64 %268
  %270 = load i64, ptr %269, align 8, !tbaa !14
  %271 = mul i64 %270, %267
  %272 = or disjoint i64 %.0322361, 4
  %273 = getelementptr inbounds i64, ptr %20, i64 %272
  %274 = load i64, ptr %273, align 8, !tbaa !14
  %275 = mul i64 %274, %271
  %276 = or disjoint i64 %.0322361, 5
  %277 = getelementptr inbounds i64, ptr %20, i64 %276
  %278 = load i64, ptr %277, align 8, !tbaa !14
  %279 = mul i64 %278, %275
  %280 = or disjoint i64 %.0322361, 6
  %281 = getelementptr inbounds i64, ptr %20, i64 %280
  %282 = load i64, ptr %281, align 8, !tbaa !14
  %283 = mul i64 %282, %279
  %284 = or disjoint i64 %.0322361, 7
  %285 = getelementptr inbounds i64, ptr %20, i64 %284
  %286 = load i64, ptr %285, align 8, !tbaa !14
  %287 = mul i64 %286, %283
  %288 = add nuw i64 %.0322361, 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 %.preheader359.unr-lcssa, label %.lr.ph, !llvm.loop !51

._crit_edge.unr-lcssa:                            ; preds = %.lr.ph366, %.lr.ph366.preheader
  %.lcssa593.ph = phi i64 [ poison, %.lr.ph366.preheader ], [ %339, %.lr.ph366 ]
  %.0323365.unr = phi i64 [ 1, %.lr.ph366.preheader ], [ %340, %.lr.ph366 ]
  %.0324364.unr = phi i64 [ 1, %.lr.ph366.preheader ], [ %339, %.lr.ph366 ]
  %lcmp.mod598.not = icmp eq i64 %xtraiter596, 0
  br i1 %lcmp.mod598.not, label %._crit_edge, label %.lr.ph366.epil

.lr.ph366.epil:                                   ; preds = %._crit_edge.unr-lcssa, %.lr.ph366.epil
  %.0323365.epil = phi i64 [ %292, %.lr.ph366.epil ], [ %.0323365.unr, %._crit_edge.unr-lcssa ]
  %.0324364.epil = phi i64 [ %291, %.lr.ph366.epil ], [ %.0324364.unr, %._crit_edge.unr-lcssa ]
  %epil.iter597 = phi i64 [ %epil.iter597.next, %.lr.ph366.epil ], [ 0, %._crit_edge.unr-lcssa ]
  %289 = getelementptr inbounds i64, ptr %240, i64 %.0323365.epil
  %290 = load i64, ptr %289, align 8, !tbaa !14
  %291 = mul i64 %290, %.0324364.epil
  %292 = add nuw i64 %.0323365.epil, 1
  %epil.iter597.next = add i64 %epil.iter597, 1
  %epil.iter597.cmp.not = icmp eq i64 %epil.iter597.next, %xtraiter596
  br i1 %epil.iter597.cmp.not, label %._crit_edge, label %.lr.ph366.epil, !llvm.loop !52

._crit_edge:                                      ; preds = %.lr.ph366.epil, %._crit_edge.unr-lcssa
  %.lcssa593 = phi i64 [ %.lcssa593.ph, %._crit_edge.unr-lcssa ], [ %291, %.lr.ph366.epil ]
  %reass.add = shl i64 %9, 1
  %293 = add i64 %reass.add, -2
  br i1 %.not464, label %._crit_edge373, label %.lr.ph370.preheader

.lr.ph370.preheader:                              ; preds = %.preheader359, %._crit_edge
  %294 = phi i64 [ %293, %._crit_edge ], [ -2, %.preheader359 ]
  %.0324.lcssa512 = phi i64 [ %.lcssa593, %._crit_edge ], [ 1, %.preheader359 ]
  %min.iters.check = icmp ult i64 %247, 6
  %295 = sub i64 %16, %21
  %diff.check = icmp ult i64 %295, 32
  %or.cond588 = select i1 %min.iters.check, i1 true, i1 %diff.check
  br i1 %or.cond588, label %.lr.ph370.preheader592, label %vector.ph

.lr.ph370.preheader592:                           ; preds = %middle.block, %.lr.ph370.preheader
  %.0321368.ph = phi i64 [ 0, %.lr.ph370.preheader ], [ %n.vec, %middle.block ]
  %296 = add i64 %9, 3
  %297 = add i64 %9, -2
  %298 = sub i64 %297, %.0321368.ph
  %xtraiter602 = and i64 %296, 3
  %lcmp.mod603.not = icmp eq i64 %xtraiter602, 0
  br i1 %lcmp.mod603.not, label %.lr.ph370.prol.loopexit, label %.lr.ph370.prol

.lr.ph370.prol:                                   ; preds = %.lr.ph370.preheader592, %.lr.ph370.prol
  %.0321368.prol = phi i64 [ %302, %.lr.ph370.prol ], [ %.0321368.ph, %.lr.ph370.preheader592 ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph370.prol ], [ 0, %.lr.ph370.preheader592 ]
  %299 = getelementptr inbounds i64, ptr %20, i64 %.0321368.prol
  %300 = load i64, ptr %299, align 8, !tbaa !14
  %301 = getelementptr inbounds i64, ptr %15, i64 %.0321368.prol
  store i64 %300, ptr %301, align 8, !tbaa !14
  %302 = add nuw i64 %.0321368.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter602
  br i1 %prol.iter.cmp.not, label %.lr.ph370.prol.loopexit, label %.lr.ph370.prol, !llvm.loop !53

.lr.ph370.prol.loopexit:                          ; preds = %.lr.ph370.prol, %.lr.ph370.preheader592
  %.0321368.unr = phi i64 [ %.0321368.ph, %.lr.ph370.preheader592 ], [ %302, %.lr.ph370.prol ]
  %303 = icmp ult i64 %298, 3
  br i1 %303, label %.lr.ph372, label %.lr.ph370

vector.ph:                                        ; preds = %.lr.ph370.preheader
  %n.vec = and i64 %247, -4
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %304 = getelementptr inbounds i64, ptr %20, i64 %index
  %305 = getelementptr inbounds i8, ptr %304, i64 16
  %wide.load = load <2 x i64>, ptr %304, align 8, !tbaa !14
  %wide.load531 = load <2 x i64>, ptr %305, align 8, !tbaa !14
  %306 = getelementptr inbounds i64, ptr %15, i64 %index
  %307 = getelementptr inbounds i8, ptr %306, i64 16
  store <2 x i64> %wide.load, ptr %306, align 32, !tbaa !14
  store <2 x i64> %wide.load531, ptr %307, align 16, !tbaa !14
  %index.next = add nuw i64 %index, 4
  %308 = icmp eq i64 %index.next, %n.vec
  br i1 %308, label %middle.block, label %vector.body, !llvm.loop !54

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %247, %n.vec
  br i1 %cmp.n, label %.lr.ph372, label %.lr.ph370.preheader592

.lr.ph366:                                        ; preds = %.lr.ph366, %.lr.ph366.preheader.new
  %.0323365 = phi i64 [ 1, %.lr.ph366.preheader.new ], [ %340, %.lr.ph366 ]
  %.0324364 = phi i64 [ 1, %.lr.ph366.preheader.new ], [ %339, %.lr.ph366 ]
  %niter601 = phi i64 [ 0, %.lr.ph366.preheader.new ], [ %niter601.next.7, %.lr.ph366 ]
  %309 = getelementptr inbounds i64, ptr %240, i64 %.0323365
  %310 = load i64, ptr %309, align 8, !tbaa !14
  %311 = mul i64 %310, %.0324364
  %312 = add nuw nsw i64 %.0323365, 1
  %313 = getelementptr inbounds i64, ptr %240, i64 %312
  %314 = load i64, ptr %313, align 8, !tbaa !14
  %315 = mul i64 %314, %311
  %316 = add nuw nsw i64 %.0323365, 2
  %317 = getelementptr inbounds i64, ptr %240, i64 %316
  %318 = load i64, ptr %317, align 8, !tbaa !14
  %319 = mul i64 %318, %315
  %320 = add nuw nsw i64 %.0323365, 3
  %321 = getelementptr inbounds i64, ptr %240, i64 %320
  %322 = load i64, ptr %321, align 8, !tbaa !14
  %323 = mul i64 %322, %319
  %324 = add nuw nsw i64 %.0323365, 4
  %325 = getelementptr inbounds i64, ptr %240, i64 %324
  %326 = load i64, ptr %325, align 8, !tbaa !14
  %327 = mul i64 %326, %323
  %328 = add nuw nsw i64 %.0323365, 5
  %329 = getelementptr inbounds i64, ptr %240, i64 %328
  %330 = load i64, ptr %329, align 8, !tbaa !14
  %331 = mul i64 %330, %327
  %332 = add nuw nsw i64 %.0323365, 6
  %333 = getelementptr inbounds i64, ptr %240, i64 %332
  %334 = load i64, ptr %333, align 8, !tbaa !14
  %335 = mul i64 %334, %331
  %336 = add nuw i64 %.0323365, 7
  %337 = getelementptr inbounds i64, ptr %240, i64 %336
  %338 = load i64, ptr %337, align 8, !tbaa !14
  %339 = mul i64 %338, %335
  %340 = add nuw i64 %.0323365, 8
  %niter601.next.7 = add i64 %niter601, 8
  %niter601.ncmp.7 = icmp eq i64 %niter601.next.7, %unroll_iter600
  br i1 %niter601.ncmp.7, label %._crit_edge.unr-lcssa, label %.lr.ph366, !llvm.loop !55

.lr.ph372:                                        ; preds = %.lr.ph370.prol.loopexit, %.lr.ph370, %middle.block
  %341 = getelementptr i64, ptr %15, i64 %9
  %342 = getelementptr i8, ptr %341, i64 -8
  %min.iters.check536 = icmp ult i64 %247, 14
  br i1 %min.iters.check536, label %scalar.ph535.preheader, label %vector.memcheck532

scalar.ph535.preheader:                           ; preds = %middle.block534, %vector.memcheck532, %.lr.ph372
  %.0320371.ph = phi i64 [ 0, %vector.memcheck532 ], [ 0, %.lr.ph372 ], [ %n.vec539, %middle.block534 ]
  %343 = add i64 %9, 3
  %344 = add i64 %9, -2
  %345 = sub i64 %344, %.0320371.ph
  %xtraiter604 = and i64 %343, 3
  %lcmp.mod605.not = icmp eq i64 %xtraiter604, 0
  br i1 %lcmp.mod605.not, label %scalar.ph535.prol.loopexit, label %scalar.ph535.prol

scalar.ph535.prol:                                ; preds = %scalar.ph535.preheader, %scalar.ph535.prol
  %.0320371.prol = phi i64 [ %346, %scalar.ph535.prol ], [ %.0320371.ph, %scalar.ph535.preheader ]
  %prol.iter606 = phi i64 [ %prol.iter606.next, %scalar.ph535.prol ], [ 0, %scalar.ph535.preheader ]
  %346 = add nuw i64 %.0320371.prol, 1
  %347 = getelementptr inbounds i64, ptr %240, i64 %346
  %348 = load i64, ptr %347, align 8, !tbaa !14
  %349 = getelementptr i64, ptr %342, i64 %.0320371.prol
  store i64 %348, ptr %349, align 8, !tbaa !14
  %prol.iter606.next = add i64 %prol.iter606, 1
  %prol.iter606.cmp.not = icmp eq i64 %prol.iter606.next, %xtraiter604
  br i1 %prol.iter606.cmp.not, label %scalar.ph535.prol.loopexit, label %scalar.ph535.prol, !llvm.loop !56

scalar.ph535.prol.loopexit:                       ; preds = %scalar.ph535.prol, %scalar.ph535.preheader
  %.0320371.unr = phi i64 [ %.0320371.ph, %scalar.ph535.preheader ], [ %346, %scalar.ph535.prol ]
  %350 = icmp ult i64 %345, 3
  br i1 %350, label %._crit_edge373, label %scalar.ph535

vector.memcheck532:                               ; preds = %.lr.ph372
  %351 = shl i64 %9, 3
  %352 = add i64 %351, %16
  %353 = add i64 %352, -16
  %354 = sub i64 %353, %241
  %diff.check533 = icmp ult i64 %354, 32
  br i1 %diff.check533, label %scalar.ph535.preheader, label %vector.ph537

vector.ph537:                                     ; preds = %vector.memcheck532
  %n.vec539 = and i64 %247, -4
  br label %vector.body541

vector.body541:                                   ; preds = %vector.body541, %vector.ph537
  %index542 = phi i64 [ 0, %vector.ph537 ], [ %index.next545, %vector.body541 ]
  %355 = or disjoint i64 %index542, 1
  %356 = getelementptr inbounds i64, ptr %240, i64 %355
  %357 = getelementptr inbounds i8, ptr %356, i64 16
  %wide.load543 = load <2 x i64>, ptr %356, align 8, !tbaa !14
  %wide.load544 = load <2 x i64>, ptr %357, align 8, !tbaa !14
  %358 = getelementptr i64, ptr %342, i64 %index542
  %359 = getelementptr i8, ptr %358, i64 16
  store <2 x i64> %wide.load543, ptr %358, align 8, !tbaa !14
  store <2 x i64> %wide.load544, ptr %359, align 8, !tbaa !14
  %index.next545 = add nuw i64 %index542, 4
  %360 = icmp eq i64 %index.next545, %n.vec539
  br i1 %360, label %middle.block534, label %vector.body541, !llvm.loop !57

middle.block534:                                  ; preds = %vector.body541
  %cmp.n546 = icmp eq i64 %247, %n.vec539
  br i1 %cmp.n546, label %._crit_edge373, label %scalar.ph535.preheader

.lr.ph370:                                        ; preds = %.lr.ph370.prol.loopexit, %.lr.ph370
  %.0321368 = phi i64 [ %376, %.lr.ph370 ], [ %.0321368.unr, %.lr.ph370.prol.loopexit ]
  %361 = getelementptr inbounds i64, ptr %20, i64 %.0321368
  %362 = load i64, ptr %361, align 8, !tbaa !14
  %363 = getelementptr inbounds i64, ptr %15, i64 %.0321368
  store i64 %362, ptr %363, align 8, !tbaa !14
  %364 = add nuw i64 %.0321368, 1
  %365 = getelementptr inbounds i64, ptr %20, i64 %364
  %366 = load i64, ptr %365, align 8, !tbaa !14
  %367 = getelementptr inbounds i64, ptr %15, i64 %364
  store i64 %366, ptr %367, align 8, !tbaa !14
  %368 = add nuw i64 %.0321368, 2
  %369 = getelementptr inbounds i64, ptr %20, i64 %368
  %370 = load i64, ptr %369, align 8, !tbaa !14
  %371 = getelementptr inbounds i64, ptr %15, i64 %368
  store i64 %370, ptr %371, align 8, !tbaa !14
  %372 = add nuw i64 %.0321368, 3
  %373 = getelementptr inbounds i64, ptr %20, i64 %372
  %374 = load i64, ptr %373, align 8, !tbaa !14
  %375 = getelementptr inbounds i64, ptr %15, i64 %372
  store i64 %374, ptr %375, align 8, !tbaa !14
  %376 = add nuw i64 %.0321368, 4
  %exitcond485.not.3 = icmp eq i64 %376, %247
  br i1 %exitcond485.not.3, label %.lr.ph372, label %.lr.ph370, !llvm.loop !58

._crit_edge373:                                   ; preds = %scalar.ph535.prol.loopexit, %scalar.ph535, %middle.block534, %.preheader360, %._crit_edge
  %.0319.lcssa501505516 = phi i64 [ %.lcssa594, %._crit_edge ], [ 1, %.preheader360 ], [ %.lcssa594, %middle.block534 ], [ %.lcssa594, %scalar.ph535 ], [ %.lcssa594, %scalar.ph535.prol.loopexit ]
  %.0324.lcssa506515 = phi i64 [ %.lcssa593, %._crit_edge ], [ 1, %.preheader360 ], [ %.0324.lcssa512, %middle.block534 ], [ %.0324.lcssa512, %scalar.ph535 ], [ %.0324.lcssa512, %scalar.ph535.prol.loopexit ]
  %377 = phi i64 [ %293, %._crit_edge ], [ 0, %.preheader360 ], [ %294, %middle.block534 ], [ %294, %scalar.ph535 ], [ %294, %scalar.ph535.prol.loopexit ]
  %378 = mul i64 %.0324.lcssa506515, %.0319.lcssa501505516
  %379 = add i64 %378, 7
  %380 = and i64 %379, -8
  %381 = getelementptr inbounds i8, ptr %0, i64 24
  %382 = load ptr, ptr %381, align 8, !tbaa !15
  %383 = shl i64 %380, 3
  tail call void @llvm.memset.p0.i64(ptr align 4 %382, i8 0, i64 %383, i1 false)
  %384 = load i64, ptr %8, align 8, !tbaa !5
  %385 = shl i64 %384, 3
  %386 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %385) #7
  %387 = load i64, ptr %10, align 8, !tbaa !5
  %388 = shl i64 %387, 3
  %389 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %388) #7
  %390 = icmp ne ptr %386, null
  %391 = icmp ne ptr %389, null
  %or.cond9 = and i1 %390, %391
  br i1 %or.cond9, label %409, label %408

scalar.ph535:                                     ; preds = %scalar.ph535.prol.loopexit, %scalar.ph535
  %.0320371 = phi i64 [ %404, %scalar.ph535 ], [ %.0320371.unr, %scalar.ph535.prol.loopexit ]
  %392 = add nuw i64 %.0320371, 1
  %393 = getelementptr inbounds i64, ptr %240, i64 %392
  %394 = load i64, ptr %393, align 8, !tbaa !14
  %395 = getelementptr i64, ptr %342, i64 %.0320371
  store i64 %394, ptr %395, align 8, !tbaa !14
  %396 = add nuw i64 %.0320371, 2
  %397 = getelementptr inbounds i64, ptr %240, i64 %396
  %398 = load i64, ptr %397, align 8, !tbaa !14
  %399 = getelementptr i64, ptr %341, i64 %.0320371
  store i64 %398, ptr %399, align 8, !tbaa !14
  %400 = add nuw i64 %.0320371, 3
  %401 = getelementptr inbounds i64, ptr %240, i64 %400
  %402 = load i64, ptr %401, align 8, !tbaa !14
  %403 = getelementptr i64, ptr %342, i64 %396
  store i64 %402, ptr %403, align 8, !tbaa !14
  %404 = add nuw i64 %.0320371, 4
  %405 = getelementptr inbounds i64, ptr %240, i64 %404
  %406 = load i64, ptr %405, align 8, !tbaa !14
  %407 = getelementptr i64, ptr %342, i64 %400
  store i64 %406, ptr %407, align 8, !tbaa !14
  %exitcond486.not.3 = icmp eq i64 %404, %247
  br i1 %exitcond486.not.3, label %._crit_edge373, label %scalar.ph535, !llvm.loop !59

408:                                              ; preds = %._crit_edge373
  tail call void @free(ptr noundef %386) #8
  tail call void @free(ptr noundef %389) #8
  br label %489

409:                                              ; preds = %._crit_edge373
  %410 = load ptr, ptr %242, align 8, !tbaa !13
  tail call void @calculate_strides(ptr noundef nonnull %386, ptr noundef %410, i64 noundef %384)
  %411 = load ptr, ptr %246, align 8, !tbaa !13
  %412 = load i64, ptr %10, align 8, !tbaa !5
  tail call void @calculate_strides(ptr noundef nonnull %389, ptr noundef %411, i64 noundef %412)
  %413 = load ptr, ptr %242, align 8, !tbaa !13
  %414 = load i64, ptr %8, align 8, !tbaa !5
  %415 = getelementptr i64, ptr %413, i64 %414
  %416 = getelementptr i8, ptr %415, i64 -8
  %417 = load i64, ptr %416, align 8, !tbaa !14
  %.not467 = icmp eq i64 %.0319.lcssa501505516, 0
  br i1 %.not467, label %._crit_edge411, label %.preheader357.lr.ph

.preheader357.lr.ph:                              ; preds = %409
  %.not468 = icmp eq i64 %.0324.lcssa506515, 0
  %418 = getelementptr inbounds i8, ptr %1, i64 24
  %419 = getelementptr inbounds i8, ptr %2, i64 24
  %.not469 = icmp eq i64 %417, 0
  %or.cond524 = select i1 %.not468, i1 true, i1 %.not469
  br i1 %or.cond524, label %._crit_edge411, label %.preheader357.us.us

.preheader357.us.us:                              ; preds = %.preheader357.lr.ph, %._crit_edge397.split.us.us.us
  %.0313408.us.us = phi i64 [ %420, %._crit_edge397.split.us.us.us ], [ 0, %.preheader357.lr.ph ]
  %420 = add i64 %.0313408.us.us, 32
  br label %.preheader356.us.us.us

.preheader356.us.us.us:                           ; preds = %._crit_edge393.us.us.us, %.preheader357.us.us
  %.0312395.us.us.us = phi i64 [ 0, %.preheader357.us.us ], [ %421, %._crit_edge393.us.us.us ]
  %421 = add i64 %.0312395.us.us.us, 32
  br label %422

422:                                              ; preds = %.loopexit355.us.us.us, %.preheader356.us.us.us
  %.0311390.us.us.us = phi i64 [ 0, %.preheader356.us.us.us ], [ %425, %.loopexit355.us.us.us ]
  %423 = call i64 @min(i64 noundef %420, i64 noundef %.0319.lcssa501505516)
  %424 = call i64 @min(i64 noundef %421, i64 noundef %.0324.lcssa506515)
  %425 = add i64 %.0311390.us.us.us, 32
  %426 = call i64 @min(i64 noundef %425, i64 noundef %417)
  %427 = icmp ult i64 %.0313408.us.us, %423
  %428 = icmp ult i64 %.0312395.us.us.us, %424
  %or.cond525 = select i1 %427, i1 %428, i1 false
  br i1 %or.cond525, label %.preheader354.lr.ph.split.us.us.us.us, label %.loopexit355.us.us.us

.loopexit355.us.us.us:                            ; preds = %._crit_edge380.split.us387.us.us.us, %._crit_edge380.split.us.us.us.us.us.us, %422
  %429 = icmp ult i64 %425, %417
  br i1 %429, label %422, label %._crit_edge393.us.us.us, !llvm.loop !60

.preheader354.lr.ph.split.us.us.us.us:            ; preds = %422
  %430 = icmp ult i64 %.0311390.us.us.us, %426
  br i1 %430, label %.preheader354.us.us.us.us.us, label %.preheader354.us.us403.us.us

.preheader354.us.us403.us.us:                     ; preds = %.preheader354.lr.ph.split.us.us.us.us, %._crit_edge380.split.us387.us.us.us
  %.0307382.us.us404.us.us = phi i64 [ %439, %._crit_edge380.split.us387.us.us.us ], [ %.0313408.us.us, %.preheader354.lr.ph.split.us.us.us.us ]
  %431 = mul i64 %.0307382.us.us404.us.us, %.0324.lcssa506515
  br label %.preheader353.us385.us.us.us

.preheader353.us385.us.us.us:                     ; preds = %.preheader353.us385.us.us.us, %.preheader354.us.us403.us.us
  %.0306379.us386.us.us.us = phi i64 [ %.0312395.us.us.us, %.preheader354.us.us403.us.us ], [ %437, %.preheader353.us385.us.us.us ]
  %432 = load ptr, ptr %381, align 8, !tbaa !15
  %433 = getelementptr %struct.ComplexFloat, ptr %432, i64 %431
  %434 = getelementptr %struct.ComplexFloat, ptr %433, i64 %.0306379.us386.us.us.us
  %435 = load <2 x float>, ptr %434, align 4
  %436 = call <2 x float> @complex_float_add(<2 x float> %435, <2 x float> zeroinitializer)
  store <2 x float> %436, ptr %434, align 4
  %437 = add nuw i64 %.0306379.us386.us.us.us, 1
  %438 = icmp ult i64 %437, %424
  br i1 %438, label %.preheader353.us385.us.us.us, label %._crit_edge380.split.us387.us.us.us, !llvm.loop !61

._crit_edge380.split.us387.us.us.us:              ; preds = %.preheader353.us385.us.us.us
  %439 = add nuw i64 %.0307382.us.us404.us.us, 1
  %440 = icmp ult i64 %439, %423
  br i1 %440, label %.preheader354.us.us403.us.us, label %.loopexit355.us.us.us, !llvm.loop !62

.preheader354.us.us.us.us.us:                     ; preds = %.preheader354.lr.ph.split.us.us.us.us, %._crit_edge380.split.us.us.us.us.us.us
  %.0307382.us.us.us.us.us = phi i64 [ %477, %._crit_edge380.split.us.us.us.us.us.us ], [ %.0313408.us.us, %.preheader354.lr.ph.split.us.us.us.us ]
  %441 = mul i64 %.0307382.us.us.us.us.us, %417
  %442 = mul i64 %.0307382.us.us.us.us.us, %.0324.lcssa506515
  br label %.preheader353.us.us.us.us.us.us

.preheader353.us.us.us.us.us.us:                  ; preds = %._crit_edge377.us.us.us.us.us.us, %.preheader354.us.us.us.us.us
  %.0306379.us.us.us.us.us.us = phi i64 [ %.0312395.us.us.us, %.preheader354.us.us.us.us.us ], [ %475, %._crit_edge377.us.us.us.us.us.us ]
  br label %443

443:                                              ; preds = %443, %.preheader353.us.us.us.us.us.us
  %.0305375.us.us.us.us.us.us = phi i64 [ %.0311390.us.us.us, %.preheader353.us.us.us.us.us.us ], [ %468, %443 ]
  %.sroa.020.5374.us.us.us.us.us.us = phi <2 x float> [ zeroinitializer, %.preheader353.us.us.us.us.us.us ], [ %467, %443 ]
  %444 = load i64, ptr %8, align 8, !tbaa !5
  %445 = shl i64 %444, 3
  %446 = alloca i8, i64 %445, align 16
  %447 = load i64, ptr %10, align 8, !tbaa !5
  %448 = shl i64 %447, 3
  %449 = alloca i8, i64 %448, align 16
  %450 = add i64 %.0305375.us.us.us.us.us.us, %441
  %451 = load ptr, ptr %242, align 8, !tbaa !13
  call void @linear_to_indices(ptr noundef nonnull %446, i64 noundef %450, ptr noundef %451, i64 noundef %444)
  %452 = mul i64 %.0305375.us.us.us.us.us.us, %.0324.lcssa506515
  %453 = add i64 %452, %.0306379.us.us.us.us.us.us
  %454 = load ptr, ptr %246, align 8, !tbaa !13
  %455 = load i64, ptr %10, align 8, !tbaa !5
  call void @linear_to_indices(ptr noundef nonnull %449, i64 noundef %453, ptr noundef %454, i64 noundef %455)
  %456 = load i64, ptr %8, align 8, !tbaa !5
  %457 = call i64 @indices_to_linear(ptr noundef nonnull %446, ptr noundef nonnull %386, i64 noundef %456)
  %458 = load i64, ptr %10, align 8, !tbaa !5
  %459 = call i64 @indices_to_linear(ptr noundef nonnull %449, ptr noundef nonnull %389, i64 noundef %458)
  %460 = load ptr, ptr %418, align 8, !tbaa !15
  %461 = getelementptr inbounds %struct.ComplexFloat, ptr %460, i64 %457
  %462 = load ptr, ptr %419, align 8, !tbaa !15
  %463 = getelementptr inbounds %struct.ComplexFloat, ptr %462, i64 %459
  %464 = load <2 x float>, ptr %461, align 4
  %465 = load <2 x float>, ptr %463, align 4
  %466 = call <2 x float> @complex_float_multiply(<2 x float> %464, <2 x float> %465)
  %467 = call <2 x float> @complex_float_add(<2 x float> %.sroa.020.5374.us.us.us.us.us.us, <2 x float> %466)
  %468 = add nuw i64 %.0305375.us.us.us.us.us.us, 1
  %469 = icmp ult i64 %468, %426
  br i1 %469, label %443, label %._crit_edge377.us.us.us.us.us.us, !llvm.loop !63

._crit_edge377.us.us.us.us.us.us:                 ; preds = %443
  %470 = load ptr, ptr %381, align 8, !tbaa !15
  %471 = getelementptr %struct.ComplexFloat, ptr %470, i64 %442
  %472 = getelementptr %struct.ComplexFloat, ptr %471, i64 %.0306379.us.us.us.us.us.us
  %473 = load <2 x float>, ptr %472, align 4
  %474 = call <2 x float> @complex_float_add(<2 x float> %473, <2 x float> %467)
  store <2 x float> %474, ptr %472, align 4
  %475 = add nuw i64 %.0306379.us.us.us.us.us.us, 1
  %476 = icmp ult i64 %475, %424
  br i1 %476, label %.preheader353.us.us.us.us.us.us, label %._crit_edge380.split.us.us.us.us.us.us, !llvm.loop !61

._crit_edge380.split.us.us.us.us.us.us:           ; preds = %._crit_edge377.us.us.us.us.us.us
  %477 = add nuw i64 %.0307382.us.us.us.us.us, 1
  %478 = icmp ult i64 %477, %423
  br i1 %478, label %.preheader354.us.us.us.us.us, label %.loopexit355.us.us.us, !llvm.loop !62

._crit_edge393.us.us.us:                          ; preds = %.loopexit355.us.us.us
  %479 = icmp ult i64 %421, %.0324.lcssa506515
  br i1 %479, label %.preheader356.us.us.us, label %._crit_edge397.split.us.us.us, !llvm.loop !64

._crit_edge397.split.us.us.us:                    ; preds = %._crit_edge393.us.us.us
  %480 = icmp ult i64 %420, %.0319.lcssa501505516
  br i1 %480, label %.preheader357.us.us, label %._crit_edge411, !llvm.loop !65

._crit_edge411:                                   ; preds = %._crit_edge397.split.us.us.us, %.preheader357.lr.ph, %409
  call void @free(ptr noundef %386) #8
  call void @free(ptr noundef %389) #8
  %481 = load ptr, ptr %381, align 8, !tbaa !15
  %482 = call zeroext i1 @check_numerical_stability(ptr noundef %481, i64 noundef %378)
  br i1 %482, label %484, label %483

483:                                              ; preds = %._crit_edge411
  call void @free(ptr noundef %15) #8
  br label %489

484:                                              ; preds = %._crit_edge411
  %485 = getelementptr inbounds i8, ptr %0, i64 8
  store ptr %15, ptr %485, align 8, !tbaa !13
  %486 = getelementptr inbounds i8, ptr %0, i64 16
  store i64 %377, ptr %486, align 8, !tbaa !5
  %487 = getelementptr inbounds i8, ptr %0, i64 48
  store i64 %378, ptr %487, align 8, !tbaa !48
  %488 = getelementptr inbounds i8, ptr %0, i64 56
  store i64 %380, ptr %488, align 8, !tbaa !49
  br label %489

489:                                              ; preds = %.thread, %250, %13, %230, %229, %483, %484, %408, %7, %3
  %.5 = phi i32 [ -1, %3 ], [ -1, %7 ], [ -22, %250 ], [ -2, %13 ], [ 0, %230 ], [ -24, %229 ], [ -2, %408 ], [ 0, %484 ], [ -24, %483 ], [ -2, %.thread ]
  ret i32 %.5
}

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_add(<2 x float>, <2 x float>) local_unnamed_addr #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_multiply(<2 x float>, <2 x float>) local_unnamed_addr #5

; Function Attrs: nounwind uwtable
declare hidden zeroext i1 @check_numerical_stability(ptr noundef, i64 noundef) local_unnamed_addr #6

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

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

; Function Attrs: nounwind uwtable
declare hidden i64 @indices_to_linear(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #6

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


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