; LLVM IR from bbenligiray/stag :: src/Ellipse.ll (Z7inversePPdS0_i)

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_Z14AllocateMatrixii(i32 noundef, i32 noundef) #0

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_Z16DeallocateMatrixPPdi(ptr noundef, i32 noundef) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fabs.f64(double) #3

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_Z7inversePPdS0_i(ptr noundef %0, ptr noundef %1, i32 noundef %2) #0 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca double, align 8
  %14 = alloca double, align 8
  %15 = alloca double, align 8
  %16 = alloca double, align 8
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca double, align 8
  %22 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i32 %2, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %23 = load i32, ptr %7, align 4, !tbaa !9
  %24 = add nsw i32 %23, 1
  %25 = load i32, ptr %7, align 4, !tbaa !9
  %26 = add nsw i32 %25, 2
  %27 = call noundef ptr @_Z14AllocateMatrixii(i32 noundef %24, i32 noundef %26)
  store ptr %27, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %28 = load i32, ptr %7, align 4, !tbaa !9
  %29 = add nsw i32 %28, 1
  %30 = load i32, ptr %7, align 4, !tbaa !9
  %31 = mul nsw i32 2, %30
  %32 = add nsw i32 %31, 2
  %33 = call noundef ptr @_Z14AllocateMatrixii(i32 noundef %29, i32 noundef %32)
  store ptr %33, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %34 = load i32, ptr %7, align 4, !tbaa !9
  %35 = add nsw i32 %34, 1
  %36 = load i32, ptr %7, align 4, !tbaa !9
  %37 = add nsw i32 %36, 1
  %38 = call noundef ptr @_Z14AllocateMatrixii(i32 noundef %35, i32 noundef %37)
  store ptr %38, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  store double 0x3BFD83C94FB6D2AC, ptr %21, align 8, !tbaa !11
  store i32 1, ptr %8, align 4, !tbaa !9
  br label %39

39:                                               ; preds = %70, %3
  %40 = load i32, ptr %8, align 4, !tbaa !9
  %41 = load i32, ptr %7, align 4, !tbaa !9
  %42 = icmp sle i32 %40, %41
  br i1 %42, label %43, label %73

43:                                               ; preds = %39
  store i32 1, ptr %10, align 4, !tbaa !9
  br label %44

44:                                               ; preds = %66, %43
  %45 = load i32, ptr %10, align 4, !tbaa !9
  %46 = load i32, ptr %7, align 4, !tbaa !9
  %47 = icmp sle i32 %45, %46
  br i1 %47, label %48, label %69

48:                                               ; preds = %44
  %49 = load ptr, ptr %5, align 8, !tbaa !5
  %50 = load i32, ptr %8, align 4, !tbaa !9
  %51 = sext i32 %50 to i64
  %52 = getelementptr inbounds ptr, ptr %49, i64 %51
  %53 = load ptr, ptr %52, align 8, !tbaa !5
  %54 = load i32, ptr %10, align 4, !tbaa !9
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds double, ptr %53, i64 %55
  %57 = load double, ptr %56, align 8, !tbaa !11
  %58 = load ptr, ptr %18, align 8, !tbaa !5
  %59 = load i32, ptr %8, align 4, !tbaa !9
  %60 = sext i32 %59 to i64
  %61 = getelementptr inbounds ptr, ptr %58, i64 %60
  %62 = load ptr, ptr %61, align 8, !tbaa !5
  %63 = load i32, ptr %10, align 4, !tbaa !9
  %64 = sext i32 %63 to i64
  %65 = getelementptr inbounds double, ptr %62, i64 %64
  store double %57, ptr %65, align 8, !tbaa !11
  br label %66

66:                                               ; preds = %48
  %67 = load i32, ptr %10, align 4, !tbaa !9
  %68 = add nsw i32 %67, 1
  store i32 %68, ptr %10, align 4, !tbaa !9
  br label %44, !llvm.loop !13

69:                                               ; preds = %44
  br label %70

70:                                               ; preds = %69
  %71 = load i32, ptr %8, align 4, !tbaa !9
  %72 = add nsw i32 %71, 1
  store i32 %72, ptr %8, align 4, !tbaa !9
  br label %39, !llvm.loop !15

73:                                               ; preds = %39
  store i32 1, ptr %8, align 4, !tbaa !9
  br label %74

74:                                               ; preds = %139, %73
  %75 = load i32, ptr %8, align 4, !tbaa !9
  %76 = load i32, ptr %7, align 4, !tbaa !9
  %77 = icmp sle i32 %75, %76
  br i1 %77, label %78, label %142

78:                                               ; preds = %74
  store i32 1, ptr %10, align 4, !tbaa !9
  br label %79

79:                                               ; preds = %102, %78
  %80 = load i32, ptr %10, align 4, !tbaa !9
  %81 = load i32, ptr %7, align 4, !tbaa !9
  %82 = add nsw i32 %81, 1
  %83 = icmp sle i32 %80, %82
  br i1 %83, label %84, label %105

84:                                               ; preds = %79
  %85 = load ptr, ptr %18, align 8, !tbaa !5
  %86 = load i32, ptr %8, align 4, !tbaa !9
  %87 = sext i32 %86 to i64
  %88 = getelementptr inbounds ptr, ptr %85, i64 %87
  %89 = load ptr, ptr %88, align 8, !tbaa !5
  %90 = load i32, ptr %10, align 4, !tbaa !9
  %91 = sext i32 %90 to i64
  %92 = getelementptr inbounds double, ptr %89, i64 %91
  %93 = load double, ptr %92, align 8, !tbaa !11
  %94 = load ptr, ptr %19, align 8, !tbaa !5
  %95 = load i32, ptr %8, align 4, !tbaa !9
  %96 = sext i32 %95 to i64
  %97 = getelementptr inbounds ptr, ptr %94, i64 %96
  %98 = load ptr, ptr %97, align 8, !tbaa !5
  %99 = load i32, ptr %10, align 4, !tbaa !9
  %100 = sext i32 %99 to i64
  %101 = getelementptr inbounds double, ptr %98, i64 %100
  store double %93, ptr %101, align 8, !tbaa !11
  br label %102

102:                                              ; preds = %84
  %103 = load i32, ptr %10, align 4, !tbaa !9
  %104 = add nsw i32 %103, 1
  store i32 %104, ptr %10, align 4, !tbaa !9
  br label %79, !llvm.loop !16

105:                                              ; preds = %79
  %106 = load i32, ptr %7, align 4, !tbaa !9
  %107 = add nsw i32 %106, 2
  store i32 %107, ptr %10, align 4, !tbaa !9
  br label %108

108:                                              ; preds = %123, %105
  %109 = load i32, ptr %10, align 4, !tbaa !9
  %110 = load i32, ptr %7, align 4, !tbaa !9
  %111 = mul nsw i32 2, %110
  %112 = add nsw i32 %111, 1
  %113 = icmp sle i32 %109, %112
  br i1 %113, label %114, label %126

114:                                              ; preds = %108
  %115 = load ptr, ptr %19, align 8, !tbaa !5
  %116 = load i32, ptr %8, align 4, !tbaa !9
  %117 = sext i32 %116 to i64
  %118 = getelementptr inbounds ptr, ptr %115, i64 %117
  %119 = load ptr, ptr %118, align 8, !tbaa !5
  %120 = load i32, ptr %10, align 4, !tbaa !9
  %121 = sext i32 %120 to i64
  %122 = getelementptr inbounds double, ptr %119, i64 %121
  store double 0.000000e+00, ptr %122, align 8, !tbaa !11
  br label %123

123:                                              ; preds = %114
  %124 = load i32, ptr %10, align 4, !tbaa !9
  %125 = add nsw i32 %124, 1
  store i32 %125, ptr %10, align 4, !tbaa !9
  br label %108, !llvm.loop !17

126:                                              ; preds = %108
  %127 = load ptr, ptr %19, align 8, !tbaa !5
  %128 = load i32, ptr %8, align 4, !tbaa !9
  %129 = sext i32 %128 to i64
  %130 = getelementptr inbounds ptr, ptr %127, i64 %129
  %131 = load ptr, ptr %130, align 8, !tbaa !5
  %132 = load i32, ptr %8, align 4, !tbaa !9
  %133 = sub nsw i32 %132, 1
  %134 = load i32, ptr %7, align 4, !tbaa !9
  %135 = add nsw i32 %133, %134
  %136 = add nsw i32 %135, 2
  %137 = sext i32 %136 to i64
  %138 = getelementptr inbounds double, ptr %131, i64 %137
  store double 1.000000e+00, ptr %138, align 8, !tbaa !11
  br label %139

139:                                              ; preds = %126
  %140 = load i32, ptr %8, align 4, !tbaa !9
  %141 = add nsw i32 %140, 1
  store i32 %141, ptr %8, align 4, !tbaa !9
  br label %74, !llvm.loop !18

