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

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

@is_initialized = external hidden global i8, align 1
@profiling_enabled = external hidden global i8, align 1
@operation_count = external hidden global i64, align 8
@total_flops = external hidden global i64, align 8

; 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

declare void @geometric_free(ptr noundef) #1

declare ptr @geometric_allocate(i64 noundef) #1

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

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

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

29:                                               ; preds = %3
  %30 = load ptr, ptr %6, align 8, !tbaa !5
  %31 = icmp eq ptr %30, null
  br i1 %31, label %32, label %33

32:                                               ; preds = %29
  store i32 -1, ptr %4, align 4
  br label %353

33:                                               ; preds = %29
  %34 = load i8, ptr @is_initialized, align 1, !tbaa !11, !range !13, !noundef !14
  %35 = trunc i8 %34 to i1
  br i1 %35, label %37, label %36

36:                                               ; preds = %33
  store i32 -4, ptr %4, align 4
  br label %353

37:                                               ; preds = %33
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  %38 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %38, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  %39 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %39, ptr %9, align 8, !tbaa !5
  %40 = load ptr, ptr %8, align 8, !tbaa !5
  %41 = load ptr, ptr %9, align 8, !tbaa !5
  %42 = load i64, ptr %7, align 8, !tbaa !9
  %43 = load i64, ptr %7, align 8, !tbaa !9
  %44 = mul i64 %42, %43
  %45 = mul i64 %44, 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %40, ptr align 4 %41, i64 %45, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  %46 = load i64, ptr %7, align 8, !tbaa !9
  %47 = load i64, ptr %7, align 8, !tbaa !9
  %48 = mul i64 %46, %47
  %49 = mul i64 %48, 4
  %50 = call ptr @geometric_allocate(i64 noundef %49)
  store ptr %50, ptr %10, align 8, !tbaa !5
  %51 = load ptr, ptr %10, align 8, !tbaa !5
  %52 = icmp ne ptr %51, null
  br i1 %52, label %54, label %53

53:                                               ; preds = %37
  store i32 -2, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %352

54:                                               ; preds = %37
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  store i64 0, ptr %12, align 8, !tbaa !9
  br label %55

55:                                               ; preds = %83, %54
  %56 = load i64, ptr %12, align 8, !tbaa !9
  %57 = load i64, ptr %7, align 8, !tbaa !9
  %58 = icmp ult i64 %56, %57
  br i1 %58, label %60, label %59

59:                                               ; preds = %55
  store i32 2, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  br label %86

60:                                               ; preds = %55
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  store i64 0, ptr %13, align 8, !tbaa !9
  br label %61

61:                                               ; preds = %79, %60
  %62 = load i64, ptr %13, align 8, !tbaa !9
  %63 = load i64, ptr %7, align 8, !tbaa !9
  %64 = icmp ult i64 %62, %63
  br i1 %64, label %66, label %65

65:                                               ; preds = %61
  store i32 5, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  br label %82

66:                                               ; preds = %61
  %67 = load i64, ptr %12, align 8, !tbaa !9
  %68 = load i64, ptr %13, align 8, !tbaa !9
  %69 = icmp eq i64 %67, %68
  %70 = zext i1 %69 to i64
  %71 = select i1 %69, float 1.000000e+00, float 0.000000e+00
  %72 = load ptr, ptr %10, align 8, !tbaa !5
  %73 = load i64, ptr %12, align 8, !tbaa !9
  %74 = load i64, ptr %7, align 8, !tbaa !9
  %75 = mul i64 %73, %74
  %76 = load i64, ptr %13, align 8, !tbaa !9
  %77 = add i64 %75, %76
  %78 = getelementptr inbounds float, ptr %72, i64 %77
  store float %71, ptr %78, align 4, !tbaa !15
  br label %79

79:                                               ; preds = %66
  %80 = load i64, ptr %13, align 8, !tbaa !9
  %81 = add i64 %80, 1
  store i64 %81, ptr %13, align 8, !tbaa !9
  br label %61, !llvm.loop !17

82:                                               ; preds = %65
  br label %83

83:                                               ; preds = %82
  %84 = load i64, ptr %12, align 8, !tbaa !9
  %85 = add i64 %84, 1
  store i64 %85, ptr %12, align 8, !tbaa !9
  br label %55, !llvm.loop !19

86:                                               ; preds = %59
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  store i64 0, ptr %14, align 8, !tbaa !9
  br label %87

87:                                               ; preds = %326, %86
  %88 = load i64, ptr %14, align 8, !tbaa !9
  %89 = load i64, ptr %7, align 8, !tbaa !9
  %90 = icmp ult i64 %88, %89
  br i1 %90, label %92, label %91

91:                                               ; preds = %87
  store i32 8, ptr %11, align 4
  br label %329

92:                                               ; preds = %87
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %93 = load i64, ptr %14, align 8, !tbaa !9
  store i64 %93, ptr %15, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  %94 = load ptr, ptr %8, align 8, !tbaa !5
  %95 = load i64, ptr %14, align 8, !tbaa !9
  %96 = load i64, ptr %7, align 8, !tbaa !9
  %97 = mul i64 %95, %96
  %98 = load i64, ptr %14, align 8, !tbaa !9
  %99 = add i64 %97, %98
  %100 = getelementptr inbounds float, ptr %94, i64 %99
  %101 = load float, ptr %100, align 4, !tbaa !15
  %102 = call float @llvm.fabs.f32(float %101)
  store float %102, ptr %16, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  %103 = load i64, ptr %14, align 8, !tbaa !9
  %104 = add i64 %103, 1
  store i64 %104, ptr %17, align 8, !tbaa !9
  br label %105

105:                                              ; preds = %127, %92
  %106 = load i64, ptr %17, align 8, !tbaa !9
  %107 = load i64, ptr %7, align 8, !tbaa !9
  %108 = icmp ult i64 %106, %107
  br i1 %108, label %110, label %109

109:                                              ; preds = %105
  store i32 11, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  br label %130

110:                                              ; preds = %105
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  %111 = load ptr, ptr %8, align 8, !tbaa !5
  %112 = load i64, ptr %17, align 8, !tbaa !9
  %113 = load i64, ptr %7, align 8, !tbaa !9
  %114 = mul i64 %112, %113
  %115 = load i64, ptr %14, align 8, !tbaa !9
  %116 = add i64 %114, %115
  %117 = getelementptr inbounds float, ptr %111, i64 %116
  %118 = load float, ptr %117, align 4, !tbaa !15
  %119 = call float @llvm.fabs.f32(float %118)
  store float %119, ptr %18, align 4, !tbaa !15
  %120 = load float, ptr %18, align 4, !tbaa !15
  %121 = load float, ptr %16, align 4, !tbaa !15
  %122 = fcmp ogt float %120, %121
  br i1 %122, label %123, label %126

