; 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: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @llvm.prefetch.p0(ptr nocapture readonly, i32 immarg, i32 immarg, i32 immarg) #4

; 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 @min(i64 noundef, i64 noundef) #6

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

; Function Attrs: nounwind uwtable
define dso_local i32 @geometric_tensor_contract(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, i64 noundef %5) #9 {
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i32, align 4
  %16 = alloca i64, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, 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 ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca i64, align 8
  %32 = alloca i64, align 8
  %33 = alloca i64, align 8
  %34 = alloca i64, align 8
  %35 = alloca [32 x i64], align 16
  %36 = alloca [32 x i64], align 16
  %37 = alloca i64, align 8
  %38 = alloca i64, align 8
  %39 = alloca i64, align 8
  %40 = alloca i8, align 1
  %41 = alloca i64, align 8
  %42 = alloca i64, align 8
  %43 = alloca i8, align 1
  %44 = alloca i64, align 8
  %45 = alloca [32 x [32 x i64]], align 16
  %46 = alloca i64, align 8
  %47 = alloca i64, align 8
  %48 = alloca i64, align 8
  %49 = alloca i64, align 8
  %50 = alloca ptr, align 8
  %51 = alloca i32, align 4
  %52 = alloca ptr, align 8
  %53 = alloca [32 x i64], align 16
  %54 = alloca [32 x i64], align 16
  %55 = alloca [32 x %struct.ComplexFloat], align 64
  %56 = alloca [128 x %struct.ComplexFloat], align 64
  %57 = alloca [512 x %struct.ComplexFloat], align 64
  %58 = alloca ptr, align 8
  %59 = alloca i64, align 8
  %60 = alloca i64, align 8
  %61 = alloca i64, align 8
  %62 = alloca i64, align 8
  %63 = alloca i64, align 8
  %64 = alloca i64, align 8
  %65 = alloca i64, align 8
  %66 = alloca i64, align 8
  %67 = alloca i64, align 8
  %68 = alloca i64, align 8
  %69 = alloca i64, align 8
  %70 = alloca i64, align 8
  %71 = alloca i64, align 8
  %72 = alloca i64, align 8
  %73 = alloca i64, align 8
  %74 = alloca i64, align 8
  %75 = alloca i64, align 8
  %76 = alloca i64, align 8
  %77 = alloca %struct.ComplexFloat, align 4
  %78 = alloca i64, align 8
  %79 = alloca i64, align 8
  %80 = alloca i64, align 8
  %81 = alloca i64, align 8
  %82 = alloca i64, align 8
  %83 = alloca i64, align 8
  %84 = alloca i64, align 8
  %85 = alloca i64, align 8
  %86 = alloca %struct.ComplexFloat, align 4
  %87 = alloca i64, align 8
  %88 = alloca i64, align 8
  %89 = alloca %struct.ComplexFloat, align 4
  %90 = alloca i64, align 8
  store ptr %0, ptr %8, align 8, !tbaa !5
  store ptr %1, ptr %9, align 8, !tbaa !5
  store ptr %2, ptr %10, align 8, !tbaa !5
  store ptr %3, ptr %11, align 8, !tbaa !5
  store ptr %4, ptr %12, align 8, !tbaa !5
  store i64 %5, ptr %13, align 8, !tbaa !9
  %91 = load ptr, ptr %8, align 8, !tbaa !5
  %92 = icmp eq ptr %91, null
  br i1 %92, label %93, label %94

93:                                               ; preds = %6
  store i32 -1, ptr %7, align 4
  br label %961

94:                                               ; preds = %6
  %95 = load ptr, ptr %9, align 8, !tbaa !5
  %96 = icmp eq ptr %95, null
  br i1 %96, label %97, label %98

97:                                               ; preds = %94
  store i32 -1, ptr %7, align 4
  br label %961

98:                                               ; preds = %94
  %99 = load ptr, ptr %10, align 8, !tbaa !5
  %100 = icmp eq ptr %99, null
  br i1 %100, label %101, label %102

101:                                              ; preds = %98
  store i32 -1, ptr %7, align 4
  br label %961

102:                                              ; preds = %98
  %103 = load ptr, ptr %11, align 8, !tbaa !5
  %104 = icmp eq ptr %103, null
  br i1 %104, label %105, label %106

105:                                              ; preds = %102
  store i32 -1, ptr %7, align 4
  br label %961

106:                                              ; preds = %102
  %107 = load ptr, ptr %12, align 8, !tbaa !5
  %108 = icmp eq ptr %107, null
  br i1 %108, label %109, label %110

109:                                              ; preds = %106
  store i32 -1, ptr %7, align 4
  br label %961

110:                                              ; preds = %106
  %111 = load i64, ptr %13, align 8, !tbaa !9
  %112 = icmp ugt i64 %111, 0
  br i1 %112, label %114, label %113

113:                                              ; preds = %110
  store i32 -1, ptr %7, align 4
  br label %961

114:                                              ; preds = %110
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #11
  store i64 0, ptr %14, align 8, !tbaa !9
  br label %115

115:                                              ; preds = %162, %114
  %116 = load i64, ptr %14, align 8, !tbaa !9
  %117 = load i64, ptr %13, align 8, !tbaa !9
  %118 = icmp ult i64 %116, %117
  br i1 %118, label %120, label %119

119:                                              ; preds = %115
  store i32 2, ptr %15, align 4
  br label %165

120:                                              ; preds = %115
  %121 = load ptr, ptr %11, align 8, !tbaa !5
  %122 = load i64, ptr %14, align 8, !tbaa !9
  %123 = getelementptr inbounds i64, ptr %121, i64 %122
  %124 = load i64, ptr %123, align 8, !tbaa !9
  %125 = load ptr, ptr %9, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %125, i32 0, i32 2
  %127 = load i64, ptr %126, align 8, !tbaa !11
  %128 = icmp ult i64 %124, %127
  br i1 %128, label %130, label %129

129:                                              ; preds = %120
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %165

130:                                              ; preds = %120
  %131 = load ptr, ptr %12, align 8, !tbaa !5
  %132 = load i64, ptr %14, align 8, !tbaa !9
  %133 = getelementptr inbounds i64, ptr %131, i64 %132
  %134 = load i64, ptr %133, align 8, !tbaa !9
  %135 = load ptr, ptr %10, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %135, i32 0, i32 2
  %137 = load i64, ptr %136, align 8, !tbaa !11
  %138 = icmp ult i64 %134, %137
  br i1 %138, label %140, label %139

139:                                              ; preds = %130
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %165

140:                                              ; preds = %130
  %141 = load ptr, ptr %9, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %141, i32 0, i32 1
  %143 = load ptr, ptr %142, align 8, !tbaa !15
  %144 = load ptr, ptr %11, align 8, !tbaa !5
  %145 = load i64, ptr %14, align 8, !tbaa !9
  %146 = getelementptr inbounds i64, ptr %144, i64 %145
  %147 = load i64, ptr %146, align 8, !tbaa !9
  %148 = getelementptr inbounds i64, ptr %143, i64 %147
  %149 = load i64, ptr %148, align 8, !tbaa !9
  %150 = load ptr, ptr %10, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %150, i32 0, i32 1
  %152 = load ptr, ptr %151, align 8, !tbaa !15
  %153 = load ptr, ptr %12, align 8, !tbaa !5
  %154 = load i64, ptr %14, align 8, !tbaa !9
  %155 = getelementptr inbounds i64, ptr %153, i64 %154
  %156 = load i64, ptr %155, align 8, !tbaa !9
  %157 = getelementptr inbounds i64, ptr %152, i64 %156
  %158 = load i64, ptr %157, align 8, !tbaa !9
  %159 = icmp eq i64 %149, %158
  br i1 %159, label %161, label %160

160:                                              ; preds = %140
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %165

161:                                              ; preds = %140
  br label %162

162:                                              ; preds = %161
  %163 = load i64, ptr %14, align 8, !tbaa !9
  %164 = add i64 %163, 1
  store i64 %164, ptr %14, align 8, !tbaa !9
  br label %115, !llvm.loop !16

165:                                              ; preds = %160, %139, %129, %119
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #11
  %166 = load i32, ptr %15, align 4
  switch i32 %166, label %963 [
    i32 2, label %167
    i32 1, label %961
  ]

167:                                              ; preds = %165
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #11
  %168 = load ptr, ptr %9, align 8, !tbaa !5
  %169 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %168, i32 0, i32 2
  %170 = load i64, ptr %169, align 8, !tbaa !11
  %171 = load ptr, ptr %10, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %171, i32 0, i32 2
  %173 = load i64, ptr %172, align 8, !tbaa !11
  %174 = add i64 %170, %173
  %175 = load i64, ptr %13, align 8, !tbaa !9
  %176 = mul i64 2, %175
  %177 = sub i64 %174, %176
  store i64 %177, ptr %16, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #11
  %178 = load i64, ptr %16, align 8, !tbaa !9
  %179 = mul i64 %178, 8
  %180 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %179) #12
  store ptr %180, ptr %17, align 8, !tbaa !5
  %181 = load ptr, ptr %17, align 8, !tbaa !5
  %182 = icmp ne ptr %181, null
  br i1 %182, label %184, label %183

183:                                              ; preds = %167
  store i32 -2, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %960

184:                                              ; preds = %167
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #11
  %185 = load ptr, ptr %9, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %185, i32 0, i32 2
  %187 = load i64, ptr %186, align 8, !tbaa !11
  %188 = mul i64 %187, 8
  %189 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %188) #12
  store ptr %189, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #11
  %190 = load ptr, ptr %10, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %190, i32 0, i32 2
  %192 = load i64, ptr %191, align 8, !tbaa !11
  %193 = mul i64 %192, 8
  %194 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %193) #12
  store ptr %194, ptr %19, align 8, !tbaa !5
  %195 = load ptr, ptr %18, align 8, !tbaa !5
  %196 = icmp ne ptr %195, null
  br i1 %196, label %197, label %200

197:                                              ; preds = %184
  %198 = load ptr, ptr %19, align 8, !tbaa !5
  %199 = icmp ne ptr %198, null
  br i1 %199, label %204, label %200

200:                                              ; preds = %197, %184
  %201 = load ptr, ptr %17, align 8, !tbaa !5
  call void @free(ptr noundef %201) #11
  %202 = load ptr, ptr %18, align 8, !tbaa !5
  call void @free(ptr noundef %202) #11
  %203 = load ptr, ptr %19, align 8, !tbaa !5
  call void @free(ptr noundef %203) #11
  store i32 -2, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %959

204:                                              ; preds = %197
  %205 = load ptr, ptr %18, align 8, !tbaa !5
  %206 = load ptr, ptr %9, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %206, i32 0, i32 2
  %208 = load i64, ptr %207, align 8, !tbaa !11
  %209 = mul i64 %208, 8
  call void @llvm.memset.p0.i64(ptr align 8 %205, i8 -1, i64 %209, i1 false)
  %210 = load ptr, ptr %19, align 8, !tbaa !5
  %211 = load ptr, ptr %10, align 8, !tbaa !5
  %212 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %211, i32 0, i32 2
  %213 = load i64, ptr %212, align 8, !tbaa !11
  %214 = mul i64 %213, 8
  call void @llvm.memset.p0.i64(ptr align 8 %210, i8 -1, i64 %214, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #11
  store i64 0, ptr %20, align 8, !tbaa !9
  br label %215

215:                                              ; preds = %235, %204
  %216 = load i64, ptr %20, align 8, !tbaa !9
  %217 = load i64, ptr %13, align 8, !tbaa !9
  %218 = icmp ult i64 %216, %217
  br i1 %218, label %220, label %219

219:                                              ; preds = %215
  store i32 5, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #11
  br label %238

220:                                              ; preds = %215
  %221 = load i64, ptr %20, align 8, !tbaa !9
  %222 = load ptr, ptr %18, align 8, !tbaa !5
  %223 = load ptr, ptr %11, align 8, !tbaa !5
  %224 = load i64, ptr %20, align 8, !tbaa !9
  %225 = getelementptr inbounds i64, ptr %223, i64 %224
  %226 = load i64, ptr %225, align 8, !tbaa !9
  %227 = getelementptr inbounds i64, ptr %222, i64 %226
  store i64 %221, ptr %227, align 8, !tbaa !9
  %228 = load i64, ptr %20, align 8, !tbaa !9
  %229 = load ptr, ptr %19, align 8, !tbaa !5
  %230 = load ptr, ptr %12, align 8, !tbaa !5
  %231 = load i64, ptr %20, align 8, !tbaa !9
  %232 = getelementptr inbounds i64, ptr %230, i64 %231
  %233 = load i64, ptr %232, align 8, !tbaa !9
  %234 = getelementptr inbounds i64, ptr %229, i64 %233
  store i64 %228, ptr %234, align 8, !tbaa !9
  br label %235

235:                                              ; preds = %220
  %236 = load i64, ptr %20, align 8, !tbaa !9
  %237 = add i64 %236, 1
  store i64 %237, ptr %20, align 8, !tbaa !9
  br label %215, !llvm.loop !18

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

239:                                              ; preds = %264, %238
  %240 = load i64, ptr %22, align 8, !tbaa !9
  %241 = load ptr, ptr %9, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %241, i32 0, i32 2
  %243 = load i64, ptr %242, align 8, !tbaa !11
  %244 = icmp ult i64 %240, %243
  br i1 %244, label %246, label %245

245:                                              ; preds = %239
  store i32 8, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #11
  br label %267

246:                                              ; preds = %239
  %247 = load ptr, ptr %18, align 8, !tbaa !5
  %248 = load i64, ptr %22, align 8, !tbaa !9
  %249 = getelementptr inbounds i64, ptr %247, i64 %248
  %250 = load i64, ptr %249, align 8, !tbaa !9
  %251 = icmp eq i64 %250, -1
  br i1 %251, label %252, label %263

252:                                              ; preds = %246
  %253 = load ptr, ptr %9, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %253, i32 0, i32 1
  %255 = load ptr, ptr %254, align 8, !tbaa !15
  %256 = load i64, ptr %22, align 8, !tbaa !9
  %257 = getelementptr inbounds i64, ptr %255, i64 %256
  %258 = load i64, ptr %257, align 8, !tbaa !9
  %259 = load ptr, ptr %17, align 8, !tbaa !5
  %260 = load i64, ptr %21, align 8, !tbaa !9
  %261 = add i64 %260, 1
  store i64 %261, ptr %21, align 8, !tbaa !9
  %262 = getelementptr inbounds i64, ptr %259, i64 %260
  store i64 %258, ptr %262, align 8, !tbaa !9
  br label %263

263:                                              ; preds = %252, %246
  br label %264

264:                                              ; preds = %263
  %265 = load i64, ptr %22, align 8, !tbaa !9
  %266 = add i64 %265, 1
  store i64 %266, ptr %22, align 8, !tbaa !9
  br label %239, !llvm.loop !19

267:                                              ; preds = %245
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #11
  store i64 0, ptr %23, align 8, !tbaa !9
  br label %268

268:                                              ; preds = %293, %267
  %269 = load i64, ptr %23, align 8, !tbaa !9
  %270 = load ptr, ptr %10, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %270, i32 0, i32 2
  %272 = load i64, ptr %271, align 8, !tbaa !11
  %273 = icmp ult i64 %269, %272
  br i1 %273, label %275, label %274

274:                                              ; preds = %268
  store i32 11, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #11
  br label %296

275:                                              ; preds = %268
  %276 = load ptr, ptr %19, align 8, !tbaa !5
  %277 = load i64, ptr %23, align 8, !tbaa !9
  %278 = getelementptr inbounds i64, ptr %276, i64 %277
  %279 = load i64, ptr %278, align 8, !tbaa !9
  %280 = icmp eq i64 %279, -1
  br i1 %280, label %281, label %292

281:                                              ; preds = %275
  %282 = load ptr, ptr %10, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %282, i32 0, i32 1
  %284 = load ptr, ptr %283, align 8, !tbaa !15
  %285 = load i64, ptr %23, align 8, !tbaa !9
  %286 = getelementptr inbounds i64, ptr %284, i64 %285
  %287 = load i64, ptr %286, align 8, !tbaa !9
  %288 = load ptr, ptr %17, align 8, !tbaa !5
  %289 = load i64, ptr %21, align 8, !tbaa !9
  %290 = add i64 %289, 1
  store i64 %290, ptr %21, align 8, !tbaa !9
  %291 = getelementptr inbounds i64, ptr %288, i64 %289
  store i64 %287, ptr %291, align 8, !tbaa !9
  br label %292

292:                                              ; preds = %281, %275
  br label %293

293:                                              ; preds = %292
  %294 = load i64, ptr %23, align 8, !tbaa !9
  %295 = add i64 %294, 1
  store i64 %295, ptr %23, align 8, !tbaa !9
  br label %268, !llvm.loop !20

296:                                              ; preds = %274
  %297 = load ptr, ptr %18, align 8, !tbaa !5
  call void @free(ptr noundef %297) #11
  %298 = load ptr, ptr %19, align 8, !tbaa !5
  call void @free(ptr noundef %298) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #11
  store i64 1, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #11
  store i64 0, ptr %25, align 8, !tbaa !9
  br label %299

299:                                              ; preds = %311, %296
  %300 = load i64, ptr %25, align 8, !tbaa !9
  %301 = load i64, ptr %16, align 8, !tbaa !9
  %302 = icmp ult i64 %300, %301
  br i1 %302, label %304, label %303

303:                                              ; preds = %299
  store i32 14, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #11
  br label %314

304:                                              ; preds = %299
  %305 = load ptr, ptr %17, align 8, !tbaa !5
  %306 = load i64, ptr %25, align 8, !tbaa !9
  %307 = getelementptr inbounds i64, ptr %305, i64 %306
  %308 = load i64, ptr %307, align 8, !tbaa !9
  %309 = load i64, ptr %24, align 8, !tbaa !9
  %310 = mul i64 %309, %308
  store i64 %310, ptr %24, align 8, !tbaa !9
  br label %311

311:                                              ; preds = %304
  %312 = load i64, ptr %25, align 8, !tbaa !9
  %313 = add i64 %312, 1
  store i64 %313, ptr %25, align 8, !tbaa !9
  br label %299, !llvm.loop !21

314:                                              ; preds = %303
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #11
  store i64 1, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #11
  store i64 0, ptr %27, align 8, !tbaa !9
  br label %315

315:                                              ; preds = %332, %314
  %316 = load i64, ptr %27, align 8, !tbaa !9
  %317 = load i64, ptr %13, align 8, !tbaa !9
  %318 = icmp ult i64 %316, %317
  br i1 %318, label %320, label %319

319:                                              ; preds = %315
  store i32 17, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #11
  br label %335

320:                                              ; preds = %315
  %321 = load ptr, ptr %9, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %321, i32 0, i32 1
  %323 = load ptr, ptr %322, align 8, !tbaa !15
  %324 = load ptr, ptr %11, align 8, !tbaa !5
  %325 = load i64, ptr %27, align 8, !tbaa !9
  %326 = getelementptr inbounds i64, ptr %324, i64 %325
  %327 = load i64, ptr %326, align 8, !tbaa !9
  %328 = getelementptr inbounds i64, ptr %323, i64 %327
  %329 = load i64, ptr %328, align 8, !tbaa !9
  %330 = load i64, ptr %26, align 8, !tbaa !9
  %331 = mul i64 %330, %329
  store i64 %331, ptr %26, align 8, !tbaa !9
  br label %332

332:                                              ; preds = %320
  %333 = load i64, ptr %27, align 8, !tbaa !9
  %334 = add i64 %333, 1
  store i64 %334, ptr %27, align 8, !tbaa !9
  br label %315, !llvm.loop !22

335:                                              ; preds = %319
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #11
  %336 = load i64, ptr %24, align 8, !tbaa !9
  %337 = add i64 %336, 7
  %338 = and i64 %337, -8
  store i64 %338, ptr %28, align 8, !tbaa !9
  %339 = load ptr, ptr %8, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %339, i32 0, i32 3
  %341 = load ptr, ptr %340, align 8, !tbaa !23
  %342 = load i64, ptr %28, align 8, !tbaa !9
  %343 = mul i64 %342, 8
  call void @llvm.memset.p0.i64(ptr align 4 %341, i8 0, i64 %343, i1 false)
  %344 = load ptr, ptr %17, align 8, !tbaa !5
  %345 = load ptr, ptr %8, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %345, i32 0, i32 1
  store ptr %344, ptr %346, align 8, !tbaa !15
  %347 = load i64, ptr %16, align 8, !tbaa !9
  %348 = load ptr, ptr %8, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %348, i32 0, i32 2
  store i64 %347, ptr %349, align 8, !tbaa !11
  %350 = load i64, ptr %24, align 8, !tbaa !9
  %351 = load ptr, ptr %8, align 8, !tbaa !5
  %352 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %351, i32 0, i32 9
  store i64 %350, ptr %352, align 8, !tbaa !24
  %353 = load i64, ptr %28, align 8, !tbaa !9
  %354 = load ptr, ptr %8, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %354, i32 0, i32 10
  store i64 %353, ptr %355, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #11
  %356 = load ptr, ptr %9, align 8, !tbaa !5
  %357 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %356, i32 0, i32 2
  %358 = load i64, ptr %357, align 8, !tbaa !11
  %359 = mul i64 %358, 8
  %360 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %359) #12
  store ptr %360, ptr %29, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #11
  %361 = load ptr, ptr %10, align 8, !tbaa !5
  %362 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %361, i32 0, i32 2
  %363 = load i64, ptr %362, align 8, !tbaa !11
  %364 = mul i64 %363, 8
  %365 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %364) #12
  store ptr %365, ptr %30, align 8, !tbaa !5
  %366 = load ptr, ptr %29, align 8, !tbaa !5
  %367 = icmp ne ptr %366, null
  br i1 %367, label %368, label %371