142:                                              ; preds = %74
  store i32 1, ptr %8, align 4, !tbaa !9
  br label %143

143:                                              ; preds = %365, %142
  %144 = load i32, ptr %8, align 4, !tbaa !9
  %145 = load i32, ptr %7, align 4, !tbaa !9
  %146 = icmp sle i32 %144, %145
  br i1 %146, label %147, label %368

147:                                              ; preds = %143
  %148 = load ptr, ptr %19, align 8, !tbaa !5
  %149 = load i32, ptr %8, align 4, !tbaa !9
  %150 = sext i32 %149 to i64
  %151 = getelementptr inbounds ptr, ptr %148, i64 %150
  %152 = load ptr, ptr %151, align 8, !tbaa !5
  %153 = load i32, ptr %8, align 4, !tbaa !9
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds double, ptr %152, i64 %154
  %156 = load double, ptr %155, align 8, !tbaa !11
  %157 = call double @llvm.fabs.f64(double %156)
  store double %157, ptr %16, align 8, !tbaa !11
  %158 = load i32, ptr %8, align 4, !tbaa !9
  store i32 %158, ptr %17, align 4, !tbaa !9
  %159 = load i32, ptr %8, align 4, !tbaa !9
  store i32 %159, ptr %9, align 4, !tbaa !9
  br label %160

160:                                              ; preds = %190, %147
  %161 = load i32, ptr %9, align 4, !tbaa !9
  %162 = load i32, ptr %7, align 4, !tbaa !9
  %163 = icmp sle i32 %161, %162
  br i1 %163, label %164, label %193

164:                                              ; preds = %160
  %165 = load double, ptr %16, align 8, !tbaa !11
  %166 = load ptr, ptr %19, align 8, !tbaa !5
  %167 = load i32, ptr %9, align 4, !tbaa !9
  %168 = sext i32 %167 to i64
  %169 = getelementptr inbounds ptr, ptr %166, i64 %168
  %170 = load ptr, ptr %169, align 8, !tbaa !5
  %171 = load i32, ptr %8, align 4, !tbaa !9
  %172 = sext i32 %171 to i64
  %173 = getelementptr inbounds double, ptr %170, i64 %172
  %174 = load double, ptr %173, align 8, !tbaa !11
  %175 = call double @llvm.fabs.f64(double %174)
  %176 = fcmp olt double %165, %175
  br i1 %176, label %177, label %189

177:                                              ; preds = %164
  %178 = load ptr, ptr %19, align 8, !tbaa !5
  %179 = load i32, ptr %9, align 4, !tbaa !9
  %180 = sext i32 %179 to i64
  %181 = getelementptr inbounds ptr, ptr %178, i64 %180
  %182 = load ptr, ptr %181, align 8, !tbaa !5
  %183 = load i32, ptr %8, align 4, !tbaa !9
  %184 = sext i32 %183 to i64
  %185 = getelementptr inbounds double, ptr %182, i64 %184
  %186 = load double, ptr %185, align 8, !tbaa !11
  %187 = call double @llvm.fabs.f64(double %186)
  store double %187, ptr %16, align 8, !tbaa !11
  %188 = load i32, ptr %9, align 4, !tbaa !9
  store i32 %188, ptr %17, align 4, !tbaa !9
  br label %189

189:                                              ; preds = %177, %164
  br label %190

190:                                              ; preds = %189
  %191 = load i32, ptr %9, align 4, !tbaa !9
  %192 = add nsw i32 %191, 1
  store i32 %192, ptr %9, align 4, !tbaa !9
  br label %160, !llvm.loop !19

193:                                              ; preds = %160
  %194 = load double, ptr %16, align 8, !tbaa !11
  %195 = load double, ptr %21, align 8, !tbaa !11
  %196 = fcmp oge double %194, %195
  br i1 %196, label %197, label %354

197:                                              ; preds = %193
  %198 = load i32, ptr %17, align 4, !tbaa !9
  %199 = load i32, ptr %8, align 4, !tbaa !9
  %200 = icmp ne i32 %198, %199
  br i1 %200, label %201, label %249

201:                                              ; preds = %197
  %202 = load i32, ptr %8, align 4, !tbaa !9
  store i32 %202, ptr %10, align 4, !tbaa !9
  br label %203

203:                                              ; preds = %245, %201
  %204 = load i32, ptr %10, align 4, !tbaa !9
  %205 = load i32, ptr %7, align 4, !tbaa !9
  %206 = mul nsw i32 2, %205
  %207 = add nsw i32 %206, 1
  %208 = icmp sle i32 %204, %207
  br i1 %208, label %209, label %248

209:                                              ; preds = %203
  %210 = load ptr, ptr %19, align 8, !tbaa !5
  %211 = load i32, ptr %17, align 4, !tbaa !9
  %212 = sext i32 %211 to i64
  %213 = getelementptr inbounds ptr, ptr %210, i64 %212
  %214 = load ptr, ptr %213, align 8, !tbaa !5
  %215 = load i32, ptr %10, align 4, !tbaa !9
  %216 = sext i32 %215 to i64
  %217 = getelementptr inbounds double, ptr %214, i64 %216
  %218 = load double, ptr %217, align 8, !tbaa !11
  store double %218, ptr %15, align 8, !tbaa !11
  %219 = load ptr, ptr %19, align 8, !tbaa !5
  %220 = load i32, ptr %8, align 4, !tbaa !9
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds ptr, ptr %219, i64 %221
  %223 = load ptr, ptr %222, align 8, !tbaa !5
  %224 = load i32, ptr %10, align 4, !tbaa !9
  %225 = sext i32 %224 to i64
  %226 = getelementptr inbounds double, ptr %223, i64 %225
  %227 = load double, ptr %226, align 8, !tbaa !11
  %228 = load ptr, ptr %19, align 8, !tbaa !5
  %229 = load i32, ptr %17, align 4, !tbaa !9
  %230 = sext i32 %229 to i64
  %231 = getelementptr inbounds ptr, ptr %228, i64 %230
  %232 = load ptr, ptr %231, align 8, !tbaa !5
  %233 = load i32, ptr %10, align 4, !tbaa !9
  %234 = sext i32 %233 to i64
  %235 = getelementptr inbounds double, ptr %232, i64 %234
  store double %227, ptr %235, align 8, !tbaa !11
  %236 = load double, ptr %15, align 8, !tbaa !11
  %237 = load ptr, ptr %19, align 8, !tbaa !5
  %238 = load i32, ptr %8, align 4, !tbaa !9
  %239 = sext i32 %238 to i64
  %240 = getelementptr inbounds ptr, ptr %237, i64 %239
  %241 = load ptr, ptr %240, align 8, !tbaa !5
  %242 = load i32, ptr %10, align 4, !tbaa !9
  %243 = sext i32 %242 to i64
  %244 = getelementptr inbounds double, ptr %241, i64 %243
  store double %236, ptr %244, align 8, !tbaa !11
  br label %245

245:                                              ; preds = %209
  %246 = load i32, ptr %10, align 4, !tbaa !9
  %247 = add nsw i32 %246, 1
  store i32 %247, ptr %10, align 4, !tbaa !9
  br label %203, !llvm.loop !20

248:                                              ; preds = %203
  br label %249

249:                                              ; preds = %248, %197
  %250 = load ptr, ptr %19, align 8, !tbaa !5
  %251 = load i32, ptr %8, align 4, !tbaa !9
  %252 = sext i32 %251 to i64
  %253 = getelementptr inbounds ptr, ptr %250, i64 %252
  %254 = load ptr, ptr %253, align 8, !tbaa !5
  %255 = load i32, ptr %8, align 4, !tbaa !9
  %256 = sext i32 %255 to i64
  %257 = getelementptr inbounds double, ptr %254, i64 %256
  %258 = load double, ptr %257, align 8, !tbaa !11
  store double %258, ptr %14, align 8, !tbaa !11
  %259 = load i32, ptr %7, align 4, !tbaa !9
  %260 = mul nsw i32 2, %259
  %261 = add nsw i32 %260, 1
  store i32 %261, ptr %10, align 4, !tbaa !9
  br label %262

262:                                              ; preds = %286, %249
  %263 = load i32, ptr %10, align 4, !tbaa !9
  %264 = load i32, ptr %8, align 4, !tbaa !9
  %265 = icmp sge i32 %263, %264
  br i1 %265, label %266, label %289