123:                                              ; preds = %110
  %124 = load float, ptr %18, align 4, !tbaa !15
  store float %124, ptr %16, align 4, !tbaa !15
  %125 = load i64, ptr %17, align 8, !tbaa !9
  store i64 %125, ptr %15, align 8, !tbaa !9
  br label %126

126:                                              ; preds = %123, %110
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  br label %127

127:                                              ; preds = %126
  %128 = load i64, ptr %17, align 8, !tbaa !9
  %129 = add i64 %128, 1
  store i64 %129, ptr %17, align 8, !tbaa !9
  br label %105, !llvm.loop !20

130:                                              ; preds = %109
  %131 = load float, ptr %16, align 4, !tbaa !15
  %132 = fcmp olt float %131, 0x3EB0C6F7A0000000
  br i1 %132, label %133, label %135

133:                                              ; preds = %130
  %134 = load ptr, ptr %10, align 8, !tbaa !5
  call void @geometric_free(ptr noundef %134)
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %323

135:                                              ; preds = %130
  %136 = load i64, ptr %15, align 8, !tbaa !9
  %137 = load i64, ptr %14, align 8, !tbaa !9
  %138 = icmp ne i64 %136, %137
  br i1 %138, label %139, label %212

139:                                              ; preds = %135
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  store i64 0, ptr %19, align 8, !tbaa !9
  br label %140

140:                                              ; preds = %208, %139
  %141 = load i64, ptr %19, align 8, !tbaa !9
  %142 = load i64, ptr %7, align 8, !tbaa !9
  %143 = icmp ult i64 %141, %142
  br i1 %143, label %145, label %144

144:                                              ; preds = %140
  store i32 14, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  br label %211

145:                                              ; preds = %140
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  %146 = load ptr, ptr %8, align 8, !tbaa !5
  %147 = load i64, ptr %14, align 8, !tbaa !9
  %148 = load i64, ptr %7, align 8, !tbaa !9
  %149 = mul i64 %147, %148
  %150 = load i64, ptr %19, align 8, !tbaa !9
  %151 = add i64 %149, %150
  %152 = getelementptr inbounds float, ptr %146, i64 %151
  %153 = load float, ptr %152, align 4, !tbaa !15
  store float %153, ptr %20, align 4, !tbaa !15
  %154 = load ptr, ptr %8, align 8, !tbaa !5
  %155 = load i64, ptr %15, align 8, !tbaa !9
  %156 = load i64, ptr %7, align 8, !tbaa !9
  %157 = mul i64 %155, %156
  %158 = load i64, ptr %19, align 8, !tbaa !9
  %159 = add i64 %157, %158
  %160 = getelementptr inbounds float, ptr %154, i64 %159
  %161 = load float, ptr %160, align 4, !tbaa !15
  %162 = load ptr, ptr %8, align 8, !tbaa !5
  %163 = load i64, ptr %14, align 8, !tbaa !9
  %164 = load i64, ptr %7, align 8, !tbaa !9
  %165 = mul i64 %163, %164
  %166 = load i64, ptr %19, align 8, !tbaa !9
  %167 = add i64 %165, %166
  %168 = getelementptr inbounds float, ptr %162, i64 %167
  store float %161, ptr %168, align 4, !tbaa !15
  %169 = load float, ptr %20, align 4, !tbaa !15
  %170 = load ptr, ptr %8, align 8, !tbaa !5
  %171 = load i64, ptr %15, align 8, !tbaa !9
  %172 = load i64, ptr %7, align 8, !tbaa !9
  %173 = mul i64 %171, %172
  %174 = load i64, ptr %19, align 8, !tbaa !9
  %175 = add i64 %173, %174
  %176 = getelementptr inbounds float, ptr %170, i64 %175
  store float %169, ptr %176, align 4, !tbaa !15
  %177 = load ptr, ptr %10, align 8, !tbaa !5
  %178 = load i64, ptr %14, align 8, !tbaa !9
  %179 = load i64, ptr %7, align 8, !tbaa !9
  %180 = mul i64 %178, %179
  %181 = load i64, ptr %19, align 8, !tbaa !9
  %182 = add i64 %180, %181
  %183 = getelementptr inbounds float, ptr %177, i64 %182
  %184 = load float, ptr %183, align 4, !tbaa !15
  store float %184, ptr %20, align 4, !tbaa !15
  %185 = load ptr, ptr %10, align 8, !tbaa !5
  %186 = load i64, ptr %15, align 8, !tbaa !9
  %187 = load i64, ptr %7, align 8, !tbaa !9
  %188 = mul i64 %186, %187
  %189 = load i64, ptr %19, align 8, !tbaa !9
  %190 = add i64 %188, %189
  %191 = getelementptr inbounds float, ptr %185, i64 %190
  %192 = load float, ptr %191, align 4, !tbaa !15
  %193 = load ptr, ptr %10, align 8, !tbaa !5
  %194 = load i64, ptr %14, align 8, !tbaa !9
  %195 = load i64, ptr %7, align 8, !tbaa !9
  %196 = mul i64 %194, %195
  %197 = load i64, ptr %19, align 8, !tbaa !9
  %198 = add i64 %196, %197
  %199 = getelementptr inbounds float, ptr %193, i64 %198
  store float %192, ptr %199, align 4, !tbaa !15
  %200 = load float, ptr %20, align 4, !tbaa !15
  %201 = load ptr, ptr %10, align 8, !tbaa !5
  %202 = load i64, ptr %15, align 8, !tbaa !9
  %203 = load i64, ptr %7, align 8, !tbaa !9
  %204 = mul i64 %202, %203
  %205 = load i64, ptr %19, align 8, !tbaa !9
  %206 = add i64 %204, %205
  %207 = getelementptr inbounds float, ptr %201, i64 %206
  store float %200, ptr %207, align 4, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  br label %208

208:                                              ; preds = %145
  %209 = load i64, ptr %19, align 8, !tbaa !9
  %210 = add i64 %209, 1
  store i64 %210, ptr %19, align 8, !tbaa !9
  br label %140, !llvm.loop !21

211:                                              ; preds = %144
  br label %212

212:                                              ; preds = %211, %135
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #5
  %213 = load ptr, ptr %8, align 8, !tbaa !5
  %214 = load i64, ptr %14, align 8, !tbaa !9
  %215 = load i64, ptr %7, align 8, !tbaa !9
  %216 = mul i64 %214, %215
  %217 = load i64, ptr %14, align 8, !tbaa !9
  %218 = add i64 %216, %217
  %219 = getelementptr inbounds float, ptr %213, i64 %218
  %220 = load float, ptr %219, align 4, !tbaa !15
  %221 = fdiv float 1.000000e+00, %220
  store float %221, ptr %21, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  store i64 0, ptr %22, align 8, !tbaa !9
  br label %222

