; LLVM IR from ERGO-Code/HiGHS :: src/ipm/basiclu (lu_solve_dense)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.lu = type { i32, i32, i32, double, double, double, i32, i32, i32, double, double, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, double, double, double, double, double, double, double, double, double, double, double, i32, i32, i32, double, double, double, double, double, double, double, double, double, i32, i32, i32, i32, i32, i32, i32, i32, double, double, double, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

@.str = external hidden unnamed_addr constant [20 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [82 x i8], align 1
@__PRETTY_FUNCTION__.lu_solve_dense = external hidden unnamed_addr constant [65 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @lu_solve_dense(ptr noundef %0, ptr noundef %1, ptr noundef %2, i8 noundef signext %3) #0 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i8, align 1
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca double, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  store i8 %3, ptr %8, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #6
  %37 = load ptr, ptr %5, align 8, !tbaa !5
  %38 = getelementptr inbounds %struct.lu, ptr %37, i32 0, i32 13
  %39 = load i32, ptr %38, align 4, !tbaa !10
  store i32 %39, ptr %9, align 4, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #6
  %40 = load ptr, ptr %5, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.lu, ptr %40, i32 0, i32 18
  %42 = load i32, ptr %41, align 8, !tbaa !15
  store i32 %42, ptr %10, align 4, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #6
  %43 = load ptr, ptr %5, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.lu, ptr %43, i32 0, i32 93
  %45 = load ptr, ptr %44, align 8, !tbaa !16
  store ptr %45, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #6
  %46 = load ptr, ptr %5, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.lu, ptr %46, i32 0, i32 83
  %48 = load ptr, ptr %47, align 8, !tbaa !17
  store ptr %48, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  %49 = load ptr, ptr %5, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.lu, ptr %49, i32 0, i32 78
  %51 = load ptr, ptr %50, align 8, !tbaa !18
  store ptr %51, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  %52 = load ptr, ptr %5, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.lu, ptr %52, i32 0, i32 80
  %54 = load ptr, ptr %53, align 8, !tbaa !19
  store ptr %54, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  %55 = load ptr, ptr %5, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.lu, ptr %55, i32 0, i32 98
  %57 = load ptr, ptr %56, align 8, !tbaa !20
  store ptr %57, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  %58 = load ptr, ptr %5, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.lu, ptr %58, i32 0, i32 91
  %60 = load ptr, ptr %59, align 8, !tbaa !21
  store ptr %60, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  %61 = load ptr, ptr %5, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.lu, ptr %61, i32 0, i32 99
  %63 = load ptr, ptr %62, align 8, !tbaa !22
  store ptr %63, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  %64 = load ptr, ptr %5, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.lu, ptr %64, i32 0, i32 82
  %66 = load ptr, ptr %65, align 8, !tbaa !23
  store ptr %66, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #6
  %67 = load ptr, ptr %5, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.lu, ptr %67, i32 0, i32 86
  %69 = load ptr, ptr %68, align 8, !tbaa !24
  store ptr %69, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #6
  %70 = load ptr, ptr %5, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.lu, ptr %70, i32 0, i32 88
  %72 = load ptr, ptr %71, align 8, !tbaa !25
  store ptr %72, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  %73 = load ptr, ptr %5, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.lu, ptr %73, i32 0, i32 104
  %75 = load ptr, ptr %74, align 8, !tbaa !26
  store ptr %75, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #6
  %76 = load ptr, ptr %5, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.lu, ptr %76, i32 0, i32 105
  %78 = load ptr, ptr %77, align 8, !tbaa !27
  store ptr %78, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  %79 = load ptr, ptr %5, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.lu, ptr %79, i32 0, i32 71
  %81 = load ptr, ptr %80, align 8, !tbaa !28
  store ptr %81, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %82 = load ptr, ptr %5, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.lu, ptr %82, i32 0, i32 74
  %84 = load ptr, ptr %83, align 8, !tbaa !29
  store ptr %84, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #6
  %85 = load ptr, ptr %5, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.lu, ptr %85, i32 0, i32 72
  %87 = load ptr, ptr %86, align 8, !tbaa !30
  store ptr %87, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #6
  %88 = load ptr, ptr %5, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.lu, ptr %88, i32 0, i32 75
  %90 = load ptr, ptr %89, align 8, !tbaa !31
  store ptr %90, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #6
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.lu, ptr %91, i32 0, i32 73
  %93 = load ptr, ptr %92, align 8, !tbaa !32
  store ptr %93, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  %94 = load ptr, ptr %5, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.lu, ptr %94, i32 0, i32 76
  %96 = load ptr, ptr %95, align 8, !tbaa !33
  store ptr %96, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #6
  %97 = load ptr, ptr %5, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.lu, ptr %97, i32 0, i32 103
  %99 = load ptr, ptr %98, align 8, !tbaa !34
  store ptr %99, ptr %29, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #6
  %100 = load ptr, ptr %5, align 8, !tbaa !5
  call void @lu_garbage_perm(ptr noundef %100)
  %101 = load ptr, ptr %5, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.lu, ptr %101, i32 0, i32 67
  %103 = load i32, ptr %102, align 8, !tbaa !35
  %104 = load i32, ptr %9, align 4, !tbaa !14
  %105 = icmp eq i32 %103, %104
  br i1 %105, label %106, label %107

106:                                              ; preds = %4
  br label %108

107:                                              ; preds = %4
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 38, ptr noundef @__PRETTY_FUNCTION__.lu_solve_dense) #7
  unreachable

108:                                              ; preds = %106
  %109 = load i8, ptr %8, align 1, !tbaa !9
  %110 = sext i8 %109 to i32
  %111 = icmp eq i32 %110, 116
  br i1 %111, label %116, label %112

112:                                              ; preds = %108
  %113 = load i8, ptr %8, align 1, !tbaa !9
  %114 = sext i8 %113 to i32
  %115 = icmp eq i32 %114, 84
  br i1 %115, label %116, label %299

116:                                              ; preds = %112, %108
  %117 = load ptr, ptr %29, align 8, !tbaa !5
  %118 = load ptr, ptr %6, align 8, !tbaa !5
  %119 = load i32, ptr %9, align 4, !tbaa !14
  %120 = sext i32 %119 to i64
  %121 = mul i64 %120, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %117, ptr align 8 %118, i64 %121, i1 false)
  store i32 0, ptr %31, align 4, !tbaa !14
  br label %122

122:                                              ; preds = %188, %116
  %123 = load i32, ptr %31, align 4, !tbaa !14
  %124 = load i32, ptr %9, align 4, !tbaa !14
  %125 = icmp slt i32 %123, %124
  br i1 %125, label %126, label %191

126:                                              ; preds = %122
  %127 = load ptr, ptr %13, align 8, !tbaa !5
  %128 = load i32, ptr %31, align 4, !tbaa !14
  %129 = sext i32 %128 to i64
  %130 = getelementptr inbounds i32, ptr %127, i64 %129
  %131 = load i32, ptr %130, align 4, !tbaa !14
  store i32 %131, ptr %34, align 4, !tbaa !14
  %132 = load ptr, ptr %14, align 8, !tbaa !5
  %133 = load i32, ptr %31, align 4, !tbaa !14
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds i32, ptr %132, i64 %134
  %136 = load i32, ptr %135, align 4, !tbaa !14
  store i32 %136, ptr %33, align 4, !tbaa !14
  %137 = load ptr, ptr %29, align 8, !tbaa !5
  %138 = load i32, ptr %34, align 4, !tbaa !14
  %139 = sext i32 %138 to i64
  %140 = getelementptr inbounds double, ptr %137, i64 %139
  %141 = load double, ptr %140, align 8, !tbaa !36
  %142 = load ptr, ptr %21, align 8, !tbaa !5
  %143 = load i32, ptr %34, align 4, !tbaa !14
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds double, ptr %142, i64 %144
  %146 = load double, ptr %145, align 8, !tbaa !36
  %147 = fdiv double %141, %146
  store double %147, ptr %36, align 8, !tbaa !36
  %148 = load ptr, ptr %19, align 8, !tbaa !5
  %149 = load i32, ptr %34, align 4, !tbaa !14
  %150 = sext i32 %149 to i64
  %151 = getelementptr inbounds i32, ptr %148, i64 %150
  %152 = load i32, ptr %151, align 4, !tbaa !14
  store i32 %152, ptr %35, align 4, !tbaa !14
  br label %153

153:                                              ; preds = %179, %126
  %154 = load i32, ptr %35, align 4, !tbaa !14
  %155 = load ptr, ptr %20, align 8, !tbaa !5
  %156 = load i32, ptr %34, align 4, !tbaa !14
  %157 = sext i32 %156 to i64
  %158 = getelementptr inbounds i32, ptr %155, i64 %157
  %159 = load i32, ptr %158, align 4, !tbaa !14
  %160 = icmp slt i32 %154, %159
  br i1 %160, label %161, label %182

161:                                              ; preds = %153
  %162 = load double, ptr %36, align 8, !tbaa !36
  %163 = load ptr, ptr %28, align 8, !tbaa !5
  %164 = load i32, ptr %35, align 4, !tbaa !14
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds double, ptr %163, i64 %165
  %167 = load double, ptr %166, align 8, !tbaa !36
  %168 = load ptr, ptr %29, align 8, !tbaa !5
  %169 = load ptr, ptr %27, align 8, !tbaa !5
  %170 = load i32, ptr %35, align 4, !tbaa !14
  %171 = sext i32 %170 to i64
  %172 = getelementptr inbounds i32, ptr %169, i64 %171
  %173 = load i32, ptr %172, align 4, !tbaa !14
  %174 = sext i32 %173 to i64
  %175 = getelementptr inbounds double, ptr %168, i64 %174
  %176 = load double, ptr %175, align 8, !tbaa !36
  %177 = fneg double %162
  %178 = call double @llvm.fmuladd.f64(double %177, double %167, double %176)
  store double %178, ptr %175, align 8, !tbaa !36
  br label %179

179:                                              ; preds = %161
  %180 = load i32, ptr %35, align 4, !tbaa !14
  %181 = add nsw i32 %180, 1
  store i32 %181, ptr %35, align 4, !tbaa !14
  br label %153, !llvm.loop !37

182:                                              ; preds = %153
  %183 = load double, ptr %36, align 8, !tbaa !36
  %184 = load ptr, ptr %7, align 8, !tbaa !5
  %185 = load i32, ptr %33, align 4, !tbaa !14
  %186 = sext i32 %185 to i64
  %187 = getelementptr inbounds double, ptr %184, i64 %186
  store double %183, ptr %187, align 8, !tbaa !36
  br label %188

188:                                              ; preds = %182
  %189 = load i32, ptr %31, align 4, !tbaa !14
  %190 = add nsw i32 %189, 1
  store i32 %190, ptr %31, align 4, !tbaa !14
  br label %122, !llvm.loop !39

191:                                              ; preds = %122
  %192 = load i32, ptr %10, align 4, !tbaa !14
  %193 = sub nsw i32 %192, 1
  store i32 %193, ptr %32, align 4, !tbaa !14
  br label %194

194:                                              ; preds = %245, %191
  %195 = load i32, ptr %32, align 4, !tbaa !14
  %196 = icmp sge i32 %195, 0
  br i1 %196, label %197, label %248

197:                                              ; preds = %194
  %198 = load ptr, ptr %12, align 8, !tbaa !5
  %199 = load i32, ptr %32, align 4, !tbaa !14
  %200 = sext i32 %199 to i64
  %201 = getelementptr inbounds i32, ptr %198, i64 %200
  %202 = load i32, ptr %201, align 4, !tbaa !14
  store i32 %202, ptr %33, align 4, !tbaa !14
  %203 = load ptr, ptr %7, align 8, !tbaa !5
  %204 = load i32, ptr %33, align 4, !tbaa !14
  %205 = sext i32 %204 to i64
  %206 = getelementptr inbounds double, ptr %203, i64 %205
  %207 = load double, ptr %206, align 8, !tbaa !36
  store double %207, ptr %36, align 8, !tbaa !36
  %208 = load ptr, ptr %18, align 8, !tbaa !5
  %209 = load i32, ptr %32, align 4, !tbaa !14
  %210 = sext i32 %209 to i64
  %211 = getelementptr inbounds i32, ptr %208, i64 %210
  %212 = load i32, ptr %211, align 4, !tbaa !14
  store i32 %212, ptr %35, align 4, !tbaa !14
  br label %213

213:                                              ; preds = %241, %197
  %214 = load i32, ptr %35, align 4, !tbaa !14
  %215 = load ptr, ptr %18, align 8, !tbaa !5
  %216 = load i32, ptr %32, align 4, !tbaa !14
  %217 = add nsw i32 %216, 1
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds i32, ptr %215, i64 %218
  %220 = load i32, ptr %219, align 4, !tbaa !14
  %221 = icmp slt i32 %214, %220
  br i1 %221, label %222, label %244

222:                                              ; preds = %213
  %223 = load ptr, ptr %23, align 8, !tbaa !5
  %224 = load i32, ptr %35, align 4, !tbaa !14
  %225 = sext i32 %224 to i64
  %226 = getelementptr inbounds i32, ptr %223, i64 %225
  %227 = load i32, ptr %226, align 4, !tbaa !14
  store i32 %227, ptr %30, align 4, !tbaa !14
  %228 = load double, ptr %36, align 8, !tbaa !36
  %229 = load ptr, ptr %24, align 8, !tbaa !5
  %230 = load i32, ptr %35, align 4, !tbaa !14
  %231 = sext i32 %230 to i64
  %232 = getelementptr inbounds double, ptr %229, i64 %231
  %233 = load double, ptr %232, align 8, !tbaa !36
  %234 = load ptr, ptr %7, align 8, !tbaa !5
  %235 = load i32, ptr %30, align 4, !tbaa !14
  %236 = sext i32 %235 to i64
  %237 = getelementptr inbounds double, ptr %234, i64 %236
  %238 = load double, ptr %237, align 8, !tbaa !36
  %239 = fneg double %228
  %240 = call double @llvm.fmuladd.f64(double %239, double %233, double %238)
  store double %240, ptr %237, align 8, !tbaa !36
  br label %241

241:                                              ; preds = %222
  %242 = load i32, ptr %35, align 4, !tbaa !14
  %243 = add nsw i32 %242, 1
  store i32 %243, ptr %35, align 4, !tbaa !14
  br label %213, !llvm.loop !40

244:                                              ; preds = %213
  br label %245

245:                                              ; preds = %244
  %246 = load i32, ptr %32, align 4, !tbaa !14
  %247 = add nsw i32 %246, -1
  store i32 %247, ptr %32, align 4, !tbaa !14
  br label %194, !llvm.loop !41

248:                                              ; preds = %194
  %249 = load i32, ptr %9, align 4, !tbaa !14
  %250 = sub nsw i32 %249, 1
  store i32 %250, ptr %31, align 4, !tbaa !14
  br label %251

251:                                              ; preds = %295, %248
  %252 = load i32, ptr %31, align 4, !tbaa !14
  %253 = icmp sge i32 %252, 0
  br i1 %253, label %254, label %298

254:                                              ; preds = %251
  store double 0.000000e+00, ptr %36, align 8, !tbaa !36
  %255 = load ptr, ptr %15, align 8, !tbaa !5
  %256 = load i32, ptr %31, align 4, !tbaa !14
  %257 = sext i32 %256 to i64
  %258 = getelementptr inbounds i32, ptr %255, i64 %257
  %259 = load i32, ptr %258, align 4, !tbaa !14
  store i32 %259, ptr %35, align 4, !tbaa !14
  br label %260

260:                                              ; preds = %280, %254
  %261 = load ptr, ptr %23, align 8, !tbaa !5
  %262 = load i32, ptr %35, align 4, !tbaa !14
  %263 = sext i32 %262 to i64
  %264 = getelementptr inbounds i32, ptr %261, i64 %263
  %265 = load i32, ptr %264, align 4, !tbaa !14
  store i32 %265, ptr %30, align 4, !tbaa !14
  %266 = icmp sge i32 %265, 0
  br i1 %266, label %267, label %283

267:                                              ; preds = %260
  %268 = load ptr, ptr %7, align 8, !tbaa !5
  %269 = load i32, ptr %30, align 4, !tbaa !14
  %270 = sext i32 %269 to i64
  %271 = getelementptr inbounds double, ptr %268, i64 %270
  %272 = load double, ptr %271, align 8, !tbaa !36
  %273 = load ptr, ptr %24, align 8, !tbaa !5
  %274 = load i32, ptr %35, align 4, !tbaa !14
  %275 = sext i32 %274 to i64
  %276 = getelementptr inbounds double, ptr %273, i64 %275
  %277 = load double, ptr %276, align 8, !tbaa !36
  %278 = load double, ptr %36, align 8, !tbaa !36
  %279 = call double @llvm.fmuladd.f64(double %272, double %277, double %278)
  store double %279, ptr %36, align 8, !tbaa !36
  br label %280

280:                                              ; preds = %267
  %281 = load i32, ptr %35, align 4, !tbaa !14
  %282 = add nsw i32 %281, 1
  store i32 %282, ptr %35, align 4, !tbaa !14
  br label %260, !llvm.loop !42

283:                                              ; preds = %260
  %284 = load double, ptr %36, align 8, !tbaa !36
  %285 = load ptr, ptr %7, align 8, !tbaa !5
  %286 = load ptr, ptr %11, align 8, !tbaa !5
  %287 = load i32, ptr %31, align 4, !tbaa !14
  %288 = sext i32 %287 to i64
  %289 = getelementptr inbounds i32, ptr %286, i64 %288
  %290 = load i32, ptr %289, align 4, !tbaa !14
  %291 = sext i32 %290 to i64
  %292 = getelementptr inbounds double, ptr %285, i64 %291
  %293 = load double, ptr %292, align 8, !tbaa !36
  %294 = fsub double %293, %284
  store double %294, ptr %292, align 8, !tbaa !36
  br label %295

295:                                              ; preds = %283
  %296 = load i32, ptr %31, align 4, !tbaa !14
  %297 = add nsw i32 %296, -1
  store i32 %297, ptr %31, align 4, !tbaa !14
  br label %251, !llvm.loop !43

298:                                              ; preds = %251
  br label %474

299:                                              ; preds = %112
  %300 = load ptr, ptr %29, align 8, !tbaa !5
  %301 = load ptr, ptr %6, align 8, !tbaa !5
  %302 = load i32, ptr %9, align 4, !tbaa !14
  %303 = sext i32 %302 to i64
  %304 = mul i64 %303, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %300, ptr align 8 %301, i64 %304, i1 false)
  store i32 0, ptr %31, align 4, !tbaa !14
  br label %305