266:                                              ; preds = %262
  %267 = load ptr, ptr %19, align 8, !tbaa !5
  %268 = load i32, ptr %8, align 4, !tbaa !9
  %269 = sext i32 %268 to i64
  %270 = getelementptr inbounds ptr, ptr %267, i64 %269
  %271 = load ptr, ptr %270, align 8, !tbaa !5
  %272 = load i32, ptr %10, align 4, !tbaa !9
  %273 = sext i32 %272 to i64
  %274 = getelementptr inbounds double, ptr %271, i64 %273
  %275 = load double, ptr %274, align 8, !tbaa !11
  %276 = load double, ptr %14, align 8, !tbaa !11
  %277 = fdiv double %275, %276
  %278 = load ptr, ptr %19, align 8, !tbaa !5
  %279 = load i32, ptr %8, align 4, !tbaa !9
  %280 = sext i32 %279 to i64
  %281 = getelementptr inbounds ptr, ptr %278, i64 %280
  %282 = load ptr, ptr %281, align 8, !tbaa !5
  %283 = load i32, ptr %10, align 4, !tbaa !9
  %284 = sext i32 %283 to i64
  %285 = getelementptr inbounds double, ptr %282, i64 %284
  store double %277, ptr %285, align 8, !tbaa !11
  br label %286

286:                                              ; preds = %266
  %287 = load i32, ptr %10, align 4, !tbaa !9
  %288 = add nsw i32 %287, -1
  store i32 %288, ptr %10, align 4, !tbaa !9
  br label %262, !llvm.loop !21

289:                                              ; preds = %262
  store i32 1, ptr %9, align 4, !tbaa !9
  br label %290

290:                                              ; preds = %350, %289
  %291 = load i32, ptr %9, align 4, !tbaa !9
  %292 = load i32, ptr %7, align 4, !tbaa !9
  %293 = icmp sle i32 %291, %292
  br i1 %293, label %294, label %353

294:                                              ; preds = %290
  %295 = load i32, ptr %9, align 4, !tbaa !9
  %296 = load i32, ptr %8, align 4, !tbaa !9
  %297 = icmp ne i32 %295, %296
  br i1 %297, label %298, label %349

298:                                              ; preds = %294
  %299 = load ptr, ptr %19, align 8, !tbaa !5
  %300 = load i32, ptr %9, align 4, !tbaa !9
  %301 = sext i32 %300 to i64
  %302 = getelementptr inbounds ptr, ptr %299, i64 %301
  %303 = load ptr, ptr %302, align 8, !tbaa !5
  %304 = load i32, ptr %8, align 4, !tbaa !9
  %305 = sext i32 %304 to i64
  %306 = getelementptr inbounds double, ptr %303, i64 %305
  %307 = load double, ptr %306, align 8, !tbaa !11
  store double %307, ptr %13, align 8, !tbaa !11
  %308 = load i32, ptr %7, align 4, !tbaa !9
  %309 = mul nsw i32 2, %308
  %310 = add nsw i32 %309, 1
  store i32 %310, ptr %10, align 4, !tbaa !9
  br label %311

311:                                              ; preds = %345, %298
  %312 = load i32, ptr %10, align 4, !tbaa !9
  %313 = load i32, ptr %8, align 4, !tbaa !9
  %314 = icmp sge i32 %312, %313
  br i1 %314, label %315, label %348

315:                                              ; preds = %311
  %316 = load ptr, ptr %19, align 8, !tbaa !5
  %317 = load i32, ptr %9, align 4, !tbaa !9
  %318 = sext i32 %317 to i64
  %319 = getelementptr inbounds ptr, ptr %316, i64 %318
  %320 = load ptr, ptr %319, align 8, !tbaa !5
  %321 = load i32, ptr %10, align 4, !tbaa !9
  %322 = sext i32 %321 to i64
  %323 = getelementptr inbounds double, ptr %320, i64 %322
  %324 = load double, ptr %323, align 8, !tbaa !11
  %325 = load double, ptr %13, align 8, !tbaa !11
  %326 = load ptr, ptr %19, align 8, !tbaa !5
  %327 = load i32, ptr %8, align 4, !tbaa !9
  %328 = sext i32 %327 to i64
  %329 = getelementptr inbounds ptr, ptr %326, i64 %328
  %330 = load ptr, ptr %329, align 8, !tbaa !5
  %331 = load i32, ptr %10, align 4, !tbaa !9
  %332 = sext i32 %331 to i64
  %333 = getelementptr inbounds double, ptr %330, i64 %332
  %334 = load double, ptr %333, align 8, !tbaa !11
  %335 = fneg double %325
  %336 = call double @llvm.fmuladd.f64(double %335, double %334, double %324)
  %337 = load ptr, ptr %19, align 8, !tbaa !5
  %338 = load i32, ptr %9, align 4, !tbaa !9
  %339 = sext i32 %338 to i64
  %340 = getelementptr inbounds ptr, ptr %337, i64 %339
  %341 = load ptr, ptr %340, align 8, !tbaa !5
  %342 = load i32, ptr %10, align 4, !tbaa !9
  %343 = sext i32 %342 to i64
  %344 = getelementptr inbounds double, ptr %341, i64 %343
  store double %336, ptr %344, align 8, !tbaa !11
  br label %345

345:                                              ; preds = %315
  %346 = load i32, ptr %10, align 4, !tbaa !9
  %347 = add nsw i32 %346, -1
  store i32 %347, ptr %10, align 4, !tbaa !9
  br label %311, !llvm.loop !22

348:                                              ; preds = %311
  br label %349

349:                                              ; preds = %348, %294
  br label %350

350:                                              ; preds = %349
  %351 = load i32, ptr %9, align 4, !tbaa !9
  %352 = add nsw i32 %351, 1
  store i32 %352, ptr %9, align 4, !tbaa !9
  br label %290, !llvm.loop !23

353:                                              ; preds = %290
  br label %364

354:                                              ; preds = %193
  %355 = load ptr, ptr %18, align 8, !tbaa !5
  %356 = load i32, ptr %7, align 4, !tbaa !9
  %357 = add nsw i32 %356, 1
  call void @_Z16DeallocateMatrixPPdi(ptr noundef %355, i32 noundef %357)
  %358 = load ptr, ptr %19, align 8, !tbaa !5
  %359 = load i32, ptr %7, align 4, !tbaa !9
  %360 = add nsw i32 %359, 1
  call void @_Z16DeallocateMatrixPPdi(ptr noundef %358, i32 noundef %360)
  %361 = load ptr, ptr %20, align 8, !tbaa !5
  %362 = load i32, ptr %7, align 4, !tbaa !9
  %363 = add nsw i32 %362, 1
  call void @_Z16DeallocateMatrixPPdi(ptr noundef %361, i32 noundef %363)
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %22, align 4
  br label %421

364:                                              ; preds = %353
  br label %365

365:                                              ; preds = %364
  %366 = load i32, ptr %8, align 4, !tbaa !9
  %367 = add nsw i32 %366, 1
  store i32 %367, ptr %8, align 4, !tbaa !9
  br label %143, !llvm.loop !24

368:                                              ; preds = %143
  store i32 1, ptr %8, align 4, !tbaa !9
  store i32 1, ptr %11, align 4, !tbaa !9
  br label %369

369:                                              ; preds = %406, %368
  %370 = load i32, ptr %8, align 4, !tbaa !9
  %371 = load i32, ptr %7, align 4, !tbaa !9
  %372 = icmp sle i32 %370, %371
  br i1 %372, label %373, label %411

373:                                              ; preds = %369
  %374 = load i32, ptr %7, align 4, !tbaa !9
  %375 = add nsw i32 %374, 2
  store i32 %375, ptr %10, align 4, !tbaa !9
  store i32 1, ptr %12, align 4, !tbaa !9
  br label %376

376:                                              ; preds = %400, %373
  %377 = load i32, ptr %10, align 4, !tbaa !9
  %378 = load i32, ptr %7, align 4, !tbaa !9
  %379 = mul nsw i32 2, %378
  %380 = add nsw i32 %379, 1
  %381 = icmp sle i32 %377, %380
  br i1 %381, label %382, label %405

382:                                              ; preds = %376
  %383 = load ptr, ptr %19, align 8, !tbaa !5
  %384 = load i32, ptr %8, align 4, !tbaa !9
  %385 = sext i32 %384 to i64
  %386 = getelementptr inbounds ptr, ptr %383, i64 %385
  %387 = load ptr, ptr %386, align 8, !tbaa !5
  %388 = load i32, ptr %10, align 4, !tbaa !9
  %389 = sext i32 %388 to i64
  %390 = getelementptr inbounds double, ptr %387, i64 %389
  %391 = load double, ptr %390, align 8, !tbaa !11
  %392 = load ptr, ptr %6, align 8, !tbaa !5
  %393 = load i32, ptr %11, align 4, !tbaa !9
  %394 = sext i32 %393 to i64
  %395 = getelementptr inbounds ptr, ptr %392, i64 %394
  %396 = load ptr, ptr %395, align 8, !tbaa !5
  %397 = load i32, ptr %12, align 4, !tbaa !9
  %398 = sext i32 %397 to i64
  %399 = getelementptr inbounds double, ptr %396, i64 %398
  store double %391, ptr %399, align 8, !tbaa !11
  br label %400