222:                                              ; preds = %248, %212
  %223 = load i64, ptr %22, align 8, !tbaa !9
  %224 = load i64, ptr %7, align 8, !tbaa !9
  %225 = icmp ult i64 %223, %224
  br i1 %225, label %227, label %226

226:                                              ; preds = %222
  store i32 17, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  br label %251

227:                                              ; preds = %222
  %228 = load float, ptr %21, align 4, !tbaa !15
  %229 = load ptr, ptr %8, align 8, !tbaa !5
  %230 = load i64, ptr %14, align 8, !tbaa !9
  %231 = load i64, ptr %7, align 8, !tbaa !9
  %232 = mul i64 %230, %231
  %233 = load i64, ptr %22, align 8, !tbaa !9
  %234 = add i64 %232, %233
  %235 = getelementptr inbounds float, ptr %229, i64 %234
  %236 = load float, ptr %235, align 4, !tbaa !15
  %237 = fmul float %236, %228
  store float %237, ptr %235, align 4, !tbaa !15
  %238 = load float, ptr %21, align 4, !tbaa !15
  %239 = load ptr, ptr %10, align 8, !tbaa !5
  %240 = load i64, ptr %14, align 8, !tbaa !9
  %241 = load i64, ptr %7, align 8, !tbaa !9
  %242 = mul i64 %240, %241
  %243 = load i64, ptr %22, align 8, !tbaa !9
  %244 = add i64 %242, %243
  %245 = getelementptr inbounds float, ptr %239, i64 %244
  %246 = load float, ptr %245, align 4, !tbaa !15
  %247 = fmul float %246, %238
  store float %247, ptr %245, align 4, !tbaa !15
  br label %248

248:                                              ; preds = %227
  %249 = load i64, ptr %22, align 8, !tbaa !9
  %250 = add i64 %249, 1
  store i64 %250, ptr %22, align 8, !tbaa !9
  br label %222, !llvm.loop !22

251:                                              ; preds = %226
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  store i64 0, ptr %23, align 8, !tbaa !9
  br label %252

252:                                              ; preds = %319, %251
  %253 = load i64, ptr %23, align 8, !tbaa !9
  %254 = load i64, ptr %7, align 8, !tbaa !9
  %255 = icmp ult i64 %253, %254
  br i1 %255, label %257, label %256

256:                                              ; preds = %252
  store i32 20, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  br label %322

257:                                              ; preds = %252
  %258 = load i64, ptr %23, align 8, !tbaa !9
  %259 = load i64, ptr %14, align 8, !tbaa !9
  %260 = icmp ne i64 %258, %259
  br i1 %260, label %261, label %318

261:                                              ; preds = %257
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #5
  %262 = load ptr, ptr %8, align 8, !tbaa !5
  %263 = load i64, ptr %23, align 8, !tbaa !9
  %264 = load i64, ptr %7, align 8, !tbaa !9
  %265 = mul i64 %263, %264
  %266 = load i64, ptr %14, align 8, !tbaa !9
  %267 = add i64 %265, %266
  %268 = getelementptr inbounds float, ptr %262, i64 %267
  %269 = load float, ptr %268, align 4, !tbaa !15
  store float %269, ptr %24, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  store i64 0, ptr %25, align 8, !tbaa !9
  br label %270

270:                                              ; preds = %314, %261
  %271 = load i64, ptr %25, align 8, !tbaa !9
  %272 = load i64, ptr %7, align 8, !tbaa !9
  %273 = icmp ult i64 %271, %272
  br i1 %273, label %275, label %274

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

275:                                              ; preds = %270
  %276 = load float, ptr %24, align 4, !tbaa !15
  %277 = load ptr, ptr %8, align 8, !tbaa !5
  %278 = load i64, ptr %14, align 8, !tbaa !9
  %279 = load i64, ptr %7, align 8, !tbaa !9
  %280 = mul i64 %278, %279
  %281 = load i64, ptr %25, align 8, !tbaa !9
  %282 = add i64 %280, %281
  %283 = getelementptr inbounds float, ptr %277, i64 %282
  %284 = load float, ptr %283, align 4, !tbaa !15
  %285 = load ptr, ptr %8, align 8, !tbaa !5
  %286 = load i64, ptr %23, align 8, !tbaa !9
  %287 = load i64, ptr %7, align 8, !tbaa !9
  %288 = mul i64 %286, %287
  %289 = load i64, ptr %25, align 8, !tbaa !9
  %290 = add i64 %288, %289
  %291 = getelementptr inbounds float, ptr %285, i64 %290
  %292 = load float, ptr %291, align 4, !tbaa !15
  %293 = fneg float %276
  %294 = call float @llvm.fmuladd.f32(float %293, float %284, float %292)
  store float %294, ptr %291, align 4, !tbaa !15
  %295 = load float, ptr %24, align 4, !tbaa !15
  %296 = load ptr, ptr %10, align 8, !tbaa !5
  %297 = load i64, ptr %14, align 8, !tbaa !9
  %298 = load i64, ptr %7, align 8, !tbaa !9
  %299 = mul i64 %297, %298
  %300 = load i64, ptr %25, align 8, !tbaa !9
  %301 = add i64 %299, %300
  %302 = getelementptr inbounds float, ptr %296, i64 %301
  %303 = load float, ptr %302, align 4, !tbaa !15
  %304 = load ptr, ptr %10, align 8, !tbaa !5
  %305 = load i64, ptr %23, align 8, !tbaa !9
  %306 = load i64, ptr %7, align 8, !tbaa !9
  %307 = mul i64 %305, %306
  %308 = load i64, ptr %25, align 8, !tbaa !9
  %309 = add i64 %307, %308
  %310 = getelementptr inbounds float, ptr %304, i64 %309
  %311 = load float, ptr %310, align 4, !tbaa !15
  %312 = fneg float %295
  %313 = call float @llvm.fmuladd.f32(float %312, float %303, float %311)
  store float %313, ptr %310, align 4, !tbaa !15
  br label %314

314:                                              ; preds = %275
  %315 = load i64, ptr %25, align 8, !tbaa !9
  %316 = add i64 %315, 1
  store i64 %316, ptr %25, align 8, !tbaa !9
  br label %270, !llvm.loop !23

317:                                              ; preds = %274
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #5
  br label %318

318:                                              ; preds = %317, %257
  br label %319