305:                                              ; preds = %350, %299
  %306 = load i32, ptr %31, align 4, !tbaa !14
  %307 = load i32, ptr %9, align 4, !tbaa !14
  %308 = icmp slt i32 %306, %307
  br i1 %308, label %309, label %353

309:                                              ; preds = %305
  store double 0.000000e+00, ptr %36, align 8, !tbaa !36
  %310 = load ptr, ptr %16, align 8, !tbaa !5
  %311 = load i32, ptr %31, align 4, !tbaa !14
  %312 = sext i32 %311 to i64
  %313 = getelementptr inbounds i32, ptr %310, i64 %312
  %314 = load i32, ptr %313, align 4, !tbaa !14
  store i32 %314, ptr %35, align 4, !tbaa !14
  br label %315

315:                                              ; preds = %335, %309
  %316 = load ptr, ptr %23, align 8, !tbaa !5
  %317 = load i32, ptr %35, align 4, !tbaa !14
  %318 = sext i32 %317 to i64
  %319 = getelementptr inbounds i32, ptr %316, i64 %318
  %320 = load i32, ptr %319, align 4, !tbaa !14
  store i32 %320, ptr %30, align 4, !tbaa !14
  %321 = icmp sge i32 %320, 0
  br i1 %321, label %322, label %338