368:                                              ; preds = %335
  %369 = load ptr, ptr %30, align 8, !tbaa !5
  %370 = icmp ne ptr %369, null
  br i1 %370, label %375, label %371

371:                                              ; preds = %368, %335
  %372 = load ptr, ptr %17, align 8, !tbaa !5
  call void @free(ptr noundef %372) #11
  %373 = load ptr, ptr %29, align 8, !tbaa !5
  call void @free(ptr noundef %373) #11
  %374 = load ptr, ptr %30, align 8, !tbaa !5
  call void @free(ptr noundef %374) #11
  store i32 -2, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %958

375:                                              ; preds = %368
  %376 = load ptr, ptr %29, align 8, !tbaa !5
  %377 = load ptr, ptr %9, align 8, !tbaa !5
  %378 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %377, i32 0, i32 1
  %379 = load ptr, ptr %378, align 8, !tbaa !15
  %380 = load ptr, ptr %9, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %380, i32 0, i32 2
  %382 = load i64, ptr %381, align 8, !tbaa !11
  call void @calculate_strides(ptr noundef %376, ptr noundef %379, i64 noundef %382)
  %383 = load ptr, ptr %30, align 8, !tbaa !5
  %384 = load ptr, ptr %10, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %384, i32 0, i32 1
  %386 = load ptr, ptr %385, align 8, !tbaa !15
  %387 = load ptr, ptr %10, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %387, i32 0, i32 2
  %389 = load i64, ptr %388, align 8, !tbaa !11
  call void @calculate_strides(ptr noundef %383, ptr noundef %386, i64 noundef %389)
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #11
  store i64 8, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #11
  store i64 32, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #11
  store i64 128, ptr %33, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #11
  store i64 512, ptr %34, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 256, ptr %35) #11
  call void @llvm.lifetime.start.p0(i64 256, ptr %36) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #11
  store i64 0, ptr %37, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #11
  store i64 0, ptr %38, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #11
  store i64 0, ptr %39, align 8, !tbaa !9
  br label %390

390:                                              ; preds = %425, %375
  %391 = load i64, ptr %39, align 8, !tbaa !9
  %392 = load ptr, ptr %9, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %392, i32 0, i32 2
  %394 = load i64, ptr %393, align 8, !tbaa !11
  %395 = icmp ult i64 %391, %394
  br i1 %395, label %397, label %396

396:                                              ; preds = %390
  store i32 20, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #11
  br label %428

397:                                              ; preds = %390
  call void @llvm.lifetime.start.p0(i64 1, ptr %40) #11
  store i8 0, ptr %40, align 1, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #11
  store i64 0, ptr %41, align 8, !tbaa !9
  br label %398

398:                                              ; preds = %412, %397
  %399 = load i64, ptr %41, align 8, !tbaa !9
  %400 = load i64, ptr %13, align 8, !tbaa !9
  %401 = icmp ult i64 %399, %400
  br i1 %401, label %403, label %402

402:                                              ; preds = %398
  store i32 23, ptr %15, align 4
  br label %415

403:                                              ; preds = %398
  %404 = load i64, ptr %39, align 8, !tbaa !9
  %405 = load ptr, ptr %11, align 8, !tbaa !5
  %406 = load i64, ptr %41, align 8, !tbaa !9
  %407 = getelementptr inbounds i64, ptr %405, i64 %406
  %408 = load i64, ptr %407, align 8, !tbaa !9
  %409 = icmp eq i64 %404, %408
  br i1 %409, label %410, label %411

410:                                              ; preds = %403
  store i8 1, ptr %40, align 1, !tbaa !26
  store i32 23, ptr %15, align 4
  br label %415

411:                                              ; preds = %403
  br label %412

412:                                              ; preds = %411
  %413 = load i64, ptr %41, align 8, !tbaa !9
  %414 = add i64 %413, 1
  store i64 %414, ptr %41, align 8, !tbaa !9
  br label %398, !llvm.loop !27

415:                                              ; preds = %410, %402
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #11
  br label %416

416:                                              ; preds = %415
  %417 = load i8, ptr %40, align 1, !tbaa !26, !range !28, !noundef !29
  %418 = trunc i8 %417 to i1
  br i1 %418, label %424, label %419

419:                                              ; preds = %416
  %420 = load i64, ptr %39, align 8, !tbaa !9
  %421 = load i64, ptr %37, align 8, !tbaa !9
  %422 = add i64 %421, 1
  store i64 %422, ptr %37, align 8, !tbaa !9
  %423 = getelementptr inbounds [32 x i64], ptr %35, i64 0, i64 %421
  store i64 %420, ptr %423, align 8, !tbaa !9
  br label %424

424:                                              ; preds = %419, %416
  call void @llvm.lifetime.end.p0(i64 1, ptr %40) #11
  br label %425

425:                                              ; preds = %424
  %426 = load i64, ptr %39, align 8, !tbaa !9
  %427 = add i64 %426, 1
  store i64 %427, ptr %39, align 8, !tbaa !9
  br label %390, !llvm.loop !30

428:                                              ; preds = %396
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #11
  store i64 0, ptr %42, align 8, !tbaa !9
  br label %429

429:                                              ; preds = %464, %428
  %430 = load i64, ptr %42, align 8, !tbaa !9
  %431 = load ptr, ptr %10, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %431, i32 0, i32 2
  %433 = load i64, ptr %432, align 8, !tbaa !11
  %434 = icmp ult i64 %430, %433
  br i1 %434, label %436, label %435

435:                                              ; preds = %429
  store i32 26, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #11
  br label %467

436:                                              ; preds = %429
  call void @llvm.lifetime.start.p0(i64 1, ptr %43) #11
  store i8 0, ptr %43, align 1, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #11
  store i64 0, ptr %44, align 8, !tbaa !9
  br label %437

437:                                              ; preds = %451, %436
  %438 = load i64, ptr %44, align 8, !tbaa !9
  %439 = load i64, ptr %13, align 8, !tbaa !9
  %440 = icmp ult i64 %438, %439
  br i1 %440, label %442, label %441

441:                                              ; preds = %437
  store i32 29, ptr %15, align 4
  br label %454

442:                                              ; preds = %437
  %443 = load i64, ptr %42, align 8, !tbaa !9
  %444 = load ptr, ptr %12, align 8, !tbaa !5
  %445 = load i64, ptr %44, align 8, !tbaa !9
  %446 = getelementptr inbounds i64, ptr %444, i64 %445
  %447 = load i64, ptr %446, align 8, !tbaa !9
  %448 = icmp eq i64 %443, %447
  br i1 %448, label %449, label %450

449:                                              ; preds = %442
  store i8 1, ptr %43, align 1, !tbaa !26
  store i32 29, ptr %15, align 4
  br label %454

450:                                              ; preds = %442
  br label %451

451:                                              ; preds = %450
  %452 = load i64, ptr %44, align 8, !tbaa !9
  %453 = add i64 %452, 1
  store i64 %453, ptr %44, align 8, !tbaa !9
  br label %437, !llvm.loop !31

454:                                              ; preds = %449, %441
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #11
  br label %455

455:                                              ; preds = %454
  %456 = load i8, ptr %43, align 1, !tbaa !26, !range !28, !noundef !29
  %457 = trunc i8 %456 to i1
  br i1 %457, label %463, label %458

458:                                              ; preds = %455
  %459 = load i64, ptr %42, align 8, !tbaa !9
  %460 = load i64, ptr %38, align 8, !tbaa !9
  %461 = add i64 %460, 1
  store i64 %461, ptr %38, align 8, !tbaa !9
  %462 = getelementptr inbounds [32 x i64], ptr %36, i64 0, i64 %460
  store i64 %459, ptr %462, align 8, !tbaa !9
  br label %463

463:                                              ; preds = %458, %455
  call void @llvm.lifetime.end.p0(i64 1, ptr %43) #11
  br label %464

464:                                              ; preds = %463
  %465 = load i64, ptr %42, align 8, !tbaa !9
  %466 = add i64 %465, 1
  store i64 %466, ptr %42, align 8, !tbaa !9
  br label %429, !llvm.loop !32

467:                                              ; preds = %435
  call void @llvm.lifetime.start.p0(i64 8192, ptr %45) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #11
  store i64 0, ptr %46, align 8, !tbaa !9
  br label %468

468:                                              ; preds = %516, %467
  %469 = load i64, ptr %46, align 8, !tbaa !9
  %470 = load i64, ptr %26, align 8, !tbaa !9
  %471 = icmp ult i64 %469, %470
  br i1 %471, label %472, label %475

472:                                              ; preds = %468
  %473 = load i64, ptr %46, align 8, !tbaa !9
  %474 = icmp ult i64 %473, 32
  br label %475

475:                                              ; preds = %472, %468
  %476 = phi i1 [ false, %468 ], [ %474, %472 ]
  br i1 %476, label %478, label %477

477:                                              ; preds = %475
  store i32 32, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #11
  br label %519

478:                                              ; preds = %475
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #11
  %479 = load i64, ptr %46, align 8, !tbaa !9
  store i64 %479, ptr %47, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #11
  store i64 0, ptr %48, align 8, !tbaa !9
  br label %480

480:                                              ; preds = %512, %478
  %481 = load i64, ptr %48, align 8, !tbaa !9
  %482 = load i64, ptr %13, align 8, !tbaa !9
  %483 = icmp ult i64 %481, %482
  br i1 %483, label %485, label %484

484:                                              ; preds = %480
  store i32 35, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #11
  br label %515

485:                                              ; preds = %480
  %486 = load i64, ptr %47, align 8, !tbaa !9
  %487 = load ptr, ptr %9, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %487, i32 0, i32 1
  %489 = load ptr, ptr %488, align 8, !tbaa !15
  %490 = load ptr, ptr %11, align 8, !tbaa !5
  %491 = load i64, ptr %48, align 8, !tbaa !9
  %492 = getelementptr inbounds i64, ptr %490, i64 %491
  %493 = load i64, ptr %492, align 8, !tbaa !9
  %494 = getelementptr inbounds i64, ptr %489, i64 %493
  %495 = load i64, ptr %494, align 8, !tbaa !9
  %496 = urem i64 %486, %495
  %497 = load i64, ptr %46, align 8, !tbaa !9
  %498 = getelementptr inbounds [32 x [32 x i64]], ptr %45, i64 0, i64 %497
  %499 = load i64, ptr %48, align 8, !tbaa !9
  %500 = getelementptr inbounds [32 x i64], ptr %498, i64 0, i64 %499
  store i64 %496, ptr %500, align 8, !tbaa !9
  %501 = load ptr, ptr %9, 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 !15
  %504 = load ptr, ptr %11, align 8, !tbaa !5
  %505 = load i64, ptr %48, align 8, !tbaa !9
  %506 = getelementptr inbounds i64, ptr %504, i64 %505
  %507 = load i64, ptr %506, align 8, !tbaa !9
  %508 = getelementptr inbounds i64, ptr %503, i64 %507
  %509 = load i64, ptr %508, align 8, !tbaa !9
  %510 = load i64, ptr %47, align 8, !tbaa !9
  %511 = udiv i64 %510, %509
  store i64 %511, ptr %47, align 8, !tbaa !9
  br label %512

512:                                              ; preds = %485
  %513 = load i64, ptr %48, align 8, !tbaa !9
  %514 = add i64 %513, 1
  store i64 %514, ptr %48, align 8, !tbaa !9
  br label %480, !llvm.loop !33

515:                                              ; preds = %484
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #11
  br label %516

516:                                              ; preds = %515
  %517 = load i64, ptr %46, align 8, !tbaa !9
  %518 = add i64 %517, 1
  store i64 %518, ptr %46, align 8, !tbaa !9
  br label %468, !llvm.loop !34

519:                                              ; preds = %477
  %520 = load ptr, ptr %8, align 8, !tbaa !5
  %521 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %520, i32 0, i32 3
  %522 = load ptr, ptr %521, align 8, !tbaa !23
  %523 = load i64, ptr %28, align 8, !tbaa !9
  %524 = mul i64 %523, 8
  call void @llvm.memset.p0.i64(ptr align 4 %522, i8 0, i64 %524, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #11
  store i64 1, ptr %49, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #11
  %525 = load i64, ptr %49, align 8, !tbaa !9
  %526 = load i64, ptr %24, align 8, !tbaa !9
  %527 = mul i64 %525, %526
  %528 = mul i64 %527, 8
  %529 = call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %528) #12
  store ptr %529, ptr %50, align 8, !tbaa !5
  %530 = load ptr, ptr %50, align 8, !tbaa !5
  %531 = icmp ne ptr %530, null
  br i1 %531, label %535, label %532

532:                                              ; preds = %519
  %533 = load ptr, ptr %29, align 8, !tbaa !5
  call void @free(ptr noundef %533) #11
  %534 = load ptr, ptr %30, align 8, !tbaa !5
  call void @free(ptr noundef %534) #11
  store i32 -2, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %957

535:                                              ; preds = %519
  %536 = load ptr, ptr %50, align 8, !tbaa !5
  %537 = load i64, ptr %49, align 8, !tbaa !9
  %538 = load i64, ptr %24, align 8, !tbaa !9
  %539 = mul i64 %537, %538
  %540 = mul i64 %539, 8
  call void @llvm.memset.p0.i64(ptr align 4 %536, i8 0, i64 %540, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #11
  store i32 0, ptr %51, align 4, !tbaa !35
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #11
  %541 = load ptr, ptr %50, align 8, !tbaa !5
  %542 = load i64, ptr %24, align 8, !tbaa !9
  %543 = mul i64 0, %542
  %544 = getelementptr inbounds %struct.ComplexFloat, ptr %541, i64 %543
  store ptr %544, ptr %52, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 256, ptr %53) #11
  call void @llvm.lifetime.start.p0(i64 256, ptr %54) #11
  call void @llvm.lifetime.start.p0(i64 256, ptr %55) #11
  call void @llvm.lifetime.start.p0(i64 1024, ptr %56) #11
  call void @llvm.lifetime.start.p0(i64 4096, ptr %57) #11
  %545 = getelementptr inbounds [32 x %struct.ComplexFloat], ptr %55, i64 0, i64 0
  %546 = load ptr, ptr %9, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %546, i32 0, i32 3
  %548 = load ptr, ptr %547, align 8, !tbaa !23
  %549 = getelementptr inbounds %struct.ComplexFloat, ptr %548, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 64 %545, ptr align 4 %549, i64 256, i1 false)
  %550 = getelementptr inbounds [128 x %struct.ComplexFloat], ptr %56, i64 0, i64 0
  %551 = load ptr, ptr %10, align 8, !tbaa !5
  %552 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %551, i32 0, i32 3
  %553 = load ptr, ptr %552, align 8, !tbaa !23
  %554 = getelementptr inbounds %struct.ComplexFloat, ptr %553, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 64 %550, ptr align 4 %554, i64 1024, i1 false)
  %555 = getelementptr inbounds [512 x %struct.ComplexFloat], ptr %57, i64 0, i64 0
  %556 = load ptr, ptr %8, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %556, i32 0, i32 3
  %558 = load ptr, ptr %557, align 8, !tbaa !23
  call void @llvm.memcpy.p0.p0.i64(ptr align 64 %555, ptr align 4 %558, i64 4096, i1 false)
  %559 = call ptr @llvm.stacksave.p0()
  store ptr %559, ptr %58, align 8
  %560 = alloca %struct.ComplexFloat, i64 8, align 64
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #11
  store i64 0, ptr %59, align 8, !tbaa !9
  br label %561