319:                                              ; preds = %318
  %320 = load i64, ptr %23, align 8, !tbaa !9
  %321 = add i64 %320, 1
  store i64 %321, ptr %23, align 8, !tbaa !9
  br label %252, !llvm.loop !24

322:                                              ; preds = %256
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #5
  store i32 0, ptr %11, align 4
  br label %323

323:                                              ; preds = %322, %133
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  %324 = load i32, ptr %11, align 4
  switch i32 %324, label %329 [
    i32 0, label %325
  ]

325:                                              ; preds = %323
  br label %326

326:                                              ; preds = %325
  %327 = load i64, ptr %14, align 8, !tbaa !9
  %328 = add i64 %327, 1
  store i64 %328, ptr %14, align 8, !tbaa !9
  br label %87, !llvm.loop !25

329:                                              ; preds = %323, %91
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  %330 = load i32, ptr %11, align 4
  switch i32 %330, label %352 [
    i32 8, label %331
  ]

331:                                              ; preds = %329
  %332 = load ptr, ptr %8, align 8, !tbaa !5
  %333 = load ptr, ptr %10, align 8, !tbaa !5
  %334 = load i64, ptr %7, align 8, !tbaa !9
  %335 = load i64, ptr %7, align 8, !tbaa !9
  %336 = mul i64 %334, %335
  %337 = mul i64 %336, 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %332, ptr align 4 %333, i64 %337, i1 false)
  %338 = load ptr, ptr %10, align 8, !tbaa !5
  call void @geometric_free(ptr noundef %338)
  %339 = load i8, ptr @profiling_enabled, align 1, !tbaa !11, !range !13, !noundef !14
  %340 = trunc i8 %339 to i1
  br i1 %340, label %341, label %351

341:                                              ; preds = %331
  %342 = load i64, ptr @operation_count, align 8, !tbaa !9
  %343 = add i64 %342, 1
  store i64 %343, ptr @operation_count, align 8, !tbaa !9
  %344 = load i64, ptr %7, align 8, !tbaa !9
  %345 = load i64, ptr %7, align 8, !tbaa !9
  %346 = mul i64 %344, %345
  %347 = load i64, ptr %7, align 8, !tbaa !9
  %348 = mul i64 %346, %347
  %349 = load i64, ptr @total_flops, align 8, !tbaa !9
  %350 = add i64 %349, %348
  store i64 %350, ptr @total_flops, align 8, !tbaa !9
  br label %351

351:                                              ; preds = %341, %331
  store i32 0, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %352

352:                                              ; preds = %351, %329, %53
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  br label %353

353:                                              ; preds = %352, %36, %32, %28
  %354 = load i32, ptr %4, align 4
  ret i32 %354
}

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

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!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, !12, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{i8 0, i8 2}
!14 = !{}
!15 = !{!16, !16, i64 0}
!16 = !{!"float", !7, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18}
!20 = distinct !{!20, !18}
!21 = distinct !{!21, !18}
!22 = distinct !{!22, !18}
!23 = distinct !{!23, !18}
!24 = distinct !{!24, !18}
!25 = distinct !{!25, !18}


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

@is_initialized = external hidden local_unnamed_addr global i8, align 1
@profiling_enabled = external hidden local_unnamed_addr global i8, align 1
@operation_count = external hidden local_unnamed_addr global i64, align 8
@total_flops = external hidden local_unnamed_addr global i64, align 8

declare void @geometric_free(ptr noundef) local_unnamed_addr #0

declare ptr @geometric_allocate(i64 noundef) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @geometric_core_matrix_inverse(ptr noundef %0, ptr noundef readonly %1, i64 noundef %2) local_unnamed_addr #2 {
  %4 = icmp eq ptr %0, null
  %5 = icmp eq ptr %1, null
  %or.cond = or i1 %4, %5
  br i1 %or.cond, label %.loopexit168, label %6

6:                                                ; preds = %3
  %7 = load i8, ptr @is_initialized, align 1, !tbaa !5, !range !9, !noundef !10
  %8 = trunc nuw i8 %7 to i1
  br i1 %8, label %9, label %.loopexit168

9:                                                ; preds = %6
  %10 = mul i64 %2, %2
  %11 = shl i64 %10, 2
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 %0, ptr nonnull align 4 %1, i64 %11, i1 false)
  %12 = tail call ptr @geometric_allocate(i64 noundef %11) #5
  %.not = icmp eq ptr %12, null
  br i1 %.not, label %.loopexit168, label %.preheader170

.preheader170:                                    ; preds = %9
  %.not183 = icmp eq i64 %2, 0
  br i1 %.not183, label %.preheader167, label %.preheader169.preheader

.preheader169.preheader:                          ; preds = %.preheader170
  %min.iters.check = icmp ult i64 %2, 8
  %n.vec = and i64 %2, -8
  %cmp.n = icmp eq i64 %n.vec, %2
  br label %.preheader169

.preheader169:                                    ; preds = %.preheader169.preheader, %.loopexit313
  %.0147172 = phi i64 [ %40, %.loopexit313 ], [ 0, %.preheader169.preheader ]
  %13 = mul i64 %.0147172, %2
  %14 = getelementptr float, ptr %12, i64 %13
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

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

vector.ph:                                        ; preds = %.preheader169
  %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %.0147172, i64 0
  %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.ind = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
  %step.add = add <4 x i64> %vec.ind, <i64 4, i64 4, i64 4, i64 4>
  %15 = icmp eq <4 x i64> %broadcast.splat, %vec.ind
  %16 = icmp eq <4 x i64> %broadcast.splat, %step.add
  %17 = select <4 x i1> %15, <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float> zeroinitializer
  %18 = select <4 x i1> %16, <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float> zeroinitializer
  %19 = getelementptr float, ptr %14, i64 %index
  %20 = getelementptr i8, ptr %19, i64 16
  store <4 x float> %17, ptr %19, align 4, !tbaa !11
  store <4 x float> %18, ptr %20, align 4, !tbaa !11
  %index.next = add nuw i64 %index, 8
  %vec.ind.next = add <4 x i64> %vec.ind, <i64 8, i64 8, i64 8, i64 8>
  %21 = icmp eq i64 %index.next, %n.vec
  br i1 %21, label %middle.block, label %vector.body, !llvm.loop !13

middle.block:                                     ; preds = %vector.body
  br i1 %cmp.n, label %.loopexit313, label %scalar.ph.preheader

.preheader167:                                    ; preds = %.loopexit313, %.preheader170
  %umax = tail call i64 @llvm.umax.i64(i64 %2, i64 1)
  %exitcond190.not192 = icmp eq i64 %2, 0
  br i1 %exitcond190.not192, label %.critedge, label %.lr.ph194