322:                                              ; preds = %315
  %323 = load ptr, ptr %29, align 8, !tbaa !5
  %324 = load i32, ptr %30, align 4, !tbaa !14
  %325 = sext i32 %324 to i64
  %326 = getelementptr inbounds double, ptr %323, i64 %325
  %327 = load double, ptr %326, align 8, !tbaa !36
  %328 = load ptr, ptr %24, align 8, !tbaa !5
  %329 = load i32, ptr %35, align 4, !tbaa !14
  %330 = sext i32 %329 to i64
  %331 = getelementptr inbounds double, ptr %328, i64 %330
  %332 = load double, ptr %331, align 8, !tbaa !36
  %333 = load double, ptr %36, align 8, !tbaa !36
  %334 = call double @llvm.fmuladd.f64(double %327, double %332, double %333)
  store double %334, ptr %36, align 8, !tbaa !36
  br label %335

335:                                              ; preds = %322
  %336 = load i32, ptr %35, align 4, !tbaa !14
  %337 = add nsw i32 %336, 1
  store i32 %337, ptr %35, align 4, !tbaa !14
  br label %315, !llvm.loop !44

338:                                              ; preds = %315
  %339 = load double, ptr %36, align 8, !tbaa !36
  %340 = load ptr, ptr %29, align 8, !tbaa !5
  %341 = load ptr, ptr %11, align 8, !tbaa !5
  %342 = load i32, ptr %31, align 4, !tbaa !14
  %343 = sext i32 %342 to i64
  %344 = getelementptr inbounds i32, ptr %341, i64 %343
  %345 = load i32, ptr %344, align 4, !tbaa !14
  %346 = sext i32 %345 to i64
  %347 = getelementptr inbounds double, ptr %340, i64 %346
  %348 = load double, ptr %347, align 8, !tbaa !36
  %349 = fsub double %348, %339
  store double %349, ptr %347, align 8, !tbaa !36
  br label %350

350:                                              ; preds = %338
  %351 = load i32, ptr %31, align 4, !tbaa !14
  %352 = add nsw i32 %351, 1
  store i32 %352, ptr %31, align 4, !tbaa !14
  br label %305, !llvm.loop !45

353:                                              ; preds = %305
  %354 = load ptr, ptr %18, align 8, !tbaa !5
  %355 = getelementptr inbounds i32, ptr %354, i64 0
  %356 = load i32, ptr %355, align 4, !tbaa !14
  store i32 %356, ptr %35, align 4, !tbaa !14
  store i32 0, ptr %32, align 4, !tbaa !14
  br label %357

357:                                              ; preds = %404, %353
  %358 = load i32, ptr %32, align 4, !tbaa !14
  %359 = load i32, ptr %10, align 4, !tbaa !14
  %360 = icmp slt i32 %358, %359
  br i1 %360, label %361, label %407

361:                                              ; preds = %357
  %362 = load ptr, ptr %12, align 8, !tbaa !5
  %363 = load i32, ptr %32, align 4, !tbaa !14
  %364 = sext i32 %363 to i64
  %365 = getelementptr inbounds i32, ptr %362, i64 %364
  %366 = load i32, ptr %365, align 4, !tbaa !14
  store i32 %366, ptr %33, align 4, !tbaa !14
  store double 0.000000e+00, ptr %36, align 8, !tbaa !36
  br label %367

367:                                              ; preds = %393, %361
  %368 = load i32, ptr %35, align 4, !tbaa !14
  %369 = load ptr, ptr %18, align 8, !tbaa !5
  %370 = load i32, ptr %32, align 4, !tbaa !14
  %371 = add nsw i32 %370, 1
  %372 = sext i32 %371 to i64
  %373 = getelementptr inbounds i32, ptr %369, i64 %372
  %374 = load i32, ptr %373, align 4, !tbaa !14
  %375 = icmp slt i32 %368, %374
  br i1 %375, label %376, label %396

376:                                              ; preds = %367
  %377 = load ptr, ptr %29, align 8, !tbaa !5
  %378 = load ptr, ptr %23, align 8, !tbaa !5
  %379 = load i32, ptr %35, align 4, !tbaa !14
  %380 = sext i32 %379 to i64
  %381 = getelementptr inbounds i32, ptr %378, i64 %380
  %382 = load i32, ptr %381, align 4, !tbaa !14
  %383 = sext i32 %382 to i64
  %384 = getelementptr inbounds double, ptr %377, i64 %383
  %385 = load double, ptr %384, align 8, !tbaa !36
  %386 = load ptr, ptr %24, align 8, !tbaa !5
  %387 = load i32, ptr %35, align 4, !tbaa !14
  %388 = sext i32 %387 to i64
  %389 = getelementptr inbounds double, ptr %386, i64 %388
  %390 = load double, ptr %389, align 8, !tbaa !36
  %391 = load double, ptr %36, align 8, !tbaa !36
  %392 = call double @llvm.fmuladd.f64(double %385, double %390, double %391)
  store double %392, ptr %36, align 8, !tbaa !36
  br label %393

393:                                              ; preds = %376
  %394 = load i32, ptr %35, align 4, !tbaa !14
  %395 = add nsw i32 %394, 1
  store i32 %395, ptr %35, align 4, !tbaa !14
  br label %367, !llvm.loop !46

396:                                              ; preds = %367
  %397 = load double, ptr %36, align 8, !tbaa !36
  %398 = load ptr, ptr %29, align 8, !tbaa !5
  %399 = load i32, ptr %33, align 4, !tbaa !14
  %400 = sext i32 %399 to i64
  %401 = getelementptr inbounds double, ptr %398, i64 %400
  %402 = load double, ptr %401, align 8, !tbaa !36
  %403 = fsub double %402, %397
  store double %403, ptr %401, align 8, !tbaa !36
  br label %404

404:                                              ; preds = %396
  %405 = load i32, ptr %32, align 4, !tbaa !14
  %406 = add nsw i32 %405, 1
  store i32 %406, ptr %32, align 4, !tbaa !14
  br label %357, !llvm.loop !47

407:                                              ; preds = %357
  %408 = load i32, ptr %9, align 4, !tbaa !14
  %409 = sub nsw i32 %408, 1
  store i32 %409, ptr %31, align 4, !tbaa !14
  br label %410