561:                                              ; preds = %900, %535
  %562 = load i64, ptr %59, align 8, !tbaa !9
  %563 = load i64, ptr %24, align 8, !tbaa !9
  %564 = icmp ult i64 %562, %563
  br i1 %564, label %566, label %565

565:                                              ; preds = %561
  store i32 38, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #11
  br label %903

566:                                              ; preds = %561
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #11
  store i64 0, ptr %60, align 8, !tbaa !9
  br label %567

567:                                              ; preds = %896, %566
  %568 = load i64, ptr %60, align 8, !tbaa !9
  %569 = load i64, ptr %26, align 8, !tbaa !9
  %570 = icmp ult i64 %568, %569
  br i1 %570, label %572, label %571

571:                                              ; preds = %567
  store i32 41, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #11
  br label %899

572:                                              ; preds = %567
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #11
  %573 = load i64, ptr %59, align 8, !tbaa !9
  %574 = add i64 %573, 512
  %575 = load i64, ptr %24, align 8, !tbaa !9
  %576 = call i64 @min(i64 noundef %574, i64 noundef %575)
  store i64 %576, ptr %61, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #11
  %577 = load i64, ptr %60, align 8, !tbaa !9
  %578 = add i64 %577, 512
  %579 = load i64, ptr %26, align 8, !tbaa !9
  %580 = call i64 @min(i64 noundef %578, i64 noundef %579)
  store i64 %580, ptr %62, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #11
  %581 = load i64, ptr %59, align 8, !tbaa !9
  store i64 %581, ptr %63, align 8, !tbaa !9
  br label %582

582:                                              ; preds = %892, %572
  %583 = load i64, ptr %63, align 8, !tbaa !9
  %584 = load i64, ptr %61, align 8, !tbaa !9
  %585 = icmp ult i64 %583, %584
  br i1 %585, label %587, label %586

586:                                              ; preds = %582
  store i32 44, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #11
  br label %895

587:                                              ; preds = %582
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #11
  %588 = load i64, ptr %60, align 8, !tbaa !9
  store i64 %588, ptr %64, align 8, !tbaa !9
  br label %589

589:                                              ; preds = %888, %587
  %590 = load i64, ptr %64, align 8, !tbaa !9
  %591 = load i64, ptr %62, align 8, !tbaa !9
  %592 = icmp ult i64 %590, %591
  br i1 %592, label %594, label %593

593:                                              ; preds = %589
  store i32 47, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #11
  br label %891

594:                                              ; preds = %589
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #11
  %595 = load i64, ptr %63, align 8, !tbaa !9
  %596 = add i64 %595, 128
  %597 = load i64, ptr %61, align 8, !tbaa !9
  %598 = call i64 @min(i64 noundef %596, i64 noundef %597)
  store i64 %598, ptr %65, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #11
  %599 = load i64, ptr %64, align 8, !tbaa !9
  %600 = add i64 %599, 128
  %601 = load i64, ptr %62, align 8, !tbaa !9
  %602 = call i64 @min(i64 noundef %600, i64 noundef %601)
  store i64 %602, ptr %66, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #11
  %603 = load i64, ptr %63, align 8, !tbaa !9
  store i64 %603, ptr %67, align 8, !tbaa !9
  br label %604

604:                                              ; preds = %884, %594
  %605 = load i64, ptr %67, align 8, !tbaa !9
  %606 = load i64, ptr %65, align 8, !tbaa !9
  %607 = icmp ult i64 %605, %606
  br i1 %607, label %609, label %608

608:                                              ; preds = %604
  store i32 50, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #11
  br label %887

609:                                              ; preds = %604
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #11
  %610 = load i64, ptr %64, align 8, !tbaa !9
  store i64 %610, ptr %68, align 8, !tbaa !9
  br label %611

611:                                              ; preds = %880, %609
  %612 = load i64, ptr %68, align 8, !tbaa !9
  %613 = load i64, ptr %66, align 8, !tbaa !9
  %614 = icmp ult i64 %612, %613
  br i1 %614, label %616, label %615

615:                                              ; preds = %611
  store i32 53, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #11
  br label %883

616:                                              ; preds = %611
  call void @llvm.lifetime.start.p0(i64 8, ptr %69) #11
  %617 = load i64, ptr %67, align 8, !tbaa !9
  %618 = add i64 %617, 32
  %619 = load i64, ptr %65, align 8, !tbaa !9
  %620 = call i64 @min(i64 noundef %618, i64 noundef %619)
  store i64 %620, ptr %69, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %70) #11
  %621 = load i64, ptr %68, align 8, !tbaa !9
  %622 = add i64 %621, 32
  %623 = load i64, ptr %66, align 8, !tbaa !9
  %624 = call i64 @min(i64 noundef %622, i64 noundef %623)
  store i64 %624, ptr %70, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %71) #11
  %625 = load i64, ptr %67, align 8, !tbaa !9
  store i64 %625, ptr %71, align 8, !tbaa !9
  br label %626

626:                                              ; preds = %876, %616
  %627 = load i64, ptr %71, align 8, !tbaa !9
  %628 = load i64, ptr %69, align 8, !tbaa !9
  %629 = icmp ult i64 %627, %628
  br i1 %629, label %631, label %630

630:                                              ; preds = %626
  store i32 56, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #11
  br label %879

631:                                              ; preds = %626
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #11
  %632 = load i64, ptr %71, align 8, !tbaa !9
  %633 = add i64 %632, 8
  %634 = load i64, ptr %69, align 8, !tbaa !9
  %635 = call i64 @min(i64 noundef %633, i64 noundef %634)
  store i64 %635, ptr %72, align 8, !tbaa !9
  call void @llvm.memset.p0.i64(ptr align 64 %560, i8 0, i64 64, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #11
  %636 = load i64, ptr %71, align 8, !tbaa !9
  store i64 %636, ptr %73, align 8, !tbaa !9
  br label %637

637:                                              ; preds = %872, %631
  %638 = load i64, ptr %73, align 8, !tbaa !9
  %639 = load i64, ptr %72, align 8, !tbaa !9
  %640 = icmp ult i64 %638, %639
  br i1 %640, label %642, label %641

641:                                              ; preds = %637
  store i32 59, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #11
  br label %875

642:                                              ; preds = %637
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #11
  %643 = load i64, ptr %73, align 8, !tbaa !9
  store i64 %643, ptr %74, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %75) #11
  store i64 0, ptr %75, align 8, !tbaa !9
  br label %644

644:                                              ; preds = %674, %642
  %645 = load i64, ptr %75, align 8, !tbaa !9
  %646 = load i64, ptr %37, align 8, !tbaa !9
  %647 = icmp ult i64 %645, %646
  br i1 %647, label %649, label %648

648:                                              ; preds = %644
  store i32 62, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #11
  br label %677

649:                                              ; preds = %644
  %650 = load i64, ptr %74, align 8, !tbaa !9
  %651 = load ptr, ptr %9, align 8, !tbaa !5
  %652 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %651, i32 0, i32 1
  %653 = load ptr, ptr %652, align 8, !tbaa !15
  %654 = load i64, ptr %75, align 8, !tbaa !9
  %655 = getelementptr inbounds [32 x i64], ptr %35, i64 0, i64 %654
  %656 = load i64, ptr %655, align 8, !tbaa !9
  %657 = getelementptr inbounds i64, ptr %653, i64 %656
  %658 = load i64, ptr %657, align 8, !tbaa !9
  %659 = urem i64 %650, %658
  %660 = load i64, ptr %75, align 8, !tbaa !9
  %661 = getelementptr inbounds [32 x i64], ptr %35, i64 0, i64 %660
  %662 = load i64, ptr %661, align 8, !tbaa !9
  %663 = getelementptr inbounds [32 x i64], ptr %53, i64 0, i64 %662
  store i64 %659, ptr %663, align 8, !tbaa !9
  %664 = load ptr, ptr %9, align 8, !tbaa !5
  %665 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %664, i32 0, i32 1
  %666 = load ptr, ptr %665, align 8, !tbaa !15
  %667 = load i64, ptr %75, align 8, !tbaa !9
  %668 = getelementptr inbounds [32 x i64], ptr %35, i64 0, i64 %667
  %669 = load i64, ptr %668, align 8, !tbaa !9
  %670 = getelementptr inbounds i64, ptr %666, i64 %669
  %671 = load i64, ptr %670, align 8, !tbaa !9
  %672 = load i64, ptr %74, align 8, !tbaa !9
  %673 = udiv i64 %672, %671
  store i64 %673, ptr %74, align 8, !tbaa !9
  br label %674

674:                                              ; preds = %649
  %675 = load i64, ptr %75, align 8, !tbaa !9
  %676 = add i64 %675, 1
  store i64 %676, ptr %75, align 8, !tbaa !9
  br label %644, !llvm.loop !36

677:                                              ; preds = %648
  %678 = load i64, ptr %73, align 8, !tbaa !9
  store i64 %678, ptr %74, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %76) #11
  store i64 0, ptr %76, align 8, !tbaa !9
  br label %679

679:                                              ; preds = %709, %677
  %680 = load i64, ptr %76, align 8, !tbaa !9
  %681 = load i64, ptr %38, align 8, !tbaa !9
  %682 = icmp ult i64 %680, %681
  br i1 %682, label %684, label %683

683:                                              ; preds = %679
  store i32 65, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %76) #11
  br label %712

684:                                              ; preds = %679
  %685 = load i64, ptr %74, align 8, !tbaa !9
  %686 = load ptr, ptr %10, align 8, !tbaa !5
  %687 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %686, i32 0, i32 1
  %688 = load ptr, ptr %687, align 8, !tbaa !15
  %689 = load i64, ptr %76, align 8, !tbaa !9
  %690 = getelementptr inbounds [32 x i64], ptr %36, i64 0, i64 %689
  %691 = load i64, ptr %690, align 8, !tbaa !9
  %692 = getelementptr inbounds i64, ptr %688, i64 %691
  %693 = load i64, ptr %692, align 8, !tbaa !9
  %694 = urem i64 %685, %693
  %695 = load i64, ptr %76, align 8, !tbaa !9
  %696 = getelementptr inbounds [32 x i64], ptr %36, i64 0, i64 %695
  %697 = load i64, ptr %696, align 8, !tbaa !9
  %698 = getelementptr inbounds [32 x i64], ptr %54, i64 0, i64 %697
  store i64 %694, ptr %698, align 8, !tbaa !9
  %699 = load ptr, ptr %10, align 8, !tbaa !5
  %700 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %699, i32 0, i32 1
  %701 = load ptr, ptr %700, align 8, !tbaa !15
  %702 = load i64, ptr %76, align 8, !tbaa !9
  %703 = getelementptr inbounds [32 x i64], ptr %36, i64 0, i64 %702
  %704 = load i64, ptr %703, align 8, !tbaa !9
  %705 = getelementptr inbounds i64, ptr %701, i64 %704
  %706 = load i64, ptr %705, align 8, !tbaa !9
  %707 = load i64, ptr %74, align 8, !tbaa !9
  %708 = udiv i64 %707, %706
  store i64 %708, ptr %74, align 8, !tbaa !9
  br label %709

709:                                              ; preds = %684
  %710 = load i64, ptr %76, align 8, !tbaa !9
  %711 = add i64 %710, 1
  store i64 %711, ptr %76, align 8, !tbaa !9
  br label %679, !llvm.loop !37

712:                                              ; preds = %683
  call void @llvm.lifetime.start.p0(i64 8, ptr %77) #11
  call void @llvm.memset.p0.i64(ptr align 4 %77, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %78) #11
  %713 = load i64, ptr %68, align 8, !tbaa !9
  store i64 %713, ptr %78, align 8, !tbaa !9
  br label %714

714:                                              ; preds = %852, %712
  %715 = load i64, ptr %78, align 8, !tbaa !9
  %716 = load i64, ptr %70, align 8, !tbaa !9
  %717 = icmp ult i64 %715, %716
  br i1 %717, label %719, label %718

718:                                              ; preds = %714
  store i32 68, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #11
  br label %855

719:                                              ; preds = %714
  call void @llvm.lifetime.start.p0(i64 8, ptr %79) #11
  %720 = load i64, ptr %78, align 8, !tbaa !9
  %721 = add i64 %720, 8
  %722 = load i64, ptr %70, align 8, !tbaa !9
  %723 = call i64 @min(i64 noundef %721, i64 noundef %722)
  store i64 %723, ptr %79, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %80) #11
  %724 = load i64, ptr %78, align 8, !tbaa !9
  store i64 %724, ptr %80, align 8, !tbaa !9
  br label %725

725:                                              ; preds = %822, %719
  %726 = load i64, ptr %80, align 8, !tbaa !9
  %727 = load i64, ptr %79, align 8, !tbaa !9
  %728 = icmp ult i64 %726, %727
  br i1 %728, label %730, label %729

729:                                              ; preds = %725
  store i32 71, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %80) #11
  br label %825

730:                                              ; preds = %725
  call void @llvm.lifetime.start.p0(i64 8, ptr %81) #11
  store i64 0, ptr %81, align 8, !tbaa !9
  br label %731

731:                                              ; preds = %754, %730
  %732 = load i64, ptr %81, align 8, !tbaa !9
  %733 = load i64, ptr %13, align 8, !tbaa !9
  %734 = icmp ult i64 %732, %733
  br i1 %734, label %736, label %735

735:                                              ; preds = %731
  store i32 74, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #11
  br label %757

736:                                              ; preds = %731
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #11
  %737 = load i64, ptr %80, align 8, !tbaa !9
  %738 = getelementptr inbounds [32 x [32 x i64]], ptr %45, i64 0, i64 %737
  %739 = load i64, ptr %81, align 8, !tbaa !9
  %740 = getelementptr inbounds [32 x i64], ptr %738, i64 0, i64 %739
  %741 = load i64, ptr %740, align 8, !tbaa !9
  store i64 %741, ptr %82, align 8, !tbaa !9
  %742 = load i64, ptr %82, align 8, !tbaa !9
  %743 = load ptr, ptr %11, align 8, !tbaa !5
  %744 = load i64, ptr %81, align 8, !tbaa !9
  %745 = getelementptr inbounds i64, ptr %743, i64 %744
  %746 = load i64, ptr %745, align 8, !tbaa !9
  %747 = getelementptr inbounds [32 x i64], ptr %53, i64 0, i64 %746
  store i64 %742, ptr %747, align 8, !tbaa !9
  %748 = load i64, ptr %82, align 8, !tbaa !9
  %749 = load ptr, ptr %12, align 8, !tbaa !5
  %750 = load i64, ptr %81, align 8, !tbaa !9
  %751 = getelementptr inbounds i64, ptr %749, i64 %750
  %752 = load i64, ptr %751, align 8, !tbaa !9
  %753 = getelementptr inbounds [32 x i64], ptr %54, i64 0, i64 %752
  store i64 %748, ptr %753, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #11
  br label %754

754:                                              ; preds = %736
  %755 = load i64, ptr %81, align 8, !tbaa !9
  %756 = add i64 %755, 1
  store i64 %756, ptr %81, align 8, !tbaa !9
  br label %731, !llvm.loop !38

757:                                              ; preds = %735
  %758 = getelementptr inbounds [32 x i64], ptr %53, i64 0, i64 0
  %759 = load i64, ptr %80, align 8, !tbaa !9
  %760 = load ptr, ptr %9, align 8, !tbaa !5
  %761 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %760, i32 0, i32 1
  %762 = load ptr, ptr %761, align 8, !tbaa !15
  %763 = load ptr, ptr %9, align 8, !tbaa !5
  %764 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %763, i32 0, i32 2
  %765 = load i64, ptr %764, align 8, !tbaa !11
  call void @linear_to_indices(ptr noundef %758, i64 noundef %759, ptr noundef %762, i64 noundef %765)
  %766 = getelementptr inbounds [32 x i64], ptr %54, i64 0, i64 0
  %767 = load i64, ptr %80, align 8, !tbaa !9
  %768 = load ptr, ptr %10, align 8, !tbaa !5
  %769 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %768, i32 0, i32 1
  %770 = load ptr, ptr %769, align 8, !tbaa !15
  %771 = load ptr, ptr %10, align 8, !tbaa !5
  %772 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %771, i32 0, i32 2
  %773 = load i64, ptr %772, align 8, !tbaa !11
  call void @linear_to_indices(ptr noundef %766, i64 noundef %767, ptr noundef %770, i64 noundef %773)
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #11
  %774 = getelementptr inbounds [32 x i64], ptr %53, i64 0, i64 0
  %775 = load ptr, ptr %29, align 8, !tbaa !5
  %776 = load ptr, ptr %9, align 8, !tbaa !5
  %777 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %776, i32 0, i32 2
  %778 = load i64, ptr %777, align 8, !tbaa !11
  %779 = call i64 @indices_to_linear(ptr noundef %774, ptr noundef %775, i64 noundef %778)
  store i64 %779, ptr %83, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %84) #11
  %780 = getelementptr inbounds [32 x i64], ptr %54, i64 0, i64 0
  %781 = load ptr, ptr %30, align 8, !tbaa !5
  %782 = load ptr, ptr %10, align 8, !tbaa !5
  %783 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %782, i32 0, i32 2
  %784 = load i64, ptr %783, align 8, !tbaa !11
  %785 = call i64 @indices_to_linear(ptr noundef %780, ptr noundef %781, i64 noundef %784)
  store i64 %785, ptr %84, align 8, !tbaa !9
  %786 = load i64, ptr %80, align 8, !tbaa !9
  %787 = add i64 %786, 1
  %788 = load i64, ptr %79, align 8, !tbaa !9
  %789 = icmp ult i64 %787, %788
  br i1 %789, label %790, label %803

790:                                              ; preds = %757
  %791 = load ptr, ptr %9, align 8, !tbaa !5
  %792 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %791, i32 0, i32 3
  %793 = load ptr, ptr %792, align 8, !tbaa !23
  %794 = load i64, ptr %83, align 8, !tbaa !9
  %795 = add i64 %794, 1
  %796 = getelementptr inbounds %struct.ComplexFloat, ptr %793, i64 %795
  call void @llvm.prefetch.p0(ptr %796, i32 0, i32 3, i32 1)
  %797 = load ptr, ptr %10, align 8, !tbaa !5
  %798 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %797, i32 0, i32 3
  %799 = load ptr, ptr %798, align 8, !tbaa !23
  %800 = load i64, ptr %84, align 8, !tbaa !9
  %801 = add i64 %800, 1
  %802 = getelementptr inbounds %struct.ComplexFloat, ptr %799, i64 %801
  call void @llvm.prefetch.p0(ptr %802, i32 0, i32 3, i32 1)
  br label %803