.lr.ph194:                                        ; preds = %.preheader167
  %22 = add i64 %umax, 4611686018427387903
  %23 = mul i64 %22, %2
  %24 = shl i64 %umax, 2
  %25 = add i64 %23, %umax
  %26 = shl i64 %25, 2
  %scevgep = getelementptr i8, ptr %0, i64 %26
  %scevgep196 = getelementptr i8, ptr %12, i64 %26
  %27 = shl i64 %2, 2
  %28 = add i64 %2, 4611686018427387903
  %29 = mul i64 %28, %2
  %30 = add i64 %29, %umax
  %31 = shl i64 %30, 2
  %scevgep238 = getelementptr i8, ptr %0, i64 %31
  %scevgep239 = getelementptr i8, ptr %12, i64 %31
  %32 = add i64 %2, 4611686018427387903
  %33 = mul i64 %32, %2
  %34 = shl i64 %umax, 2
  %35 = add i64 %33, %umax
  %36 = shl i64 %35, 2
  %scevgep261 = getelementptr i8, ptr %0, i64 %36
  %37 = shl i64 %2, 2
  %scevgep263 = getelementptr i8, ptr %0, i64 %34
  %scevgep265 = getelementptr i8, ptr %12, i64 %36
  %scevgep267 = getelementptr i8, ptr %12, i64 %34
  %min.iters.check300 = icmp ult i64 %2, 16
  %bound0273 = icmp ugt ptr %scevgep265, %0
  %bound1274 = icmp ult ptr %12, %scevgep261
  %found.conflict275 = and i1 %bound0273, %bound1274
  %.mask = and i64 %2, 2305843009213693952
  %stride.check276 = icmp ne i64 %.mask, 0
  %38 = or i1 %found.conflict275, %stride.check276
  %bound0289 = icmp ugt ptr %scevgep267, %0
  %bound1290 = icmp ult ptr %12, %scevgep263
  %found.conflict291 = and i1 %bound0289, %bound1290
  %n.vec303 = and i64 %umax, -4
  %cmp.n312 = icmp eq i64 %n.vec303, %2
  %min.iters.check247 = icmp ult i64 %2, 4
  %bound0240 = icmp ugt ptr %scevgep239, %0
  %bound1241 = icmp ult ptr %12, %scevgep238
  %found.conflict242 = and i1 %bound0240, %bound1241
  %.mask314 = and i64 %2, 2305843009213693952
  %stride.check243 = icmp ne i64 %.mask314, 0
  %39 = or i1 %found.conflict242, %stride.check243
  %n.vec250 = and i64 %umax, -2305843009213693956
  %cmp.n259 = icmp eq i64 %n.vec250, %2
  %xtraiter = and i64 %umax, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %min.iters.check223 = icmp ult i64 %2, 12
  %bound0 = icmp ugt ptr %scevgep196, %0
  %bound1 = icmp ult ptr %12, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  %.mask315 = and i64 %2, 2305843009213693952
  %stride.check205 = icmp ne i64 %.mask315, 0
  %n.vec226 = and i64 %umax, -4
  %cmp.n236 = icmp eq i64 %n.vec226, %2
  br label %45

.loopexit313:                                     ; preds = %scalar.ph, %middle.block
  %40 = add nuw i64 %.0147172, 1
  %exitcond184.not = icmp eq i64 %40, %2
  br i1 %exitcond184.not, label %.preheader167, label %.preheader169, !llvm.loop !17

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0149171 = phi i64 [ %44, %scalar.ph ], [ %.0149171.ph, %scalar.ph.preheader ]
  %41 = icmp eq i64 %.0147172, %.0149171
  %42 = select i1 %41, float 1.000000e+00, float 0.000000e+00
  %43 = getelementptr float, ptr %14, i64 %.0149171
  store float %42, ptr %43, align 4, !tbaa !11
  %44 = add nuw i64 %.0149171, 1
  %exitcond.not = icmp eq i64 %44, %2
  br i1 %exitcond.not, label %.loopexit313, label %scalar.ph, !llvm.loop !18

.loopexit191:                                     ; preds = %.loopexit
  %exitcond190.not = icmp eq i64 %53, %2
  br i1 %exitcond190.not, label %.critedge, label %45, !llvm.loop !19

45:                                               ; preds = %.lr.ph194, %.loopexit191
  %.0155193 = phi i64 [ 0, %.lr.ph194 ], [ %53, %.loopexit191 ]
  %46 = mul i64 %27, %.0155193
  %scevgep197 = getelementptr i8, ptr %0, i64 %46
  %47 = add i64 %24, %46
  %scevgep198 = getelementptr i8, ptr %0, i64 %47
  %scevgep199 = getelementptr i8, ptr %12, i64 %46
  %scevgep200 = getelementptr i8, ptr %12, i64 %47
  %48 = mul i64 %.0155193, %2
  %49 = getelementptr float, ptr %0, i64 %48
  %50 = getelementptr float, ptr %49, i64 %.0155193
  %51 = load float, ptr %50, align 4, !tbaa !11
  %52 = tail call float @llvm.fabs.f32(float %51)
  %53 = add i64 %.0155193, 1
  %invariant.gep = getelementptr float, ptr %0, i64 %.0155193
  %54 = icmp ult i64 %53, %2
  br i1 %54, label %.lr.ph, label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph, %45
  %.0153.lcssa = phi i64 [ %.0155193, %45 ], [ %.1154, %.lr.ph ]
  %.0151.lcssa = phi float [ %52, %45 ], [ %.1152, %.lr.ph ]
  %55 = fcmp uge float %.0151.lcssa, 0x3EB0C6F7A0000000
  br i1 %55, label %62, label %.thread

.lr.ph:                                           ; preds = %45, %.lr.ph
  %.0150175 = phi i64 [ %60, %.lr.ph ], [ %53, %45 ]
  %.0151174 = phi float [ %.1152, %.lr.ph ], [ %52, %45 ]
  %.0153173 = phi i64 [ %.1154, %.lr.ph ], [ %.0155193, %45 ]
  %56 = mul i64 %.0150175, %2
  %gep = getelementptr float, ptr %invariant.gep, i64 %56
  %57 = load float, ptr %gep, align 4, !tbaa !11
  %58 = tail call float @llvm.fabs.f32(float %57)
  %59 = fcmp ogt float %58, %.0151174
  %.1154 = select i1 %59, i64 %.0150175, i64 %.0153173
  %.1152 = select i1 %59, float %58, float %.0151174
  %60 = add nuw i64 %.0150175, 1
  %61 = icmp ult i64 %60, %2
  br i1 %61, label %.lr.ph, label %._crit_edge, !llvm.loop !20

.thread:                                          ; preds = %._crit_edge
  tail call void @geometric_free(ptr noundef nonnull %12) #5
  br label %.loopexit168