410:                                              ; preds = %470, %407
  %411 = load i32, ptr %31, align 4, !tbaa !14
  %412 = icmp sge i32 %411, 0
  br i1 %412, label %413, label %473

413:                                              ; preds = %410
  %414 = load ptr, ptr %13, align 8, !tbaa !5
  %415 = load i32, ptr %31, align 4, !tbaa !14
  %416 = sext i32 %415 to i64
  %417 = getelementptr inbounds i32, ptr %414, i64 %416
  %418 = load i32, ptr %417, align 4, !tbaa !14
  store i32 %418, ptr %34, align 4, !tbaa !14
  %419 = load ptr, ptr %14, align 8, !tbaa !5
  %420 = load i32, ptr %31, align 4, !tbaa !14
  %421 = sext i32 %420 to i64
  %422 = getelementptr inbounds i32, ptr %419, i64 %421
  %423 = load i32, ptr %422, align 4, !tbaa !14
  store i32 %423, ptr %33, align 4, !tbaa !14
  %424 = load ptr, ptr %29, align 8, !tbaa !5
  %425 = load i32, ptr %33, align 4, !tbaa !14
  %426 = sext i32 %425 to i64
  %427 = getelementptr inbounds double, ptr %424, i64 %426
  %428 = load double, ptr %427, align 8, !tbaa !36
  %429 = load ptr, ptr %22, align 8, !tbaa !5
  %430 = load i32, ptr %33, align 4, !tbaa !14
  %431 = sext i32 %430 to i64
  %432 = getelementptr inbounds double, ptr %429, i64 %431
  %433 = load double, ptr %432, align 8, !tbaa !36
  %434 = fdiv double %428, %433
  store double %434, ptr %36, align 8, !tbaa !36
  %435 = load ptr, ptr %17, align 8, !tbaa !5
  %436 = load i32, ptr %33, align 4, !tbaa !14
  %437 = sext i32 %436 to i64
  %438 = getelementptr inbounds i32, ptr %435, i64 %437
  %439 = load i32, ptr %438, align 4, !tbaa !14
  store i32 %439, ptr %35, align 4, !tbaa !14
  br label %440

440:                                              ; preds = %461, %413
  %441 = load ptr, ptr %25, align 8, !tbaa !5
  %442 = load i32, ptr %35, align 4, !tbaa !14
  %443 = sext i32 %442 to i64
  %444 = getelementptr inbounds i32, ptr %441, i64 %443
  %445 = load i32, ptr %444, align 4, !tbaa !14
  store i32 %445, ptr %30, align 4, !tbaa !14
  %446 = icmp sge i32 %445, 0
  br i1 %446, label %447, label %464

447:                                              ; preds = %440
  %448 = load double, ptr %36, align 8, !tbaa !36
  %449 = load ptr, ptr %26, align 8, !tbaa !5
  %450 = load i32, ptr %35, align 4, !tbaa !14
  %451 = sext i32 %450 to i64
  %452 = getelementptr inbounds double, ptr %449, i64 %451
  %453 = load double, ptr %452, align 8, !tbaa !36
  %454 = load ptr, ptr %29, align 8, !tbaa !5
  %455 = load i32, ptr %30, align 4, !tbaa !14
  %456 = sext i32 %455 to i64
  %457 = getelementptr inbounds double, ptr %454, i64 %456
  %458 = load double, ptr %457, align 8, !tbaa !36
  %459 = fneg double %448
  %460 = call double @llvm.fmuladd.f64(double %459, double %453, double %458)
  store double %460, ptr %457, align 8, !tbaa !36
  br label %461

461:                                              ; preds = %447
  %462 = load i32, ptr %35, align 4, !tbaa !14
  %463 = add nsw i32 %462, 1
  store i32 %463, ptr %35, align 4, !tbaa !14
  br label %440, !llvm.loop !48

464:                                              ; preds = %440
  %465 = load double, ptr %36, align 8, !tbaa !36
  %466 = load ptr, ptr %7, align 8, !tbaa !5
  %467 = load i32, ptr %34, align 4, !tbaa !14
  %468 = sext i32 %467 to i64
  %469 = getelementptr inbounds double, ptr %466, i64 %468
  store double %465, ptr %469, align 8, !tbaa !36
  br label %470

470:                                              ; preds = %464
  %471 = load i32, ptr %31, align 4, !tbaa !14
  %472 = add nsw i32 %471, -1
  store i32 %472, ptr %31, align 4, !tbaa !14
  br label %410, !llvm.loop !49

473:                                              ; preds = %410
  br label %474

474:                                              ; preds = %473, %298
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #6
  ret void
}

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

declare void @lu_garbage_perm(ptr noundef) #2

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #3

; 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 double @llvm.fmuladd.f64(double, double, double) #5

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

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "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 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { nounwind }
attributes #7 = { noreturn 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 = !{!7, !7, i64 0}
!10 = !{!11, !12, i64 84}
!11 = !{!"lu", !12, i64 0, !12, i64 4, !12, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !12, i64 40, !12, i64 44, !12, i64 48, !13, i64 56, !13, i64 64, !13, i64 72, !12, i64 80, !12, i64 84, !12, i64 88, !12, i64 92, !12, i64 96, !12, i64 100, !12, i64 104, !12, i64 108, !12, i64 112, !12, i64 116, !12, i64 120, !12, i64 124, !12, i64 128, !12, i64 132, !13, i64 136, !13, i64 144, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !13, i64 200, !13, i64 208, !13, i64 216, !12, i64 224, !12, i64 228, !12, i64 232, !13, i64 240, !13, i64 248, !13, i64 256, !13, i64 264, !13, i64 272, !13, i64 280, !13, i64 288, !13, i64 296, !13, i64 304, !12, i64 312, !12, i64 316, !12, i64 320, !12, i64 324, !12, i64 328, !12, i64 332, !12, i64 336, !12, i64 340, !13, i64 344, !13, i64 352, !13, i64 360, !13, i64 368, !12, i64 376, !12, i64 380, !12, i64 384, !12, i64 388, !12, i64 392, !12, i64 396, !12, i64 400, !12, i64 404, !12, i64 408, !12, i64 412, !6, i64 416, !6, i64 424, !6, i64 432, !6, i64 440, !6, i64 448, !6, i64 456, !6, i64 464, !6, i64 472, !6, i64 480, !6, i64 488, !6, i64 496, !6, i64 504, !6, i64 512, !6, i64 520, !6, i64 528, !6, i64 536, !6, i64 544, !6, i64 552, !6, i64 560, !6, i64 568, !6, i64 576, !6, i64 584, !6, i64 592, !6, i64 600, !6, i64 608, !6, i64 616, !6, i64 624, !6, i64 632, !6, i64 640, !6, i64 648, !6, i64 656, !6, i64 664, !6, i64 672, !6, i64 680, !6, i64 688}
!12 = !{!"int", !7, i64 0}
!13 = !{!"double", !7, i64 0}
!14 = !{!12, !12, i64 0}
!15 = !{!11, !12, i64 104}
!16 = !{!11, !6, i64 592}
!17 = !{!11, !6, i64 512}
!18 = !{!11, !6, i64 472}
!19 = !{!11, !6, i64 488}
!20 = !{!11, !6, i64 632}
!21 = !{!11, !6, i64 576}
!22 = !{!11, !6, i64 640}
!23 = !{!11, !6, i64 504}
!24 = !{!11, !6, i64 536}
!25 = !{!11, !6, i64 552}
!26 = !{!11, !6, i64 680}
!27 = !{!11, !6, i64 688}
!28 = !{!11, !6, i64 416}
!29 = !{!11, !6, i64 440}
!30 = !{!11, !6, i64 424}
!31 = !{!11, !6, i64 448}
!32 = !{!11, !6, i64 432}
!33 = !{!11, !6, i64 456}
!34 = !{!11, !6, i64 672}
!35 = !{!11, !12, i64 400}
!36 = !{!13, !13, i64 0}
!37 = distinct !{!37, !38}
!38 = !{!"llvm.loop.mustprogress"}
!39 = distinct !{!39, !38}
!40 = distinct !{!40, !38}
!41 = distinct !{!41, !38}
!42 = distinct !{!42, !38}
!43 = distinct !{!43, !38}
!44 = distinct !{!44, !38}
!45 = distinct !{!45, !38}
!46 = distinct !{!46, !38}
!47 = distinct !{!47, !38}
!48 = distinct !{!48, !38}
!49 = distinct !{!49, !38}


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