400:                                              ; preds = %382
  %401 = load i32, ptr %10, align 4, !tbaa !9
  %402 = add nsw i32 %401, 1
  store i32 %402, ptr %10, align 4, !tbaa !9
  %403 = load i32, ptr %12, align 4, !tbaa !9
  %404 = add nsw i32 %403, 1
  store i32 %404, ptr %12, align 4, !tbaa !9
  br label %376, !llvm.loop !25

405:                                              ; preds = %376
  br label %406

406:                                              ; preds = %405
  %407 = load i32, ptr %8, align 4, !tbaa !9
  %408 = add nsw i32 %407, 1
  store i32 %408, ptr %8, align 4, !tbaa !9
  %409 = load i32, ptr %11, align 4, !tbaa !9
  %410 = add nsw i32 %409, 1
  store i32 %410, ptr %11, align 4, !tbaa !9
  br label %369, !llvm.loop !26

411:                                              ; preds = %369
  %412 = load ptr, ptr %18, align 8, !tbaa !5
  %413 = load i32, ptr %7, align 4, !tbaa !9
  %414 = add nsw i32 %413, 1
  call void @_Z16DeallocateMatrixPPdi(ptr noundef %412, i32 noundef %414)
  %415 = load ptr, ptr %19, align 8, !tbaa !5
  %416 = load i32, ptr %7, align 4, !tbaa !9
  %417 = add nsw i32 %416, 1
  call void @_Z16DeallocateMatrixPPdi(ptr noundef %415, i32 noundef %417)
  %418 = load ptr, ptr %20, align 8, !tbaa !5
  %419 = load i32, ptr %7, align 4, !tbaa !9
  %420 = add nsw i32 %419, 1
  call void @_Z16DeallocateMatrixPPdi(ptr noundef %418, i32 noundef %420)
  store i32 0, ptr %4, align 4
  store i32 1, ptr %22, align 4
  br label %421

421:                                              ; preds = %411, %354
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #4
  %422 = load i32, ptr %4, align 4
  ret i32 %422
}

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


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

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_Z14AllocateMatrixii(i32 noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_Z16DeallocateMatrixPPdi(ptr noundef, i32 noundef) local_unnamed_addr #1

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

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

; Function Attrs: mustprogress uwtable
define dso_local noundef range(i32 -1, 1) i32 @_Z7inversePPdS0_i(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i32 noundef %2) local_unnamed_addr #0 {
  %4 = add i32 %2, 1
  %5 = add i32 %2, 2
  %6 = tail call noundef ptr @_Z14AllocateMatrixii(i32 noundef %4, i32 noundef %5)
  %7 = shl nsw i32 %2, 1
  %8 = add i32 %7, 2
  %9 = tail call noundef ptr @_Z14AllocateMatrixii(i32 noundef %4, i32 noundef %8)
  %10 = tail call noundef ptr @_Z14AllocateMatrixii(i32 noundef %4, i32 noundef %4)
  %.not185 = icmp sgt i32 %2, 0
  br i1 %.not185, label %.preheader182.preheader, label %._crit_edge224

.preheader182.preheader:                          ; preds = %3
  %wide.trip.count234 = zext i32 %4 to i64
  %11 = add nsw i64 %wide.trip.count234, -1
  %min.iters.check = icmp ult i32 %4, 5
  %n.vec = and i64 %11, -4
  %ind.end = or disjoint i64 %n.vec, 1
  %cmp.n = icmp eq i64 %11, %n.vec
  br label %.preheader182

.preheader182:                                    ; preds = %.preheader182.preheader, %._crit_edge
  %indvars.iv231 = phi i64 [ 1, %.preheader182.preheader ], [ %indvars.iv.next232, %._crit_edge ]
  %12 = getelementptr inbounds ptr, ptr %0, i64 %indvars.iv231
  %13 = load ptr, ptr %12, align 8, !tbaa !5
  %14 = getelementptr inbounds ptr, ptr %6, i64 %indvars.iv231
  %15 = load ptr, ptr %14, align 8, !tbaa !5
  %16 = ptrtoint ptr %15 to i64
  %17 = ptrtoint ptr %13 to i64
  %18 = sub i64 %16, %17
  %diff.check = icmp ult i64 %18, 32
  %or.cond406 = select i1 %min.iters.check, i1 true, i1 %diff.check
  br i1 %or.cond406, label %scalar.ph.preheader, label %vector.body

scalar.ph.preheader:                              ; preds = %middle.block, %.preheader182
  %indvars.iv.ph = phi i64 [ 1, %.preheader182 ], [ %ind.end, %middle.block ]
  %19 = sub nsw i64 %wide.trip.count234, %indvars.iv.ph
  %xtraiter = and i64 %19, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader, %scalar.ph.prol
  %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %scalar.ph.prol ], [ %indvars.iv.ph, %scalar.ph.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph.prol ], [ 0, %scalar.ph.preheader ]
  %20 = getelementptr inbounds double, ptr %13, i64 %indvars.iv.prol
  %21 = load double, ptr %20, align 8, !tbaa !9
  %22 = getelementptr inbounds double, ptr %15, i64 %indvars.iv.prol
  store double %21, ptr %22, align 8, !tbaa !9
  %indvars.iv.next.prol = add nuw nsw i64 %indvars.iv.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol, !llvm.loop !11

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv.unr = phi i64 [ %indvars.iv.ph, %scalar.ph.preheader ], [ %indvars.iv.next.prol, %scalar.ph.prol ]
  %23 = sub nsw i64 %indvars.iv.ph, %wide.trip.count234
  %24 = icmp ugt i64 %23, -4
  br i1 %24, label %._crit_edge, label %scalar.ph

vector.body:                                      ; preds = %.preheader182, %vector.body
  %index = phi i64 [ %index.next, %vector.body ], [ 0, %.preheader182 ]
  %offset.idx = or disjoint i64 %index, 1
  %25 = getelementptr inbounds double, ptr %13, i64 %offset.idx
  %26 = getelementptr inbounds i8, ptr %25, i64 16
  %wide.load = load <2 x double>, ptr %25, align 8, !tbaa !9
  %wide.load295 = load <2 x double>, ptr %26, align 8, !tbaa !9
  %27 = getelementptr inbounds double, ptr %15, i64 %offset.idx
  %28 = getelementptr inbounds i8, ptr %27, i64 16
  store <2 x double> %wide.load, ptr %27, align 8, !tbaa !9
  store <2 x double> %wide.load295, ptr %28, align 8, !tbaa !9
  %index.next = add nuw i64 %index, 4
  %29 = icmp eq i64 %index.next, %n.vec
  br i1 %29, label %middle.block, label %vector.body, !llvm.loop !13

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

.preheader181:                                    ; preds = %._crit_edge
  br i1 %.not185, label %.preheader180.preheader, label %._crit_edge224

.preheader180.preheader:                          ; preds = %.preheader181
  %.not172189.not = icmp sgt i32 %7, %2
  %30 = add nsw i32 %2, -1
  %31 = zext i32 %5 to i64
  %32 = shl nuw nsw i64 %31, 3
  %33 = or disjoint i32 %7, 1
  %smax = tail call i32 @llvm.smax.i32(i32 %5, i32 %33)
  %34 = add nsw i32 %smax, -2
  %35 = sub i32 %34, %2
  %36 = zext i32 %35 to i64
  %37 = shl nuw nsw i64 %36, 3
  %38 = add nuw nsw i64 %37, 8
  %wide.trip.count248 = zext i32 %4 to i64
  %39 = add nsw i64 %31, -1
  %min.iters.check300 = icmp ult i32 %5, 5
  %n.vec303 = and i64 %39, -4
  %ind.end304 = or disjoint i64 %n.vec303, 1
  %cmp.n312 = icmp eq i64 %39, %n.vec303
  br label %.preheader180

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv = phi i64 [ %indvars.iv.next.3, %scalar.ph ], [ %indvars.iv.unr, %scalar.ph.prol.loopexit ]
  %40 = getelementptr inbounds double, ptr %13, i64 %indvars.iv
  %41 = load double, ptr %40, align 8, !tbaa !9
  %42 = getelementptr inbounds double, ptr %15, i64 %indvars.iv
  store double %41, ptr %42, align 8, !tbaa !9
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %43 = getelementptr inbounds double, ptr %13, i64 %indvars.iv.next
  %44 = load double, ptr %43, align 8, !tbaa !9
  %45 = getelementptr inbounds double, ptr %15, i64 %indvars.iv.next
  store double %44, ptr %45, align 8, !tbaa !9
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %46 = getelementptr inbounds double, ptr %13, i64 %indvars.iv.next.1
  %47 = load double, ptr %46, align 8, !tbaa !9
  %48 = getelementptr inbounds double, ptr %15, i64 %indvars.iv.next.1
  store double %47, ptr %48, align 8, !tbaa !9
  %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
  %49 = getelementptr inbounds double, ptr %13, i64 %indvars.iv.next.2
  %50 = load double, ptr %49, align 8, !tbaa !9
  %51 = getelementptr inbounds double, ptr %15, i64 %indvars.iv.next.2
  store double %50, ptr %51, align 8, !tbaa !9
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next.3, %wide.trip.count234
  br i1 %exitcond.not.3, label %._crit_edge, label %scalar.ph, !llvm.loop !17