62:                                               ; preds = %._crit_edge
  %.not162 = icmp eq i64 %.0153.lcssa, %.0155193
  br i1 %.not162, label %.loopexit166, label %.preheader165

.preheader165:                                    ; preds = %62
  %63 = mul i64 %.0153.lcssa, %2
  br i1 %min.iters.check300, label %scalar.ph299.preheader, label %vector.memcheck260

vector.memcheck260:                               ; preds = %.preheader165
  %64 = mul i64 %37, %.0153.lcssa
  %scevgep262 = getelementptr i8, ptr %0, i64 %64
  %scevgep264 = getelementptr i8, ptr %scevgep263, i64 %64
  %scevgep266 = getelementptr i8, ptr %12, i64 %64
  %scevgep268 = getelementptr i8, ptr %scevgep267, i64 %64
  %bound0269 = icmp ugt ptr %scevgep264, %0
  %bound1270 = icmp ult ptr %scevgep262, %scevgep261
  %found.conflict271 = and i1 %bound0269, %bound1270
  %conflict.rdx278 = or i1 %found.conflict271, %38
  %bound0279 = icmp ugt ptr %scevgep268, %0
  %bound1280 = icmp ult ptr %scevgep266, %scevgep261
  %found.conflict281 = and i1 %bound0279, %bound1280
  %conflict.rdx283 = or i1 %found.conflict281, %conflict.rdx278
  %bound0284 = icmp ult ptr %scevgep262, %scevgep265
  %bound1285 = icmp ult ptr %12, %scevgep264
  %found.conflict286 = and i1 %bound0284, %bound1285
  %conflict.rdx288 = or i1 %found.conflict286, %conflict.rdx283
  %conflict.rdx292 = or i1 %conflict.rdx288, %found.conflict291
  %bound0293 = icmp ult ptr %12, %scevgep268
  %bound1294 = icmp ult ptr %scevgep266, %scevgep265
  %found.conflict295 = and i1 %bound0293, %bound1294
  %conflict.rdx297 = or i1 %found.conflict295, %conflict.rdx292
  br i1 %conflict.rdx297, label %scalar.ph299.preheader, label %vector.body305

vector.body305:                                   ; preds = %vector.memcheck260, %vector.body305
  %index306 = phi i64 [ %index.next311, %vector.body305 ], [ 0, %vector.memcheck260 ]
  %65 = add i64 %index306, %48
  %66 = getelementptr inbounds float, ptr %0, i64 %65
  %wide.load307 = load <4 x float>, ptr %66, align 4, !tbaa !11, !alias.scope !21, !noalias !24
  %67 = add i64 %index306, %63
  %68 = getelementptr inbounds float, ptr %0, i64 %67
  %wide.load308 = load <4 x float>, ptr %68, align 4, !tbaa !11, !alias.scope !28, !noalias !29
  store <4 x float> %wide.load308, ptr %66, align 4, !tbaa !11, !alias.scope !21, !noalias !24
  store <4 x float> %wide.load307, ptr %68, align 4, !tbaa !11, !alias.scope !28, !noalias !29
  %69 = getelementptr inbounds float, ptr %12, i64 %65
  %wide.load309 = load <4 x float>, ptr %69, align 4, !tbaa !11, !alias.scope !30, !noalias !31
  %70 = getelementptr inbounds float, ptr %12, i64 %67
  %wide.load310 = load <4 x float>, ptr %70, align 4, !tbaa !11, !alias.scope !31
  store <4 x float> %wide.load310, ptr %69, align 4, !tbaa !11, !alias.scope !30, !noalias !31
  store <4 x float> %wide.load309, ptr %70, align 4, !tbaa !11, !alias.scope !31
  %index.next311 = add nuw i64 %index306, 4
  %71 = icmp eq i64 %index.next311, %n.vec303
  br i1 %71, label %middle.block298, label %vector.body305, !llvm.loop !32

middle.block298:                                  ; preds = %vector.body305
  br i1 %cmp.n312, label %.loopexit166.loopexit, label %scalar.ph299.preheader

scalar.ph299.preheader:                           ; preds = %middle.block298, %vector.memcheck260, %.preheader165
  %.0148177.ph = phi i64 [ 0, %vector.memcheck260 ], [ 0, %.preheader165 ], [ %n.vec303, %middle.block298 ]
  br label %scalar.ph299

scalar.ph299:                                     ; preds = %scalar.ph299.preheader, %scalar.ph299
  %.0148177 = phi i64 [ %82, %scalar.ph299 ], [ %.0148177.ph, %scalar.ph299.preheader ]
  %72 = add i64 %.0148177, %48
  %73 = getelementptr inbounds float, ptr %0, i64 %72
  %74 = load float, ptr %73, align 4, !tbaa !11
  %75 = add i64 %.0148177, %63
  %76 = getelementptr inbounds float, ptr %0, i64 %75
  %77 = load float, ptr %76, align 4, !tbaa !11
  store float %77, ptr %73, align 4, !tbaa !11
  store float %74, ptr %76, align 4, !tbaa !11
  %78 = getelementptr inbounds float, ptr %12, i64 %72
  %79 = load float, ptr %78, align 4, !tbaa !11
  %80 = getelementptr inbounds float, ptr %12, i64 %75
  %81 = load float, ptr %80, align 4, !tbaa !11
  store float %81, ptr %78, align 4, !tbaa !11
  store float %79, ptr %80, align 4, !tbaa !11
  %82 = add nuw i64 %.0148177, 1
  %exitcond185.not = icmp eq i64 %82, %umax
  br i1 %exitcond185.not, label %.loopexit166.loopexit, label %scalar.ph299, !llvm.loop !33

.loopexit166.loopexit:                            ; preds = %scalar.ph299, %middle.block298
  %.pre = load float, ptr %50, align 4, !tbaa !11
  br label %.loopexit166

.loopexit166:                                     ; preds = %.loopexit166.loopexit, %62
  %83 = phi float [ %.pre, %.loopexit166.loopexit ], [ %51, %62 ]
  %84 = fdiv float 1.000000e+00, %83
  %brmerge = select i1 %min.iters.check247, i1 true, i1 %39
  br i1 %brmerge, label %scalar.ph246.preheader, label %vector.ph248

vector.ph248:                                     ; preds = %.loopexit166
  %broadcast.splatinsert255 = insertelement <4 x float> poison, float %84, i64 0
  %broadcast.splat256 = shufflevector <4 x float> %broadcast.splatinsert255, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body252