@.str = external hidden unnamed_addr constant [20 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [82 x i8], align 1
@__PRETTY_FUNCTION__.lu_solve_dense = external hidden unnamed_addr constant [65 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @lu_solve_dense(ptr noundef %0, ptr nocapture noundef readonly %1, ptr nocapture noundef %2, i8 noundef signext %3) local_unnamed_addr #0 {
  %5 = getelementptr inbounds i8, ptr %0, i64 84
  %6 = load i32, ptr %5, align 4, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %0, i64 104
  %8 = load i32, ptr %7, align 8, !tbaa !12
  %9 = getelementptr inbounds i8, ptr %0, i64 592
  %10 = load ptr, ptr %9, align 8, !tbaa !13
  %11 = getelementptr inbounds i8, ptr %0, i64 512
  %12 = load ptr, ptr %11, align 8, !tbaa !14
  %13 = getelementptr inbounds i8, ptr %0, i64 472
  %14 = load ptr, ptr %13, align 8, !tbaa !15
  %15 = getelementptr inbounds i8, ptr %0, i64 488
  %16 = load ptr, ptr %15, align 8, !tbaa !16
  %17 = getelementptr inbounds i8, ptr %0, i64 632
  %18 = load ptr, ptr %17, align 8, !tbaa !17
  %19 = getelementptr inbounds i8, ptr %0, i64 576
  %20 = load ptr, ptr %19, align 8, !tbaa !18
  %21 = getelementptr inbounds i8, ptr %0, i64 640
  %22 = load ptr, ptr %21, align 8, !tbaa !19
  %23 = getelementptr inbounds i8, ptr %0, i64 504
  %24 = load ptr, ptr %23, align 8, !tbaa !20
  %25 = getelementptr inbounds i8, ptr %0, i64 536
  %26 = load ptr, ptr %25, align 8, !tbaa !21
  %27 = getelementptr inbounds i8, ptr %0, i64 552
  %28 = load ptr, ptr %27, align 8, !tbaa !22
  %29 = getelementptr inbounds i8, ptr %0, i64 680
  %30 = load ptr, ptr %29, align 8, !tbaa !23
  %31 = getelementptr inbounds i8, ptr %0, i64 688
  %32 = load ptr, ptr %31, align 8, !tbaa !24
  %33 = getelementptr inbounds i8, ptr %0, i64 416
  %34 = load ptr, ptr %33, align 8, !tbaa !25
  %35 = getelementptr inbounds i8, ptr %0, i64 440
  %36 = load ptr, ptr %35, align 8, !tbaa !26
  %37 = getelementptr inbounds i8, ptr %0, i64 424
  %38 = load ptr, ptr %37, align 8, !tbaa !27
  %39 = getelementptr inbounds i8, ptr %0, i64 448
  %40 = load ptr, ptr %39, align 8, !tbaa !28
  %41 = getelementptr inbounds i8, ptr %0, i64 432
  %42 = load ptr, ptr %41, align 8, !tbaa !29
  %43 = getelementptr inbounds i8, ptr %0, i64 456
  %44 = load ptr, ptr %43, align 8, !tbaa !30
  %45 = getelementptr inbounds i8, ptr %0, i64 672
  %46 = load ptr, ptr %45, align 8, !tbaa !31
  tail call void @lu_garbage_perm(ptr noundef %0) #5
  %47 = getelementptr inbounds i8, ptr %0, i64 400
  %48 = load i32, ptr %47, align 8, !tbaa !32
  %49 = icmp eq i32 %48, %6
  br i1 %49, label %51, label %50

50:                                               ; preds = %4
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 38, ptr noundef nonnull @__PRETTY_FUNCTION__.lu_solve_dense) #6
  unreachable

51:                                               ; preds = %4
  %52 = and i8 %3, -33
  %or.cond = icmp eq i8 %52, 84
  %53 = sext i32 %6 to i64
  %54 = shl nsw i64 %53, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %46, ptr align 8 %1, i64 %54, i1 false)
  %55 = icmp sgt i32 %6, 0
  br i1 %or.cond, label %56, label %168

56:                                               ; preds = %51
  br i1 %55, label %.lr.ph204.preheader, label %.preheader170

.lr.ph204.preheader:                              ; preds = %56
  %wide.trip.count253 = zext nneg i32 %6 to i64
  br label %.lr.ph204

.preheader170:                                    ; preds = %._crit_edge201, %56
  %57 = icmp sgt i32 %8, 0
  br i1 %57, label %.lr.ph211.preheader, label %.preheader

.lr.ph211.preheader:                              ; preds = %.preheader170
  %58 = zext nneg i32 %8 to i64
  %.phi.trans.insert = getelementptr inbounds i32, ptr %24, i64 %58
  %.pre = load i32, ptr %.phi.trans.insert, align 4, !tbaa !33
  br label %.lr.ph211

.lr.ph204:                                        ; preds = %.lr.ph204.preheader, %._crit_edge201
  %indvars.iv250 = phi i64 [ 0, %.lr.ph204.preheader ], [ %indvars.iv.next251, %._crit_edge201 ]
  %59 = getelementptr inbounds i32, ptr %14, i64 %indvars.iv250
  %60 = load i32, ptr %59, align 4, !tbaa !33
  %61 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv250
  %62 = load i32, ptr %61, align 4, !tbaa !33
  %63 = sext i32 %60 to i64
  %64 = getelementptr inbounds double, ptr %46, i64 %63
  %65 = load double, ptr %64, align 8, !tbaa !34
  %66 = getelementptr inbounds double, ptr %30, i64 %63
  %67 = load double, ptr %66, align 8, !tbaa !34
  %68 = fdiv double %65, %67
  %69 = getelementptr inbounds i32, ptr %26, i64 %63
  %70 = load i32, ptr %69, align 4, !tbaa !33
  %71 = getelementptr inbounds i32, ptr %28, i64 %63
  %72 = load i32, ptr %71, align 4, !tbaa !33
  %73 = icmp slt i32 %70, %72
  br i1 %73, label %.lr.ph200, label %._crit_edge201

.lr.ph200:                                        ; preds = %.lr.ph204
  %74 = fneg double %68
  %75 = sext i32 %70 to i64
  %wide.trip.count248 = sext i32 %72 to i64
  %76 = sub nsw i64 %wide.trip.count248, %75
  %xtraiter278 = and i64 %76, 1
  %lcmp.mod279.not = icmp eq i64 %xtraiter278, 0
  br i1 %lcmp.mod279.not, label %.prol.loopexit, label %.prol.loopexit.unr-lcssa

.prol.loopexit.unr-lcssa:                         ; preds = %.lr.ph200
  %77 = getelementptr inbounds double, ptr %44, i64 %75
  %78 = load double, ptr %77, align 8, !tbaa !34
  %79 = getelementptr inbounds i32, ptr %42, i64 %75
  %80 = load i32, ptr %79, align 4, !tbaa !33
  %81 = sext i32 %80 to i64
  %82 = getelementptr inbounds double, ptr %46, i64 %81
  %83 = load double, ptr %82, align 8, !tbaa !34
  %84 = tail call double @llvm.fmuladd.f64(double %74, double %78, double %83)
  store double %84, ptr %82, align 8, !tbaa !34
  %indvars.iv.next246.prol = add nsw i64 %75, 1
  br label %.prol.loopexit

.prol.loopexit:                                   ; preds = %.prol.loopexit.unr-lcssa, %.lr.ph200
  %indvars.iv245.unr = phi i64 [ %75, %.lr.ph200 ], [ %indvars.iv.next246.prol, %.prol.loopexit.unr-lcssa ]
  %85 = add nsw i64 %wide.trip.count248, -1
  %86 = icmp eq i64 %85, %75
  br i1 %86, label %._crit_edge201, label %.lr.ph200.new

.lr.ph200.new:                                    ; preds = %.prol.loopexit, %.lr.ph200.new
  %indvars.iv245 = phi i64 [ %indvars.iv.next246.1, %.lr.ph200.new ], [ %indvars.iv245.unr, %.prol.loopexit ]
  %87 = getelementptr inbounds double, ptr %44, i64 %indvars.iv245
  %88 = load double, ptr %87, align 8, !tbaa !34
  %89 = getelementptr inbounds i32, ptr %42, i64 %indvars.iv245
  %90 = load i32, ptr %89, align 4, !tbaa !33
  %91 = sext i32 %90 to i64
  %92 = getelementptr inbounds double, ptr %46, i64 %91
  %93 = load double, ptr %92, align 8, !tbaa !34
  %94 = tail call double @llvm.fmuladd.f64(double %74, double %88, double %93)
  store double %94, ptr %92, align 8, !tbaa !34
  %indvars.iv.next246 = add nsw i64 %indvars.iv245, 1
  %95 = getelementptr inbounds double, ptr %44, i64 %indvars.iv.next246
  %96 = load double, ptr %95, align 8, !tbaa !34
  %97 = getelementptr inbounds i32, ptr %42, i64 %indvars.iv.next246
  %98 = load i32, ptr %97, align 4, !tbaa !33
  %99 = sext i32 %98 to i64
  %100 = getelementptr inbounds double, ptr %46, i64 %99
  %101 = load double, ptr %100, align 8, !tbaa !34
  %102 = tail call double @llvm.fmuladd.f64(double %74, double %96, double %101)
  store double %102, ptr %100, align 8, !tbaa !34
  %indvars.iv.next246.1 = add nsw i64 %indvars.iv245, 2
  %exitcond249.not.1 = icmp eq i64 %indvars.iv.next246.1, %wide.trip.count248
  br i1 %exitcond249.not.1, label %._crit_edge201, label %.lr.ph200.new, !llvm.loop !35