803:                                              ; preds = %790, %757
  call void @llvm.lifetime.start.p0(i64 8, ptr %85) #11
  %804 = load i64, ptr %80, align 8, !tbaa !9
  %805 = load i64, ptr %78, align 8, !tbaa !9
  %806 = sub i64 %804, %805
  store i64 %806, ptr %85, align 8, !tbaa !9
  %807 = load i64, ptr %85, align 8, !tbaa !9
  %808 = getelementptr inbounds %struct.ComplexFloat, ptr %560, i64 %807
  call void @llvm.lifetime.start.p0(i64 8, ptr %86) #11
  %809 = load ptr, ptr %9, align 8, !tbaa !5
  %810 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %809, i32 0, i32 3
  %811 = load ptr, ptr %810, align 8, !tbaa !23
  %812 = load i64, ptr %83, align 8, !tbaa !9
  %813 = getelementptr inbounds %struct.ComplexFloat, ptr %811, i64 %812
  %814 = load ptr, ptr %10, align 8, !tbaa !5
  %815 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %814, i32 0, i32 3
  %816 = load ptr, ptr %815, align 8, !tbaa !23
  %817 = load i64, ptr %84, align 8, !tbaa !9
  %818 = getelementptr inbounds %struct.ComplexFloat, ptr %816, i64 %817
  %819 = load <2 x float>, ptr %813, align 4
  %820 = load <2 x float>, ptr %818, align 4
  %821 = call <2 x float> @complex_float_multiply(<2 x float> %819, <2 x float> %820)
  store <2 x float> %821, ptr %86, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %808, ptr align 4 %86, i64 8, i1 false), !tbaa.struct !39
  call void @llvm.lifetime.end.p0(i64 8, ptr %86) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %85) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %84) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #11
  br label %822

822:                                              ; preds = %803
  %823 = load i64, ptr %80, align 8, !tbaa !9
  %824 = add i64 %823, 1
  store i64 %824, ptr %80, align 8, !tbaa !9
  br label %725, !llvm.loop !42

825:                                              ; preds = %729
  call void @llvm.lifetime.start.p0(i64 8, ptr %87) #11
  store i64 0, ptr %87, align 8, !tbaa !9
  br label %826

826:                                              ; preds = %848, %825
  %827 = load i64, ptr %87, align 8, !tbaa !9
  %828 = load i64, ptr %79, align 8, !tbaa !9
  %829 = load i64, ptr %78, align 8, !tbaa !9
  %830 = sub i64 %828, %829
  %831 = icmp ult i64 %827, %830
  br i1 %831, label %833, label %832

832:                                              ; preds = %826
  store i32 77, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %87) #11
  br label %851

833:                                              ; preds = %826
  %834 = load i64, ptr %87, align 8, !tbaa !9
  %835 = getelementptr inbounds %struct.ComplexFloat, ptr %560, i64 %834
  %836 = getelementptr inbounds %struct.ComplexFloat, ptr %835, i32 0, i32 0
  %837 = load float, ptr %836, align 8, !tbaa !43
  %838 = getelementptr inbounds %struct.ComplexFloat, ptr %77, i32 0, i32 0
  %839 = load float, ptr %838, align 4, !tbaa !43
  %840 = fadd float %839, %837
  store float %840, ptr %838, align 4, !tbaa !43
  %841 = load i64, ptr %87, align 8, !tbaa !9
  %842 = getelementptr inbounds %struct.ComplexFloat, ptr %560, i64 %841
  %843 = getelementptr inbounds %struct.ComplexFloat, ptr %842, i32 0, i32 1
  %844 = load float, ptr %843, align 4, !tbaa !45
  %845 = getelementptr inbounds %struct.ComplexFloat, ptr %77, i32 0, i32 1
  %846 = load float, ptr %845, align 4, !tbaa !45
  %847 = fadd float %846, %844
  store float %847, ptr %845, align 4, !tbaa !45
  br label %848

848:                                              ; preds = %833
  %849 = load i64, ptr %87, align 8, !tbaa !9
  %850 = add i64 %849, 1
  store i64 %850, ptr %87, align 8, !tbaa !9
  br label %826, !llvm.loop !46

851:                                              ; preds = %832
  call void @llvm.lifetime.end.p0(i64 8, ptr %79) #11
  br label %852

852:                                              ; preds = %851
  %853 = load i64, ptr %78, align 8, !tbaa !9
  %854 = add i64 %853, 8
  store i64 %854, ptr %78, align 8, !tbaa !9
  br label %714, !llvm.loop !47

855:                                              ; preds = %718
  %856 = getelementptr inbounds %struct.ComplexFloat, ptr %77, i32 0, i32 0
  %857 = load float, ptr %856, align 4, !tbaa !43
  %858 = load ptr, ptr %52, align 8, !tbaa !5
  %859 = load i64, ptr %73, align 8, !tbaa !9
  %860 = getelementptr inbounds %struct.ComplexFloat, ptr %858, i64 %859
  %861 = getelementptr inbounds %struct.ComplexFloat, ptr %860, i32 0, i32 0
  %862 = load float, ptr %861, align 4, !tbaa !43
  %863 = fadd float %862, %857
  store float %863, ptr %861, align 4, !tbaa !43
  %864 = getelementptr inbounds %struct.ComplexFloat, ptr %77, i32 0, i32 1
  %865 = load float, ptr %864, align 4, !tbaa !45
  %866 = load ptr, ptr %52, align 8, !tbaa !5
  %867 = load i64, ptr %73, align 8, !tbaa !9
  %868 = getelementptr inbounds %struct.ComplexFloat, ptr %866, i64 %867
  %869 = getelementptr inbounds %struct.ComplexFloat, ptr %868, i32 0, i32 1
  %870 = load float, ptr %869, align 4, !tbaa !45
  %871 = fadd float %870, %865
  store float %871, ptr %869, align 4, !tbaa !45
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #11
  br label %872

872:                                              ; preds = %855
  %873 = load i64, ptr %73, align 8, !tbaa !9
  %874 = add i64 %873, 1
  store i64 %874, ptr %73, align 8, !tbaa !9
  br label %637, !llvm.loop !48

875:                                              ; preds = %641
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #11
  br label %876

876:                                              ; preds = %875
  %877 = load i64, ptr %71, align 8, !tbaa !9
  %878 = add i64 %877, 8
  store i64 %878, ptr %71, align 8, !tbaa !9
  br label %626, !llvm.loop !49

879:                                              ; preds = %630
  call void @llvm.lifetime.end.p0(i64 8, ptr %70) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #11
  br label %880

880:                                              ; preds = %879
  %881 = load i64, ptr %68, align 8, !tbaa !9
  %882 = add i64 %881, 32
  store i64 %882, ptr %68, align 8, !tbaa !9
  br label %611, !llvm.loop !50

883:                                              ; preds = %615
  br label %884

884:                                              ; preds = %883
  %885 = load i64, ptr %67, align 8, !tbaa !9
  %886 = add i64 %885, 32
  store i64 %886, ptr %67, align 8, !tbaa !9
  br label %604, !llvm.loop !51

887:                                              ; preds = %608
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #11
  br label %888

888:                                              ; preds = %887
  %889 = load i64, ptr %64, align 8, !tbaa !9
  %890 = add i64 %889, 128
  store i64 %890, ptr %64, align 8, !tbaa !9
  br label %589, !llvm.loop !52

891:                                              ; preds = %593
  br label %892

892:                                              ; preds = %891
  %893 = load i64, ptr %63, align 8, !tbaa !9
  %894 = add i64 %893, 128
  store i64 %894, ptr %63, align 8, !tbaa !9
  br label %582, !llvm.loop !53

895:                                              ; preds = %586
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #11
  br label %896

896:                                              ; preds = %895
  %897 = load i64, ptr %60, align 8, !tbaa !9
  %898 = add i64 %897, 512
  store i64 %898, ptr %60, align 8, !tbaa !9
  br label %567, !llvm.loop !54

899:                                              ; preds = %571
  br label %900

900:                                              ; preds = %899
  %901 = load i64, ptr %59, align 8, !tbaa !9
  %902 = add i64 %901, 512
  store i64 %902, ptr %59, align 8, !tbaa !9
  br label %561, !llvm.loop !55

903:                                              ; preds = %565
  %904 = load ptr, ptr %58, align 8
  call void @llvm.stackrestore.p0(ptr %904)
  call void @llvm.lifetime.end.p0(i64 4096, ptr %57) #11
  call void @llvm.lifetime.end.p0(i64 1024, ptr %56) #11
  call void @llvm.lifetime.end.p0(i64 256, ptr %55) #11
  call void @llvm.lifetime.end.p0(i64 256, ptr %54) #11
  call void @llvm.lifetime.end.p0(i64 256, ptr %53) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %88) #11
  store i64 0, ptr %88, align 8, !tbaa !9
  br label %905

905:                                              ; preds = %950, %903
  %906 = load i64, ptr %88, align 8, !tbaa !9
  %907 = load i64, ptr %24, align 8, !tbaa !9
  %908 = icmp ult i64 %906, %907
  br i1 %908, label %910, label %909

909:                                              ; preds = %905
  store i32 80, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #11
  br label %953

910:                                              ; preds = %905
  call void @llvm.lifetime.start.p0(i64 8, ptr %89) #11
  call void @llvm.memset.p0.i64(ptr align 4 %89, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %90) #11
  store i64 0, ptr %90, align 8, !tbaa !9
  br label %911

911:                                              ; preds = %941, %910
  %912 = load i64, ptr %90, align 8, !tbaa !9
  %913 = load i64, ptr %49, align 8, !tbaa !9
  %914 = icmp ult i64 %912, %913
  br i1 %914, label %916, label %915

915:                                              ; preds = %911
  store i32 83, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %90) #11
  br label %944

916:                                              ; preds = %911
  %917 = load ptr, ptr %50, align 8, !tbaa !5
  %918 = load i64, ptr %90, align 8, !tbaa !9
  %919 = load i64, ptr %24, align 8, !tbaa !9
  %920 = mul i64 %918, %919
  %921 = load i64, ptr %88, align 8, !tbaa !9
  %922 = add i64 %920, %921
  %923 = getelementptr inbounds %struct.ComplexFloat, ptr %917, i64 %922
  %924 = getelementptr inbounds %struct.ComplexFloat, ptr %923, i32 0, i32 0
  %925 = load float, ptr %924, align 4, !tbaa !43
  %926 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i32 0, i32 0
  %927 = load float, ptr %926, align 4, !tbaa !43
  %928 = fadd float %927, %925
  store float %928, ptr %926, align 4, !tbaa !43
  %929 = load ptr, ptr %50, align 8, !tbaa !5
  %930 = load i64, ptr %90, align 8, !tbaa !9
  %931 = load i64, ptr %24, align 8, !tbaa !9
  %932 = mul i64 %930, %931
  %933 = load i64, ptr %88, align 8, !tbaa !9
  %934 = add i64 %932, %933
  %935 = getelementptr inbounds %struct.ComplexFloat, ptr %929, i64 %934
  %936 = getelementptr inbounds %struct.ComplexFloat, ptr %935, i32 0, i32 1
  %937 = load float, ptr %936, align 4, !tbaa !45
  %938 = getelementptr inbounds %struct.ComplexFloat, ptr %89, i32 0, i32 1
  %939 = load float, ptr %938, align 4, !tbaa !45
  %940 = fadd float %939, %937
  store float %940, ptr %938, align 4, !tbaa !45
  br label %941

941:                                              ; preds = %916
  %942 = load i64, ptr %90, align 8, !tbaa !9
  %943 = add i64 %942, 1
  store i64 %943, ptr %90, align 8, !tbaa !9
  br label %911, !llvm.loop !56

944:                                              ; preds = %915
  %945 = load ptr, ptr %8, align 8, !tbaa !5
  %946 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %945, i32 0, i32 3
  %947 = load ptr, ptr %946, align 8, !tbaa !23
  %948 = load i64, ptr %88, align 8, !tbaa !9
  %949 = getelementptr inbounds %struct.ComplexFloat, ptr %947, i64 %948
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %949, ptr align 4 %89, i64 8, i1 false), !tbaa.struct !39
  call void @llvm.lifetime.end.p0(i64 8, ptr %89) #11
  br label %950

950:                                              ; preds = %944
  %951 = load i64, ptr %88, align 8, !tbaa !9
  %952 = add i64 %951, 1
  store i64 %952, ptr %88, align 8, !tbaa !9
  br label %905, !llvm.loop !57

953:                                              ; preds = %909
  %954 = load ptr, ptr %50, align 8, !tbaa !5
  call void @free(ptr noundef %954) #11
  %955 = load ptr, ptr %29, align 8, !tbaa !5
  call void @free(ptr noundef %955) #11
  %956 = load ptr, ptr %30, align 8, !tbaa !5
  call void @free(ptr noundef %956) #11
  store i32 0, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %957

957:                                              ; preds = %953, %532
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #11
  call void @llvm.lifetime.end.p0(i64 8192, ptr %45) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #11
  call void @llvm.lifetime.end.p0(i64 256, ptr %36) #11
  call void @llvm.lifetime.end.p0(i64 256, ptr %35) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #11
  br label %958

958:                                              ; preds = %957, %371
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #11
  br label %959

959:                                              ; preds = %958, %200
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #11
  br label %960

960:                                              ; preds = %959, %183
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #11
  br label %961

961:                                              ; preds = %960, %165, %113, %109, %105, %101, %97, %93
  %962 = load i32, ptr %7, align 4
  ret i32 %962

963:                                              ; preds = %165
  unreachable
}

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #10

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #10

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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite) }
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 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 #10 = { nocallback nofree nosync nounwind willreturn }
attributes #11 = { nounwind }
attributes #12 = { 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, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !10, i64 16}
!12 = !{!"quantum_geometric_tensor_t", !13, i64 0, !6, i64 8, !10, i64 16, !6, i64 24, !6, i64 32, !14, i64 40, !14, i64 41, !14, i64 42, !13, i64 44, !10, i64 48, !10, i64 56}
!13 = !{!"int", !7, i64 0}
!14 = !{!"_Bool", !7, i64 0}
!15 = !{!12, !6, i64 8}
!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 = !{!12, !6, i64 24}
!24 = !{!12, !10, i64 48}
!25 = !{!12, !10, i64 56}
!26 = !{!14, !14, i64 0}
!27 = distinct !{!27, !17}
!28 = !{i8 0, i8 2}
!29 = !{}
!30 = distinct !{!30, !17}
!31 = distinct !{!31, !17}
!32 = distinct !{!32, !17}
!33 = distinct !{!33, !17}
!34 = distinct !{!34, !17}
!35 = !{!13, !13, i64 0}
!36 = distinct !{!36, !17}
!37 = distinct !{!37, !17}
!38 = distinct !{!38, !17}
!39 = !{i64 0, i64 4, !40, i64 4, i64 4, !40}
!40 = !{!41, !41, i64 0}
!41 = !{!"float", !7, i64 0}
!42 = distinct !{!42, !17}
!43 = !{!44, !41, i64 0}
!44 = !{!"", !41, i64 0, !41, i64 4}
!45 = !{!44, !41, i64 4}
!46 = distinct !{!46, !17}
!47 = distinct !{!47, !17}
!48 = distinct !{!48, !17}
!49 = distinct !{!49, !17}
!50 = distinct !{!50, !17}
!51 = distinct !{!51, !17}
!52 = distinct !{!52, !17}
!53 = distinct !{!53, !17}
!54 = distinct !{!54, !17}
!55 = distinct !{!55, !17}
!56 = distinct !{!56, !17}
!57 = distinct !{!57, !17}


; 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 nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

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

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @llvm.prefetch.p0(ptr nocapture readonly, i32 immarg, i32 immarg, i32 immarg) #3

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @min(i64 noundef, i64 noundef) 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 #6

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

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

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 -2, 1) i32 @geometric_tensor_contract(ptr noundef %0, ptr noundef readonly %1, ptr noundef readonly %2, ptr noundef readonly %3, ptr noundef readonly %4, i64 noundef %5) local_unnamed_addr #8 {
  %7 = alloca [32 x i64], align 16
  %8 = alloca [32 x i64], align 16
  %9 = alloca [32 x [32 x i64]], align 16
  %10 = alloca [32 x i64], align 16
  %11 = alloca [32 x i64], align 16
  %12 = insertelement <4 x ptr> poison, ptr %0, i64 0
  %13 = insertelement <4 x ptr> %12, ptr %1, i64 1
  %14 = insertelement <4 x ptr> %13, ptr %2, i64 2
  %15 = insertelement <4 x ptr> %14, ptr %3, i64 3
  %16 = icmp eq <4 x ptr> %15, zeroinitializer
  %17 = icmp eq ptr %4, null
  %.not = icmp eq i64 %5, 0
  %18 = bitcast <4 x i1> %16 to i4
  %19 = icmp ne i4 %18, 0
  %op.rdx = or i1 %19, %17
  %op.rdx609 = or i1 %op.rdx, %.not
  br i1 %op.rdx609, label %.thread, label %.preheader411

.preheader411:                                    ; preds = %6
  %20 = getelementptr inbounds i8, ptr %1, i64 16
  %21 = load i64, ptr %20, align 8, !tbaa !5
  %22 = getelementptr inbounds i8, ptr %2, i64 16
  %23 = getelementptr inbounds i8, ptr %1, i64 8
  %24 = getelementptr inbounds i8, ptr %2, i64 8
  br label %27

25:                                               ; preds = %36
  %26 = add nuw i64 %.0314412, 1
  %exitcond.not = icmp eq i64 %26, %5
  br i1 %exitcond.not, label %44, label %27, !llvm.loop !13

27:                                               ; preds = %.preheader411, %25
  %.0314412 = phi i64 [ 0, %.preheader411 ], [ %26, %25 ]
  %28 = getelementptr inbounds i64, ptr %3, i64 %.0314412
  %29 = load i64, ptr %28, align 8, !tbaa !15
  %30 = icmp ult i64 %29, %21
  br i1 %30, label %31, label %.thread

31:                                               ; preds = %27
  %32 = getelementptr inbounds i64, ptr %4, i64 %.0314412
  %33 = load i64, ptr %32, align 8, !tbaa !15
  %34 = load i64, ptr %22, align 8, !tbaa !5
  %35 = icmp ult i64 %33, %34
  br i1 %35, label %36, label %.thread

36:                                               ; preds = %31
  %37 = load ptr, ptr %23, align 8, !tbaa !16
  %38 = getelementptr inbounds i64, ptr %37, i64 %29
  %39 = load i64, ptr %38, align 8, !tbaa !15
  %40 = load ptr, ptr %24, align 8, !tbaa !16
  %41 = getelementptr inbounds i64, ptr %40, i64 %33
  %42 = load i64, ptr %41, align 8, !tbaa !15
  %43 = icmp eq i64 %39, %42
  br i1 %43, label %25, label %.thread