vector.body252:                                   ; preds = %vector.body252, %vector.ph248
  %index253 = phi i64 [ 0, %vector.ph248 ], [ %index.next258, %vector.body252 ]
  %85 = add i64 %index253, %48
  %86 = getelementptr inbounds float, ptr %0, i64 %85
  %wide.load254 = load <4 x float>, ptr %86, align 4, !tbaa !11, !alias.scope !34, !noalias !37
  %87 = fmul <4 x float> %broadcast.splat256, %wide.load254
  store <4 x float> %87, ptr %86, align 4, !tbaa !11, !alias.scope !34, !noalias !37
  %88 = getelementptr inbounds float, ptr %12, i64 %85
  %wide.load257 = load <4 x float>, ptr %88, align 4, !tbaa !11, !alias.scope !37
  %89 = fmul <4 x float> %broadcast.splat256, %wide.load257
  store <4 x float> %89, ptr %88, align 4, !tbaa !11, !alias.scope !37
  %index.next258 = add nuw i64 %index253, 4
  %90 = icmp eq i64 %index.next258, %n.vec250
  br i1 %90, label %middle.block245, label %vector.body252, !llvm.loop !39

middle.block245:                                  ; preds = %vector.body252
  br i1 %cmp.n259, label %.preheader.preheader, label %scalar.ph246.preheader

scalar.ph246.preheader:                           ; preds = %.loopexit166, %middle.block245
  %.0144178.ph = phi i64 [ 0, %.loopexit166 ], [ %n.vec250, %middle.block245 ]
  %.neg = or disjoint i64 %.0144178.ph, 1
  br i1 %lcmp.mod.not, label %scalar.ph246.prol.loopexit, label %scalar.ph246.prol

scalar.ph246.prol:                                ; preds = %scalar.ph246.preheader
  %91 = add i64 %.0144178.ph, %48
  %92 = getelementptr inbounds float, ptr %0, i64 %91
  %93 = load float, ptr %92, align 4, !tbaa !11
  %94 = fmul float %84, %93
  store float %94, ptr %92, align 4, !tbaa !11
  %95 = getelementptr inbounds float, ptr %12, i64 %91
  %96 = load float, ptr %95, align 4, !tbaa !11
  %97 = fmul float %84, %96
  store float %97, ptr %95, align 4, !tbaa !11
  %98 = or disjoint i64 %.0144178.ph, 1
  br label %scalar.ph246.prol.loopexit

scalar.ph246.prol.loopexit:                       ; preds = %scalar.ph246.prol, %scalar.ph246.preheader
  %.0144178.unr = phi i64 [ %.0144178.ph, %scalar.ph246.preheader ], [ %98, %scalar.ph246.prol ]
  %99 = icmp eq i64 %umax, %.neg
  br i1 %99, label %.preheader.preheader, label %scalar.ph246

scalar.ph246:                                     ; preds = %scalar.ph246.prol.loopexit, %scalar.ph246
  %.0144178 = phi i64 [ %115, %scalar.ph246 ], [ %.0144178.unr, %scalar.ph246.prol.loopexit ]
  %100 = add i64 %.0144178, %48
  %101 = getelementptr inbounds float, ptr %0, i64 %100
  %102 = load float, ptr %101, align 4, !tbaa !11
  %103 = fmul float %84, %102
  store float %103, ptr %101, align 4, !tbaa !11
  %104 = getelementptr inbounds float, ptr %12, i64 %100
  %105 = load float, ptr %104, align 4, !tbaa !11
  %106 = fmul float %84, %105
  store float %106, ptr %104, align 4, !tbaa !11
  %107 = add nuw i64 %.0144178, 1
  %108 = add i64 %107, %48
  %109 = getelementptr inbounds float, ptr %0, i64 %108
  %110 = load float, ptr %109, align 4, !tbaa !11
  %111 = fmul float %84, %110
  store float %111, ptr %109, align 4, !tbaa !11
  %112 = getelementptr inbounds float, ptr %12, i64 %108
  %113 = load float, ptr %112, align 4, !tbaa !11
  %114 = fmul float %84, %113
  store float %114, ptr %112, align 4, !tbaa !11
  %115 = add nuw i64 %.0144178, 2
  %exitcond187.not.1 = icmp eq i64 %115, %2
  br i1 %exitcond187.not.1, label %.preheader.preheader, label %scalar.ph246, !llvm.loop !40

.preheader.preheader:                             ; preds = %scalar.ph246.prol.loopexit, %scalar.ph246, %middle.block245
  %bound0202 = icmp ugt ptr %scevgep198, %0
  %bound1203 = icmp ult ptr %scevgep197, %scevgep
  %found.conflict204 = and i1 %bound0202, %bound1203
  %116 = or i1 %found.conflict204, %stride.check205
  %conflict.rdx = or i1 %found.conflict, %116
  %bound0206 = icmp ugt ptr %scevgep200, %0
  %bound1207 = icmp ult ptr %scevgep199, %scevgep
  %found.conflict208 = and i1 %bound0206, %bound1207
  %conflict.rdx210 = or i1 %found.conflict208, %conflict.rdx
  %bound0211 = icmp ult ptr %12, %scevgep198
  %bound1212 = icmp ult ptr %scevgep197, %scevgep196
  %found.conflict213 = and i1 %bound0211, %bound1212
  %conflict.rdx215 = or i1 %found.conflict213, %conflict.rdx210
  %bound0216 = icmp ult ptr %12, %scevgep200
  %bound1217 = icmp ult ptr %scevgep199, %scevgep196
  %found.conflict218 = and i1 %bound0216, %bound1217
  %conflict.rdx220 = or i1 %found.conflict218, %conflict.rdx215
  br label %.preheader

.preheader:                                       ; preds = %.preheader.preheader, %.loopexit
  %.0143182 = phi i64 [ %143, %.loopexit ], [ 0, %.preheader.preheader ]
  %.not163 = icmp eq i64 %.0143182, %.0155193
  br i1 %.not163, label %.loopexit, label %117

117:                                              ; preds = %.preheader
  %118 = mul i64 %.0143182, %2
  %gep181 = getelementptr float, ptr %invariant.gep, i64 %118
  %119 = load float, ptr %gep181, align 4, !tbaa !11
  %120 = fneg float %119
  %brmerge316 = select i1 %min.iters.check223, i1 true, i1 %conflict.rdx220
  br i1 %brmerge316, label %scalar.ph222.preheader, label %vector.ph224

vector.ph224:                                     ; preds = %117
  %broadcast.splatinsert231 = insertelement <4 x float> poison, float %120, i64 0
  %broadcast.splat232 = shufflevector <4 x float> %broadcast.splatinsert231, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body228