._crit_edge:                                      ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block
  %indvars.iv.next232 = add nuw nsw i64 %indvars.iv231, 1
  %exitcond235.not = icmp eq i64 %indvars.iv.next232, %wide.trip.count234
  br i1 %exitcond235.not, label %.preheader181, label %.preheader182, !llvm.loop !18

.preheader180:                                    ; preds = %.preheader180.preheader, %._crit_edge192
  %indvars.iv245 = phi i64 [ 1, %.preheader180.preheader ], [ %indvars.iv.next246, %._crit_edge192 ]
  %52 = getelementptr inbounds ptr, ptr %6, i64 %indvars.iv245
  %53 = load ptr, ptr %52, align 8, !tbaa !5
  %54 = getelementptr inbounds ptr, ptr %9, i64 %indvars.iv245
  %55 = load ptr, ptr %54, align 8, !tbaa !5
  %56 = ptrtoint ptr %55 to i64
  %57 = ptrtoint ptr %53 to i64
  %58 = sub i64 %56, %57
  %diff.check297 = icmp ult i64 %58, 32
  %or.cond409 = select i1 %min.iters.check300, i1 true, i1 %diff.check297
  br i1 %or.cond409, label %scalar.ph299.preheader, label %vector.body306

scalar.ph299.preheader:                           ; preds = %middle.block298, %.preheader180
  %indvars.iv237.ph = phi i64 [ 1, %.preheader180 ], [ %ind.end304, %middle.block298 ]
  %59 = sub nsw i64 %31, %indvars.iv237.ph
  %xtraiter411 = and i64 %59, 3
  %lcmp.mod412.not = icmp eq i64 %xtraiter411, 0
  br i1 %lcmp.mod412.not, label %scalar.ph299.prol.loopexit, label %scalar.ph299.prol

scalar.ph299.prol:                                ; preds = %scalar.ph299.preheader, %scalar.ph299.prol
  %indvars.iv237.prol = phi i64 [ %indvars.iv.next238.prol, %scalar.ph299.prol ], [ %indvars.iv237.ph, %scalar.ph299.preheader ]
  %prol.iter413 = phi i64 [ %prol.iter413.next, %scalar.ph299.prol ], [ 0, %scalar.ph299.preheader ]
  %60 = getelementptr inbounds double, ptr %53, i64 %indvars.iv237.prol
  %61 = load double, ptr %60, align 8, !tbaa !9
  %62 = getelementptr inbounds double, ptr %55, i64 %indvars.iv237.prol
  store double %61, ptr %62, align 8, !tbaa !9
  %indvars.iv.next238.prol = add nuw nsw i64 %indvars.iv237.prol, 1
  %prol.iter413.next = add i64 %prol.iter413, 1
  %prol.iter413.cmp.not = icmp eq i64 %prol.iter413.next, %xtraiter411
  br i1 %prol.iter413.cmp.not, label %scalar.ph299.prol.loopexit, label %scalar.ph299.prol, !llvm.loop !19

scalar.ph299.prol.loopexit:                       ; preds = %scalar.ph299.prol, %scalar.ph299.preheader
  %indvars.iv237.unr = phi i64 [ %indvars.iv237.ph, %scalar.ph299.preheader ], [ %indvars.iv.next238.prol, %scalar.ph299.prol ]
  %63 = sub nsw i64 %indvars.iv237.ph, %31
  %64 = icmp ugt i64 %63, -4
  br i1 %64, label %..preheader179_crit_edge, label %scalar.ph299

vector.body306:                                   ; preds = %.preheader180, %vector.body306
  %index307 = phi i64 [ %index.next311, %vector.body306 ], [ 0, %.preheader180 ]
  %offset.idx308 = or disjoint i64 %index307, 1
  %65 = getelementptr inbounds double, ptr %53, i64 %offset.idx308
  %66 = getelementptr inbounds i8, ptr %65, i64 16
  %wide.load309 = load <2 x double>, ptr %65, align 8, !tbaa !9
  %wide.load310 = load <2 x double>, ptr %66, align 8, !tbaa !9
  %67 = getelementptr inbounds double, ptr %55, i64 %offset.idx308
  %68 = getelementptr inbounds i8, ptr %67, i64 16
  store <2 x double> %wide.load309, ptr %67, align 8, !tbaa !9
  store <2 x double> %wide.load310, ptr %68, align 8, !tbaa !9
  %index.next311 = add nuw i64 %index307, 4
  %69 = icmp eq i64 %index.next311, %n.vec303
  br i1 %69, label %middle.block298, label %vector.body306, !llvm.loop !20

middle.block298:                                  ; preds = %vector.body306
  br i1 %cmp.n312, label %..preheader179_crit_edge, label %scalar.ph299.preheader

.preheader178:                                    ; preds = %._crit_edge192
  br i1 %.not185, label %.lr.ph215, label %._crit_edge224

.lr.ph215:                                        ; preds = %.preheader178
  %70 = or disjoint i32 %7, 1
  %71 = or disjoint i32 %7, 1
  %72 = zext nneg i32 %71 to i64
  %73 = zext nneg i32 %70 to i64
  %wide.trip.count276 = zext i32 %4 to i64
  %wide.trip.count262 = zext i32 %8 to i64
  %74 = zext nneg i32 %7 to i64
  %75 = shl nuw nsw i64 %74, 3
  %76 = add nuw nsw i64 %75, 16
  %77 = or disjoint i32 %7, 1
  %78 = zext nneg i32 %77 to i64
  %79 = or disjoint i32 %7, 1
  %80 = zext nneg i32 %79 to i64
  %81 = shl nuw nsw i64 %wide.trip.count262, 3
  %82 = add nsw i64 %wide.trip.count262, -1
  br label %107

..preheader179_crit_edge:                         ; preds = %scalar.ph299.prol.loopexit, %scalar.ph299, %middle.block298
  br i1 %.not172189.not, label %.lr.ph191, label %._crit_edge192

.lr.ph191:                                        ; preds = %..preheader179_crit_edge
  %scevgep = getelementptr i8, ptr %55, i64 %32
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %scevgep, i8 0, i64 %38, i1 false), !tbaa !9
  br label %._crit_edge192

scalar.ph299:                                     ; preds = %scalar.ph299.prol.loopexit, %scalar.ph299
  %indvars.iv237 = phi i64 [ %indvars.iv.next238.3, %scalar.ph299 ], [ %indvars.iv237.unr, %scalar.ph299.prol.loopexit ]
  %83 = getelementptr inbounds double, ptr %53, i64 %indvars.iv237
  %84 = load double, ptr %83, align 8, !tbaa !9
  %85 = getelementptr inbounds double, ptr %55, i64 %indvars.iv237
  store double %84, ptr %85, align 8, !tbaa !9
  %indvars.iv.next238 = add nuw nsw i64 %indvars.iv237, 1
  %86 = getelementptr inbounds double, ptr %53, i64 %indvars.iv.next238
  %87 = load double, ptr %86, align 8, !tbaa !9
  %88 = getelementptr inbounds double, ptr %55, i64 %indvars.iv.next238
  store double %87, ptr %88, align 8, !tbaa !9
  %indvars.iv.next238.1 = add nuw nsw i64 %indvars.iv237, 2
  %89 = getelementptr inbounds double, ptr %53, i64 %indvars.iv.next238.1
  %90 = load double, ptr %89, align 8, !tbaa !9
  %91 = getelementptr inbounds double, ptr %55, i64 %indvars.iv.next238.1
  store double %90, ptr %91, align 8, !tbaa !9
  %indvars.iv.next238.2 = add nuw nsw i64 %indvars.iv237, 3
  %92 = getelementptr inbounds double, ptr %53, i64 %indvars.iv.next238.2
  %93 = load double, ptr %92, align 8, !tbaa !9
  %94 = getelementptr inbounds double, ptr %55, i64 %indvars.iv.next238.2
  store double %93, ptr %94, align 8, !tbaa !9
  %indvars.iv.next238.3 = add nuw nsw i64 %indvars.iv237, 4
  %exitcond241.3 = icmp eq i64 %indvars.iv.next238.3, %31
  br i1 %exitcond241.3, label %..preheader179_crit_edge, label %scalar.ph299, !llvm.loop !21

._crit_edge192:                                   ; preds = %.lr.ph191, %..preheader179_crit_edge
  %95 = trunc nuw nsw i64 %indvars.iv245 to i32
  %96 = add i32 %30, %95
  %97 = sext i32 %96 to i64
  %98 = getelementptr double, ptr %55, i64 %97
  %99 = getelementptr i8, ptr %98, i64 16
  store double 1.000000e+00, ptr %99, align 8, !tbaa !9
  %indvars.iv.next246 = add nuw nsw i64 %indvars.iv245, 1
  %exitcond249.not = icmp eq i64 %indvars.iv.next246, %wide.trip.count248
  br i1 %exitcond249.not, label %.preheader178, label %.preheader180, !llvm.loop !22