44:                                               ; preds = %25
  %45 = shl i64 %5, 1
  %46 = sub i64 %21, %45
  %47 = add i64 %46, %34
  %48 = shl i64 %47, 3
  %49 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %48) #11
  %.not378 = icmp eq ptr %49, null
  br i1 %.not378, label %.thread, label %50

50:                                               ; preds = %44
  %51 = shl i64 %21, 3
  %52 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %51) #11
  %53 = shl i64 %34, 3
  %54 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %53) #11
  %55 = icmp ne ptr %52, null
  %56 = icmp ne ptr %54, null
  %or.cond = and i1 %55, %56
  br i1 %or.cond, label %.lr.ph.preheader, label %57

57:                                               ; preds = %50
  tail call void @free(ptr noundef nonnull %49) #12
  tail call void @free(ptr noundef %52) #12
  tail call void @free(ptr noundef %54) #12
  br label %.thread

.lr.ph.preheader:                                 ; preds = %50
  tail call void @llvm.memset.p0.i64(ptr nonnull align 64 %52, i8 -1, i64 %51, i1 false)
  tail call void @llvm.memset.p0.i64(ptr nonnull align 64 %54, i8 -1, i64 %53, i1 false)
  %58 = add i64 %5, -1
  %xtraiter = and i64 %5, 1
  %59 = icmp eq i64 %58, 0
  br i1 %59, label %.lr.ph416.preheader.unr-lcssa, label %.lr.ph.preheader.new

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

.lr.ph:                                           ; preds = %.lr.ph, %.lr.ph.preheader.new
  %.0316413 = phi i64 [ 0, %.lr.ph.preheader.new ], [ %73, %.lr.ph ]
  %niter = phi i64 [ 0, %.lr.ph.preheader.new ], [ %niter.next.1, %.lr.ph ]
  %60 = getelementptr inbounds i64, ptr %3, i64 %.0316413
  %61 = load i64, ptr %60, align 8, !tbaa !15
  %62 = getelementptr inbounds i64, ptr %52, i64 %61
  store i64 %.0316413, ptr %62, align 8, !tbaa !15
  %63 = getelementptr inbounds i64, ptr %4, i64 %.0316413
  %64 = load i64, ptr %63, align 8, !tbaa !15
  %65 = getelementptr inbounds i64, ptr %54, i64 %64
  store i64 %.0316413, ptr %65, align 8, !tbaa !15
  %66 = or disjoint i64 %.0316413, 1
  %67 = getelementptr inbounds i64, ptr %3, i64 %66
  %68 = load i64, ptr %67, align 8, !tbaa !15
  %69 = getelementptr inbounds i64, ptr %52, i64 %68
  store i64 %66, ptr %69, align 8, !tbaa !15
  %70 = getelementptr inbounds i64, ptr %4, i64 %66
  %71 = load i64, ptr %70, align 8, !tbaa !15
  %72 = getelementptr inbounds i64, ptr %54, i64 %71
  store i64 %66, ptr %72, align 8, !tbaa !15
  %73 = add nuw i64 %.0316413, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.lr.ph416.preheader.unr-lcssa, label %.lr.ph, !llvm.loop !17

.lr.ph416.preheader.unr-lcssa:                    ; preds = %.lr.ph, %.lr.ph.preheader
  %.0316413.unr = phi i64 [ 0, %.lr.ph.preheader ], [ %73, %.lr.ph ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph416.preheader, label %.lr.ph.epil

.lr.ph.epil:                                      ; preds = %.lr.ph416.preheader.unr-lcssa
  %74 = getelementptr inbounds i64, ptr %3, i64 %.0316413.unr
  %75 = load i64, ptr %74, align 8, !tbaa !15
  %76 = getelementptr inbounds i64, ptr %52, i64 %75
  store i64 %.0316413.unr, ptr %76, align 8, !tbaa !15
  %77 = getelementptr inbounds i64, ptr %4, i64 %.0316413.unr
  %78 = load i64, ptr %77, align 8, !tbaa !15
  %79 = getelementptr inbounds i64, ptr %54, i64 %78
  store i64 %.0316413.unr, ptr %79, align 8, !tbaa !15
  br label %.lr.ph416.preheader

.lr.ph416.preheader:                              ; preds = %.lr.ph416.preheader.unr-lcssa, %.lr.ph.epil
  %xtraiter618 = and i64 %21, 1
  %80 = icmp eq i64 %21, 1
  br i1 %80, label %.lr.ph419.preheader.unr-lcssa, label %.lr.ph416.preheader.new

.lr.ph416.preheader.new:                          ; preds = %.lr.ph416.preheader
  %unroll_iter621 = and i64 %21, -2
  br label %.lr.ph416

.lr.ph416:                                        ; preds = %98, %.lr.ph416.preheader.new
  %.0317415 = phi i64 [ 0, %.lr.ph416.preheader.new ], [ %.1318.1, %98 ]
  %.0323414 = phi i64 [ 0, %.lr.ph416.preheader.new ], [ %99, %98 ]
  %niter622 = phi i64 [ 0, %.lr.ph416.preheader.new ], [ %niter622.next.1, %98 ]
  %81 = getelementptr inbounds i64, ptr %52, i64 %.0323414
  %82 = load i64, ptr %81, align 16, !tbaa !15
  %83 = icmp eq i64 %82, -1
  br i1 %83, label %84, label %.lr.ph416.1

84:                                               ; preds = %.lr.ph416
  %85 = getelementptr inbounds i64, ptr %37, i64 %.0323414
  %86 = load i64, ptr %85, align 8, !tbaa !15
  %87 = add i64 %.0317415, 1
  %88 = getelementptr inbounds i64, ptr %49, i64 %.0317415
  store i64 %86, ptr %88, align 8, !tbaa !15
  br label %.lr.ph416.1

.lr.ph416.1:                                      ; preds = %.lr.ph416, %84
  %.1318 = phi i64 [ %87, %84 ], [ %.0317415, %.lr.ph416 ]
  %89 = or disjoint i64 %.0323414, 1
  %90 = getelementptr inbounds i64, ptr %52, i64 %89
  %91 = load i64, ptr %90, align 8, !tbaa !15
  %92 = icmp eq i64 %91, -1
  br i1 %92, label %93, label %98

93:                                               ; preds = %.lr.ph416.1
  %94 = getelementptr inbounds i64, ptr %37, i64 %89
  %95 = load i64, ptr %94, align 8, !tbaa !15
  %96 = add i64 %.1318, 1
  %97 = getelementptr inbounds i64, ptr %49, i64 %.1318
  store i64 %95, ptr %97, align 8, !tbaa !15
  br label %98

98:                                               ; preds = %93, %.lr.ph416.1
  %.1318.1 = phi i64 [ %96, %93 ], [ %.1318, %.lr.ph416.1 ]
  %99 = add nuw i64 %.0323414, 2
  %niter622.next.1 = add i64 %niter622, 2
  %niter622.ncmp.1 = icmp eq i64 %niter622.next.1, %unroll_iter621
  br i1 %niter622.ncmp.1, label %.lr.ph419.preheader.unr-lcssa, label %.lr.ph416, !llvm.loop !18

.lr.ph419.preheader.unr-lcssa:                    ; preds = %98, %.lr.ph416.preheader
  %.1318.lcssa.ph = phi i64 [ poison, %.lr.ph416.preheader ], [ %.1318.1, %98 ]
  %.0317415.unr = phi i64 [ 0, %.lr.ph416.preheader ], [ %.1318.1, %98 ]
  %.0323414.unr = phi i64 [ 0, %.lr.ph416.preheader ], [ %99, %98 ]
  %lcmp.mod619.not = icmp eq i64 %xtraiter618, 0
  br i1 %lcmp.mod619.not, label %.lr.ph419.preheader, label %.lr.ph416.epil

.lr.ph416.epil:                                   ; preds = %.lr.ph419.preheader.unr-lcssa
  %100 = getelementptr inbounds i64, ptr %52, i64 %.0323414.unr
  %101 = load i64, ptr %100, align 8, !tbaa !15
  %102 = icmp eq i64 %101, -1
  br i1 %102, label %103, label %.lr.ph419.preheader

103:                                              ; preds = %.lr.ph416.epil
  %104 = getelementptr inbounds i64, ptr %37, i64 %.0323414.unr
  %105 = load i64, ptr %104, align 8, !tbaa !15
  %106 = add i64 %.0317415.unr, 1
  %107 = getelementptr inbounds i64, ptr %49, i64 %.0317415.unr
  store i64 %105, ptr %107, align 8, !tbaa !15
  br label %.lr.ph419.preheader

.lr.ph419.preheader:                              ; preds = %.lr.ph416.epil, %103, %.lr.ph419.preheader.unr-lcssa
  %.1318.lcssa = phi i64 [ %.1318.lcssa.ph, %.lr.ph419.preheader.unr-lcssa ], [ %106, %103 ], [ %.0317415.unr, %.lr.ph416.epil ]
  %xtraiter623 = and i64 %34, 1
  %108 = icmp eq i64 %34, 1
  br i1 %108, label %._crit_edge.unr-lcssa, label %.lr.ph419.preheader.new

.lr.ph419.preheader.new:                          ; preds = %.lr.ph419.preheader
  %unroll_iter625 = and i64 %34, -2
  br label %.lr.ph419

._crit_edge.unr-lcssa:                            ; preds = %136, %.lr.ph419.preheader
  %.2319418.unr = phi i64 [ %.1318.lcssa, %.lr.ph419.preheader ], [ %.3320.1, %136 ]
  %.0330417.unr = phi i64 [ 0, %.lr.ph419.preheader ], [ %137, %136 ]
  %lcmp.mod624.not = icmp eq i64 %xtraiter623, 0
  br i1 %lcmp.mod624.not, label %._crit_edge, label %.lr.ph419.epil

.lr.ph419.epil:                                   ; preds = %._crit_edge.unr-lcssa
  %109 = getelementptr inbounds i64, ptr %54, i64 %.0330417.unr
  %110 = load i64, ptr %109, align 8, !tbaa !15
  %111 = icmp eq i64 %110, -1
  br i1 %111, label %112, label %._crit_edge

112:                                              ; preds = %.lr.ph419.epil
  %113 = getelementptr inbounds i64, ptr %40, i64 %.0330417.unr
  %114 = load i64, ptr %113, align 8, !tbaa !15
  %115 = getelementptr inbounds i64, ptr %49, i64 %.2319418.unr
  store i64 %114, ptr %115, align 8, !tbaa !15
  br label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph419.epil, %112, %._crit_edge.unr-lcssa
  tail call void @free(ptr noundef %52) #12
  tail call void @free(ptr noundef nonnull %54) #12
  %.not538 = icmp eq i64 %47, 0
  br i1 %.not538, label %.lr.ph427, label %.lr.ph423.preheader

.lr.ph423.preheader:                              ; preds = %._crit_edge
  %xtraiter627 = and i64 %47, 7
  %116 = add i64 %21, %34
  %117 = sub i64 %45, %116
  %118 = icmp ugt i64 %117, -8
  br i1 %118, label %.lr.ph427.loopexit.unr-lcssa, label %.lr.ph423.preheader.new

.lr.ph423.preheader.new:                          ; preds = %.lr.ph423.preheader
  %unroll_iter630 = and i64 %47, -8
  br label %.lr.ph423

.lr.ph419:                                        ; preds = %136, %.lr.ph419.preheader.new
  %.2319418 = phi i64 [ %.1318.lcssa, %.lr.ph419.preheader.new ], [ %.3320.1, %136 ]
  %.0330417 = phi i64 [ 0, %.lr.ph419.preheader.new ], [ %137, %136 ]
  %niter626 = phi i64 [ 0, %.lr.ph419.preheader.new ], [ %niter626.next.1, %136 ]
  %119 = getelementptr inbounds i64, ptr %54, i64 %.0330417
  %120 = load i64, ptr %119, align 16, !tbaa !15
  %121 = icmp eq i64 %120, -1
  br i1 %121, label %122, label %.lr.ph419.1

122:                                              ; preds = %.lr.ph419
  %123 = getelementptr inbounds i64, ptr %40, i64 %.0330417
  %124 = load i64, ptr %123, align 8, !tbaa !15
  %125 = add i64 %.2319418, 1
  %126 = getelementptr inbounds i64, ptr %49, i64 %.2319418
  store i64 %124, ptr %126, align 8, !tbaa !15
  br label %.lr.ph419.1

.lr.ph419.1:                                      ; preds = %.lr.ph419, %122
  %.3320 = phi i64 [ %125, %122 ], [ %.2319418, %.lr.ph419 ]
  %127 = or disjoint i64 %.0330417, 1
  %128 = getelementptr inbounds i64, ptr %54, i64 %127
  %129 = load i64, ptr %128, align 8, !tbaa !15
  %130 = icmp eq i64 %129, -1
  br i1 %130, label %131, label %136

131:                                              ; preds = %.lr.ph419.1
  %132 = getelementptr inbounds i64, ptr %40, i64 %127
  %133 = load i64, ptr %132, align 8, !tbaa !15
  %134 = add i64 %.3320, 1
  %135 = getelementptr inbounds i64, ptr %49, i64 %.3320
  store i64 %133, ptr %135, align 8, !tbaa !15
  br label %136

136:                                              ; preds = %131, %.lr.ph419.1
  %.3320.1 = phi i64 [ %134, %131 ], [ %.3320, %.lr.ph419.1 ]
  %137 = add nuw i64 %.0330417, 2
  %niter626.next.1 = add i64 %niter626, 2
  %niter626.ncmp.1 = icmp eq i64 %niter626.next.1, %unroll_iter625
  br i1 %niter626.ncmp.1, label %._crit_edge.unr-lcssa, label %.lr.ph419, !llvm.loop !19

.lr.ph427.loopexit.unr-lcssa:                     ; preds = %.lr.ph423, %.lr.ph423.preheader
  %.lcssa614.ph = phi i64 [ poison, %.lr.ph423.preheader ], [ %173, %.lr.ph423 ]
  %.0332421.unr = phi i64 [ 1, %.lr.ph423.preheader ], [ %173, %.lr.ph423 ]
  %.0333420.unr = phi i64 [ 0, %.lr.ph423.preheader ], [ %174, %.lr.ph423 ]
  %lcmp.mod628.not = icmp eq i64 %xtraiter627, 0
  br i1 %lcmp.mod628.not, label %.lr.ph427, label %.lr.ph423.epil

.lr.ph423.epil:                                   ; preds = %.lr.ph427.loopexit.unr-lcssa, %.lr.ph423.epil
  %.0332421.epil = phi i64 [ %140, %.lr.ph423.epil ], [ %.0332421.unr, %.lr.ph427.loopexit.unr-lcssa ]
  %.0333420.epil = phi i64 [ %141, %.lr.ph423.epil ], [ %.0333420.unr, %.lr.ph427.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph423.epil ], [ 0, %.lr.ph427.loopexit.unr-lcssa ]
  %138 = getelementptr inbounds i64, ptr %49, i64 %.0333420.epil
  %139 = load i64, ptr %138, align 8, !tbaa !15
  %140 = mul i64 %139, %.0332421.epil
  %141 = add nuw i64 %.0333420.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter627
  br i1 %epil.iter.cmp.not, label %.lr.ph427, label %.lr.ph423.epil, !llvm.loop !20

.lr.ph427:                                        ; preds = %.lr.ph427.loopexit.unr-lcssa, %.lr.ph423.epil, %._crit_edge
  %.0332.lcssa = phi i64 [ 1, %._crit_edge ], [ %.lcssa614.ph, %.lr.ph427.loopexit.unr-lcssa ], [ %140, %.lr.ph423.epil ]
  %xtraiter632 = and i64 %5, 3
  %142 = icmp ult i64 %58, 3
  br i1 %142, label %._crit_edge428.unr-lcssa, label %.lr.ph427.new

.lr.ph427.new:                                    ; preds = %.lr.ph427
  %unroll_iter636 = and i64 %5, -4
  br label %198

.lr.ph423:                                        ; preds = %.lr.ph423, %.lr.ph423.preheader.new
  %.0332421 = phi i64 [ 1, %.lr.ph423.preheader.new ], [ %173, %.lr.ph423 ]
  %.0333420 = phi i64 [ 0, %.lr.ph423.preheader.new ], [ %174, %.lr.ph423 ]
  %niter631 = phi i64 [ 0, %.lr.ph423.preheader.new ], [ %niter631.next.7, %.lr.ph423 ]
  %143 = getelementptr inbounds i64, ptr %49, i64 %.0333420
  %144 = load i64, ptr %143, align 64, !tbaa !15
  %145 = mul i64 %144, %.0332421
  %146 = or disjoint i64 %.0333420, 1
  %147 = getelementptr inbounds i64, ptr %49, i64 %146
  %148 = load i64, ptr %147, align 8, !tbaa !15
  %149 = mul i64 %148, %145
  %150 = or disjoint i64 %.0333420, 2
  %151 = getelementptr inbounds i64, ptr %49, i64 %150
  %152 = load i64, ptr %151, align 16, !tbaa !15
  %153 = mul i64 %152, %149
  %154 = or disjoint i64 %.0333420, 3
  %155 = getelementptr inbounds i64, ptr %49, i64 %154
  %156 = load i64, ptr %155, align 8, !tbaa !15
  %157 = mul i64 %156, %153
  %158 = or disjoint i64 %.0333420, 4
  %159 = getelementptr inbounds i64, ptr %49, i64 %158
  %160 = load i64, ptr %159, align 32, !tbaa !15
  %161 = mul i64 %160, %157
  %162 = or disjoint i64 %.0333420, 5
  %163 = getelementptr inbounds i64, ptr %49, i64 %162
  %164 = load i64, ptr %163, align 8, !tbaa !15
  %165 = mul i64 %164, %161
  %166 = or disjoint i64 %.0333420, 6
  %167 = getelementptr inbounds i64, ptr %49, i64 %166
  %168 = load i64, ptr %167, align 16, !tbaa !15
  %169 = mul i64 %168, %165
  %170 = or disjoint i64 %.0333420, 7
  %171 = getelementptr inbounds i64, ptr %49, i64 %170
  %172 = load i64, ptr %171, align 8, !tbaa !15
  %173 = mul i64 %172, %169
  %174 = add nuw i64 %.0333420, 8
  %niter631.next.7 = add i64 %niter631, 8
  %niter631.ncmp.7.not = icmp eq i64 %niter631.next.7, %unroll_iter630
  br i1 %niter631.ncmp.7.not, label %.lr.ph427.loopexit.unr-lcssa, label %.lr.ph423, !llvm.loop !22

._crit_edge428.unr-lcssa:                         ; preds = %198, %.lr.ph427
  %.lcssa613.ph = phi i64 [ poison, %.lr.ph427 ], [ %221, %198 ]
  %.0336426.unr = phi i64 [ 1, %.lr.ph427 ], [ %221, %198 ]
  %.0337425.unr = phi i64 [ 0, %.lr.ph427 ], [ %222, %198 ]
  %lcmp.mod634.not = icmp eq i64 %xtraiter632, 0
  br i1 %lcmp.mod634.not, label %._crit_edge428, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge428.unr-lcssa, %.epil.preheader
  %.0336426.epil = phi i64 [ %179, %.epil.preheader ], [ %.0336426.unr, %._crit_edge428.unr-lcssa ]
  %.0337425.epil = phi i64 [ %180, %.epil.preheader ], [ %.0337425.unr, %._crit_edge428.unr-lcssa ]
  %epil.iter633 = phi i64 [ %epil.iter633.next, %.epil.preheader ], [ 0, %._crit_edge428.unr-lcssa ]
  %175 = getelementptr inbounds i64, ptr %3, i64 %.0337425.epil
  %176 = load i64, ptr %175, align 8, !tbaa !15
  %177 = getelementptr inbounds i64, ptr %37, i64 %176
  %178 = load i64, ptr %177, align 8, !tbaa !15
  %179 = mul i64 %178, %.0336426.epil
  %180 = add nuw i64 %.0337425.epil, 1
  %epil.iter633.next = add i64 %epil.iter633, 1
  %epil.iter633.cmp.not = icmp eq i64 %epil.iter633.next, %xtraiter632
  br i1 %epil.iter633.cmp.not, label %._crit_edge428, label %.epil.preheader, !llvm.loop !23

._crit_edge428:                                   ; preds = %.epil.preheader, %._crit_edge428.unr-lcssa
  %.lcssa613 = phi i64 [ %.lcssa613.ph, %._crit_edge428.unr-lcssa ], [ %179, %.epil.preheader ]
  %181 = add i64 %.0332.lcssa, 7
  %182 = and i64 %181, -8
  %183 = getelementptr inbounds i8, ptr %0, i64 24
  %184 = load ptr, ptr %183, align 8, !tbaa !24
  %185 = shl i64 %182, 3
  tail call void @llvm.memset.p0.i64(ptr align 4 %184, i8 0, i64 %185, i1 false)
  %186 = getelementptr inbounds i8, ptr %0, i64 8
  store ptr %49, ptr %186, align 8, !tbaa !16
  %187 = getelementptr inbounds i8, ptr %0, i64 16
  store i64 %47, ptr %187, align 8, !tbaa !5
  %188 = getelementptr inbounds i8, ptr %0, i64 48
  store i64 %.0332.lcssa, ptr %188, align 8, !tbaa !25
  %189 = getelementptr inbounds i8, ptr %0, i64 56
  store i64 %182, ptr %189, align 8, !tbaa !26
  %190 = load i64, ptr %20, align 8, !tbaa !5
  %191 = shl i64 %190, 3
  %192 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %191) #11
  %193 = load i64, ptr %22, align 8, !tbaa !5
  %194 = shl i64 %193, 3
  %195 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %194) #11
  %196 = icmp ne ptr %192, null
  %197 = icmp ne ptr %195, null
  %or.cond3 = and i1 %196, %197
  br i1 %or.cond3, label %224, label %223