vector.body228:                                   ; preds = %vector.body228, %vector.ph224
  %index229 = phi i64 [ 0, %vector.ph224 ], [ %index.next235, %vector.body228 ]
  %121 = add i64 %index229, %48
  %122 = getelementptr inbounds float, ptr %0, i64 %121
  %wide.load = load <4 x float>, ptr %122, align 4, !tbaa !11, !alias.scope !41
  %123 = add i64 %index229, %118
  %124 = getelementptr inbounds float, ptr %0, i64 %123
  %wide.load230 = load <4 x float>, ptr %124, align 4, !tbaa !11, !alias.scope !44, !noalias !46
  %125 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %broadcast.splat232, <4 x float> %wide.load, <4 x float> %wide.load230)
  store <4 x float> %125, ptr %124, align 4, !tbaa !11, !alias.scope !44, !noalias !46
  %126 = getelementptr inbounds float, ptr %12, i64 %121
  %wide.load233 = load <4 x float>, ptr %126, align 4, !tbaa !11, !alias.scope !49
  %127 = getelementptr inbounds float, ptr %12, i64 %123
  %wide.load234 = load <4 x float>, ptr %127, align 4, !tbaa !11, !alias.scope !50, !noalias !51
  %128 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %broadcast.splat232, <4 x float> %wide.load233, <4 x float> %wide.load234)
  store <4 x float> %128, ptr %127, align 4, !tbaa !11, !alias.scope !50, !noalias !51
  %index.next235 = add nuw i64 %index229, 4
  %129 = icmp eq i64 %index.next235, %n.vec226
  br i1 %129, label %middle.block221, label %vector.body228, !llvm.loop !52

middle.block221:                                  ; preds = %vector.body228
  br i1 %cmp.n236, label %.loopexit, label %scalar.ph222.preheader

scalar.ph222.preheader:                           ; preds = %117, %middle.block221
  %.0179.ph = phi i64 [ 0, %117 ], [ %n.vec226, %middle.block221 ]
  br label %scalar.ph222

scalar.ph222:                                     ; preds = %scalar.ph222.preheader, %scalar.ph222
  %.0179 = phi i64 [ %142, %scalar.ph222 ], [ %.0179.ph, %scalar.ph222.preheader ]
  %130 = add i64 %.0179, %48
  %131 = getelementptr inbounds float, ptr %0, i64 %130
  %132 = load float, ptr %131, align 4, !tbaa !11
  %133 = add i64 %.0179, %118
  %134 = getelementptr inbounds float, ptr %0, i64 %133
  %135 = load float, ptr %134, align 4, !tbaa !11
  %136 = tail call float @llvm.fmuladd.f32(float %120, float %132, float %135)
  store float %136, ptr %134, align 4, !tbaa !11
  %137 = getelementptr inbounds float, ptr %12, i64 %130
  %138 = load float, ptr %137, align 4, !tbaa !11
  %139 = getelementptr inbounds float, ptr %12, i64 %133
  %140 = load float, ptr %139, align 4, !tbaa !11
  %141 = tail call float @llvm.fmuladd.f32(float %120, float %138, float %140)
  store float %141, ptr %139, align 4, !tbaa !11
  %142 = add nuw i64 %.0179, 1
  %exitcond188.not = icmp eq i64 %142, %umax
  br i1 %exitcond188.not, label %.loopexit, label %scalar.ph222, !llvm.loop !53

.loopexit:                                        ; preds = %scalar.ph222, %middle.block221, %.preheader
  %143 = add nuw i64 %.0143182, 1
  %exitcond189.not = icmp eq i64 %143, %umax
  br i1 %exitcond189.not, label %.loopexit191, label %.preheader, !llvm.loop !19

.critedge:                                        ; preds = %.loopexit191, %.preheader167
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 %0, ptr nonnull align 4 %12, i64 %11, i1 false)
  tail call void @geometric_free(ptr noundef nonnull %12) #5
  %144 = load i8, ptr @profiling_enabled, align 1, !tbaa !5, !range !9, !noundef !10
  %145 = trunc nuw i8 %144 to i1
  br i1 %145, label %146, label %.loopexit168

146:                                              ; preds = %.critedge
  %147 = load i64, ptr @operation_count, align 8, !tbaa !54
  %148 = add i64 %147, 1
  store i64 %148, ptr @operation_count, align 8, !tbaa !54
  %149 = mul i64 %10, %2
  %150 = load i64, ptr @total_flops, align 8, !tbaa !54
  %151 = add i64 %150, %149
  store i64 %151, ptr @total_flops, align 8, !tbaa !54
  br label %.loopexit168

.loopexit168:                                     ; preds = %.thread, %9, %146, %.critedge, %6, %3
  %.4 = phi i32 [ -1, %3 ], [ -4, %6 ], [ -2, %9 ], [ 0, %146 ], [ 0, %.critedge ], [ -1, %.thread ]
  ret i32 %.4
}

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fabs.f32(float) #1

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

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

attributes #0 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"_Bool", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{i8 0, i8 2}
!10 = !{}
!11 = !{!12, !12, i64 0}
!12 = !{!"float", !7, i64 0}
!13 = distinct !{!13, !14, !15, !16}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!"llvm.loop.isvectorized", i32 1}
!16 = !{!"llvm.loop.unroll.runtime.disable"}
!17 = distinct !{!17, !14}
!18 = distinct !{!18, !14, !16, !15}
!19 = distinct !{!19, !14}
!20 = distinct !{!20, !14}
!21 = !{!22}
!22 = distinct !{!22, !23}
!23 = distinct !{!23, !"LVerDomain"}
!24 = !{!25, !26, !27}
!25 = distinct !{!25, !23}
!26 = distinct !{!26, !23}
!27 = distinct !{!27, !23}
!28 = !{!25}
!29 = !{!26, !27}
!30 = !{!26}
!31 = !{!27}
!32 = distinct !{!32, !14, !15, !16}
!33 = distinct !{!33, !14, !15}
!34 = !{!35}
!35 = distinct !{!35, !36}
!36 = distinct !{!36, !"LVerDomain"}
!37 = !{!38}
!38 = distinct !{!38, !36}
!39 = distinct !{!39, !14, !15, !16}
!40 = distinct !{!40, !14, !15}
!41 = !{!42}
!42 = distinct !{!42, !43}
!43 = distinct !{!43, !"LVerDomain"}
!44 = !{!45}
!45 = distinct !{!45, !43}
!46 = !{!47, !42, !48}
!47 = distinct !{!47, !43}
!48 = distinct !{!48, !43}
!49 = !{!48}
!50 = !{!47}
!51 = !{!42, !48}
!52 = distinct !{!52, !14, !15, !16}
!53 = distinct !{!53, !14, !15}
!54 = !{!55, !55, i64 0}
!55 = !{!"long", !7, i64 0}


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