.preheader174:                                    ; preds = %._crit_edge211
  %.not163216.not = icmp sgt i32 %7, %2
  %or.cond294 = and i1 %.not185, %.not163216.not
  br i1 %or.cond294, label %.preheader.preheader, label %._crit_edge224

.preheader.preheader:                             ; preds = %.preheader174
  %100 = zext i32 %5 to i64
  %wide.trip.count292 = zext nneg i32 %4 to i64
  %101 = shl nuw nsw i64 %31, 3
  %102 = or disjoint i32 %7, 1
  %smax385 = tail call i32 @llvm.smax.i32(i32 %5, i32 %102)
  %103 = add nsw i32 %smax385, -2
  %104 = sub i32 %103, %2
  %105 = zext i32 %104 to i64
  %106 = add nuw nsw i64 %105, 1
  %min.iters.check388 = icmp ult i32 %104, 3
  %n.vec391 = and i64 %106, 8589934588
  %ind.end392 = or disjoint i64 %n.vec391, 1
  %ind.end394 = add nuw nsw i64 %n.vec391, %100
  %cmp.n403 = icmp eq i64 %106, %n.vec391
  br label %.preheader

107:                                              ; preds = %.lr.ph215, %._crit_edge211
  %indvar = phi i64 [ 0, %.lr.ph215 ], [ %indvar.next, %._crit_edge211 ]
  %indvars.iv250 = phi i64 [ 1, %.lr.ph215 ], [ %indvars.iv.next251, %._crit_edge211 ]
  %108 = xor i64 %indvar, -1
  %109 = add i64 %108, %wide.trip.count262
  %110 = shl nuw nsw i64 %indvar, 3
  %111 = add nuw i64 %110, 8
  %112 = sub i64 %80, %indvar
  %113 = sub i64 %78, %indvar
  %114 = shl nuw nsw i64 %indvar, 3
  %115 = add nuw i64 %114, 8
  %116 = getelementptr inbounds ptr, ptr %9, i64 %indvars.iv250
  %117 = load ptr, ptr %116, align 8, !tbaa !5
  %118 = getelementptr inbounds double, ptr %117, i64 %indvars.iv250
  %119 = load double, ptr %118, align 8, !tbaa !9
  %120 = tail call double @llvm.fabs.f64(double %119)
  %121 = trunc nuw nsw i64 %indvars.iv250 to i32
  br label %122

122:                                              ; preds = %107, %122
  %indvars.iv252 = phi i64 [ %indvars.iv250, %107 ], [ %indvars.iv.next253, %122 ]
  %.0151196 = phi i32 [ %121, %107 ], [ %.1152, %122 ]
  %.0153195 = phi double [ %120, %107 ], [ %.1154, %122 ]
  %123 = getelementptr inbounds ptr, ptr %9, i64 %indvars.iv252
  %124 = load ptr, ptr %123, align 8, !tbaa !5
  %125 = getelementptr inbounds double, ptr %124, i64 %indvars.iv250
  %126 = load double, ptr %125, align 8, !tbaa !9
  %127 = tail call double @llvm.fabs.f64(double %126)
  %128 = fcmp olt double %.0153195, %127
  %.1154 = select i1 %128, double %127, double %.0153195
  %129 = trunc nuw nsw i64 %indvars.iv252 to i32
  %.1152 = select i1 %128, i32 %129, i32 %.0151196
  %indvars.iv.next253 = add nuw nsw i64 %indvars.iv252, 1
  %exitcond256.not = icmp eq i64 %indvars.iv.next253, %wide.trip.count276
  br i1 %exitcond256.not, label %130, label %122, !llvm.loop !23

130:                                              ; preds = %122
  %131 = fcmp ult double %.1154, 0x3BFD83C94FB6D2AC
  br i1 %131, label %180, label %132

132:                                              ; preds = %130
  %133 = zext i32 %.1152 to i64
  %.not165 = icmp eq i64 %indvars.iv250, %133
  %.not166198 = icmp ugt i64 %indvars.iv250, %73
  %or.cond = select i1 %.not165, i1 true, i1 %.not166198
  br i1 %or.cond, label %.loopexit177, label %.lr.ph

.lr.ph:                                           ; preds = %132
  %134 = sext i32 %.1152 to i64
  %135 = getelementptr inbounds ptr, ptr %9, i64 %134
  %136 = load ptr, ptr %135, align 8, !tbaa !5
  %min.iters.check368 = icmp ult i64 %109, 4
  br i1 %min.iters.check368, label %scalar.ph367.preheader, label %vector.memcheck358

vector.memcheck358:                               ; preds = %.lr.ph
  %scevgep359 = getelementptr i8, ptr %136, i64 %111
  %scevgep360 = getelementptr i8, ptr %136, i64 %81
  %scevgep361 = getelementptr i8, ptr %117, i64 %111
  %scevgep362 = getelementptr i8, ptr %117, i64 %81
  %bound0363 = icmp ult ptr %scevgep359, %scevgep362
  %bound1364 = icmp ult ptr %scevgep361, %scevgep360
  %found.conflict365 = and i1 %bound0363, %bound1364
  br i1 %found.conflict365, label %scalar.ph367.preheader, label %vector.ph369

vector.ph369:                                     ; preds = %vector.memcheck358
  %n.vec371 = and i64 %109, -4
  %ind.end372 = add i64 %indvars.iv250, %n.vec371
  br label %vector.body374

vector.body374:                                   ; preds = %vector.body374, %vector.ph369
  %index375 = phi i64 [ 0, %vector.ph369 ], [ %index.next381, %vector.body374 ]
  %offset.idx376 = add i64 %indvars.iv250, %index375
  %137 = getelementptr inbounds double, ptr %136, i64 %offset.idx376
  %138 = getelementptr inbounds i8, ptr %137, i64 16
  %wide.load377 = load <2 x double>, ptr %137, align 8, !tbaa !9, !alias.scope !24, !noalias !27
  %wide.load378 = load <2 x double>, ptr %138, align 8, !tbaa !9, !alias.scope !24, !noalias !27
  %139 = getelementptr inbounds double, ptr %117, i64 %offset.idx376
  %140 = getelementptr inbounds i8, ptr %139, i64 16
  %wide.load379 = load <2 x double>, ptr %139, align 8, !tbaa !9, !alias.scope !27
  %wide.load380 = load <2 x double>, ptr %140, align 8, !tbaa !9, !alias.scope !27
  store <2 x double> %wide.load379, ptr %137, align 8, !tbaa !9, !alias.scope !24, !noalias !27
  store <2 x double> %wide.load380, ptr %138, align 8, !tbaa !9, !alias.scope !24, !noalias !27
  store <2 x double> %wide.load377, ptr %139, align 8, !tbaa !9, !alias.scope !27
  store <2 x double> %wide.load378, ptr %140, align 8, !tbaa !9, !alias.scope !27
  %index.next381 = add nuw i64 %index375, 4
  %141 = icmp eq i64 %index.next381, %n.vec371
  br i1 %141, label %middle.block366, label %vector.body374, !llvm.loop !29

middle.block366:                                  ; preds = %vector.body374
  %cmp.n382 = icmp eq i64 %109, %n.vec371
  br i1 %cmp.n382, label %.loopexit177.loopexit, label %scalar.ph367.preheader

scalar.ph367.preheader:                           ; preds = %middle.block366, %vector.memcheck358, %.lr.ph
  %indvars.iv259.ph = phi i64 [ %indvars.iv250, %vector.memcheck358 ], [ %indvars.iv250, %.lr.ph ], [ %ind.end372, %middle.block366 ]
  %xtraiter414 = and i64 %indvars.iv259.ph, 1
  %lcmp.mod415.not = icmp eq i64 %xtraiter414, 0
  br i1 %lcmp.mod415.not, label %scalar.ph367.prol.loopexit, label %scalar.ph367.prol

scalar.ph367.prol:                                ; preds = %scalar.ph367.preheader
  %142 = getelementptr inbounds double, ptr %136, i64 %indvars.iv259.ph
  %143 = load double, ptr %142, align 8, !tbaa !9
  %144 = getelementptr inbounds double, ptr %117, i64 %indvars.iv259.ph
  %145 = load double, ptr %144, align 8, !tbaa !9
  store double %145, ptr %142, align 8, !tbaa !9
  store double %143, ptr %144, align 8, !tbaa !9
  %indvars.iv.next260.prol = add nuw nsw i64 %indvars.iv259.ph, 1
  br label %scalar.ph367.prol.loopexit