198:                                              ; preds = %198, %.lr.ph427.new
  %.0336426 = phi i64 [ 1, %.lr.ph427.new ], [ %221, %198 ]
  %.0337425 = phi i64 [ 0, %.lr.ph427.new ], [ %222, %198 ]
  %niter637 = phi i64 [ 0, %.lr.ph427.new ], [ %niter637.next.3, %198 ]
  %199 = getelementptr inbounds i64, ptr %3, i64 %.0337425
  %200 = load i64, ptr %199, align 8, !tbaa !15
  %201 = getelementptr inbounds i64, ptr %37, i64 %200
  %202 = load i64, ptr %201, align 8, !tbaa !15
  %203 = mul i64 %202, %.0336426
  %204 = or disjoint i64 %.0337425, 1
  %205 = getelementptr inbounds i64, ptr %3, i64 %204
  %206 = load i64, ptr %205, align 8, !tbaa !15
  %207 = getelementptr inbounds i64, ptr %37, i64 %206
  %208 = load i64, ptr %207, align 8, !tbaa !15
  %209 = mul i64 %208, %203
  %210 = or disjoint i64 %.0337425, 2
  %211 = getelementptr inbounds i64, ptr %3, i64 %210
  %212 = load i64, ptr %211, align 8, !tbaa !15
  %213 = getelementptr inbounds i64, ptr %37, i64 %212
  %214 = load i64, ptr %213, align 8, !tbaa !15
  %215 = mul i64 %214, %209
  %216 = or disjoint i64 %.0337425, 3
  %217 = getelementptr inbounds i64, ptr %3, i64 %216
  %218 = load i64, ptr %217, align 8, !tbaa !15
  %219 = getelementptr inbounds i64, ptr %37, i64 %218
  %220 = load i64, ptr %219, align 8, !tbaa !15
  %221 = mul i64 %220, %215
  %222 = add nuw i64 %.0337425, 4
  %niter637.next.3 = add i64 %niter637, 4
  %niter637.ncmp.3 = icmp eq i64 %niter637.next.3, %unroll_iter636
  br i1 %niter637.ncmp.3, label %._crit_edge428.unr-lcssa, label %198, !llvm.loop !27

223:                                              ; preds = %._crit_edge428
  tail call void @free(ptr noundef %49) #12
  tail call void @free(ptr noundef %192) #12
  tail call void @free(ptr noundef %195) #12
  br label %.thread

224:                                              ; preds = %._crit_edge428
  %225 = load ptr, ptr %23, align 8, !tbaa !16
  tail call void @calculate_strides(ptr noundef nonnull %192, ptr noundef %225, i64 noundef %190)
  %226 = load ptr, ptr %24, align 8, !tbaa !16
  %227 = load i64, ptr %22, align 8, !tbaa !5
  tail call void @calculate_strides(ptr noundef nonnull %195, ptr noundef %226, i64 noundef %227)
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %7) #12
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %8) #12
  %228 = load i64, ptr %20, align 8, !tbaa !5
  %.not540 = icmp eq i64 %228, 0
  br i1 %.not540, label %.preheader405, label %.preheader406.us.preheader

.preheader406.us.preheader:                       ; preds = %224
  %xtraiter638 = and i64 %228, 1
  %229 = icmp eq i64 %228, 1
  br i1 %229, label %.preheader405.loopexit.unr-lcssa, label %.preheader406.us.preheader.new

.preheader406.us.preheader.new:                   ; preds = %.preheader406.us.preheader
  %unroll_iter642 = and i64 %228, -2
  br label %.preheader406.us

.preheader406.us:                                 ; preds = %.loopexit407.us.1, %.preheader406.us.preheader.new
  %.0340434.us = phi i64 [ 0, %.preheader406.us.preheader.new ], [ %.1341.us.1, %.loopexit407.us.1 ]
  %.0346432.us = phi i64 [ 0, %.preheader406.us.preheader.new ], [ %245, %.loopexit407.us.1 ]
  %niter643 = phi i64 [ 0, %.preheader406.us.preheader.new ], [ %niter643.next.1, %.loopexit407.us.1 ]
  br label %232

230:                                              ; preds = %232
  %231 = add nuw i64 %.0348430.us, 1
  %exitcond568.not = icmp eq i64 %231, %5
  br i1 %exitcond568.not, label %..critedge_crit_edge.us, label %232, !llvm.loop !28

232:                                              ; preds = %.preheader406.us, %230
  %.0348430.us = phi i64 [ 0, %.preheader406.us ], [ %231, %230 ]
  %233 = getelementptr inbounds i64, ptr %3, i64 %.0348430.us
  %234 = load i64, ptr %233, align 8, !tbaa !15
  %235 = icmp eq i64 %.0346432.us, %234
  br i1 %235, label %.loopexit407.us, label %230

.loopexit407.us:                                  ; preds = %232, %..critedge_crit_edge.us
  %.1341.us = phi i64 [ %246, %..critedge_crit_edge.us ], [ %.0340434.us, %232 ]
  %236 = or disjoint i64 %.0346432.us, 1
  br label %237

237:                                              ; preds = %241, %.loopexit407.us
  %.0348430.us.1 = phi i64 [ 0, %.loopexit407.us ], [ %242, %241 ]
  %238 = getelementptr inbounds i64, ptr %3, i64 %.0348430.us.1
  %239 = load i64, ptr %238, align 8, !tbaa !15
  %240 = icmp eq i64 %236, %239
  br i1 %240, label %.loopexit407.us.1, label %241

241:                                              ; preds = %237
  %242 = add nuw i64 %.0348430.us.1, 1
  %exitcond568.not.1 = icmp eq i64 %242, %5
  br i1 %exitcond568.not.1, label %..critedge_crit_edge.us.1, label %237, !llvm.loop !28

..critedge_crit_edge.us.1:                        ; preds = %241
  %243 = add i64 %.1341.us, 1
  %244 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %.1341.us
  store i64 %236, ptr %244, align 8, !tbaa !15
  br label %.loopexit407.us.1

.loopexit407.us.1:                                ; preds = %237, %..critedge_crit_edge.us.1
  %.1341.us.1 = phi i64 [ %243, %..critedge_crit_edge.us.1 ], [ %.1341.us, %237 ]
  %245 = add nuw i64 %.0346432.us, 2
  %niter643.next.1 = add i64 %niter643, 2
  %niter643.ncmp.1 = icmp eq i64 %niter643.next.1, %unroll_iter642
  br i1 %niter643.ncmp.1, label %.preheader405.loopexit.unr-lcssa, label %.preheader406.us, !llvm.loop !29

..critedge_crit_edge.us:                          ; preds = %230
  %246 = add i64 %.0340434.us, 1
  %247 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %.0340434.us
  store i64 %.0346432.us, ptr %247, align 8, !tbaa !15
  br label %.loopexit407.us

.preheader405.loopexit.unr-lcssa:                 ; preds = %.loopexit407.us.1, %.preheader406.us.preheader
  %.1341.us.lcssa.ph = phi i64 [ poison, %.preheader406.us.preheader ], [ %.1341.us.1, %.loopexit407.us.1 ]
  %.0340434.us.unr = phi i64 [ 0, %.preheader406.us.preheader ], [ %.1341.us.1, %.loopexit407.us.1 ]
  %.0346432.us.unr = phi i64 [ 0, %.preheader406.us.preheader ], [ %245, %.loopexit407.us.1 ]
  %lcmp.mod640.not = icmp eq i64 %xtraiter638, 0
  br i1 %lcmp.mod640.not, label %.preheader405, label %.preheader406.us.epil

.preheader406.us.epil:                            ; preds = %.preheader405.loopexit.unr-lcssa, %251
  %.0348430.us.epil = phi i64 [ %252, %251 ], [ 0, %.preheader405.loopexit.unr-lcssa ]
  %248 = getelementptr inbounds i64, ptr %3, i64 %.0348430.us.epil
  %249 = load i64, ptr %248, align 8, !tbaa !15
  %250 = icmp eq i64 %.0346432.us.unr, %249
  br i1 %250, label %.preheader405, label %251

251:                                              ; preds = %.preheader406.us.epil
  %252 = add nuw i64 %.0348430.us.epil, 1
  %exitcond568.not.epil = icmp eq i64 %252, %5
  br i1 %exitcond568.not.epil, label %..critedge_crit_edge.us.epil, label %.preheader406.us.epil, !llvm.loop !28

..critedge_crit_edge.us.epil:                     ; preds = %251
  %253 = add i64 %.0340434.us.unr, 1
  %254 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %.0340434.us.unr
  store i64 %.0346432.us.unr, ptr %254, align 8, !tbaa !15
  br label %.preheader405

.preheader405:                                    ; preds = %.preheader405.loopexit.unr-lcssa, %.preheader406.us.epil, %..critedge_crit_edge.us.epil, %224
  %.0340.lcssa = phi i64 [ 0, %224 ], [ %.1341.us.lcssa.ph, %.preheader405.loopexit.unr-lcssa ], [ %253, %..critedge_crit_edge.us.epil ], [ %.0340434.us.unr, %.preheader406.us.epil ]
  %255 = load i64, ptr %22, align 8, !tbaa !5
  %.not542 = icmp eq i64 %255, 0
  br i1 %.not542, label %._crit_edge441, label %.preheader403.us.preheader

.preheader403.us.preheader:                       ; preds = %.preheader405
  %xtraiter644 = and i64 %255, 1
  %256 = icmp eq i64 %255, 1
  br i1 %256, label %._crit_edge441.loopexit.unr-lcssa, label %.preheader403.us.preheader.new

.preheader403.us.preheader.new:                   ; preds = %.preheader403.us.preheader
  %unroll_iter648 = and i64 %255, -2
  br label %.preheader403.us

.preheader403.us:                                 ; preds = %.loopexit404.us.1, %.preheader403.us.preheader.new
  %.0342440.us = phi i64 [ 0, %.preheader403.us.preheader.new ], [ %.1343.us.1, %.loopexit404.us.1 ]
  %.0349438.us = phi i64 [ 0, %.preheader403.us.preheader.new ], [ %272, %.loopexit404.us.1 ]
  %niter649 = phi i64 [ 0, %.preheader403.us.preheader.new ], [ %niter649.next.1, %.loopexit404.us.1 ]
  br label %259

257:                                              ; preds = %259
  %258 = add nuw i64 %.0354436.us, 1
  %exitcond571.not = icmp eq i64 %258, %5
  br i1 %exitcond571.not, label %..critedge381_crit_edge.us, label %259, !llvm.loop !30

259:                                              ; preds = %.preheader403.us, %257
  %.0354436.us = phi i64 [ 0, %.preheader403.us ], [ %258, %257 ]
  %260 = getelementptr inbounds i64, ptr %4, i64 %.0354436.us
  %261 = load i64, ptr %260, align 8, !tbaa !15
  %262 = icmp eq i64 %.0349438.us, %261
  br i1 %262, label %.loopexit404.us, label %257

.loopexit404.us:                                  ; preds = %259, %..critedge381_crit_edge.us
  %.1343.us = phi i64 [ %273, %..critedge381_crit_edge.us ], [ %.0342440.us, %259 ]
  %263 = or disjoint i64 %.0349438.us, 1
  br label %264

264:                                              ; preds = %268, %.loopexit404.us
  %.0354436.us.1 = phi i64 [ 0, %.loopexit404.us ], [ %269, %268 ]
  %265 = getelementptr inbounds i64, ptr %4, i64 %.0354436.us.1
  %266 = load i64, ptr %265, align 8, !tbaa !15
  %267 = icmp eq i64 %263, %266
  br i1 %267, label %.loopexit404.us.1, label %268

268:                                              ; preds = %264
  %269 = add nuw i64 %.0354436.us.1, 1
  %exitcond571.not.1 = icmp eq i64 %269, %5
  br i1 %exitcond571.not.1, label %..critedge381_crit_edge.us.1, label %264, !llvm.loop !30

..critedge381_crit_edge.us.1:                     ; preds = %268
  %270 = add i64 %.1343.us, 1
  %271 = getelementptr inbounds [32 x i64], ptr %8, i64 0, i64 %.1343.us
  store i64 %263, ptr %271, align 8, !tbaa !15
  br label %.loopexit404.us.1

.loopexit404.us.1:                                ; preds = %264, %..critedge381_crit_edge.us.1
  %.1343.us.1 = phi i64 [ %270, %..critedge381_crit_edge.us.1 ], [ %.1343.us, %264 ]
  %272 = add nuw i64 %.0349438.us, 2
  %niter649.next.1 = add i64 %niter649, 2
  %niter649.ncmp.1 = icmp eq i64 %niter649.next.1, %unroll_iter648
  br i1 %niter649.ncmp.1, label %._crit_edge441.loopexit.unr-lcssa, label %.preheader403.us, !llvm.loop !31

..critedge381_crit_edge.us:                       ; preds = %257
  %273 = add i64 %.0342440.us, 1
  %274 = getelementptr inbounds [32 x i64], ptr %8, i64 0, i64 %.0342440.us
  store i64 %.0349438.us, ptr %274, align 8, !tbaa !15
  br label %.loopexit404.us

._crit_edge441.loopexit.unr-lcssa:                ; preds = %.loopexit404.us.1, %.preheader403.us.preheader
  %.1343.us.lcssa.ph = phi i64 [ poison, %.preheader403.us.preheader ], [ %.1343.us.1, %.loopexit404.us.1 ]
  %.0342440.us.unr = phi i64 [ 0, %.preheader403.us.preheader ], [ %.1343.us.1, %.loopexit404.us.1 ]
  %.0349438.us.unr = phi i64 [ 0, %.preheader403.us.preheader ], [ %272, %.loopexit404.us.1 ]
  %lcmp.mod646.not = icmp eq i64 %xtraiter644, 0
  br i1 %lcmp.mod646.not, label %._crit_edge441, label %.preheader403.us.epil

.preheader403.us.epil:                            ; preds = %._crit_edge441.loopexit.unr-lcssa, %278
  %.0354436.us.epil = phi i64 [ %279, %278 ], [ 0, %._crit_edge441.loopexit.unr-lcssa ]
  %275 = getelementptr inbounds i64, ptr %4, i64 %.0354436.us.epil
  %276 = load i64, ptr %275, align 8, !tbaa !15
  %277 = icmp eq i64 %.0349438.us.unr, %276
  br i1 %277, label %._crit_edge441, label %278

278:                                              ; preds = %.preheader403.us.epil
  %279 = add nuw i64 %.0354436.us.epil, 1
  %exitcond571.not.epil = icmp eq i64 %279, %5
  br i1 %exitcond571.not.epil, label %..critedge381_crit_edge.us.epil, label %.preheader403.us.epil, !llvm.loop !30

..critedge381_crit_edge.us.epil:                  ; preds = %278
  %280 = add i64 %.0342440.us.unr, 1
  %281 = getelementptr inbounds [32 x i64], ptr %8, i64 0, i64 %.0342440.us.unr
  store i64 %.0349438.us.unr, ptr %281, align 8, !tbaa !15
  br label %._crit_edge441