._crit_edge201:                                   ; preds = %.prol.loopexit, %.lr.ph200.new, %.lr.ph204
  %103 = sext i32 %62 to i64
  %104 = getelementptr inbounds double, ptr %2, i64 %103
  store double %68, ptr %104, align 8, !tbaa !34
  %indvars.iv.next251 = add nuw nsw i64 %indvars.iv250, 1
  %exitcond254.not = icmp eq i64 %indvars.iv.next251, %wide.trip.count253
  br i1 %exitcond254.not, label %.preheader170, label %.lr.ph204, !llvm.loop !37

.loopexit169:                                     ; preds = %.prol.loopexit282, %.lr.ph207.new, %.lr.ph211
  %105 = icmp sgt i64 %indvars.iv260, 1
  br i1 %105, label %.lr.ph211, label %.preheader, !llvm.loop !38

.preheader:                                       ; preds = %.loopexit169, %.preheader170
  br i1 %55, label %.lr.ph220.preheader, label %.loopexit

.lr.ph220.preheader:                              ; preds = %.preheader
  %106 = zext nneg i32 %6 to i64
  br label %.lr.ph220

.lr.ph211:                                        ; preds = %.lr.ph211.preheader, %.loopexit169
  %107 = phi i32 [ %.pre, %.lr.ph211.preheader ], [ %109, %.loopexit169 ]
  %indvars.iv260 = phi i64 [ %58, %.lr.ph211.preheader ], [ %indvars.iv.next261, %.loopexit169 ]
  %indvars.iv.next261 = add nsw i64 %indvars.iv260, -1
  %108 = getelementptr inbounds i32, ptr %24, i64 %indvars.iv.next261
  %109 = load i32, ptr %108, align 4, !tbaa !33
  %110 = icmp slt i32 %109, %107
  br i1 %110, label %.lr.ph207, label %.loopexit169

.lr.ph207:                                        ; preds = %.lr.ph211
  %111 = getelementptr inbounds i32, ptr %12, i64 %indvars.iv.next261
  %112 = load i32, ptr %111, align 4, !tbaa !33
  %113 = sext i32 %112 to i64
  %114 = getelementptr inbounds double, ptr %2, i64 %113
  %115 = load double, ptr %114, align 8, !tbaa !34
  %116 = fneg double %115
  %117 = sext i32 %109 to i64
  %wide.trip.count258 = sext i32 %107 to i64
  %118 = sub nsw i64 %wide.trip.count258, %117
  %xtraiter283 = and i64 %118, 1
  %lcmp.mod284.not = icmp eq i64 %xtraiter283, 0
  br i1 %lcmp.mod284.not, label %.prol.loopexit282, label %.prol.loopexit282.unr-lcssa

.prol.loopexit282.unr-lcssa:                      ; preds = %.lr.ph207
  %119 = getelementptr inbounds i32, ptr %34, i64 %117
  %120 = load i32, ptr %119, align 4, !tbaa !33
  %121 = getelementptr inbounds double, ptr %36, i64 %117
  %122 = load double, ptr %121, align 8, !tbaa !34
  %123 = sext i32 %120 to i64
  %124 = getelementptr inbounds double, ptr %2, i64 %123
  %125 = load double, ptr %124, align 8, !tbaa !34
  %126 = tail call double @llvm.fmuladd.f64(double %116, double %122, double %125)
  store double %126, ptr %124, align 8, !tbaa !34
  %indvars.iv.next256.prol = add nsw i64 %117, 1
  br label %.prol.loopexit282

.prol.loopexit282:                                ; preds = %.prol.loopexit282.unr-lcssa, %.lr.ph207
  %indvars.iv255.unr = phi i64 [ %117, %.lr.ph207 ], [ %indvars.iv.next256.prol, %.prol.loopexit282.unr-lcssa ]
  %127 = add nsw i64 %wide.trip.count258, -1
  %128 = icmp eq i64 %127, %117
  br i1 %128, label %.loopexit169, label %.lr.ph207.new

.lr.ph207.new:                                    ; preds = %.prol.loopexit282, %.lr.ph207.new
  %indvars.iv255 = phi i64 [ %indvars.iv.next256.1, %.lr.ph207.new ], [ %indvars.iv255.unr, %.prol.loopexit282 ]
  %129 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv255
  %130 = load i32, ptr %129, align 4, !tbaa !33
  %131 = getelementptr inbounds double, ptr %36, i64 %indvars.iv255
  %132 = load double, ptr %131, align 8, !tbaa !34
  %133 = sext i32 %130 to i64
  %134 = getelementptr inbounds double, ptr %2, i64 %133
  %135 = load double, ptr %134, align 8, !tbaa !34
  %136 = tail call double @llvm.fmuladd.f64(double %116, double %132, double %135)
  store double %136, ptr %134, align 8, !tbaa !34
  %indvars.iv.next256 = add nsw i64 %indvars.iv255, 1
  %137 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv.next256
  %138 = load i32, ptr %137, align 4, !tbaa !33
  %139 = getelementptr inbounds double, ptr %36, i64 %indvars.iv.next256
  %140 = load double, ptr %139, align 8, !tbaa !34
  %141 = sext i32 %138 to i64
  %142 = getelementptr inbounds double, ptr %2, i64 %141
  %143 = load double, ptr %142, align 8, !tbaa !34
  %144 = tail call double @llvm.fmuladd.f64(double %116, double %140, double %143)
  store double %144, ptr %142, align 8, !tbaa !34
  %indvars.iv.next256.1 = add nsw i64 %indvars.iv255, 2
  %exitcond259.not.1 = icmp eq i64 %indvars.iv.next256.1, %wide.trip.count258
  br i1 %exitcond259.not.1, label %.loopexit169, label %.lr.ph207.new, !llvm.loop !39

.lr.ph220:                                        ; preds = %.lr.ph220.preheader, %._crit_edge216
  %indvars.iv266 = phi i64 [ %106, %.lr.ph220.preheader ], [ %indvars.iv.next267, %._crit_edge216 ]
  %indvars.iv.next267 = add nsw i64 %indvars.iv266, -1
  %145 = getelementptr inbounds i32, ptr %18, i64 %indvars.iv.next267
  %146 = load i32, ptr %145, align 4, !tbaa !33
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds i32, ptr %34, i64 %147
  %149 = load i32, ptr %148, align 4, !tbaa !33
  %150 = icmp sgt i32 %149, -1
  br i1 %150, label %.lr.ph215, label %._crit_edge216

.lr.ph215:                                        ; preds = %.lr.ph220, %.lr.ph215
  %indvars.iv263 = phi i64 [ %indvars.iv.next264, %.lr.ph215 ], [ %147, %.lr.ph220 ]
  %151 = phi i32 [ %159, %.lr.ph215 ], [ %149, %.lr.ph220 ]
  %.0213 = phi double [ %157, %.lr.ph215 ], [ 0.000000e+00, %.lr.ph220 ]
  %152 = zext nneg i32 %151 to i64
  %153 = getelementptr inbounds double, ptr %2, i64 %152
  %154 = load double, ptr %153, align 8, !tbaa !34
  %155 = getelementptr inbounds double, ptr %36, i64 %indvars.iv263
  %156 = load double, ptr %155, align 8, !tbaa !34
  %157 = tail call double @llvm.fmuladd.f64(double %154, double %156, double %.0213)
  %indvars.iv.next264 = add nsw i64 %indvars.iv263, 1
  %158 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv.next264
  %159 = load i32, ptr %158, align 4, !tbaa !33
  %160 = icmp sgt i32 %159, -1
  br i1 %160, label %.lr.ph215, label %._crit_edge216, !llvm.loop !40

._crit_edge216:                                   ; preds = %.lr.ph215, %.lr.ph220
  %.0.lcssa = phi double [ 0.000000e+00, %.lr.ph220 ], [ %157, %.lr.ph215 ]
  %161 = getelementptr inbounds i32, ptr %10, i64 %indvars.iv.next267
  %162 = load i32, ptr %161, align 4, !tbaa !33
  %163 = sext i32 %162 to i64
  %164 = getelementptr inbounds double, ptr %2, i64 %163
  %165 = load double, ptr %164, align 8, !tbaa !34
  %166 = fsub double %165, %.0.lcssa
  store double %166, ptr %164, align 8, !tbaa !34
  %167 = icmp sgt i64 %indvars.iv266, 1
  br i1 %167, label %.lr.ph220, label %.loopexit, !llvm.loop !41