scalar.ph367.prol.loopexit:                       ; preds = %scalar.ph367.prol, %scalar.ph367.preheader
  %indvars.iv259.unr = phi i64 [ %indvars.iv259.ph, %scalar.ph367.preheader ], [ %indvars.iv.next260.prol, %scalar.ph367.prol ]
  %146 = icmp eq i64 %indvars.iv259.ph, %82
  br i1 %146, label %.loopexit177.loopexit, label %scalar.ph367

scalar.ph367:                                     ; preds = %scalar.ph367.prol.loopexit, %scalar.ph367
  %indvars.iv259 = phi i64 [ %indvars.iv.next260.1, %scalar.ph367 ], [ %indvars.iv259.unr, %scalar.ph367.prol.loopexit ]
  %147 = getelementptr inbounds double, ptr %136, i64 %indvars.iv259
  %148 = load double, ptr %147, align 8, !tbaa !9
  %149 = getelementptr inbounds double, ptr %117, i64 %indvars.iv259
  %150 = load double, ptr %149, align 8, !tbaa !9
  store double %150, ptr %147, align 8, !tbaa !9
  store double %148, ptr %149, align 8, !tbaa !9
  %indvars.iv.next260 = add nuw nsw i64 %indvars.iv259, 1
  %151 = getelementptr inbounds double, ptr %136, i64 %indvars.iv.next260
  %152 = load double, ptr %151, align 8, !tbaa !9
  %153 = getelementptr inbounds double, ptr %117, i64 %indvars.iv.next260
  %154 = load double, ptr %153, align 8, !tbaa !9
  store double %154, ptr %151, align 8, !tbaa !9
  store double %152, ptr %153, align 8, !tbaa !9
  %indvars.iv.next260.1 = add nuw nsw i64 %indvars.iv259, 2
  %exitcond263.1 = icmp eq i64 %indvars.iv.next260.1, %wide.trip.count262
  br i1 %exitcond263.1, label %.loopexit177.loopexit, label %scalar.ph367, !llvm.loop !30

.loopexit177.loopexit:                            ; preds = %scalar.ph367.prol.loopexit, %scalar.ph367, %middle.block366
  %.pre = load double, ptr %118, align 8, !tbaa !9
  br label %.loopexit177

.loopexit177:                                     ; preds = %.loopexit177.loopexit, %132
  %155 = phi double [ %.pre, %.loopexit177.loopexit ], [ %119, %132 ]
  br i1 %.not166198, label %._crit_edge211, label %.lr.ph203.preheader

.lr.ph203.preheader:                              ; preds = %.loopexit177
  %min.iters.check342 = icmp ult i64 %112, 2
  br i1 %min.iters.check342, label %.lr.ph203.preheader410, label %vector.ph343

.lr.ph203.preheader410:                           ; preds = %middle.block340, %.lr.ph203.preheader
  %indvars.iv264.ph = phi i64 [ %72, %.lr.ph203.preheader ], [ %ind.end346, %middle.block340 ]
  br label %.lr.ph203

vector.ph343:                                     ; preds = %.lr.ph203.preheader
  %n.vec345 = and i64 %112, -2
  %ind.end346 = sub i64 %72, %n.vec345
  %broadcast.splatinsert353 = insertelement <2 x double> poison, double %155, i64 0
  %invariant.gep = getelementptr i8, ptr %117, i64 -8
  %156 = shufflevector <2 x double> %broadcast.splatinsert353, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body348

vector.body348:                                   ; preds = %vector.body348, %vector.ph343
  %index349 = phi i64 [ 0, %vector.ph343 ], [ %index.next356, %vector.body348 ]
  %offset.idx350 = sub i64 %72, %index349
  %gep = getelementptr double, ptr %invariant.gep, i64 %offset.idx350
  %wide.load351 = load <2 x double>, ptr %gep, align 8, !tbaa !9
  %reverse355 = fdiv <2 x double> %wide.load351, %156
  store <2 x double> %reverse355, ptr %gep, align 8, !tbaa !9
  %index.next356 = add nuw i64 %index349, 2
  %157 = icmp eq i64 %index.next356, %n.vec345
  br i1 %157, label %middle.block340, label %vector.body348, !llvm.loop !31

middle.block340:                                  ; preds = %vector.body348
  %cmp.n357 = icmp eq i64 %112, %n.vec345
  br i1 %cmp.n357, label %.lr.ph210, label %.lr.ph203.preheader410

.lr.ph210:                                        ; preds = %.lr.ph203, %middle.block340
  br i1 %.not166198, label %._crit_edge211, label %.lr.ph210.split.preheader

.lr.ph210.split.preheader:                        ; preds = %.lr.ph210
  %scevgep316 = getelementptr i8, ptr %117, i64 %115
  %scevgep317 = getelementptr i8, ptr %117, i64 %76
  %min.iters.check320 = icmp ult i64 %113, 4
  %n.vec323 = and i64 %113, -4
  %ind.end324 = sub i64 %72, %n.vec323
  %cmp.n339 = icmp eq i64 %113, %n.vec323
  br label %.lr.ph210.split

.lr.ph203:                                        ; preds = %.lr.ph203.preheader410, %.lr.ph203
  %indvars.iv264 = phi i64 [ %indvars.iv.next265, %.lr.ph203 ], [ %indvars.iv264.ph, %.lr.ph203.preheader410 ]
  %158 = getelementptr inbounds double, ptr %117, i64 %indvars.iv264
  %159 = load double, ptr %158, align 8, !tbaa !9
  %160 = fdiv double %159, %155
  store double %160, ptr %158, align 8, !tbaa !9
  %indvars.iv.next265 = add nsw i64 %indvars.iv264, -1
  %.not167.not = icmp sgt i64 %indvars.iv264, %indvars.iv250
  br i1 %.not167.not, label %.lr.ph203, label %.lr.ph210, !llvm.loop !32

.lr.ph210.split:                                  ; preds = %.lr.ph210.split.preheader, %..loopexit_crit_edge
  %indvars.iv270 = phi i64 [ %indvars.iv.next271, %..loopexit_crit_edge ], [ 1, %.lr.ph210.split.preheader ]
  %.not169 = icmp eq i64 %indvars.iv270, %indvars.iv250
  br i1 %.not169, label %..loopexit_crit_edge, label %.lr.ph207

.lr.ph207:                                        ; preds = %.lr.ph210.split
  %161 = getelementptr inbounds ptr, ptr %9, i64 %indvars.iv270
  %162 = load ptr, ptr %161, align 8, !tbaa !5
  %163 = getelementptr inbounds double, ptr %162, i64 %indvars.iv250
  %164 = load double, ptr %163, align 8, !tbaa !9
  %165 = fneg double %164
  br i1 %min.iters.check320, label %scalar.ph319.preheader, label %vector.memcheck313

vector.memcheck313:                               ; preds = %.lr.ph207
  %scevgep314 = getelementptr i8, ptr %162, i64 %115
  %scevgep315 = getelementptr i8, ptr %162, i64 %76
  %bound0 = icmp ult ptr %scevgep314, %scevgep317
  %bound1 = icmp ult ptr %scevgep316, %scevgep315
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %scalar.ph319.preheader, label %vector.ph321

vector.ph321:                                     ; preds = %vector.memcheck313
  %broadcast.splatinsert = insertelement <2 x double> poison, double %165, i64 0
  %166 = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  %167 = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body326

vector.body326:                                   ; preds = %vector.body326, %vector.ph321
  %index327 = phi i64 [ 0, %vector.ph321 ], [ %index.next338, %vector.body326 ]
  %offset.idx328 = sub i64 %72, %index327
  %168 = getelementptr inbounds double, ptr %162, i64 %offset.idx328
  %169 = getelementptr inbounds i8, ptr %168, i64 -8
  %170 = getelementptr inbounds i8, ptr %168, i64 -24
  %wide.load329 = load <2 x double>, ptr %169, align 8, !tbaa !9, !alias.scope !33, !noalias !36
  %wide.load330 = load <2 x double>, ptr %170, align 8, !tbaa !9, !alias.scope !33, !noalias !36
  %171 = getelementptr inbounds double, ptr %117, i64 %offset.idx328
  %172 = getelementptr inbounds i8, ptr %171, i64 -8
  %173 = getelementptr inbounds i8, ptr %171, i64 -24
  %wide.load332 = load <2 x double>, ptr %172, align 8, !tbaa !9, !alias.scope !36
  %wide.load334 = load <2 x double>, ptr %173, align 8, !tbaa !9, !alias.scope !36
  %reverse336 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %166, <2 x double> %wide.load332, <2 x double> %wide.load329)
  store <2 x double> %reverse336, ptr %169, align 8, !tbaa !9, !alias.scope !33, !noalias !36
  %reverse337 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %167, <2 x double> %wide.load334, <2 x double> %wide.load330)
  store <2 x double> %reverse337, ptr %170, align 8, !tbaa !9, !alias.scope !33, !noalias !36
  %index.next338 = add nuw i64 %index327, 4
  %174 = icmp eq i64 %index.next338, %n.vec323
  br i1 %174, label %middle.block318, label %vector.body326, !llvm.loop !38