._crit_edge441:                                   ; preds = %._crit_edge441.loopexit.unr-lcssa, %.preheader403.us.epil, %..critedge381_crit_edge.us.epil, %.preheader405
  %.0342.lcssa = phi i64 [ 0, %.preheader405 ], [ %.1343.us.lcssa.ph, %._crit_edge441.loopexit.unr-lcssa ], [ %280, %..critedge381_crit_edge.us.epil ], [ %.0342440.us.unr, %.preheader403.us.epil ]
  call void @llvm.lifetime.start.p0(i64 8192, ptr nonnull %9) #12
  %invariant.umin = tail call i64 @llvm.umin.i64(i64 %.lcssa613, i64 32)
  %.not544 = icmp eq i64 %.lcssa613, 0
  br i1 %.not544, label %._crit_edge449, label %.preheader402.lr.ph.split.us

.preheader402.lr.ph.split.us:                     ; preds = %._crit_edge441
  %282 = load ptr, ptr %23, align 8, !tbaa !16
  br label %.preheader402.us

.preheader402.us:                                 ; preds = %._crit_edge447.us, %.preheader402.lr.ph.split.us
  %.0353448.us = phi i64 [ 0, %.preheader402.lr.ph.split.us ], [ %292, %._crit_edge447.us ]
  br label %283

283:                                              ; preds = %.preheader402.us, %283
  %.0351445.us = phi i64 [ 0, %.preheader402.us ], [ %291, %283 ]
  %.0352444.us = phi i64 [ %.0353448.us, %.preheader402.us ], [ %290, %283 ]
  %284 = getelementptr inbounds i64, ptr %3, i64 %.0351445.us
  %285 = load i64, ptr %284, align 8, !tbaa !15
  %286 = getelementptr inbounds i64, ptr %282, i64 %285
  %287 = load i64, ptr %286, align 8, !tbaa !15
  %288 = urem i64 %.0352444.us, %287
  %289 = getelementptr inbounds [32 x [32 x i64]], ptr %9, i64 0, i64 %.0353448.us, i64 %.0351445.us
  store i64 %288, ptr %289, align 8, !tbaa !15
  %290 = udiv i64 %.0352444.us, %287
  %291 = add nuw i64 %.0351445.us, 1
  %exitcond574.not = icmp eq i64 %291, %5
  br i1 %exitcond574.not, label %._crit_edge447.us, label %283, !llvm.loop !32

._crit_edge447.us:                                ; preds = %283
  %292 = add nuw nsw i64 %.0353448.us, 1
  %exitcond575.not = icmp eq i64 %292, %invariant.umin
  br i1 %exitcond575.not, label %._crit_edge449, label %.preheader402.us, !llvm.loop !33

._crit_edge449:                                   ; preds = %._crit_edge447.us, %._crit_edge441
  %293 = load ptr, ptr %183, align 8, !tbaa !24
  tail call void @llvm.memset.p0.i64(ptr align 4 %293, i8 0, i64 %185, i1 false)
  %294 = shl i64 %.0332.lcssa, 3
  %295 = tail call noalias align 64 ptr @aligned_alloc(i64 noundef 64, i64 noundef %294) #11
  %.not379 = icmp eq ptr %295, null
  br i1 %.not379, label %296, label %297

296:                                              ; preds = %._crit_edge449
  tail call void @free(ptr noundef %192) #12
  tail call void @free(ptr noundef %195) #12
  br label %503

297:                                              ; preds = %._crit_edge449
  tail call void @llvm.memset.p0.i64(ptr nonnull align 64 %295, i8 0, i64 %294, i1 false)
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %10) #12
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %11) #12
  %298 = getelementptr inbounds i8, ptr %1, i64 24
  %299 = getelementptr inbounds i8, ptr %2, i64 24
  %300 = tail call ptr @llvm.stacksave.p0()
  %301 = alloca [8 x %struct.ComplexFloat], align 64
  %.not546 = icmp eq i64 %.0332.lcssa, 0
  br i1 %.not546, label %._crit_edge525.thread, label %.preheader401.lr.ph

._crit_edge525.thread:                            ; preds = %297
  tail call void @llvm.stackrestore.p0(ptr %300)
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %11) #12
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %10) #12
  br label %._crit_edge533

.preheader401.lr.ph:                              ; preds = %297
  %.not548 = icmp eq i64 %.0340.lcssa, 0
  %.not549 = icmp eq i64 %.0342.lcssa, 0
  br i1 %.not544, label %._crit_edge525.thread588, label %.preheader401.us.preheader

.preheader401.us.preheader:                       ; preds = %.preheader401.lr.ph
  %xtraiter650 = and i64 %5, 1
  %302 = icmp eq i64 %58, 0
  %unroll_iter653 = and i64 %5, -2
  %lcmp.mod652.not = icmp eq i64 %xtraiter650, 0
  br label %.preheader401.us

._crit_edge525.thread588:                         ; preds = %.preheader401.lr.ph
  tail call void @llvm.stackrestore.p0(ptr %300)
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %11) #12
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %10) #12
  br label %.preheader.lr.ph

.preheader401.us:                                 ; preds = %.preheader401.us.preheader, %._crit_edge519.us
  %.0345522.us = phi i64 [ %303, %._crit_edge519.us ], [ 0, %.preheader401.us.preheader ]
  %303 = add i64 %.0345522.us, 512
  br label %304

304:                                              ; preds = %.preheader401.us, %.loopexit400.us
  %indvars.iv = phi i64 [ 0, %.preheader401.us ], [ %indvars.iv.next, %.loopexit400.us ]
  %.0344515.us = phi i64 [ 0, %.preheader401.us ], [ %306, %.loopexit400.us ]
  %305 = call i64 @min(i64 noundef %303, i64 noundef %.0332.lcssa)
  %306 = add i64 %.0344515.us, 512
  %307 = call i64 @min(i64 noundef %306, i64 noundef %.lcssa613)
  %308 = icmp ult i64 %.0345522.us, %305
  %309 = icmp ult i64 %.0344515.us, %307
  %or.cond595 = select i1 %308, i1 %309, i1 false
  br i1 %or.cond595, label %.preheader399.us.us, label %.loopexit400.us

.loopexit400.us:                                  ; preds = %._crit_edge501.us.us, %304
  %310 = icmp ult i64 %306, %.lcssa613
  %indvars.iv.next = add i64 %indvars.iv, -512
  br i1 %310, label %304, label %._crit_edge519.us, !llvm.loop !34

.preheader399.us.us:                              ; preds = %304, %._crit_edge501.us.us
  %.0339504.us.us = phi i64 [ %311, %._crit_edge501.us.us ], [ %.0345522.us, %304 ]
  %311 = add i64 %.0339504.us.us, 128
  br label %312

312:                                              ; preds = %.loopexit398.us.us, %.preheader399.us.us
  %indvars.iv579 = phi i64 [ %indvars.iv.next580, %.loopexit398.us.us ], [ %indvars.iv, %.preheader399.us.us ]
  %.0338497.us.us = phi i64 [ %314, %.loopexit398.us.us ], [ %.0344515.us, %.preheader399.us.us ]
  %313 = call i64 @min(i64 noundef %311, i64 noundef %305)
  %314 = add i64 %.0338497.us.us, 128
  %315 = call i64 @min(i64 noundef %314, i64 noundef %307)
  %316 = icmp ult i64 %.0339504.us.us, %313
  %317 = icmp ult i64 %.0338497.us.us, %315
  %or.cond596 = select i1 %316, i1 %317, i1 false
  br i1 %or.cond596, label %.preheader397.us.us.us, label %.loopexit398.us.us

.loopexit398.us.us:                               ; preds = %._crit_edge487.us.us.us, %312
  %318 = icmp ult i64 %314, %307
  %indvars.iv.next580 = add i64 %indvars.iv579, -128
  br i1 %318, label %312, label %._crit_edge501.us.us, !llvm.loop !35

.preheader397.us.us.us:                           ; preds = %312, %._crit_edge487.us.us.us
  %.0335490.us.us.us = phi i64 [ %319, %._crit_edge487.us.us.us ], [ %.0339504.us.us, %312 ]
  %319 = add i64 %.0335490.us.us.us, 32
  br label %320

320:                                              ; preds = %.loopexit396.us.us.us, %.preheader397.us.us.us
  %indvars.iv581 = phi i64 [ %indvars.iv.next582, %.loopexit396.us.us.us ], [ %indvars.iv579, %.preheader397.us.us.us ]
  %.0334483.us.us.us = phi i64 [ %322, %.loopexit396.us.us.us ], [ %.0338497.us.us, %.preheader397.us.us.us ]
  %321 = call i64 @min(i64 noundef %319, i64 noundef %313)
  %322 = add i64 %.0334483.us.us.us, 32
  %323 = call i64 @min(i64 noundef %322, i64 noundef %315)
  %324 = icmp ult i64 %.0335490.us.us.us, %321
  br i1 %324, label %.lr.ph480.us.us.us, label %.loopexit396.us.us.us

325:                                              ; preds = %.lr.ph480.us.us.us, %.loopexit395.us.us.us
  %.0331476.us.us.us = phi i64 [ %.0335490.us.us.us, %.lr.ph480.us.us.us ], [ %326, %.loopexit395.us.us.us ]
  %326 = add i64 %.0331476.us.us.us, 8
  %327 = call i64 @min(i64 noundef %326, i64 noundef %321)
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 64 dereferenceable(64) %301, i8 0, i64 64, i1 false)
  %328 = icmp ult i64 %.0331476.us.us.us, %327
  br i1 %328, label %.preheader394.us.us.us, label %.loopexit395.us.us.us

._crit_edge470.us.us.us:                          ; preds = %.loopexit.us.us.us, %.preheader392.us.us.us
  %329 = phi <2 x float> [ zeroinitializer, %.preheader392.us.us.us ], [ %453, %.loopexit.us.us.us ]
  %330 = getelementptr inbounds %struct.ComplexFloat, ptr %295, i64 %.0329473.us.us.us
  %331 = load <2 x float>, ptr %330, align 8, !tbaa !36
  %332 = fadd <2 x float> %329, %331
  store <2 x float> %332, ptr %330, align 8, !tbaa !36
  %333 = add nuw i64 %.0329473.us.us.us, 1
  %334 = icmp ult i64 %333, %327
  br i1 %334, label %.preheader394.us.us.us, label %.loopexit395.us.us.us, !llvm.loop !38

.lr.ph469.us.us.us:                               ; preds = %.preheader392.us.us.us, %.loopexit.us.us.us
  %indvars.iv583 = phi i64 [ %indvars.iv.next584, %.loopexit.us.us.us ], [ %indvars.iv581, %.preheader392.us.us.us ]
  %.0324468.us.us.us = phi i64 [ %336, %.loopexit.us.us.us ], [ %.0334483.us.us.us, %.preheader392.us.us.us ]
  %335 = phi <2 x float> [ %453, %.loopexit.us.us.us ], [ zeroinitializer, %.preheader392.us.us.us ]
  %336 = add i64 %.0324468.us.us.us, 8
  %337 = call i64 @min(i64 noundef %336, i64 noundef %323)
  %338 = icmp ult i64 %.0324468.us.us.us, %337
  br i1 %338, label %.lr.ph457.us.us.us.preheader, label %.preheader391.us.us.us

.lr.ph463.us.us.us:                               ; preds = %.lr.ph463.us.us.us, %.lr.ph463.us.us.us.preheader.new
  %.0312462.us.us.us = phi i64 [ 0, %.lr.ph463.us.us.us.preheader.new ], [ %371, %.lr.ph463.us.us.us ]
  %339 = phi <2 x float> [ %335, %.lr.ph463.us.us.us.preheader.new ], [ %370, %.lr.ph463.us.us.us ]
  %niter660 = phi i64 [ 0, %.lr.ph463.us.us.us.preheader.new ], [ %niter660.next.7, %.lr.ph463.us.us.us ]
  %340 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %.0312462.us.us.us
  %341 = load <2 x float>, ptr %340, align 64, !tbaa !36
  %342 = fadd <2 x float> %339, %341
  %343 = or disjoint i64 %.0312462.us.us.us, 1
  %344 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %343
  %345 = load <2 x float>, ptr %344, align 8, !tbaa !36
  %346 = fadd <2 x float> %342, %345
  %347 = or disjoint i64 %.0312462.us.us.us, 2
  %348 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %347
  %349 = load <2 x float>, ptr %348, align 16, !tbaa !36
  %350 = fadd <2 x float> %346, %349
  %351 = or disjoint i64 %.0312462.us.us.us, 3
  %352 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %351
  %353 = load <2 x float>, ptr %352, align 8, !tbaa !36
  %354 = fadd <2 x float> %350, %353
  %355 = or disjoint i64 %.0312462.us.us.us, 4
  %356 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %355
  %357 = load <2 x float>, ptr %356, align 32, !tbaa !36
  %358 = fadd <2 x float> %354, %357
  %359 = or disjoint i64 %.0312462.us.us.us, 5
  %360 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %359
  %361 = load <2 x float>, ptr %360, align 8, !tbaa !36
  %362 = fadd <2 x float> %358, %361
  %363 = or disjoint i64 %.0312462.us.us.us, 6
  %364 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %363
  %365 = load <2 x float>, ptr %364, align 16, !tbaa !36
  %366 = fadd <2 x float> %362, %365
  %367 = or disjoint i64 %.0312462.us.us.us, 7
  %368 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %367
  %369 = load <2 x float>, ptr %368, align 8, !tbaa !36
  %370 = fadd <2 x float> %366, %369
  %371 = add nuw i64 %.0312462.us.us.us, 8
  %niter660.next.7 = add i64 %niter660, 8
  %niter660.ncmp.7 = icmp eq i64 %niter660.next.7, %unroll_iter659
  br i1 %niter660.ncmp.7, label %.loopexit.us.us.us.loopexit.unr-lcssa, label %.lr.ph463.us.us.us, !llvm.loop !39

._crit_edge458.us.us.us.unr-lcssa:                ; preds = %.lr.ph457.us.us.us, %.lr.ph457.us.us.us.preheader
  %.0321456.us.us.us.unr = phi i64 [ 0, %.lr.ph457.us.us.us.preheader ], [ %419, %.lr.ph457.us.us.us ]
  br i1 %lcmp.mod652.not, label %._crit_edge458.us.us.us, label %.lr.ph457.us.us.us.epil

.lr.ph457.us.us.us.epil:                          ; preds = %._crit_edge458.us.us.us.unr-lcssa
  %372 = getelementptr inbounds [32 x [32 x i64]], ptr %9, i64 0, i64 %.0322459.us.us.us, i64 %.0321456.us.us.us.unr
  %373 = load i64, ptr %372, align 8, !tbaa !15
  %374 = getelementptr inbounds i64, ptr %3, i64 %.0321456.us.us.us.unr
  %375 = load i64, ptr %374, align 8, !tbaa !15
  %376 = getelementptr inbounds [32 x i64], ptr %10, i64 0, i64 %375
  store i64 %373, ptr %376, align 8, !tbaa !15
  %377 = getelementptr inbounds i64, ptr %4, i64 %.0321456.us.us.us.unr
  %378 = load i64, ptr %377, align 8, !tbaa !15
  %379 = getelementptr inbounds [32 x i64], ptr %11, i64 0, i64 %378
  store i64 %373, ptr %379, align 8, !tbaa !15
  br label %._crit_edge458.us.us.us

._crit_edge458.us.us.us:                          ; preds = %._crit_edge458.us.us.us.unr-lcssa, %.lr.ph457.us.us.us.epil
  %380 = load ptr, ptr %23, align 8, !tbaa !16
  %381 = load i64, ptr %20, align 8, !tbaa !5
  call void @linear_to_indices(ptr noundef nonnull %10, i64 noundef %.0322459.us.us.us, ptr noundef %380, i64 noundef %381)
  %382 = load ptr, ptr %24, align 8, !tbaa !16
  %383 = load i64, ptr %22, align 8, !tbaa !5
  call void @linear_to_indices(ptr noundef nonnull %11, i64 noundef %.0322459.us.us.us, ptr noundef %382, i64 noundef %383)
  %384 = load i64, ptr %20, align 8, !tbaa !5
  %385 = call i64 @indices_to_linear(ptr noundef nonnull %10, ptr noundef nonnull %192, i64 noundef %384)
  %386 = load i64, ptr %22, align 8, !tbaa !5
  %387 = call i64 @indices_to_linear(ptr noundef nonnull %11, ptr noundef nonnull %195, i64 noundef %386)
  %388 = add nuw i64 %.0322459.us.us.us, 1
  %389 = icmp ult i64 %388, %337
  %.pre = load ptr, ptr %298, align 8, !tbaa !24
  %.pre587 = load ptr, ptr %299, align 8, !tbaa !24
  %390 = getelementptr %struct.ComplexFloat, ptr %.pre587, i64 %387
  br i1 %389, label %391, label %.preheader391.us.us.us.loopexit.critedge

391:                                              ; preds = %._crit_edge458.us.us.us
  %392 = getelementptr %struct.ComplexFloat, ptr %.pre, i64 %385
  %393 = getelementptr i8, ptr %392, i64 8
  call void @llvm.prefetch.p0(ptr %393, i32 0, i32 3, i32 1)
  %394 = getelementptr i8, ptr %390, i64 8
  call void @llvm.prefetch.p0(ptr %394, i32 0, i32 3, i32 1)
  %395 = sub nuw i64 %.0322459.us.us.us, %.0324468.us.us.us
  %396 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %395
  %397 = getelementptr inbounds %struct.ComplexFloat, ptr %.pre, i64 %385
  %398 = getelementptr inbounds %struct.ComplexFloat, ptr %.pre587, i64 %387
  %399 = load <2 x float>, ptr %397, align 4
  %400 = load <2 x float>, ptr %398, align 4
  %401 = call <2 x float> @complex_float_multiply(<2 x float> %399, <2 x float> %400)
  store <2 x float> %401, ptr %396, align 8
  br label %.lr.ph457.us.us.us.preheader, !llvm.loop !40