168:                                              ; preds = %51
  br i1 %55, label %.lr.ph177.preheader, label %._crit_edge178

.lr.ph177.preheader:                              ; preds = %168
  %wide.trip.count = zext nneg i32 %6 to i64
  br label %.lr.ph177

.lr.ph177:                                        ; preds = %.lr.ph177.preheader, %._crit_edge
  %indvars.iv226 = phi i64 [ 0, %.lr.ph177.preheader ], [ %indvars.iv.next227, %._crit_edge ]
  %169 = getelementptr inbounds i32, ptr %20, i64 %indvars.iv226
  %170 = load i32, ptr %169, align 4, !tbaa !33
  %171 = sext i32 %170 to i64
  %172 = getelementptr inbounds i32, ptr %34, i64 %171
  %173 = load i32, ptr %172, align 4, !tbaa !33
  %174 = icmp sgt i32 %173, -1
  br i1 %174, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.lr.ph177, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %171, %.lr.ph177 ]
  %175 = phi i32 [ %183, %.lr.ph ], [ %173, %.lr.ph177 ]
  %.1174 = phi double [ %181, %.lr.ph ], [ 0.000000e+00, %.lr.ph177 ]
  %176 = zext nneg i32 %175 to i64
  %177 = getelementptr inbounds double, ptr %46, i64 %176
  %178 = load double, ptr %177, align 8, !tbaa !34
  %179 = getelementptr inbounds double, ptr %36, i64 %indvars.iv
  %180 = load double, ptr %179, align 8, !tbaa !34
  %181 = tail call double @llvm.fmuladd.f64(double %178, double %180, double %.1174)
  %indvars.iv.next = add nsw i64 %indvars.iv, 1
  %182 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv.next
  %183 = load i32, ptr %182, align 4, !tbaa !33
  %184 = icmp sgt i32 %183, -1
  br i1 %184, label %.lr.ph, label %._crit_edge, !llvm.loop !42

._crit_edge:                                      ; preds = %.lr.ph, %.lr.ph177
  %.1.lcssa = phi double [ 0.000000e+00, %.lr.ph177 ], [ %181, %.lr.ph ]
  %185 = getelementptr inbounds i32, ptr %10, i64 %indvars.iv226
  %186 = load i32, ptr %185, align 4, !tbaa !33
  %187 = sext i32 %186 to i64
  %188 = getelementptr inbounds double, ptr %46, i64 %187
  %189 = load double, ptr %188, align 8, !tbaa !34
  %190 = fsub double %189, %.1.lcssa
  store double %190, ptr %188, align 8, !tbaa !34
  %indvars.iv.next227 = add nuw nsw i64 %indvars.iv226, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next227, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge178, label %.lr.ph177, !llvm.loop !43

._crit_edge178:                                   ; preds = %._crit_edge, %168
  %191 = icmp sgt i32 %8, 0
  br i1 %191, label %.lr.ph190.preheader, label %.preheader171

.lr.ph190.preheader:                              ; preds = %._crit_edge178
  %192 = load i32, ptr %24, align 4, !tbaa !33
  %wide.trip.count237 = zext nneg i32 %8 to i64
  br label %.lr.ph190

.preheader171:                                    ; preds = %._crit_edge183, %._crit_edge178
  br i1 %55, label %.lr.ph197.preheader, label %.loopexit

.lr.ph197.preheader:                              ; preds = %.preheader171
  %193 = zext nneg i32 %6 to i64
  br label %.lr.ph197

.lr.ph190:                                        ; preds = %.lr.ph190.preheader, %._crit_edge183
  %indvars.iv234 = phi i64 [ 0, %.lr.ph190.preheader ], [ %indvars.iv.next235, %._crit_edge183 ]
  %.4188 = phi i32 [ %192, %.lr.ph190.preheader ], [ %.5.lcssa, %._crit_edge183 ]
  %194 = getelementptr inbounds i32, ptr %12, i64 %indvars.iv234
  %195 = load i32, ptr %194, align 4, !tbaa !33
  %indvars.iv.next235 = add nuw nsw i64 %indvars.iv234, 1
  %196 = getelementptr inbounds i32, ptr %24, i64 %indvars.iv.next235
  %197 = load i32, ptr %196, align 4, !tbaa !33
  %198 = icmp slt i32 %.4188, %197
  br i1 %198, label %.lr.ph182.preheader, label %._crit_edge183

.lr.ph182.preheader:                              ; preds = %.lr.ph190
  %199 = sext i32 %.4188 to i64
  %wide.trip.count232 = sext i32 %197 to i64
  %200 = sub nsw i64 %wide.trip.count232, %199
  %xtraiter = and i64 %200, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph182.prol.loopexit, label %.lr.ph182.prol

.lr.ph182.prol:                                   ; preds = %.lr.ph182.preheader, %.lr.ph182.prol
  %indvars.iv229.prol = phi i64 [ %indvars.iv.next230.prol, %.lr.ph182.prol ], [ %199, %.lr.ph182.preheader ]
  %.2180.prol = phi double [ %208, %.lr.ph182.prol ], [ 0.000000e+00, %.lr.ph182.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph182.prol ], [ 0, %.lr.ph182.preheader ]
  %201 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv229.prol
  %202 = load i32, ptr %201, align 4, !tbaa !33
  %203 = sext i32 %202 to i64
  %204 = getelementptr inbounds double, ptr %46, i64 %203
  %205 = load double, ptr %204, align 8, !tbaa !34
  %206 = getelementptr inbounds double, ptr %36, i64 %indvars.iv229.prol
  %207 = load double, ptr %206, align 8, !tbaa !34
  %208 = tail call double @llvm.fmuladd.f64(double %205, double %207, double %.2180.prol)
  %indvars.iv.next230.prol = add nsw i64 %indvars.iv229.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 %.lr.ph182.prol.loopexit, label %.lr.ph182.prol, !llvm.loop !44

.lr.ph182.prol.loopexit:                          ; preds = %.lr.ph182.prol, %.lr.ph182.preheader
  %.lcssa276.unr = phi double [ poison, %.lr.ph182.preheader ], [ %208, %.lr.ph182.prol ]
  %indvars.iv229.unr = phi i64 [ %199, %.lr.ph182.preheader ], [ %indvars.iv.next230.prol, %.lr.ph182.prol ]
  %.2180.unr = phi double [ 0.000000e+00, %.lr.ph182.preheader ], [ %208, %.lr.ph182.prol ]
  %209 = sub nsw i64 %199, %wide.trip.count232
  %210 = icmp ugt i64 %209, -4
  br i1 %210, label %._crit_edge183, label %.lr.ph182

.lr.ph182:                                        ; preds = %.lr.ph182.prol.loopexit, %.lr.ph182
  %indvars.iv229 = phi i64 [ %indvars.iv.next230.3, %.lr.ph182 ], [ %indvars.iv229.unr, %.lr.ph182.prol.loopexit ]
  %.2180 = phi double [ %242, %.lr.ph182 ], [ %.2180.unr, %.lr.ph182.prol.loopexit ]
  %211 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv229
  %212 = load i32, ptr %211, align 4, !tbaa !33
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds double, ptr %46, i64 %213
  %215 = load double, ptr %214, align 8, !tbaa !34
  %216 = getelementptr inbounds double, ptr %36, i64 %indvars.iv229
  %217 = load double, ptr %216, align 8, !tbaa !34
  %218 = tail call double @llvm.fmuladd.f64(double %215, double %217, double %.2180)
  %indvars.iv.next230 = add nsw i64 %indvars.iv229, 1
  %219 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv.next230
  %220 = load i32, ptr %219, align 4, !tbaa !33
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds double, ptr %46, i64 %221
  %223 = load double, ptr %222, align 8, !tbaa !34
  %224 = getelementptr inbounds double, ptr %36, i64 %indvars.iv.next230
  %225 = load double, ptr %224, align 8, !tbaa !34
  %226 = tail call double @llvm.fmuladd.f64(double %223, double %225, double %218)
  %indvars.iv.next230.1 = add nsw i64 %indvars.iv229, 2
  %227 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv.next230.1
  %228 = load i32, ptr %227, align 4, !tbaa !33
  %229 = sext i32 %228 to i64
  %230 = getelementptr inbounds double, ptr %46, i64 %229
  %231 = load double, ptr %230, align 8, !tbaa !34
  %232 = getelementptr inbounds double, ptr %36, i64 %indvars.iv.next230.1
  %233 = load double, ptr %232, align 8, !tbaa !34
  %234 = tail call double @llvm.fmuladd.f64(double %231, double %233, double %226)
  %indvars.iv.next230.2 = add nsw i64 %indvars.iv229, 3
  %235 = getelementptr inbounds i32, ptr %34, i64 %indvars.iv.next230.2
  %236 = load i32, ptr %235, align 4, !tbaa !33
  %237 = sext i32 %236 to i64
  %238 = getelementptr inbounds double, ptr %46, i64 %237
  %239 = load double, ptr %238, align 8, !tbaa !34
  %240 = getelementptr inbounds double, ptr %36, i64 %indvars.iv.next230.2
  %241 = load double, ptr %240, align 8, !tbaa !34
  %242 = tail call double @llvm.fmuladd.f64(double %239, double %241, double %234)
  %indvars.iv.next230.3 = add nsw i64 %indvars.iv229, 4
  %exitcond233.not.3 = icmp eq i64 %indvars.iv.next230.3, %wide.trip.count232
  br i1 %exitcond233.not.3, label %._crit_edge183, label %.lr.ph182, !llvm.loop !46