middle.block318:                                  ; preds = %vector.body326
  br i1 %cmp.n339, label %..loopexit_crit_edge, label %scalar.ph319.preheader

scalar.ph319.preheader:                           ; preds = %middle.block318, %vector.memcheck313, %.lr.ph207
  %indvars.iv267.ph = phi i64 [ %72, %vector.memcheck313 ], [ %72, %.lr.ph207 ], [ %ind.end324, %middle.block318 ]
  br label %scalar.ph319

scalar.ph319:                                     ; preds = %scalar.ph319.preheader, %scalar.ph319
  %indvars.iv267 = phi i64 [ %indvars.iv.next268, %scalar.ph319 ], [ %indvars.iv267.ph, %scalar.ph319.preheader ]
  %175 = getelementptr inbounds double, ptr %162, i64 %indvars.iv267
  %176 = load double, ptr %175, align 8, !tbaa !9
  %177 = getelementptr inbounds double, ptr %117, i64 %indvars.iv267
  %178 = load double, ptr %177, align 8, !tbaa !9
  %179 = tail call double @llvm.fmuladd.f64(double %165, double %178, double %176)
  store double %179, ptr %175, align 8, !tbaa !9
  %indvars.iv.next268 = add nsw i64 %indvars.iv267, -1
  %.not170.not = icmp sgt i64 %indvars.iv267, %indvars.iv250
  br i1 %.not170.not, label %scalar.ph319, label %..loopexit_crit_edge, !llvm.loop !39

..loopexit_crit_edge:                             ; preds = %scalar.ph319, %middle.block318, %.lr.ph210.split
  %indvars.iv.next271 = add nuw nsw i64 %indvars.iv270, 1
  %exitcond274.not = icmp eq i64 %indvars.iv.next271, %wide.trip.count276
  br i1 %exitcond274.not, label %._crit_edge211, label %.lr.ph210.split, !llvm.loop !40

180:                                              ; preds = %130
  tail call void @_Z16DeallocateMatrixPPdi(ptr noundef %6, i32 noundef %4)
  tail call void @_Z16DeallocateMatrixPPdi(ptr noundef nonnull %9, i32 noundef %4)
  br label %198

._crit_edge211:                                   ; preds = %..loopexit_crit_edge, %.loopexit177, %.lr.ph210
  %indvars.iv.next251 = add nuw nsw i64 %indvars.iv250, 1
  %exitcond277.not = icmp eq i64 %indvars.iv.next251, %wide.trip.count276
  %indvar.next = add i64 %indvar, 1
  br i1 %exitcond277.not, label %.preheader174, label %107, !llvm.loop !41

.preheader:                                       ; preds = %.preheader.preheader, %._crit_edge220
  %indvars.iv287 = phi i64 [ 1, %.preheader.preheader ], [ %indvars.iv.next288, %._crit_edge220 ]
  %181 = getelementptr inbounds ptr, ptr %9, i64 %indvars.iv287
  %182 = load ptr, ptr %181, align 8, !tbaa !5
  %183 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv287
  %184 = load ptr, ptr %183, align 8, !tbaa !5
  br i1 %min.iters.check388, label %scalar.ph387.preheader, label %vector.memcheck383

vector.memcheck383:                               ; preds = %.preheader
  %185 = ptrtoint ptr %184 to i64
  %186 = ptrtoint ptr %182 to i64
  %187 = add i64 %185, 8
  %188 = add i64 %101, %186
  %189 = sub i64 %187, %188
  %diff.check384 = icmp ult i64 %189, 32
  br i1 %diff.check384, label %scalar.ph387.preheader, label %vector.ph389

vector.ph389:                                     ; preds = %vector.memcheck383
  %invariant.gep417 = getelementptr double, ptr %182, i64 %100
  br label %vector.body396

vector.body396:                                   ; preds = %vector.body396, %vector.ph389
  %index397 = phi i64 [ 0, %vector.ph389 ], [ %index.next402, %vector.body396 ]
  %offset.idx398 = or disjoint i64 %index397, 1
  %gep418 = getelementptr double, ptr %invariant.gep417, i64 %index397
  %190 = getelementptr inbounds i8, ptr %gep418, i64 16
  %wide.load400 = load <2 x double>, ptr %gep418, align 8, !tbaa !9
  %wide.load401 = load <2 x double>, ptr %190, align 8, !tbaa !9
  %191 = getelementptr inbounds double, ptr %184, i64 %offset.idx398
  %192 = getelementptr inbounds i8, ptr %191, i64 16
  store <2 x double> %wide.load400, ptr %191, align 8, !tbaa !9
  store <2 x double> %wide.load401, ptr %192, align 8, !tbaa !9
  %index.next402 = add nuw i64 %index397, 4
  %193 = icmp eq i64 %index.next402, %n.vec391
  br i1 %193, label %middle.block386, label %vector.body396, !llvm.loop !42

middle.block386:                                  ; preds = %vector.body396
  br i1 %cmp.n403, label %._crit_edge220, label %scalar.ph387.preheader

scalar.ph387.preheader:                           ; preds = %middle.block386, %vector.memcheck383, %.preheader
  %indvars.iv282.ph = phi i64 [ 1, %vector.memcheck383 ], [ 1, %.preheader ], [ %ind.end392, %middle.block386 ]
  %indvars.iv280.ph = phi i64 [ %100, %vector.memcheck383 ], [ %100, %.preheader ], [ %ind.end394, %middle.block386 ]
  br label %scalar.ph387

scalar.ph387:                                     ; preds = %scalar.ph387.preheader, %scalar.ph387
  %indvars.iv282 = phi i64 [ %indvars.iv.next283, %scalar.ph387 ], [ %indvars.iv282.ph, %scalar.ph387.preheader ]
  %indvars.iv280 = phi i64 [ %indvars.iv.next281, %scalar.ph387 ], [ %indvars.iv280.ph, %scalar.ph387.preheader ]
  %194 = getelementptr inbounds double, ptr %182, i64 %indvars.iv280
  %195 = load double, ptr %194, align 8, !tbaa !9
  %196 = getelementptr inbounds double, ptr %184, i64 %indvars.iv282
  store double %195, ptr %196, align 8, !tbaa !9
  %indvars.iv.next281 = add nuw nsw i64 %indvars.iv280, 1
  %indvars.iv.next283 = add nuw nsw i64 %indvars.iv282, 1
  %197 = trunc nuw i64 %indvars.iv280 to i32
  %.not163 = icmp slt i32 %7, %197
  br i1 %.not163, label %._crit_edge220, label %scalar.ph387, !llvm.loop !43

._crit_edge220:                                   ; preds = %scalar.ph387, %middle.block386
  %indvars.iv.next288 = add nuw nsw i64 %indvars.iv287, 1
  %exitcond293.not = icmp eq i64 %indvars.iv.next288, %wide.trip.count292
  br i1 %exitcond293.not, label %._crit_edge224, label %.preheader, !llvm.loop !44

._crit_edge224:                                   ; preds = %._crit_edge220, %3, %.preheader181, %.preheader178, %.preheader174
  tail call void @_Z16DeallocateMatrixPPdi(ptr noundef %6, i32 noundef %4)
  tail call void @_Z16DeallocateMatrixPPdi(ptr noundef %9, i32 noundef %4)
  br label %198

198:                                              ; preds = %._crit_edge224, %180
  %.0 = phi i32 [ -1, %180 ], [ 0, %._crit_edge224 ]
  tail call void @_Z16DeallocateMatrixPPdi(ptr noundef %10, i32 noundef %4)
  ret i32 %.0
}

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

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

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

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

!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++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"double", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.unroll.disable"}
!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, !15}
!18 = distinct !{!18, !14}
!19 = distinct !{!19, !12}
!20 = distinct !{!20, !14, !15, !16}
!21 = distinct !{!21, !14, !15}
!22 = distinct !{!22, !14}
!23 = distinct !{!23, !14}
!24 = !{!25}
!25 = distinct !{!25, !26}
!26 = distinct !{!26, !"LVerDomain"}
!27 = !{!28}
!28 = distinct !{!28, !26}
!29 = distinct !{!29, !14, !15, !16}
!30 = distinct !{!30, !14, !15}
!31 = distinct !{!31, !14, !15, !16}
!32 = distinct !{!32, !14, !16, !15}
!33 = !{!34}
!34 = distinct !{!34, !35}
!35 = distinct !{!35, !"LVerDomain"}
!36 = !{!37}
!37 = distinct !{!37, !35}
!38 = distinct !{!38, !14, !15, !16}
!39 = distinct !{!39, !14, !15}
!40 = distinct !{!40, !14}
!41 = distinct !{!41, !14}
!42 = distinct !{!42, !14, !15, !16}
!43 = distinct !{!43, !14, !15}
!44 = distinct !{!44, !14}


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