.lr.ph457.us.us.us:                               ; preds = %.lr.ph457.us.us.us.preheader, %.lr.ph457.us.us.us
  %.0321456.us.us.us = phi i64 [ %419, %.lr.ph457.us.us.us ], [ 0, %.lr.ph457.us.us.us.preheader ]
  %niter654 = phi i64 [ %niter654.next.1, %.lr.ph457.us.us.us ], [ 0, %.lr.ph457.us.us.us.preheader ]
  %402 = getelementptr inbounds [32 x [32 x i64]], ptr %9, i64 0, i64 %.0322459.us.us.us, i64 %.0321456.us.us.us
  %403 = load i64, ptr %402, align 16, !tbaa !15
  %404 = getelementptr inbounds i64, ptr %3, i64 %.0321456.us.us.us
  %405 = load i64, ptr %404, align 8, !tbaa !15
  %406 = getelementptr inbounds [32 x i64], ptr %10, i64 0, i64 %405
  store i64 %403, ptr %406, align 8, !tbaa !15
  %407 = getelementptr inbounds i64, ptr %4, i64 %.0321456.us.us.us
  %408 = load i64, ptr %407, align 8, !tbaa !15
  %409 = getelementptr inbounds [32 x i64], ptr %11, i64 0, i64 %408
  store i64 %403, ptr %409, align 8, !tbaa !15
  %410 = or disjoint i64 %.0321456.us.us.us, 1
  %411 = getelementptr inbounds [32 x [32 x i64]], ptr %9, i64 0, i64 %.0322459.us.us.us, i64 %410
  %412 = load i64, ptr %411, align 8, !tbaa !15
  %413 = getelementptr inbounds i64, ptr %3, i64 %410
  %414 = load i64, ptr %413, align 8, !tbaa !15
  %415 = getelementptr inbounds [32 x i64], ptr %10, i64 0, i64 %414
  store i64 %412, ptr %415, align 8, !tbaa !15
  %416 = getelementptr inbounds i64, ptr %4, i64 %410
  %417 = load i64, ptr %416, align 8, !tbaa !15
  %418 = getelementptr inbounds [32 x i64], ptr %11, i64 0, i64 %417
  store i64 %412, ptr %418, align 8, !tbaa !15
  %419 = add nuw i64 %.0321456.us.us.us, 2
  %niter654.next.1 = add i64 %niter654, 2
  %niter654.ncmp.1 = icmp eq i64 %niter654.next.1, %unroll_iter653
  br i1 %niter654.ncmp.1, label %._crit_edge458.us.us.us.unr-lcssa, label %.lr.ph457.us.us.us, !llvm.loop !41

420:                                              ; preds = %.lr.ph455.us.us.us, %420
  %.0325454.us.us.us = phi i64 [ 0, %.lr.ph455.us.us.us ], [ %429, %420 ]
  %.1328453.us.us.us = phi i64 [ %.0329473.us.us.us, %.lr.ph455.us.us.us ], [ %428, %420 ]
  %421 = getelementptr inbounds [32 x i64], ptr %8, i64 0, i64 %.0325454.us.us.us
  %422 = load i64, ptr %421, align 8, !tbaa !15
  %423 = getelementptr inbounds i64, ptr %458, i64 %422
  %424 = load i64, ptr %423, align 8, !tbaa !15
  %425 = urem i64 %.1328453.us.us.us, %424
  %426 = getelementptr inbounds [32 x i64], ptr %11, i64 0, i64 %422
  store i64 %425, ptr %426, align 8, !tbaa !15
  %427 = load i64, ptr %423, align 8, !tbaa !15
  %428 = udiv i64 %.1328453.us.us.us, %427
  %429 = add nuw i64 %.0325454.us.us.us, 1
  %exitcond577.not = icmp eq i64 %429, %.0342.lcssa
  br i1 %exitcond577.not, label %.preheader392.us.us.us, label %420, !llvm.loop !42

430:                                              ; preds = %.lr.ph452.us.us.us, %430
  %.0326451.us.us.us = phi i64 [ 0, %.lr.ph452.us.us.us ], [ %439, %430 ]
  %.0327450.us.us.us = phi i64 [ %.0329473.us.us.us, %.lr.ph452.us.us.us ], [ %438, %430 ]
  %431 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %.0326451.us.us.us
  %432 = load i64, ptr %431, align 8, !tbaa !15
  %433 = getelementptr inbounds i64, ptr %457, i64 %432
  %434 = load i64, ptr %433, align 8, !tbaa !15
  %435 = urem i64 %.0327450.us.us.us, %434
  %436 = getelementptr inbounds [32 x i64], ptr %10, i64 0, i64 %432
  store i64 %435, ptr %436, align 8, !tbaa !15
  %437 = load i64, ptr %433, align 8, !tbaa !15
  %438 = udiv i64 %.0327450.us.us.us, %437
  %439 = add nuw i64 %.0326451.us.us.us, 1
  %exitcond576.not = icmp eq i64 %439, %.0340.lcssa
  br i1 %exitcond576.not, label %.preheader393.us.us.us, label %430, !llvm.loop !43

.lr.ph457.us.us.us.preheader:                     ; preds = %.lr.ph469.us.us.us, %391
  %.0322459.us.us.us = phi i64 [ %388, %391 ], [ %.0324468.us.us.us, %.lr.ph469.us.us.us ]
  br i1 %302, label %._crit_edge458.us.us.us.unr-lcssa, label %.lr.ph457.us.us.us

.preheader391.us.us.us.loopexit.critedge:         ; preds = %._crit_edge458.us.us.us
  %440 = sub nuw i64 %.0322459.us.us.us, %.0324468.us.us.us
  %441 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %440
  %442 = getelementptr inbounds %struct.ComplexFloat, ptr %.pre, i64 %385
  %443 = load <2 x float>, ptr %442, align 4
  %444 = load <2 x float>, ptr %390, align 4
  %445 = call <2 x float> @complex_float_multiply(<2 x float> %443, <2 x float> %444)
  store <2 x float> %445, ptr %441, align 8
  br label %.preheader391.us.us.us

.preheader391.us.us.us:                           ; preds = %.preheader391.us.us.us.loopexit.critedge, %.lr.ph469.us.us.us
  %.not551 = icmp eq i64 %337, %.0324468.us.us.us
  br i1 %.not551, label %.loopexit.us.us.us, label %.lr.ph463.us.us.us.preheader

.lr.ph463.us.us.us.preheader:                     ; preds = %.preheader391.us.us.us
  %446 = add i64 %337, %indvars.iv583
  %umax = call i64 @llvm.umax.i64(i64 %446, i64 1)
  %xtraiter655 = and i64 %umax, 7
  %447 = icmp ult i64 %446, 8
  br i1 %447, label %.loopexit.us.us.us.loopexit.unr-lcssa, label %.lr.ph463.us.us.us.preheader.new

.lr.ph463.us.us.us.preheader.new:                 ; preds = %.lr.ph463.us.us.us.preheader
  %unroll_iter659 = and i64 %umax, -8
  br label %.lr.ph463.us.us.us

.loopexit.us.us.us.loopexit.unr-lcssa:            ; preds = %.lr.ph463.us.us.us, %.lr.ph463.us.us.us.preheader
  %.lcssa611.ph = phi <2 x float> [ poison, %.lr.ph463.us.us.us.preheader ], [ %370, %.lr.ph463.us.us.us ]
  %.0312462.us.us.us.unr = phi i64 [ 0, %.lr.ph463.us.us.us.preheader ], [ %371, %.lr.ph463.us.us.us ]
  %.unr = phi <2 x float> [ %335, %.lr.ph463.us.us.us.preheader ], [ %370, %.lr.ph463.us.us.us ]
  %lcmp.mod657.not = icmp eq i64 %xtraiter655, 0
  br i1 %lcmp.mod657.not, label %.loopexit.us.us.us, label %.lr.ph463.us.us.us.epil

.lr.ph463.us.us.us.epil:                          ; preds = %.loopexit.us.us.us.loopexit.unr-lcssa, %.lr.ph463.us.us.us.epil
  %.0312462.us.us.us.epil = phi i64 [ %452, %.lr.ph463.us.us.us.epil ], [ %.0312462.us.us.us.unr, %.loopexit.us.us.us.loopexit.unr-lcssa ]
  %448 = phi <2 x float> [ %451, %.lr.ph463.us.us.us.epil ], [ %.unr, %.loopexit.us.us.us.loopexit.unr-lcssa ]
  %epil.iter656 = phi i64 [ %epil.iter656.next, %.lr.ph463.us.us.us.epil ], [ 0, %.loopexit.us.us.us.loopexit.unr-lcssa ]
  %449 = getelementptr inbounds %struct.ComplexFloat, ptr %301, i64 %.0312462.us.us.us.epil
  %450 = load <2 x float>, ptr %449, align 8, !tbaa !36
  %451 = fadd <2 x float> %448, %450
  %452 = add nuw i64 %.0312462.us.us.us.epil, 1
  %epil.iter656.next = add i64 %epil.iter656, 1
  %epil.iter656.cmp.not = icmp eq i64 %epil.iter656.next, %xtraiter655
  br i1 %epil.iter656.cmp.not, label %.loopexit.us.us.us, label %.lr.ph463.us.us.us.epil, !llvm.loop !44

.loopexit.us.us.us:                               ; preds = %.loopexit.us.us.us.loopexit.unr-lcssa, %.lr.ph463.us.us.us.epil, %.preheader391.us.us.us
  %453 = phi <2 x float> [ %335, %.preheader391.us.us.us ], [ %.lcssa611.ph, %.loopexit.us.us.us.loopexit.unr-lcssa ], [ %451, %.lr.ph463.us.us.us.epil ]
  %454 = icmp ult i64 %336, %323
  %indvars.iv.next584 = add i64 %indvars.iv583, -8
  br i1 %454, label %.lr.ph469.us.us.us, label %._crit_edge470.us.us.us, !llvm.loop !45

.preheader392.us.us.us:                           ; preds = %420, %.preheader393.us.us.us
  br i1 %459, label %.lr.ph469.us.us.us, label %._crit_edge470.us.us.us

.preheader393.us.us.us:                           ; preds = %430, %.preheader394.us.us.us
  br i1 %.not549, label %.preheader392.us.us.us, label %.lr.ph455.us.us.us

.preheader394.us.us.us:                           ; preds = %325, %._crit_edge470.us.us.us
  %.0329473.us.us.us = phi i64 [ %333, %._crit_edge470.us.us.us ], [ %.0331476.us.us.us, %325 ]
  br i1 %.not548, label %.preheader393.us.us.us, label %.lr.ph452.us.us.us

.loopexit395.us.us.us:                            ; preds = %._crit_edge470.us.us.us, %325
  %455 = icmp ult i64 %326, %321
  br i1 %455, label %325, label %.loopexit396.us.us.us, !llvm.loop !46

.loopexit396.us.us.us:                            ; preds = %.loopexit395.us.us.us, %320
  %456 = icmp ult i64 %322, %315
  %indvars.iv.next582 = add i64 %indvars.iv581, -32
  br i1 %456, label %320, label %._crit_edge487.us.us.us, !llvm.loop !47

.lr.ph452.us.us.us:                               ; preds = %.preheader394.us.us.us
  %457 = load ptr, ptr %23, align 8, !tbaa !16
  br label %430

.lr.ph455.us.us.us:                               ; preds = %.preheader393.us.us.us
  %458 = load ptr, ptr %24, align 8, !tbaa !16
  br label %420

.lr.ph480.us.us.us:                               ; preds = %320
  %459 = icmp ult i64 %.0334483.us.us.us, %323
  br label %325

._crit_edge487.us.us.us:                          ; preds = %.loopexit396.us.us.us
  %460 = icmp ult i64 %319, %313
  br i1 %460, label %.preheader397.us.us.us, label %.loopexit398.us.us, !llvm.loop !48

._crit_edge501.us.us:                             ; preds = %.loopexit398.us.us
  %461 = icmp ult i64 %311, %305
  br i1 %461, label %.preheader399.us.us, label %.loopexit400.us, !llvm.loop !49

._crit_edge519.us:                                ; preds = %.loopexit400.us
  %462 = icmp ult i64 %303, %.0332.lcssa
  br i1 %462, label %.preheader401.us, label %._crit_edge525, !llvm.loop !50

._crit_edge525:                                   ; preds = %._crit_edge519.us
  call void @llvm.stackrestore.p0(ptr %300)
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %11) #12
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %10) #12
  br i1 %.not546, label %._crit_edge533, label %.preheader.lr.ph

.preheader.lr.ph:                                 ; preds = %._crit_edge525.thread588, %._crit_edge525
  %463 = load ptr, ptr %183, align 8, !tbaa !24
  %min.iters.check = icmp ult i64 %.0332.lcssa, 12
  br i1 %min.iters.check, label %.preheader.preheader, label %vector.scevcheck

vector.scevcheck:                                 ; preds = %.preheader.lr.ph
  %464 = add i64 %.0332.lcssa, -1
  %mul.result = shl i64 %464, 3
  %465 = getelementptr i8, ptr %463, i64 %mul.result
  %466 = icmp ult ptr %465, %463
  %scevgep = getelementptr i8, ptr %463, i64 4
  %mul.result606 = shl i64 %464, 3
  %mul.overflow607 = icmp ugt i64 %464, 2305843009213693951
  %467 = getelementptr i8, ptr %scevgep, i64 %mul.result606
  %468 = icmp ult ptr %467, %scevgep
  %469 = or i1 %468, %mul.overflow607
  %470 = or i1 %466, %469
  br i1 %470, label %.preheader.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.scevcheck
  %n.vec = and i64 %.0332.lcssa, 4611686018427387902
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %471 = getelementptr inbounds %struct.ComplexFloat, ptr %295, i64 %index
  %472 = load <4 x float>, ptr %471, align 16, !tbaa !36
  %473 = getelementptr inbounds %struct.ComplexFloat, ptr %463, i64 %index
  %interleaved.vec = fadd <4 x float> %472, zeroinitializer
  store <4 x float> %interleaved.vec, ptr %473, align 4, !tbaa !36
  %index.next = add nuw i64 %index, 2
  %474 = icmp eq i64 %index.next, %n.vec
  br i1 %474, label %middle.block, label %vector.body, !llvm.loop !51

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %.0332.lcssa, %n.vec
  br i1 %cmp.n, label %._crit_edge533, label %.preheader.preheader

.preheader.preheader:                             ; preds = %middle.block, %vector.scevcheck, %.preheader.lr.ph
  %.0311532.ph = phi i64 [ 0, %vector.scevcheck ], [ 0, %.preheader.lr.ph ], [ %n.vec, %middle.block ]
  %475 = sub i64 %.0332.lcssa, %.0311532.ph
  %xtraiter661 = and i64 %475, 3
  %lcmp.mod662.not = icmp eq i64 %xtraiter661, 0
  br i1 %lcmp.mod662.not, label %.preheader.prol.loopexit, label %.preheader.prol

.preheader.prol:                                  ; preds = %.preheader.preheader, %.preheader.prol
  %.0311532.prol = phi i64 [ %480, %.preheader.prol ], [ %.0311532.ph, %.preheader.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %.preheader.prol ], [ 0, %.preheader.preheader ]
  %476 = getelementptr inbounds %struct.ComplexFloat, ptr %295, i64 %.0311532.prol
  %477 = getelementptr inbounds %struct.ComplexFloat, ptr %463, i64 %.0311532.prol
  %478 = load <2 x float>, ptr %476, align 8, !tbaa !36
  %479 = fadd <2 x float> %478, zeroinitializer
  store <2 x float> %479, ptr %477, align 4, !tbaa !36
  %480 = add nuw i64 %.0311532.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter661
  br i1 %prol.iter.cmp.not, label %.preheader.prol.loopexit, label %.preheader.prol, !llvm.loop !54

.preheader.prol.loopexit:                         ; preds = %.preheader.prol, %.preheader.preheader
  %.0311532.unr = phi i64 [ %.0311532.ph, %.preheader.preheader ], [ %480, %.preheader.prol ]
  %481 = sub i64 %.0311532.ph, %.0332.lcssa
  %482 = icmp ugt i64 %481, -4
  br i1 %482, label %._crit_edge533, label %.preheader

.preheader:                                       ; preds = %.preheader.prol.loopexit, %.preheader
  %.0311532 = phi i64 [ %502, %.preheader ], [ %.0311532.unr, %.preheader.prol.loopexit ]
  %483 = getelementptr inbounds %struct.ComplexFloat, ptr %295, i64 %.0311532
  %484 = getelementptr inbounds %struct.ComplexFloat, ptr %463, i64 %.0311532
  %485 = load <2 x float>, ptr %483, align 8, !tbaa !36
  %486 = fadd <2 x float> %485, zeroinitializer
  store <2 x float> %486, ptr %484, align 4, !tbaa !36
  %487 = add nuw i64 %.0311532, 1
  %488 = getelementptr inbounds %struct.ComplexFloat, ptr %295, i64 %487
  %489 = getelementptr inbounds %struct.ComplexFloat, ptr %463, i64 %487
  %490 = load <2 x float>, ptr %488, align 8, !tbaa !36
  %491 = fadd <2 x float> %490, zeroinitializer
  store <2 x float> %491, ptr %489, align 4, !tbaa !36
  %492 = add nuw i64 %.0311532, 2
  %493 = getelementptr inbounds %struct.ComplexFloat, ptr %295, i64 %492
  %494 = getelementptr inbounds %struct.ComplexFloat, ptr %463, i64 %492
  %495 = load <2 x float>, ptr %493, align 8, !tbaa !36
  %496 = fadd <2 x float> %495, zeroinitializer
  store <2 x float> %496, ptr %494, align 4, !tbaa !36
  %497 = add nuw i64 %.0311532, 3
  %498 = getelementptr inbounds %struct.ComplexFloat, ptr %295, i64 %497
  %499 = getelementptr inbounds %struct.ComplexFloat, ptr %463, i64 %497
  %500 = load <2 x float>, ptr %498, align 8, !tbaa !36
  %501 = fadd <2 x float> %500, zeroinitializer
  store <2 x float> %501, ptr %499, align 4, !tbaa !36
  %502 = add nuw i64 %.0311532, 4
  %exitcond586.not.3 = icmp eq i64 %502, %.0332.lcssa
  br i1 %exitcond586.not.3, label %._crit_edge533, label %.preheader, !llvm.loop !55

._crit_edge533:                                   ; preds = %.preheader.prol.loopexit, %.preheader, %middle.block, %._crit_edge525.thread, %._crit_edge525
  call void @free(ptr noundef %295) #12
  call void @free(ptr noundef %192) #12
  call void @free(ptr noundef %195) #12
  br label %503

503:                                              ; preds = %._crit_edge533, %296
  %.1 = phi i32 [ 0, %._crit_edge533 ], [ -2, %296 ]
  call void @llvm.lifetime.end.p0(i64 8192, ptr nonnull %9) #12
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %8) #12
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %7) #12
  br label %.thread

.thread:                                          ; preds = %36, %31, %27, %44, %223, %503, %57, %6
  %.5 = phi i32 [ -1, %6 ], [ -2, %44 ], [ -2, %57 ], [ %.1, %503 ], [ -2, %223 ], [ -1, %27 ], [ -1, %31 ], [ -1, %36 ]
  ret i32 %.5
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #9

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #9

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

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

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


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