._crit_edge183:                                   ; preds = %.lr.ph182.prol.loopexit, %.lr.ph182, %.lr.ph190
  %.5.lcssa = phi i32 [ %.4188, %.lr.ph190 ], [ %197, %.lr.ph182 ], [ %197, %.lr.ph182.prol.loopexit ]
  %.2.lcssa = phi double [ 0.000000e+00, %.lr.ph190 ], [ %.lcssa276.unr, %.lr.ph182.prol.loopexit ], [ %242, %.lr.ph182 ]
  %243 = sext i32 %195 to i64
  %244 = getelementptr inbounds double, ptr %46, i64 %243
  %245 = load double, ptr %244, align 8, !tbaa !34
  %246 = fsub double %245, %.2.lcssa
  store double %246, ptr %244, align 8, !tbaa !34
  %exitcond238.not = icmp eq i64 %indvars.iv.next235, %wide.trip.count237
  br i1 %exitcond238.not, label %.preheader171, label %.lr.ph190, !llvm.loop !47

.lr.ph197:                                        ; preds = %.lr.ph197.preheader, %._crit_edge194
  %indvars.iv242 = phi i64 [ %193, %.lr.ph197.preheader ], [ %indvars.iv.next243, %._crit_edge194 ]
  %indvars.iv.next243 = add nsw i64 %indvars.iv242, -1
  %247 = getelementptr inbounds i32, ptr %14, i64 %indvars.iv.next243
  %248 = load i32, ptr %247, align 4, !tbaa !33
  %249 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv.next243
  %250 = load i32, ptr %249, align 4, !tbaa !33
  %251 = sext i32 %250 to i64
  %252 = getelementptr inbounds double, ptr %46, i64 %251
  %253 = load double, ptr %252, align 8, !tbaa !34
  %254 = getelementptr inbounds double, ptr %32, i64 %251
  %255 = load double, ptr %254, align 8, !tbaa !34
  %256 = fdiv double %253, %255
  %257 = getelementptr inbounds i32, ptr %22, i64 %251
  %258 = load i32, ptr %257, align 4, !tbaa !33
  %259 = sext i32 %258 to i64
  %260 = getelementptr inbounds i32, ptr %38, i64 %259
  %261 = load i32, ptr %260, align 4, !tbaa !33
  %262 = icmp sgt i32 %261, -1
  br i1 %262, label %.lr.ph193, label %._crit_edge194

.lr.ph193:                                        ; preds = %.lr.ph197
  %263 = fneg double %256
  br label %264

264:                                              ; preds = %.lr.ph193, %264
  %indvars.iv239 = phi i64 [ %259, %.lr.ph193 ], [ %indvars.iv.next240, %264 ]
  %265 = phi i32 [ %261, %.lr.ph193 ], [ %273, %264 ]
  %266 = getelementptr inbounds double, ptr %40, i64 %indvars.iv239
  %267 = load double, ptr %266, align 8, !tbaa !34
  %268 = zext nneg i32 %265 to i64
  %269 = getelementptr inbounds double, ptr %46, i64 %268
  %270 = load double, ptr %269, align 8, !tbaa !34
  %271 = tail call double @llvm.fmuladd.f64(double %263, double %267, double %270)
  store double %271, ptr %269, align 8, !tbaa !34
  %indvars.iv.next240 = add nsw i64 %indvars.iv239, 1
  %272 = getelementptr inbounds i32, ptr %38, i64 %indvars.iv.next240
  %273 = load i32, ptr %272, align 4, !tbaa !33
  %274 = icmp sgt i32 %273, -1
  br i1 %274, label %264, label %._crit_edge194, !llvm.loop !48

._crit_edge194:                                   ; preds = %264, %.lr.ph197
  %275 = sext i32 %248 to i64
  %276 = getelementptr inbounds double, ptr %2, i64 %275
  store double %256, ptr %276, align 8, !tbaa !34
  %277 = icmp sgt i64 %indvars.iv242, 1
  br i1 %277, label %.lr.ph197, label %.loopexit, !llvm.loop !49

.loopexit:                                        ; preds = %._crit_edge194, %._crit_edge216, %.preheader171, %.preheader
  ret void
}

declare void @lu_garbage_perm(ptr noundef) local_unnamed_addr #1

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

; 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 double @llvm.fmuladd.f64(double, double, double) #4

attributes #0 = { 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 #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 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind }
attributes #6 = { noreturn 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, !7, i64 84}
!6 = !{!"lu", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !7, i64 40, !7, i64 44, !7, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !7, i64 80, !7, i64 84, !7, i64 88, !7, i64 92, !7, i64 96, !7, i64 100, !7, i64 104, !7, i64 108, !7, i64 112, !7, i64 116, !7, i64 120, !7, i64 124, !7, i64 128, !7, i64 132, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !7, i64 224, !7, i64 228, !7, i64 232, !10, i64 240, !10, i64 248, !10, i64 256, !10, i64 264, !10, i64 272, !10, i64 280, !10, i64 288, !10, i64 296, !10, i64 304, !7, i64 312, !7, i64 316, !7, i64 320, !7, i64 324, !7, i64 328, !7, i64 332, !7, i64 336, !7, i64 340, !10, i64 344, !10, i64 352, !10, i64 360, !10, i64 368, !7, i64 376, !7, i64 380, !7, i64 384, !7, i64 388, !7, i64 392, !7, i64 396, !7, i64 400, !7, i64 404, !7, i64 408, !7, i64 412, !11, i64 416, !11, i64 424, !11, i64 432, !11, i64 440, !11, i64 448, !11, i64 456, !11, i64 464, !11, i64 472, !11, i64 480, !11, i64 488, !11, i64 496, !11, i64 504, !11, i64 512, !11, i64 520, !11, i64 528, !11, i64 536, !11, i64 544, !11, i64 552, !11, i64 560, !11, i64 568, !11, i64 576, !11, i64 584, !11, i64 592, !11, i64 600, !11, i64 608, !11, i64 616, !11, i64 624, !11, i64 632, !11, i64 640, !11, i64 648, !11, i64 656, !11, i64 664, !11, i64 672, !11, i64 680, !11, i64 688}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"double", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!6, !7, i64 104}
!13 = !{!6, !11, i64 592}
!14 = !{!6, !11, i64 512}
!15 = !{!6, !11, i64 472}
!16 = !{!6, !11, i64 488}
!17 = !{!6, !11, i64 632}
!18 = !{!6, !11, i64 576}
!19 = !{!6, !11, i64 640}
!20 = !{!6, !11, i64 504}
!21 = !{!6, !11, i64 536}
!22 = !{!6, !11, i64 552}
!23 = !{!6, !11, i64 680}
!24 = !{!6, !11, i64 688}
!25 = !{!6, !11, i64 416}
!26 = !{!6, !11, i64 440}
!27 = !{!6, !11, i64 424}
!28 = !{!6, !11, i64 448}
!29 = !{!6, !11, i64 432}
!30 = !{!6, !11, i64 456}
!31 = !{!6, !11, i64 672}
!32 = !{!6, !7, i64 400}
!33 = !{!7, !7, i64 0}
!34 = !{!10, !10, i64 0}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}
!37 = distinct !{!37, !36}
!38 = distinct !{!38, !36}
!39 = distinct !{!39, !36}
!40 = distinct !{!40, !36}
!41 = distinct !{!41, !36}
!42 = distinct !{!42, !36}
!43 = distinct !{!43, !36}
!44 = distinct !{!44, !45}
!45 = !{!"llvm.loop.unroll.disable"}
!46 = distinct !{!46, !36}
!47 = distinct !{!47, !36}
!48 = distinct !{!48, !36}
!49 = distinct !{!49, !36}


; Effective O3 passes: BDCEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass