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

; 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 [19 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [84 x i8], align 1
@__PRETTY_FUNCTION__.lu_residual_test = external hidden unnamed_addr constant [99 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [20 x i8], align 1

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

85:                                               ; preds = %5
  br label %87

86:                                               ; preds = %5
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 46, ptr noundef @__PRETTY_FUNCTION__.lu_residual_test) #6
  unreachable

87:                                               ; preds = %85
  store i32 0, ptr %27, align 4, !tbaa !13
  br label %88

88:                                               ; preds = %146, %87
  %89 = load i32, ptr %27, align 4, !tbaa !13
  %90 = load i32, ptr %11, align 4, !tbaa !13
  %91 = icmp slt i32 %89, %90
  br i1 %91, label %92, label %149

92:                                               ; preds = %88
  store double 0.000000e+00, ptr %35, align 8, !tbaa !29
  %93 = load ptr, ptr %17, align 8, !tbaa !5
  %94 = load i32, ptr %27, align 4, !tbaa !13
  %95 = sext i32 %94 to i64
  %96 = getelementptr inbounds i32, ptr %93, i64 %95
  %97 = load i32, ptr %96, align 4, !tbaa !13
  store i32 %97, ptr %30, align 4, !tbaa !13
  br label %98

98:                                               ; preds = %118, %92
  %99 = load ptr, ptr %20, align 8, !tbaa !5
  %100 = load i32, ptr %30, align 4, !tbaa !13
  %101 = sext i32 %100 to i64
  %102 = getelementptr inbounds i32, ptr %99, i64 %101
  %103 = load i32, ptr %102, align 4, !tbaa !13
  store i32 %103, ptr %26, align 4, !tbaa !13
  %104 = icmp sge i32 %103, 0
  br i1 %104, label %105, label %121

105:                                              ; preds = %98
  %106 = load ptr, ptr %25, align 8, !tbaa !5
  %107 = load i32, ptr %26, align 4, !tbaa !13
  %108 = sext i32 %107 to i64
  %109 = getelementptr inbounds double, ptr %106, i64 %108
  %110 = load double, ptr %109, align 8, !tbaa !29
  %111 = load ptr, ptr %21, align 8, !tbaa !5
  %112 = load i32, ptr %30, align 4, !tbaa !13
  %113 = sext i32 %112 to i64
  %114 = getelementptr inbounds double, ptr %111, i64 %113
  %115 = load double, ptr %114, align 8, !tbaa !29
  %116 = load double, ptr %35, align 8, !tbaa !29
  %117 = call double @llvm.fmuladd.f64(double %110, double %115, double %116)
  store double %117, ptr %35, align 8, !tbaa !29
  br label %118

118:                                              ; preds = %105
  %119 = load i32, ptr %30, align 4, !tbaa !13
  %120 = add nsw i32 %119, 1
  store i32 %120, ptr %30, align 4, !tbaa !13
  br label %98, !llvm.loop !30

121:                                              ; preds = %98
  %122 = load ptr, ptr %13, align 8, !tbaa !5
  %123 = load i32, ptr %27, align 4, !tbaa !13
  %124 = sext i32 %123 to i64
  %125 = getelementptr inbounds i32, ptr %122, i64 %124
  %126 = load i32, ptr %125, align 4, !tbaa !13
  store i32 %126, ptr %28, align 4, !tbaa !13
  %127 = load double, ptr %35, align 8, !tbaa !29
  %128 = fcmp ole double %127, 0.000000e+00
  %129 = zext i1 %128 to i64
  %130 = select i1 %128, double 1.000000e+00, double -1.000000e+00
  %131 = load ptr, ptr %24, align 8, !tbaa !5
  %132 = load i32, ptr %28, align 4, !tbaa !13
  %133 = sext i32 %132 to i64
  %134 = getelementptr inbounds double, ptr %131, i64 %133
  store double %130, ptr %134, align 8, !tbaa !29
  %135 = load ptr, ptr %24, align 8, !tbaa !5
  %136 = load i32, ptr %28, align 4, !tbaa !13
  %137 = sext i32 %136 to i64
  %138 = getelementptr inbounds double, ptr %135, i64 %137
  %139 = load double, ptr %138, align 8, !tbaa !29
  %140 = load double, ptr %35, align 8, !tbaa !29
  %141 = fsub double %139, %140
  %142 = load ptr, ptr %25, align 8, !tbaa !5
  %143 = load i32, ptr %28, align 4, !tbaa !13
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds double, ptr %142, i64 %144
  store double %141, ptr %145, align 8, !tbaa !29
  br label %146

146:                                              ; preds = %121
  %147 = load i32, ptr %27, align 4, !tbaa !13
  %148 = add nsw i32 %147, 1
  store i32 %148, ptr %27, align 4, !tbaa !13
  br label %88, !llvm.loop !32

149:                                              ; preds = %88
  %150 = load i32, ptr %11, align 4, !tbaa !13
  %151 = sub nsw i32 %150, 1
  store i32 %151, ptr %27, align 4, !tbaa !13
  br label %152

152:                                              ; preds = %202, %149
  %153 = load i32, ptr %27, align 4, !tbaa !13
  %154 = icmp sge i32 %153, 0
  br i1 %154, label %155, label %205

155:                                              ; preds = %152
  %156 = load ptr, ptr %15, align 8, !tbaa !5
  %157 = load i32, ptr %27, align 4, !tbaa !13
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds i32, ptr %156, i64 %158
  %160 = load i32, ptr %159, align 4, !tbaa !13
  store i32 %160, ptr %28, align 4, !tbaa !13
  %161 = load ptr, ptr %19, align 8, !tbaa !5
  %162 = load i32, ptr %28, align 4, !tbaa !13
  %163 = sext i32 %162 to i64
  %164 = getelementptr inbounds double, ptr %161, i64 %163
  %165 = load double, ptr %164, align 8, !tbaa !29
  %166 = load ptr, ptr %25, align 8, !tbaa !5
  %167 = load i32, ptr %28, align 4, !tbaa !13
  %168 = sext i32 %167 to i64
  %169 = getelementptr inbounds double, ptr %166, i64 %168
  %170 = load double, ptr %169, align 8, !tbaa !29
  %171 = fdiv double %170, %165
  store double %171, ptr %169, align 8, !tbaa !29
  store double %171, ptr %35, align 8, !tbaa !29
  %172 = load ptr, ptr %18, align 8, !tbaa !5
  %173 = load i32, ptr %28, align 4, !tbaa !13
  %174 = sext i32 %173 to i64
  %175 = getelementptr inbounds i32, ptr %172, i64 %174
  %176 = load i32, ptr %175, align 4, !tbaa !13
  store i32 %176, ptr %30, align 4, !tbaa !13
  br label %177

177:                                              ; preds = %198, %155
  %178 = load ptr, ptr %22, align 8, !tbaa !5
  %179 = load i32, ptr %30, align 4, !tbaa !13
  %180 = sext i32 %179 to i64
  %181 = getelementptr inbounds i32, ptr %178, i64 %180
  %182 = load i32, ptr %181, align 4, !tbaa !13
  store i32 %182, ptr %26, align 4, !tbaa !13
  %183 = icmp sge i32 %182, 0
  br i1 %183, label %184, label %201

184:                                              ; preds = %177
  %185 = load double, ptr %35, align 8, !tbaa !29
  %186 = load ptr, ptr %23, align 8, !tbaa !5
  %187 = load i32, ptr %30, align 4, !tbaa !13
  %188 = sext i32 %187 to i64
  %189 = getelementptr inbounds double, ptr %186, i64 %188
  %190 = load double, ptr %189, align 8, !tbaa !29
  %191 = load ptr, ptr %25, align 8, !tbaa !5
  %192 = load i32, ptr %26, align 4, !tbaa !13
  %193 = sext i32 %192 to i64
  %194 = getelementptr inbounds double, ptr %191, i64 %193
  %195 = load double, ptr %194, align 8, !tbaa !29
  %196 = fneg double %185
  %197 = call double @llvm.fmuladd.f64(double %196, double %190, double %195)
  store double %197, ptr %194, align 8, !tbaa !29
  br label %198

198:                                              ; preds = %184
  %199 = load i32, ptr %30, align 4, !tbaa !13
  %200 = add nsw i32 %199, 1
  store i32 %200, ptr %30, align 4, !tbaa !13
  br label %177, !llvm.loop !33

201:                                              ; preds = %177
  br label %202

202:                                              ; preds = %201
  %203 = load i32, ptr %27, align 4, !tbaa !13
  %204 = add nsw i32 %203, -1
  store i32 %204, ptr %27, align 4, !tbaa !13
  br label %152, !llvm.loop !34

205:                                              ; preds = %152
  store i32 0, ptr %27, align 4, !tbaa !13
  br label %206

206:                                              ; preds = %261, %205
  %207 = load i32, ptr %27, align 4, !tbaa !13
  %208 = load i32, ptr %12, align 4, !tbaa !13
  %209 = icmp slt i32 %207, %208
  br i1 %209, label %210, label %264

210:                                              ; preds = %206
  %211 = load ptr, ptr %15, align 8, !tbaa !5
  %212 = load i32, ptr %27, align 4, !tbaa !13
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds i32, ptr %211, i64 %213
  %215 = load i32, ptr %214, align 4, !tbaa !13
  store i32 %215, ptr %28, align 4, !tbaa !13
  %216 = load ptr, ptr %14, align 8, !tbaa !5
  %217 = load i32, ptr %27, align 4, !tbaa !13
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds i32, ptr %216, i64 %218
  %220 = load i32, ptr %219, align 4, !tbaa !13
  store i32 %220, ptr %29, align 4, !tbaa !13
  %221 = load ptr, ptr %25, align 8, !tbaa !5
  %222 = load i32, ptr %28, align 4, !tbaa !13
  %223 = sext i32 %222 to i64
  %224 = getelementptr inbounds double, ptr %221, i64 %223
  %225 = load double, ptr %224, align 8, !tbaa !29
  store double %225, ptr %35, align 8, !tbaa !29
  %226 = load ptr, ptr %7, align 8, !tbaa !5
  %227 = load i32, ptr %29, align 4, !tbaa !13
  %228 = sext i32 %227 to i64
  %229 = getelementptr inbounds i32, ptr %226, i64 %228
  %230 = load i32, ptr %229, align 4, !tbaa !13
  store i32 %230, ptr %30, align 4, !tbaa !13
  br label %231

231:                                              ; preds = %257, %210
  %232 = load i32, ptr %30, align 4, !tbaa !13
  %233 = load ptr, ptr %8, align 8, !tbaa !5
  %234 = load i32, ptr %29, align 4, !tbaa !13
  %235 = sext i32 %234 to i64
  %236 = getelementptr inbounds i32, ptr %233, i64 %235
  %237 = load i32, ptr %236, align 4, !tbaa !13
  %238 = icmp slt i32 %232, %237
  br i1 %238, label %239, label %260

239:                                              ; preds = %231
  %240 = load double, ptr %35, align 8, !tbaa !29
  %241 = load ptr, ptr %10, align 8, !tbaa !5
  %242 = load i32, ptr %30, align 4, !tbaa !13
  %243 = sext i32 %242 to i64
  %244 = getelementptr inbounds double, ptr %241, i64 %243
  %245 = load double, ptr %244, align 8, !tbaa !29
  %246 = load ptr, ptr %24, align 8, !tbaa !5
  %247 = load ptr, ptr %9, align 8, !tbaa !5
  %248 = load i32, ptr %30, align 4, !tbaa !13
  %249 = sext i32 %248 to i64
  %250 = getelementptr inbounds i32, ptr %247, i64 %249
  %251 = load i32, ptr %250, align 4, !tbaa !13
  %252 = sext i32 %251 to i64
  %253 = getelementptr inbounds double, ptr %246, i64 %252
  %254 = load double, ptr %253, align 8, !tbaa !29
  %255 = fneg double %240
  %256 = call double @llvm.fmuladd.f64(double %255, double %245, double %254)
  store double %256, ptr %253, align 8, !tbaa !29
  br label %257

257:                                              ; preds = %239
  %258 = load i32, ptr %30, align 4, !tbaa !13
  %259 = add nsw i32 %258, 1
  store i32 %259, ptr %30, align 4, !tbaa !13
  br label %231, !llvm.loop !35

260:                                              ; preds = %231
  br label %261

261:                                              ; preds = %260
  %262 = load i32, ptr %27, align 4, !tbaa !13
  %263 = add nsw i32 %262, 1
  store i32 %263, ptr %27, align 4, !tbaa !13
  br label %206, !llvm.loop !36

264:                                              ; preds = %206
  %265 = load i32, ptr %12, align 4, !tbaa !13
  store i32 %265, ptr %27, align 4, !tbaa !13
  br label %266

266:                                              ; preds = %287, %264
  %267 = load i32, ptr %27, align 4, !tbaa !13
  %268 = load i32, ptr %11, align 4, !tbaa !13
  %269 = icmp slt i32 %267, %268
  br i1 %269, label %270, label %290

270:                                              ; preds = %266
  %271 = load ptr, ptr %15, align 8, !tbaa !5
  %272 = load i32, ptr %27, align 4, !tbaa !13
  %273 = sext i32 %272 to i64
  %274 = getelementptr inbounds i32, ptr %271, i64 %273
  %275 = load i32, ptr %274, align 4, !tbaa !13
  store i32 %275, ptr %28, align 4, !tbaa !13
  %276 = load ptr, ptr %25, align 8, !tbaa !5
  %277 = load i32, ptr %28, align 4, !tbaa !13
  %278 = sext i32 %277 to i64
  %279 = getelementptr inbounds double, ptr %276, i64 %278
  %280 = load double, ptr %279, align 8, !tbaa !29
  %281 = load ptr, ptr %24, align 8, !tbaa !5
  %282 = load i32, ptr %28, align 4, !tbaa !13
  %283 = sext i32 %282 to i64
  %284 = getelementptr inbounds double, ptr %281, i64 %283
  %285 = load double, ptr %284, align 8, !tbaa !29
  %286 = fsub double %285, %280
  store double %286, ptr %284, align 8, !tbaa !29
  br label %287

287:                                              ; preds = %270
  %288 = load i32, ptr %27, align 4, !tbaa !13
  %289 = add nsw i32 %288, 1
  store i32 %289, ptr %27, align 4, !tbaa !13
  br label %266, !llvm.loop !37

290:                                              ; preds = %266
  %291 = load i32, ptr %11, align 4, !tbaa !13
  %292 = load ptr, ptr %25, align 8, !tbaa !5
  %293 = call double @lu_onenorm(i32 noundef %291, ptr noundef %292)
  store double %293, ptr %31, align 8, !tbaa !29
  %294 = load i32, ptr %11, align 4, !tbaa !13
  %295 = load ptr, ptr %24, align 8, !tbaa !5
  %296 = call double @lu_onenorm(i32 noundef %294, ptr noundef %295)
  store double %296, ptr %32, align 8, !tbaa !29
  store i32 0, ptr %27, align 4, !tbaa !13
  br label %297

297:                                              ; preds = %361, %290
  %298 = load i32, ptr %27, align 4, !tbaa !13
  %299 = load i32, ptr %11, align 4, !tbaa !13
  %300 = icmp slt i32 %298, %299
  br i1 %300, label %301, label %364

301:                                              ; preds = %297
  %302 = load ptr, ptr %15, align 8, !tbaa !5
  %303 = load i32, ptr %27, align 4, !tbaa !13
  %304 = sext i32 %303 to i64
  %305 = getelementptr inbounds i32, ptr %302, i64 %304
  %306 = load i32, ptr %305, align 4, !tbaa !13
  store i32 %306, ptr %28, align 4, !tbaa !13
  store double 0.000000e+00, ptr %35, align 8, !tbaa !29
  %307 = load ptr, ptr %18, align 8, !tbaa !5
  %308 = load i32, ptr %28, align 4, !tbaa !13
  %309 = sext i32 %308 to i64
  %310 = getelementptr inbounds i32, ptr %307, i64 %309
  %311 = load i32, ptr %310, align 4, !tbaa !13
  store i32 %311, ptr %30, align 4, !tbaa !13
  br label %312

312:                                              ; preds = %332, %301
  %313 = load ptr, ptr %22, align 8, !tbaa !5
  %314 = load i32, ptr %30, align 4, !tbaa !13
  %315 = sext i32 %314 to i64
  %316 = getelementptr inbounds i32, ptr %313, i64 %315
  %317 = load i32, ptr %316, align 4, !tbaa !13
  store i32 %317, ptr %26, align 4, !tbaa !13
  %318 = icmp sge i32 %317, 0
  br i1 %318, label %319, label %335

319:                                              ; preds = %312
  %320 = load ptr, ptr %25, align 8, !tbaa !5
  %321 = load i32, ptr %26, align 4, !tbaa !13
  %322 = sext i32 %321 to i64
  %323 = getelementptr inbounds double, ptr %320, i64 %322
  %324 = load double, ptr %323, align 8, !tbaa !29
  %325 = load ptr, ptr %23, align 8, !tbaa !5
  %326 = load i32, ptr %30, align 4, !tbaa !13
  %327 = sext i32 %326 to i64
  %328 = getelementptr inbounds double, ptr %325, i64 %327
  %329 = load double, ptr %328, align 8, !tbaa !29
  %330 = load double, ptr %35, align 8, !tbaa !29
  %331 = call double @llvm.fmuladd.f64(double %324, double %329, double %330)
  store double %331, ptr %35, align 8, !tbaa !29
  br label %332

332:                                              ; preds = %319
  %333 = load i32, ptr %30, align 4, !tbaa !13
  %334 = add nsw i32 %333, 1
  store i32 %334, ptr %30, align 4, !tbaa !13
  br label %312, !llvm.loop !38

335:                                              ; preds = %312
  %336 = load double, ptr %35, align 8, !tbaa !29
  %337 = fcmp ole double %336, 0.000000e+00
  %338 = zext i1 %337 to i64
  %339 = select i1 %337, double 1.000000e+00, double -1.000000e+00
  %340 = load ptr, ptr %24, align 8, !tbaa !5
  %341 = load i32, ptr %28, align 4, !tbaa !13
  %342 = sext i32 %341 to i64
  %343 = getelementptr inbounds double, ptr %340, i64 %342
  store double %339, ptr %343, align 8, !tbaa !29
  %344 = load ptr, ptr %24, align 8, !tbaa !5
  %345 = load i32, ptr %28, align 4, !tbaa !13
  %346 = sext i32 %345 to i64
  %347 = getelementptr inbounds double, ptr %344, i64 %346
  %348 = load double, ptr %347, align 8, !tbaa !29
  %349 = load double, ptr %35, align 8, !tbaa !29
  %350 = fsub double %348, %349
  %351 = load ptr, ptr %19, align 8, !tbaa !5
  %352 = load i32, ptr %28, align 4, !tbaa !13
  %353 = sext i32 %352 to i64
  %354 = getelementptr inbounds double, ptr %351, i64 %353
  %355 = load double, ptr %354, align 8, !tbaa !29
  %356 = fdiv double %350, %355
  %357 = load ptr, ptr %25, align 8, !tbaa !5
  %358 = load i32, ptr %28, align 4, !tbaa !13
  %359 = sext i32 %358 to i64
  %360 = getelementptr inbounds double, ptr %357, i64 %359
  store double %356, ptr %360, align 8, !tbaa !29
  br label %361

361:                                              ; preds = %335
  %362 = load i32, ptr %27, align 4, !tbaa !13
  %363 = add nsw i32 %362, 1
  store i32 %363, ptr %27, align 4, !tbaa !13
  br label %297, !llvm.loop !39

364:                                              ; preds = %297
  %365 = load i32, ptr %11, align 4, !tbaa !13
  %366 = sub nsw i32 %365, 1
  store i32 %366, ptr %27, align 4, !tbaa !13
  br label %367

367:                                              ; preds = %411, %364
  %368 = load i32, ptr %27, align 4, !tbaa !13
  %369 = icmp sge i32 %368, 0
  br i1 %369, label %370, label %414

370:                                              ; preds = %367
  store double 0.000000e+00, ptr %35, align 8, !tbaa !29
  %371 = load ptr, ptr %16, align 8, !tbaa !5
  %372 = load i32, ptr %27, align 4, !tbaa !13
  %373 = sext i32 %372 to i64
  %374 = getelementptr inbounds i32, ptr %371, i64 %373
  %375 = load i32, ptr %374, align 4, !tbaa !13
  store i32 %375, ptr %30, align 4, !tbaa !13
  br label %376

376:                                              ; preds = %396, %370
  %377 = load ptr, ptr %20, align 8, !tbaa !5
  %378 = load i32, ptr %30, align 4, !tbaa !13
  %379 = sext i32 %378 to i64
  %380 = getelementptr inbounds i32, ptr %377, i64 %379
  %381 = load i32, ptr %380, align 4, !tbaa !13
  store i32 %381, ptr %26, align 4, !tbaa !13
  %382 = icmp sge i32 %381, 0
  br i1 %382, label %383, label %399

383:                                              ; preds = %376
  %384 = load ptr, ptr %25, align 8, !tbaa !5
  %385 = load i32, ptr %26, align 4, !tbaa !13
  %386 = sext i32 %385 to i64
  %387 = getelementptr inbounds double, ptr %384, i64 %386
  %388 = load double, ptr %387, align 8, !tbaa !29
  %389 = load ptr, ptr %21, align 8, !tbaa !5
  %390 = load i32, ptr %30, align 4, !tbaa !13
  %391 = sext i32 %390 to i64
  %392 = getelementptr inbounds double, ptr %389, i64 %391
  %393 = load double, ptr %392, align 8, !tbaa !29
  %394 = load double, ptr %35, align 8, !tbaa !29
  %395 = call double @llvm.fmuladd.f64(double %388, double %393, double %394)
  store double %395, ptr %35, align 8, !tbaa !29
  br label %396

396:                                              ; preds = %383
  %397 = load i32, ptr %30, align 4, !tbaa !13
  %398 = add nsw i32 %397, 1
  store i32 %398, ptr %30, align 4, !tbaa !13
  br label %376, !llvm.loop !40

399:                                              ; preds = %376
  %400 = load double, ptr %35, align 8, !tbaa !29
  %401 = load ptr, ptr %25, align 8, !tbaa !5
  %402 = load ptr, ptr %13, align 8, !tbaa !5
  %403 = load i32, ptr %27, align 4, !tbaa !13
  %404 = sext i32 %403 to i64
  %405 = getelementptr inbounds i32, ptr %402, i64 %404
  %406 = load i32, ptr %405, align 4, !tbaa !13
  %407 = sext i32 %406 to i64
  %408 = getelementptr inbounds double, ptr %401, i64 %407
  %409 = load double, ptr %408, align 8, !tbaa !29
  %410 = fsub double %409, %400
  store double %410, ptr %408, align 8, !tbaa !29
  br label %411

411:                                              ; preds = %399
  %412 = load i32, ptr %27, align 4, !tbaa !13
  %413 = add nsw i32 %412, -1
  store i32 %413, ptr %27, align 4, !tbaa !13
  br label %367, !llvm.loop !41

414:                                              ; preds = %367
  store i32 0, ptr %27, align 4, !tbaa !13
  br label %415

415:                                              ; preds = %471, %414
  %416 = load i32, ptr %27, align 4, !tbaa !13
  %417 = load i32, ptr %12, align 4, !tbaa !13
  %418 = icmp slt i32 %416, %417
  br i1 %418, label %419, label %474

419:                                              ; preds = %415
  %420 = load ptr, ptr %15, align 8, !tbaa !5
  %421 = load i32, ptr %27, align 4, !tbaa !13
  %422 = sext i32 %421 to i64
  %423 = getelementptr inbounds i32, ptr %420, i64 %422
  %424 = load i32, ptr %423, align 4, !tbaa !13
  store i32 %424, ptr %28, align 4, !tbaa !13
  %425 = load ptr, ptr %14, align 8, !tbaa !5
  %426 = load i32, ptr %27, align 4, !tbaa !13
  %427 = sext i32 %426 to i64
  %428 = getelementptr inbounds i32, ptr %425, i64 %427
  %429 = load i32, ptr %428, align 4, !tbaa !13
  store i32 %429, ptr %29, align 4, !tbaa !13
  store double 0.000000e+00, ptr %35, align 8, !tbaa !29
  %430 = load ptr, ptr %7, align 8, !tbaa !5
  %431 = load i32, ptr %29, align 4, !tbaa !13
  %432 = sext i32 %431 to i64
  %433 = getelementptr inbounds i32, ptr %430, i64 %432
  %434 = load i32, ptr %433, align 4, !tbaa !13
  store i32 %434, ptr %30, align 4, !tbaa !13
  br label %435

435:                                              ; preds = %460, %419
  %436 = load i32, ptr %30, align 4, !tbaa !13
  %437 = load ptr, ptr %8, align 8, !tbaa !5
  %438 = load i32, ptr %29, align 4, !tbaa !13
  %439 = sext i32 %438 to i64
  %440 = getelementptr inbounds i32, ptr %437, i64 %439
  %441 = load i32, ptr %440, align 4, !tbaa !13
  %442 = icmp slt i32 %436, %441
  br i1 %442, label %443, label %463

443:                                              ; preds = %435
  %444 = load ptr, ptr %25, align 8, !tbaa !5
  %445 = load ptr, ptr %9, align 8, !tbaa !5
  %446 = load i32, ptr %30, align 4, !tbaa !13
  %447 = sext i32 %446 to i64
  %448 = getelementptr inbounds i32, ptr %445, i64 %447
  %449 = load i32, ptr %448, align 4, !tbaa !13
  %450 = sext i32 %449 to i64
  %451 = getelementptr inbounds double, ptr %444, i64 %450
  %452 = load double, ptr %451, align 8, !tbaa !29
  %453 = load ptr, ptr %10, align 8, !tbaa !5
  %454 = load i32, ptr %30, align 4, !tbaa !13
  %455 = sext i32 %454 to i64
  %456 = getelementptr inbounds double, ptr %453, i64 %455
  %457 = load double, ptr %456, align 8, !tbaa !29
  %458 = load double, ptr %35, align 8, !tbaa !29
  %459 = call double @llvm.fmuladd.f64(double %452, double %457, double %458)
  store double %459, ptr %35, align 8, !tbaa !29
  br label %460

460:                                              ; preds = %443
  %461 = load i32, ptr %30, align 4, !tbaa !13
  %462 = add nsw i32 %461, 1
  store i32 %462, ptr %30, align 4, !tbaa !13
  br label %435, !llvm.loop !42

463:                                              ; preds = %435
  %464 = load double, ptr %35, align 8, !tbaa !29
  %465 = load ptr, ptr %24, align 8, !tbaa !5
  %466 = load i32, ptr %28, align 4, !tbaa !13
  %467 = sext i32 %466 to i64
  %468 = getelementptr inbounds double, ptr %465, i64 %467
  %469 = load double, ptr %468, align 8, !tbaa !29
  %470 = fsub double %469, %464
  store double %470, ptr %468, align 8, !tbaa !29
  br label %471

471:                                              ; preds = %463
  %472 = load i32, ptr %27, align 4, !tbaa !13
  %473 = add nsw i32 %472, 1
  store i32 %473, ptr %27, align 4, !tbaa !13
  br label %415, !llvm.loop !43

474:                                              ; preds = %415
  %475 = load i32, ptr %12, align 4, !tbaa !13
  store i32 %475, ptr %27, align 4, !tbaa !13
  br label %476

476:                                              ; preds = %497, %474
  %477 = load i32, ptr %27, align 4, !tbaa !13
  %478 = load i32, ptr %11, align 4, !tbaa !13
  %479 = icmp slt i32 %477, %478
  br i1 %479, label %480, label %500

480:                                              ; preds = %476
  %481 = load ptr, ptr %15, align 8, !tbaa !5
  %482 = load i32, ptr %27, align 4, !tbaa !13
  %483 = sext i32 %482 to i64
  %484 = getelementptr inbounds i32, ptr %481, i64 %483
  %485 = load i32, ptr %484, align 4, !tbaa !13
  store i32 %485, ptr %28, align 4, !tbaa !13
  %486 = load ptr, ptr %25, align 8, !tbaa !5
  %487 = load i32, ptr %28, align 4, !tbaa !13
  %488 = sext i32 %487 to i64
  %489 = getelementptr inbounds double, ptr %486, i64 %488
  %490 = load double, ptr %489, align 8, !tbaa !29
  %491 = load ptr, ptr %24, align 8, !tbaa !5
  %492 = load i32, ptr %28, align 4, !tbaa !13
  %493 = sext i32 %492 to i64
  %494 = getelementptr inbounds double, ptr %491, i64 %493
  %495 = load double, ptr %494, align 8, !tbaa !29
  %496 = fsub double %495, %490
  store double %496, ptr %494, align 8, !tbaa !29
  br label %497

497:                                              ; preds = %480
  %498 = load i32, ptr %27, align 4, !tbaa !13
  %499 = add nsw i32 %498, 1
  store i32 %499, ptr %27, align 4, !tbaa !13
  br label %476, !llvm.loop !44

500:                                              ; preds = %476
  %501 = load i32, ptr %11, align 4, !tbaa !13
  %502 = load ptr, ptr %25, align 8, !tbaa !5
  %503 = call double @lu_onenorm(i32 noundef %501, ptr noundef %502)
  store double %503, ptr %33, align 8, !tbaa !29
  %504 = load i32, ptr %11, align 4, !tbaa !13
  %505 = load ptr, ptr %24, align 8, !tbaa !5
  %506 = call double @lu_onenorm(i32 noundef %504, ptr noundef %505)
  store double %506, ptr %34, align 8, !tbaa !29
  %507 = load ptr, ptr %6, align 8, !tbaa !5
  %508 = load ptr, ptr %7, align 8, !tbaa !5
  %509 = load ptr, ptr %8, align 8, !tbaa !5
  %510 = load ptr, ptr %9, align 8, !tbaa !5
  %511 = load ptr, ptr %10, align 8, !tbaa !5
  call void @lu_matrix_norm(ptr noundef %507, ptr noundef %508, ptr noundef %509, ptr noundef %510, ptr noundef %511)
  %512 = load ptr, ptr %6, align 8, !tbaa !5
  %513 = getelementptr inbounds %struct.lu, ptr %512, i32 0, i32 46
  %514 = load double, ptr %513, align 8, !tbaa !45
  %515 = fcmp ogt double %514, 0.000000e+00
  br i1 %515, label %516, label %517

516:                                              ; preds = %500
  br label %518

517:                                              ; preds = %500
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str.1, i32 noundef 148, ptr noundef @__PRETTY_FUNCTION__.lu_residual_test) #6
  unreachable

518:                                              ; preds = %516
  %519 = load ptr, ptr %6, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.lu, ptr %519, i32 0, i32 47
  %521 = load double, ptr %520, align 8, !tbaa !46
  %522 = fcmp ogt double %521, 0.000000e+00
  br i1 %522, label %523, label %524

523:                                              ; preds = %518
  br label %525

524:                                              ; preds = %518
  call void @__assert_fail(ptr noundef @.str.3, ptr noundef @.str.1, i32 noundef 149, ptr noundef @__PRETTY_FUNCTION__.lu_residual_test) #6
  unreachable

525:                                              ; preds = %523
  %526 = load double, ptr %32, align 8, !tbaa !29
  %527 = load i32, ptr %11, align 4, !tbaa !13
  %528 = sitofp i32 %527 to double
  %529 = load ptr, ptr %6, align 8, !tbaa !5
  %530 = getelementptr inbounds %struct.lu, ptr %529, i32 0, i32 46
  %531 = load double, ptr %530, align 8, !tbaa !45
  %532 = load double, ptr %31, align 8, !tbaa !29
  %533 = call double @llvm.fmuladd.f64(double %531, double %532, double %528)
  %534 = fdiv double %526, %533
  %535 = load double, ptr %34, align 8, !tbaa !29
  %536 = load i32, ptr %11, align 4, !tbaa !13
  %537 = sitofp i32 %536 to double
  %538 = load ptr, ptr %6, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.lu, ptr %538, i32 0, i32 47
  %540 = load double, ptr %539, align 8, !tbaa !46
  %541 = load double, ptr %33, align 8, !tbaa !29
  %542 = call double @llvm.fmuladd.f64(double %540, double %541, double %537)
  %543 = fdiv double %535, %542
  %544 = call double @llvm.maxnum.f64(double %534, double %543)
  %545 = load ptr, ptr %6, align 8, !tbaa !5
  %546 = getelementptr inbounds %struct.lu, ptr %545, i32 0, i32 48
  store double %544, ptr %546, align 8, !tbaa !47
  store i32 0, ptr %26, align 4, !tbaa !13
  br label %547

547:                                              ; preds = %556, %525
  %548 = load i32, ptr %26, align 4, !tbaa !13
  %549 = load i32, ptr %11, align 4, !tbaa !13
  %550 = icmp slt i32 %548, %549
  br i1 %550, label %551, label %559

551:                                              ; preds = %547
  %552 = load ptr, ptr %24, align 8, !tbaa !5
  %553 = load i32, ptr %26, align 4, !tbaa !13
  %554 = sext i32 %553 to i64
  %555 = getelementptr inbounds double, ptr %552, i64 %554
  store double 0.000000e+00, ptr %555, align 8, !tbaa !29
  br label %556

556:                                              ; preds = %551
  %557 = load i32, ptr %26, align 4, !tbaa !13
  %558 = add nsw i32 %557, 1
  store i32 %558, ptr %26, align 4, !tbaa !13
  br label %547, !llvm.loop !48

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

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

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

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

; Function Attrs: nounwind uwtable
declare hidden double @lu_onenorm(i32 noundef, ptr noundef) #0

declare void @lu_matrix_norm(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

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

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


; 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 [19 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [84 x i8], align 1
@__PRETTY_FUNCTION__.lu_residual_test = external hidden unnamed_addr constant [99 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [20 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @lu_residual_test(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4) local_unnamed_addr #0 {
  %6 = getelementptr inbounds i8, ptr %0, i64 84
  %7 = load i32, ptr %6, align 4, !tbaa !5
  %8 = getelementptr inbounds i8, ptr %0, i64 316
  %9 = load i32, ptr %8, align 4, !tbaa !12
  %10 = getelementptr inbounds i8, ptr %0, i64 592
  %11 = load ptr, ptr %10, align 8, !tbaa !13
  %12 = getelementptr inbounds i8, ptr %0, i64 472
  %13 = load ptr, ptr %12, align 8, !tbaa !14
  %14 = getelementptr inbounds i8, ptr %0, i64 488
  %15 = load ptr, ptr %14, align 8, !tbaa !15
  %16 = getelementptr inbounds i8, ptr %0, i64 632
  %17 = load ptr, ptr %16, align 8, !tbaa !16
  %18 = getelementptr inbounds i8, ptr %0, i64 576
  %19 = load ptr, ptr %18, align 8, !tbaa !17
  %20 = getelementptr inbounds i8, ptr %0, i64 640
  %21 = load ptr, ptr %20, align 8, !tbaa !18
  %22 = getelementptr inbounds i8, ptr %0, i64 688
  %23 = load ptr, ptr %22, align 8, !tbaa !19
  %24 = getelementptr inbounds i8, ptr %0, i64 416
  %25 = load ptr, ptr %24, align 8, !tbaa !20
  %26 = getelementptr inbounds i8, ptr %0, i64 440
  %27 = load ptr, ptr %26, align 8, !tbaa !21
  %28 = getelementptr inbounds i8, ptr %0, i64 424
  %29 = load ptr, ptr %28, align 8, !tbaa !22
  %30 = getelementptr inbounds i8, ptr %0, i64 448
  %31 = load ptr, ptr %30, align 8, !tbaa !23
  %32 = getelementptr inbounds i8, ptr %0, i64 664
  %33 = load ptr, ptr %32, align 8, !tbaa !24
  %34 = getelementptr inbounds i8, ptr %0, i64 672
  %35 = load ptr, ptr %34, align 8, !tbaa !25
  %36 = getelementptr inbounds i8, ptr %0, i64 100
  %37 = load i32, ptr %36, align 4, !tbaa !26
  %38 = icmp eq i32 %37, 0
  br i1 %38, label %.preheader214, label %41

.preheader214:                                    ; preds = %5
  %39 = icmp sgt i32 %7, 0
  br i1 %39, label %.lr.ph218.preheader, label %._crit_edge219.thread

._crit_edge219.thread:                            ; preds = %.preheader214
  %40 = add i32 %7, -1
  br label %.preheader213

.lr.ph218.preheader:                              ; preds = %.preheader214
  %wide.trip.count = zext nneg i32 %7 to i64
  br label %.lr.ph218

41:                                               ; preds = %5
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 46, ptr noundef nonnull @__PRETTY_FUNCTION__.lu_residual_test) #5
  unreachable

.lr.ph218:                                        ; preds = %.lr.ph218.preheader, %._crit_edge
  %indvars.iv272 = phi i64 [ 0, %.lr.ph218.preheader ], [ %indvars.iv.next273, %._crit_edge ]
  %42 = getelementptr inbounds i32, ptr %19, i64 %indvars.iv272
  %43 = load i32, ptr %42, align 4, !tbaa !27
  %44 = sext i32 %43 to i64
  %45 = getelementptr inbounds i32, ptr %25, i64 %44
  %46 = load i32, ptr %45, align 4, !tbaa !27
  %47 = icmp sgt i32 %46, -1
  br i1 %47, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.lr.ph218, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %44, %.lr.ph218 ]
  %48 = phi i32 [ %56, %.lr.ph ], [ %46, %.lr.ph218 ]
  %.0216 = phi double [ %54, %.lr.ph ], [ 0.000000e+00, %.lr.ph218 ]
  %49 = zext nneg i32 %48 to i64
  %50 = getelementptr inbounds double, ptr %35, i64 %49
  %51 = load double, ptr %50, align 8, !tbaa !28
  %52 = getelementptr inbounds double, ptr %27, i64 %indvars.iv
  %53 = load double, ptr %52, align 8, !tbaa !28
  %54 = tail call double @llvm.fmuladd.f64(double %51, double %53, double %.0216)
  %indvars.iv.next = add nsw i64 %indvars.iv, 1
  %55 = getelementptr inbounds i32, ptr %25, i64 %indvars.iv.next
  %56 = load i32, ptr %55, align 4, !tbaa !27
  %57 = icmp sgt i32 %56, -1
  br i1 %57, label %.lr.ph, label %._crit_edge, !llvm.loop !29

._crit_edge:                                      ; preds = %.lr.ph, %.lr.ph218
  %.0.lcssa = phi double [ 0.000000e+00, %.lr.ph218 ], [ %54, %.lr.ph ]
  %58 = getelementptr inbounds i32, ptr %11, i64 %indvars.iv272
  %59 = load i32, ptr %58, align 4, !tbaa !27
  %60 = fcmp ole double %.0.lcssa, 0.000000e+00
  %61 = select i1 %60, double 1.000000e+00, double -1.000000e+00
  %62 = sext i32 %59 to i64
  %63 = getelementptr inbounds double, ptr %33, i64 %62
  store double %61, ptr %63, align 8, !tbaa !28
  %64 = fsub double %61, %.0.lcssa
  %65 = getelementptr inbounds double, ptr %35, i64 %62
  store double %64, ptr %65, align 8, !tbaa !28
  %indvars.iv.next273 = add nuw nsw i64 %indvars.iv272, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next273, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge219, label %.lr.ph218, !llvm.loop !31

._crit_edge219:                                   ; preds = %._crit_edge
  %66 = add nsw i32 %7, -1
  br i1 %39, label %.lr.ph226.preheader, label %.preheader213

.lr.ph226.preheader:                              ; preds = %._crit_edge219
  %67 = zext nneg i32 %66 to i64
  br label %.lr.ph226

.preheader213:                                    ; preds = %._crit_edge223, %._crit_edge219.thread, %._crit_edge219
  %68 = phi i32 [ %40, %._crit_edge219.thread ], [ %66, %._crit_edge219 ], [ %66, %._crit_edge223 ]
  %69 = icmp sgt i32 %9, 0
  br i1 %69, label %.lr.ph232.preheader, label %.preheader212

.lr.ph232.preheader:                              ; preds = %.preheader213
  %wide.trip.count289 = zext nneg i32 %9 to i64
  br label %.lr.ph232

.lr.ph226:                                        ; preds = %.lr.ph226.preheader, %._crit_edge223
  %indvars.iv278 = phi i64 [ %67, %.lr.ph226.preheader ], [ %indvars.iv.next279, %._crit_edge223 ]
  %70 = getelementptr inbounds i32, ptr %15, i64 %indvars.iv278
  %71 = load i32, ptr %70, align 4, !tbaa !27
  %72 = sext i32 %71 to i64
  %73 = getelementptr inbounds double, ptr %23, i64 %72
  %74 = load double, ptr %73, align 8, !tbaa !28
  %75 = getelementptr inbounds double, ptr %35, i64 %72
  %76 = load double, ptr %75, align 8, !tbaa !28
  %77 = fdiv double %76, %74
  store double %77, ptr %75, align 8, !tbaa !28
  %78 = getelementptr inbounds i32, ptr %21, i64 %72
  %79 = load i32, ptr %78, align 4, !tbaa !27
  %80 = sext i32 %79 to i64
  %81 = getelementptr inbounds i32, ptr %29, i64 %80
  %82 = load i32, ptr %81, align 4, !tbaa !27
  %83 = icmp sgt i32 %82, -1
  br i1 %83, label %.lr.ph222, label %._crit_edge223

.lr.ph222:                                        ; preds = %.lr.ph226
  %84 = fneg double %77
  br label %85

85:                                               ; preds = %.lr.ph222, %85
  %indvars.iv275 = phi i64 [ %80, %.lr.ph222 ], [ %indvars.iv.next276, %85 ]
  %86 = phi i32 [ %82, %.lr.ph222 ], [ %94, %85 ]
  %87 = getelementptr inbounds double, ptr %31, i64 %indvars.iv275
  %88 = load double, ptr %87, align 8, !tbaa !28
  %89 = zext nneg i32 %86 to i64
  %90 = getelementptr inbounds double, ptr %35, i64 %89
  %91 = load double, ptr %90, align 8, !tbaa !28
  %92 = tail call double @llvm.fmuladd.f64(double %84, double %88, double %91)
  store double %92, ptr %90, align 8, !tbaa !28
  %indvars.iv.next276 = add nsw i64 %indvars.iv275, 1
  %93 = getelementptr inbounds i32, ptr %29, i64 %indvars.iv.next276
  %94 = load i32, ptr %93, align 4, !tbaa !27
  %95 = icmp sgt i32 %94, -1
  br i1 %95, label %85, label %._crit_edge223, !llvm.loop !32

._crit_edge223:                                   ; preds = %85, %.lr.ph226
  %indvars.iv.next279 = add nsw i64 %indvars.iv278, -1
  %96 = icmp sgt i64 %indvars.iv278, 0
  br i1 %96, label %.lr.ph226, label %.preheader213, !llvm.loop !33

.preheader212:                                    ; preds = %._crit_edge230, %.preheader213
  %97 = icmp slt i32 %9, %7
  br i1 %97, label %.lr.ph234.preheader, label %._crit_edge235

.lr.ph234.preheader:                              ; preds = %.preheader212
  %98 = sext i32 %9 to i64
  %wide.trip.count294 = sext i32 %7 to i64
  %99 = sub nsw i64 %wide.trip.count294, %98
  %xtraiter337 = and i64 %99, 1
  %lcmp.mod338.not = icmp eq i64 %xtraiter337, 0
  br i1 %lcmp.mod338.not, label %.lr.ph234.prol.loopexit, label %.lr.ph234.prol

.lr.ph234.prol:                                   ; preds = %.lr.ph234.preheader
  %100 = getelementptr inbounds i32, ptr %15, i64 %98
  %101 = load i32, ptr %100, align 4, !tbaa !27
  %102 = sext i32 %101 to i64
  %103 = getelementptr inbounds double, ptr %35, i64 %102
  %104 = load double, ptr %103, align 8, !tbaa !28
  %105 = getelementptr inbounds double, ptr %33, i64 %102
  %106 = load double, ptr %105, align 8, !tbaa !28
  %107 = fsub double %106, %104
  store double %107, ptr %105, align 8, !tbaa !28
  %indvars.iv.next292.prol = add nsw i64 %98, 1
  br label %.lr.ph234.prol.loopexit

.lr.ph234.prol.loopexit:                          ; preds = %.lr.ph234.prol, %.lr.ph234.preheader
  %indvars.iv291.unr = phi i64 [ %98, %.lr.ph234.preheader ], [ %indvars.iv.next292.prol, %.lr.ph234.prol ]
  %108 = add nsw i64 %wide.trip.count294, -1
  %109 = icmp eq i64 %108, %98
  br i1 %109, label %._crit_edge235, label %.lr.ph234.preheader.new

.lr.ph234.preheader.new:                          ; preds = %.lr.ph234.prol.loopexit
  %invariant.gep = getelementptr i8, ptr %15, i64 4
  br label %.lr.ph234

.lr.ph232:                                        ; preds = %.lr.ph232.preheader, %._crit_edge230
  %indvars.iv286 = phi i64 [ 0, %.lr.ph232.preheader ], [ %indvars.iv.next287, %._crit_edge230 ]
  %110 = getelementptr inbounds i32, ptr %13, i64 %indvars.iv286
  %111 = load i32, ptr %110, align 4, !tbaa !27
  %112 = sext i32 %111 to i64
  %113 = getelementptr inbounds i32, ptr %1, i64 %112
  %114 = load i32, ptr %113, align 4, !tbaa !27
  %115 = getelementptr inbounds i32, ptr %2, i64 %112
  %116 = load i32, ptr %115, align 4, !tbaa !27
  %117 = icmp slt i32 %114, %116
  br i1 %117, label %.lr.ph229, label %._crit_edge230

.lr.ph229:                                        ; preds = %.lr.ph232
  %118 = getelementptr inbounds i32, ptr %15, i64 %indvars.iv286
  %119 = load i32, ptr %118, align 4, !tbaa !27
  %120 = sext i32 %119 to i64
  %121 = getelementptr inbounds double, ptr %35, i64 %120
  %122 = load double, ptr %121, align 8, !tbaa !28
  %123 = fneg double %122
  %124 = sext i32 %114 to i64
  %wide.trip.count284 = sext i32 %116 to i64
  %125 = sub nsw i64 %wide.trip.count284, %124
  %xtraiter = and i64 %125, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.prol.loopexit, label %.prol.loopexit.unr-lcssa

.prol.loopexit.unr-lcssa:                         ; preds = %.lr.ph229
  %126 = getelementptr inbounds double, ptr %4, i64 %124
  %127 = load double, ptr %126, align 8, !tbaa !28
  %128 = getelementptr inbounds i32, ptr %3, i64 %124
  %129 = load i32, ptr %128, align 4, !tbaa !27
  %130 = sext i32 %129 to i64
  %131 = getelementptr inbounds double, ptr %33, i64 %130
  %132 = load double, ptr %131, align 8, !tbaa !28
  %133 = tail call double @llvm.fmuladd.f64(double %123, double %127, double %132)
  store double %133, ptr %131, align 8, !tbaa !28
  %indvars.iv.next282.prol = add nsw i64 %124, 1
  br label %.prol.loopexit

.prol.loopexit:                                   ; preds = %.prol.loopexit.unr-lcssa, %.lr.ph229
  %indvars.iv281.unr = phi i64 [ %124, %.lr.ph229 ], [ %indvars.iv.next282.prol, %.prol.loopexit.unr-lcssa ]
  %134 = add nsw i64 %wide.trip.count284, -1
  %135 = icmp eq i64 %134, %124
  br i1 %135, label %._crit_edge230, label %.lr.ph229.new

.lr.ph229.new:                                    ; preds = %.prol.loopexit, %.lr.ph229.new
  %indvars.iv281 = phi i64 [ %indvars.iv.next282.1, %.lr.ph229.new ], [ %indvars.iv281.unr, %.prol.loopexit ]
  %136 = getelementptr inbounds double, ptr %4, i64 %indvars.iv281
  %137 = load double, ptr %136, align 8, !tbaa !28
  %138 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv281
  %139 = load i32, ptr %138, align 4, !tbaa !27
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds double, ptr %33, i64 %140
  %142 = load double, ptr %141, align 8, !tbaa !28
  %143 = tail call double @llvm.fmuladd.f64(double %123, double %137, double %142)
  store double %143, ptr %141, align 8, !tbaa !28
  %indvars.iv.next282 = add nsw i64 %indvars.iv281, 1
  %144 = getelementptr inbounds double, ptr %4, i64 %indvars.iv.next282
  %145 = load double, ptr %144, align 8, !tbaa !28
  %146 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv.next282
  %147 = load i32, ptr %146, align 4, !tbaa !27
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds double, ptr %33, i64 %148
  %150 = load double, ptr %149, align 8, !tbaa !28
  %151 = tail call double @llvm.fmuladd.f64(double %123, double %145, double %150)
  store double %151, ptr %149, align 8, !tbaa !28
  %indvars.iv.next282.1 = add nsw i64 %indvars.iv281, 2
  %exitcond285.not.1 = icmp eq i64 %indvars.iv.next282.1, %wide.trip.count284
  br i1 %exitcond285.not.1, label %._crit_edge230, label %.lr.ph229.new, !llvm.loop !34

._crit_edge230:                                   ; preds = %.prol.loopexit, %.lr.ph229.new, %.lr.ph232
  %indvars.iv.next287 = add nuw nsw i64 %indvars.iv286, 1
  %exitcond290.not = icmp eq i64 %indvars.iv.next287, %wide.trip.count289
  br i1 %exitcond290.not, label %.preheader212, label %.lr.ph232, !llvm.loop !35

.lr.ph234:                                        ; preds = %.lr.ph234, %.lr.ph234.preheader.new
  %indvars.iv291 = phi i64 [ %indvars.iv291.unr, %.lr.ph234.preheader.new ], [ %indvars.iv.next292.1, %.lr.ph234 ]
  %152 = getelementptr inbounds i32, ptr %15, i64 %indvars.iv291
  %153 = load i32, ptr %152, align 4, !tbaa !27
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds double, ptr %35, i64 %154
  %156 = load double, ptr %155, align 8, !tbaa !28
  %157 = getelementptr inbounds double, ptr %33, i64 %154
  %158 = load double, ptr %157, align 8, !tbaa !28
  %159 = fsub double %158, %156
  store double %159, ptr %157, align 8, !tbaa !28
  %gep = getelementptr i32, ptr %invariant.gep, i64 %indvars.iv291
  %160 = load i32, ptr %gep, align 4, !tbaa !27
  %161 = sext i32 %160 to i64
  %162 = getelementptr inbounds double, ptr %35, i64 %161
  %163 = load double, ptr %162, align 8, !tbaa !28
  %164 = getelementptr inbounds double, ptr %33, i64 %161
  %165 = load double, ptr %164, align 8, !tbaa !28
  %166 = fsub double %165, %163
  store double %166, ptr %164, align 8, !tbaa !28
  %indvars.iv.next292.1 = add nsw i64 %indvars.iv291, 2
  %exitcond295.not.1 = icmp eq i64 %indvars.iv.next292.1, %wide.trip.count294
  br i1 %exitcond295.not.1, label %._crit_edge235, label %.lr.ph234, !llvm.loop !36

._crit_edge235:                                   ; preds = %.lr.ph234.prol.loopexit, %.lr.ph234, %.preheader212
  %167 = tail call double @lu_onenorm(i32 noundef %7, ptr noundef %35)
  %168 = tail call double @lu_onenorm(i32 noundef %7, ptr noundef %33)
  br i1 %39, label %.lr.ph244.preheader, label %.preheader210

.lr.ph244.preheader:                              ; preds = %._crit_edge235
  %wide.trip.count302 = zext nneg i32 %7 to i64
  br label %.lr.ph244

.preheader211:                                    ; preds = %._crit_edge240
  br i1 %39, label %.lr.ph252.preheader, label %.preheader210

.lr.ph252.preheader:                              ; preds = %.preheader211
  %169 = zext i32 %68 to i64
  br label %.lr.ph252

.lr.ph244:                                        ; preds = %.lr.ph244.preheader, %._crit_edge240
  %indvars.iv299 = phi i64 [ 0, %.lr.ph244.preheader ], [ %indvars.iv.next300, %._crit_edge240 ]
  %170 = getelementptr inbounds i32, ptr %15, i64 %indvars.iv299
  %171 = load i32, ptr %170, align 4, !tbaa !27
  %172 = sext i32 %171 to i64
  %173 = getelementptr inbounds i32, ptr %21, i64 %172
  %174 = load i32, ptr %173, align 4, !tbaa !27
  %175 = sext i32 %174 to i64
  %176 = getelementptr inbounds i32, ptr %29, i64 %175
  %177 = load i32, ptr %176, align 4, !tbaa !27
  %178 = icmp sgt i32 %177, -1
  br i1 %178, label %.lr.ph239, label %._crit_edge240

.lr.ph239:                                        ; preds = %.lr.ph244, %.lr.ph239
  %indvars.iv296 = phi i64 [ %indvars.iv.next297, %.lr.ph239 ], [ %175, %.lr.ph244 ]
  %179 = phi i32 [ %187, %.lr.ph239 ], [ %177, %.lr.ph244 ]
  %.1237 = phi double [ %185, %.lr.ph239 ], [ 0.000000e+00, %.lr.ph244 ]
  %180 = zext nneg i32 %179 to i64
  %181 = getelementptr inbounds double, ptr %35, i64 %180
  %182 = load double, ptr %181, align 8, !tbaa !28
  %183 = getelementptr inbounds double, ptr %31, i64 %indvars.iv296
  %184 = load double, ptr %183, align 8, !tbaa !28
  %185 = tail call double @llvm.fmuladd.f64(double %182, double %184, double %.1237)
  %indvars.iv.next297 = add nsw i64 %indvars.iv296, 1
  %186 = getelementptr inbounds i32, ptr %29, i64 %indvars.iv.next297
  %187 = load i32, ptr %186, align 4, !tbaa !27
  %188 = icmp sgt i32 %187, -1
  br i1 %188, label %.lr.ph239, label %._crit_edge240, !llvm.loop !37

._crit_edge240:                                   ; preds = %.lr.ph239, %.lr.ph244
  %.1.lcssa = phi double [ 0.000000e+00, %.lr.ph244 ], [ %185, %.lr.ph239 ]
  %189 = fcmp ole double %.1.lcssa, 0.000000e+00
  %190 = select i1 %189, double 1.000000e+00, double -1.000000e+00
  %191 = getelementptr inbounds double, ptr %33, i64 %172
  store double %190, ptr %191, align 8, !tbaa !28
  %192 = fsub double %190, %.1.lcssa
  %193 = getelementptr inbounds double, ptr %23, i64 %172
  %194 = load double, ptr %193, align 8, !tbaa !28
  %195 = fdiv double %192, %194
  %196 = getelementptr inbounds double, ptr %35, i64 %172
  store double %195, ptr %196, align 8, !tbaa !28
  %indvars.iv.next300 = add nuw nsw i64 %indvars.iv299, 1
  %exitcond303.not = icmp eq i64 %indvars.iv.next300, %wide.trip.count302
  br i1 %exitcond303.not, label %.preheader211, label %.lr.ph244, !llvm.loop !38

.preheader210:                                    ; preds = %._crit_edge249, %._crit_edge235, %.preheader211
  br i1 %69, label %.lr.ph260.preheader, label %.preheader

.lr.ph260.preheader:                              ; preds = %.preheader210
  %wide.trip.count318 = zext nneg i32 %9 to i64
  br label %.lr.ph260

.lr.ph252:                                        ; preds = %.lr.ph252.preheader, %._crit_edge249
  %indvars.iv307 = phi i64 [ %169, %.lr.ph252.preheader ], [ %indvars.iv.next308, %._crit_edge249 ]
  %197 = getelementptr inbounds i32, ptr %17, i64 %indvars.iv307
  %198 = load i32, ptr %197, align 4, !tbaa !27
  %199 = sext i32 %198 to i64
  %200 = getelementptr inbounds i32, ptr %25, i64 %199
  %201 = load i32, ptr %200, align 4, !tbaa !27
  %202 = icmp sgt i32 %201, -1
  br i1 %202, label %.lr.ph248, label %._crit_edge249

.lr.ph248:                                        ; preds = %.lr.ph252, %.lr.ph248
  %indvars.iv304 = phi i64 [ %indvars.iv.next305, %.lr.ph248 ], [ %199, %.lr.ph252 ]
  %203 = phi i32 [ %211, %.lr.ph248 ], [ %201, %.lr.ph252 ]
  %.2246 = phi double [ %209, %.lr.ph248 ], [ 0.000000e+00, %.lr.ph252 ]
  %204 = zext nneg i32 %203 to i64
  %205 = getelementptr inbounds double, ptr %35, i64 %204
  %206 = load double, ptr %205, align 8, !tbaa !28
  %207 = getelementptr inbounds double, ptr %27, i64 %indvars.iv304
  %208 = load double, ptr %207, align 8, !tbaa !28
  %209 = tail call double @llvm.fmuladd.f64(double %206, double %208, double %.2246)
  %indvars.iv.next305 = add nsw i64 %indvars.iv304, 1
  %210 = getelementptr inbounds i32, ptr %25, i64 %indvars.iv.next305
  %211 = load i32, ptr %210, align 4, !tbaa !27
  %212 = icmp sgt i32 %211, -1
  br i1 %212, label %.lr.ph248, label %._crit_edge249, !llvm.loop !39

._crit_edge249:                                   ; preds = %.lr.ph248, %.lr.ph252
  %.2.lcssa = phi double [ 0.000000e+00, %.lr.ph252 ], [ %209, %.lr.ph248 ]
  %213 = getelementptr inbounds i32, ptr %11, i64 %indvars.iv307
  %214 = load i32, ptr %213, align 4, !tbaa !27
  %215 = sext i32 %214 to i64
  %216 = getelementptr inbounds double, ptr %35, i64 %215
  %217 = load double, ptr %216, align 8, !tbaa !28
  %218 = fsub double %217, %.2.lcssa
  store double %218, ptr %216, align 8, !tbaa !28
  %indvars.iv.next308 = add nsw i64 %indvars.iv307, -1
  %219 = icmp sgt i64 %indvars.iv307, 0
  br i1 %219, label %.lr.ph252, label %.preheader210, !llvm.loop !40

.preheader:                                       ; preds = %._crit_edge257, %.preheader210
  br i1 %97, label %.lr.ph262.preheader, label %._crit_edge263

.lr.ph262.preheader:                              ; preds = %.preheader
  %220 = sext i32 %9 to i64
  %wide.trip.count323 = sext i32 %7 to i64
  %221 = sub nsw i64 %wide.trip.count323, %220
  %xtraiter341 = and i64 %221, 1
  %lcmp.mod342.not = icmp eq i64 %xtraiter341, 0
  br i1 %lcmp.mod342.not, label %.lr.ph262.prol.loopexit, label %.lr.ph262.prol

.lr.ph262.prol:                                   ; preds = %.lr.ph262.preheader
  %222 = getelementptr inbounds i32, ptr %15, i64 %220
  %223 = load i32, ptr %222, align 4, !tbaa !27
  %224 = sext i32 %223 to i64
  %225 = getelementptr inbounds double, ptr %35, i64 %224
  %226 = load double, ptr %225, align 8, !tbaa !28
  %227 = getelementptr inbounds double, ptr %33, i64 %224
  %228 = load double, ptr %227, align 8, !tbaa !28
  %229 = fsub double %228, %226
  store double %229, ptr %227, align 8, !tbaa !28
  %indvars.iv.next321.prol = add nsw i64 %220, 1
  br label %.lr.ph262.prol.loopexit

.lr.ph262.prol.loopexit:                          ; preds = %.lr.ph262.prol, %.lr.ph262.preheader
  %indvars.iv320.unr = phi i64 [ %220, %.lr.ph262.preheader ], [ %indvars.iv.next321.prol, %.lr.ph262.prol ]
  %230 = add nsw i64 %wide.trip.count323, -1
  %231 = icmp eq i64 %230, %220
  br i1 %231, label %._crit_edge263, label %.lr.ph262.preheader.new

.lr.ph262.preheader.new:                          ; preds = %.lr.ph262.prol.loopexit
  %invariant.gep349 = getelementptr i8, ptr %15, i64 4
  br label %.lr.ph262

.lr.ph260:                                        ; preds = %.lr.ph260.preheader, %._crit_edge257
  %indvars.iv315 = phi i64 [ 0, %.lr.ph260.preheader ], [ %indvars.iv.next316, %._crit_edge257 ]
  %232 = getelementptr inbounds i32, ptr %15, i64 %indvars.iv315
  %233 = load i32, ptr %232, align 4, !tbaa !27
  %234 = getelementptr inbounds i32, ptr %13, i64 %indvars.iv315
  %235 = load i32, ptr %234, align 4, !tbaa !27
  %236 = sext i32 %235 to i64
  %237 = getelementptr inbounds i32, ptr %1, i64 %236
  %238 = load i32, ptr %237, align 4, !tbaa !27
  %239 = getelementptr inbounds i32, ptr %2, i64 %236
  %240 = load i32, ptr %239, align 4, !tbaa !27
  %241 = icmp slt i32 %238, %240
  br i1 %241, label %.lr.ph256.preheader, label %._crit_edge257

.lr.ph256.preheader:                              ; preds = %.lr.ph260
  %242 = sext i32 %238 to i64
  %wide.trip.count313 = sext i32 %240 to i64
  %243 = sub nsw i64 %wide.trip.count313, %242
  %xtraiter339 = and i64 %243, 3
  %lcmp.mod340.not = icmp eq i64 %xtraiter339, 0
  br i1 %lcmp.mod340.not, label %.lr.ph256.prol.loopexit, label %.lr.ph256.prol

.lr.ph256.prol:                                   ; preds = %.lr.ph256.preheader, %.lr.ph256.prol
  %indvars.iv310.prol = phi i64 [ %indvars.iv.next311.prol, %.lr.ph256.prol ], [ %242, %.lr.ph256.preheader ]
  %.3254.prol = phi double [ %251, %.lr.ph256.prol ], [ 0.000000e+00, %.lr.ph256.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph256.prol ], [ 0, %.lr.ph256.preheader ]
  %244 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv310.prol
  %245 = load i32, ptr %244, align 4, !tbaa !27
  %246 = sext i32 %245 to i64
  %247 = getelementptr inbounds double, ptr %35, i64 %246
  %248 = load double, ptr %247, align 8, !tbaa !28
  %249 = getelementptr inbounds double, ptr %4, i64 %indvars.iv310.prol
  %250 = load double, ptr %249, align 8, !tbaa !28
  %251 = tail call double @llvm.fmuladd.f64(double %248, double %250, double %.3254.prol)
  %indvars.iv.next311.prol = add nsw i64 %indvars.iv310.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter339
  br i1 %prol.iter.cmp.not, label %.lr.ph256.prol.loopexit, label %.lr.ph256.prol, !llvm.loop !41

.lr.ph256.prol.loopexit:                          ; preds = %.lr.ph256.prol, %.lr.ph256.preheader
  %.lcssa.unr = phi double [ poison, %.lr.ph256.preheader ], [ %251, %.lr.ph256.prol ]
  %indvars.iv310.unr = phi i64 [ %242, %.lr.ph256.preheader ], [ %indvars.iv.next311.prol, %.lr.ph256.prol ]
  %.3254.unr = phi double [ 0.000000e+00, %.lr.ph256.preheader ], [ %251, %.lr.ph256.prol ]
  %252 = sub nsw i64 %242, %wide.trip.count313
  %253 = icmp ugt i64 %252, -4
  br i1 %253, label %._crit_edge257, label %.lr.ph256

.lr.ph256:                                        ; preds = %.lr.ph256.prol.loopexit, %.lr.ph256
  %indvars.iv310 = phi i64 [ %indvars.iv.next311.3, %.lr.ph256 ], [ %indvars.iv310.unr, %.lr.ph256.prol.loopexit ]
  %.3254 = phi double [ %285, %.lr.ph256 ], [ %.3254.unr, %.lr.ph256.prol.loopexit ]
  %254 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv310
  %255 = load i32, ptr %254, align 4, !tbaa !27
  %256 = sext i32 %255 to i64
  %257 = getelementptr inbounds double, ptr %35, i64 %256
  %258 = load double, ptr %257, align 8, !tbaa !28
  %259 = getelementptr inbounds double, ptr %4, i64 %indvars.iv310
  %260 = load double, ptr %259, align 8, !tbaa !28
  %261 = tail call double @llvm.fmuladd.f64(double %258, double %260, double %.3254)
  %indvars.iv.next311 = add nsw i64 %indvars.iv310, 1
  %262 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv.next311
  %263 = load i32, ptr %262, align 4, !tbaa !27
  %264 = sext i32 %263 to i64
  %265 = getelementptr inbounds double, ptr %35, i64 %264
  %266 = load double, ptr %265, align 8, !tbaa !28
  %267 = getelementptr inbounds double, ptr %4, i64 %indvars.iv.next311
  %268 = load double, ptr %267, align 8, !tbaa !28
  %269 = tail call double @llvm.fmuladd.f64(double %266, double %268, double %261)
  %indvars.iv.next311.1 = add nsw i64 %indvars.iv310, 2
  %270 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv.next311.1
  %271 = load i32, ptr %270, align 4, !tbaa !27
  %272 = sext i32 %271 to i64
  %273 = getelementptr inbounds double, ptr %35, i64 %272
  %274 = load double, ptr %273, align 8, !tbaa !28
  %275 = getelementptr inbounds double, ptr %4, i64 %indvars.iv.next311.1
  %276 = load double, ptr %275, align 8, !tbaa !28
  %277 = tail call double @llvm.fmuladd.f64(double %274, double %276, double %269)
  %indvars.iv.next311.2 = add nsw i64 %indvars.iv310, 3
  %278 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv.next311.2
  %279 = load i32, ptr %278, align 4, !tbaa !27
  %280 = sext i32 %279 to i64
  %281 = getelementptr inbounds double, ptr %35, i64 %280
  %282 = load double, ptr %281, align 8, !tbaa !28
  %283 = getelementptr inbounds double, ptr %4, i64 %indvars.iv.next311.2
  %284 = load double, ptr %283, align 8, !tbaa !28
  %285 = tail call double @llvm.fmuladd.f64(double %282, double %284, double %277)
  %indvars.iv.next311.3 = add nsw i64 %indvars.iv310, 4
  %exitcond314.not.3 = icmp eq i64 %indvars.iv.next311.3, %wide.trip.count313
  br i1 %exitcond314.not.3, label %._crit_edge257, label %.lr.ph256, !llvm.loop !43

._crit_edge257:                                   ; preds = %.lr.ph256.prol.loopexit, %.lr.ph256, %.lr.ph260
  %.3.lcssa = phi double [ 0.000000e+00, %.lr.ph260 ], [ %.lcssa.unr, %.lr.ph256.prol.loopexit ], [ %285, %.lr.ph256 ]
  %286 = sext i32 %233 to i64
  %287 = getelementptr inbounds double, ptr %33, i64 %286
  %288 = load double, ptr %287, align 8, !tbaa !28
  %289 = fsub double %288, %.3.lcssa
  store double %289, ptr %287, align 8, !tbaa !28
  %indvars.iv.next316 = add nuw nsw i64 %indvars.iv315, 1
  %exitcond319.not = icmp eq i64 %indvars.iv.next316, %wide.trip.count318
  br i1 %exitcond319.not, label %.preheader, label %.lr.ph260, !llvm.loop !44

.lr.ph262:                                        ; preds = %.lr.ph262, %.lr.ph262.preheader.new
  %indvars.iv320 = phi i64 [ %indvars.iv320.unr, %.lr.ph262.preheader.new ], [ %indvars.iv.next321.1, %.lr.ph262 ]
  %290 = getelementptr inbounds i32, ptr %15, i64 %indvars.iv320
  %291 = load i32, ptr %290, align 4, !tbaa !27
  %292 = sext i32 %291 to i64
  %293 = getelementptr inbounds double, ptr %35, i64 %292
  %294 = load double, ptr %293, align 8, !tbaa !28
  %295 = getelementptr inbounds double, ptr %33, i64 %292
  %296 = load double, ptr %295, align 8, !tbaa !28
  %297 = fsub double %296, %294
  store double %297, ptr %295, align 8, !tbaa !28
  %gep350 = getelementptr i32, ptr %invariant.gep349, i64 %indvars.iv320
  %298 = load i32, ptr %gep350, align 4, !tbaa !27
  %299 = sext i32 %298 to i64
  %300 = getelementptr inbounds double, ptr %35, i64 %299
  %301 = load double, ptr %300, align 8, !tbaa !28
  %302 = getelementptr inbounds double, ptr %33, i64 %299
  %303 = load double, ptr %302, align 8, !tbaa !28
  %304 = fsub double %303, %301
  store double %304, ptr %302, align 8, !tbaa !28
  %indvars.iv.next321.1 = add nsw i64 %indvars.iv320, 2
  %exitcond324.not.1 = icmp eq i64 %indvars.iv.next321.1, %wide.trip.count323
  br i1 %exitcond324.not.1, label %._crit_edge263, label %.lr.ph262, !llvm.loop !45

._crit_edge263:                                   ; preds = %.lr.ph262.prol.loopexit, %.lr.ph262, %.preheader
  %305 = tail call double @lu_onenorm(i32 noundef %7, ptr noundef %35)
  %306 = tail call double @lu_onenorm(i32 noundef %7, ptr noundef %33)
  tail call void @lu_matrix_norm(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4) #6
  %307 = getelementptr inbounds i8, ptr %0, i64 288
  %308 = load double, ptr %307, align 8, !tbaa !46
  %309 = fcmp ogt double %308, 0.000000e+00
  br i1 %309, label %311, label %310

310:                                              ; preds = %._crit_edge263
  tail call void @__assert_fail(ptr noundef nonnull @.str.2, ptr noundef nonnull @.str.1, i32 noundef 148, ptr noundef nonnull @__PRETTY_FUNCTION__.lu_residual_test) #5
  unreachable

311:                                              ; preds = %._crit_edge263
  %312 = getelementptr inbounds i8, ptr %0, i64 296
  %313 = load double, ptr %312, align 8, !tbaa !47
  %314 = fcmp ogt double %313, 0.000000e+00
  br i1 %314, label %316, label %315

315:                                              ; preds = %311
  tail call void @__assert_fail(ptr noundef nonnull @.str.3, ptr noundef nonnull @.str.1, i32 noundef 149, ptr noundef nonnull @__PRETTY_FUNCTION__.lu_residual_test) #5
  unreachable

316:                                              ; preds = %311
  %317 = sitofp i32 %7 to double
  %318 = tail call double @llvm.fmuladd.f64(double %308, double %167, double %317)
  %319 = fdiv double %168, %318
  %320 = tail call double @llvm.fmuladd.f64(double %313, double %305, double %317)
  %321 = fdiv double %306, %320
  %322 = tail call double @llvm.maxnum.f64(double %319, double %321)
  %323 = getelementptr inbounds i8, ptr %0, i64 304
  store double %322, ptr %323, align 8, !tbaa !48
  br i1 %39, label %.lr.ph266.preheader, label %._crit_edge267

.lr.ph266.preheader:                              ; preds = %316
  %324 = zext nneg i32 %7 to i64
  %325 = shl nuw nsw i64 %324, 3
  tail call void @llvm.memset.p0.i64(ptr align 8 %33, i8 0, i64 %325, i1 false), !tbaa !28
  br label %._crit_edge267

._crit_edge267:                                   ; preds = %.lr.ph266.preheader, %316
  ret void
}

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr 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: nounwind uwtable
declare hidden double @lu_onenorm(i32 noundef, ptr noundef) local_unnamed_addr #0

declare void @lu_matrix_norm(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #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 = { 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 #2 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { "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: write) }
attributes #5 = { noreturn nounwind }
attributes #6 = { 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 316}
!13 = !{!6, !11, i64 592}
!14 = !{!6, !11, i64 472}
!15 = !{!6, !11, i64 488}
!16 = !{!6, !11, i64 632}
!17 = !{!6, !11, i64 576}
!18 = !{!6, !11, i64 640}
!19 = !{!6, !11, i64 688}
!20 = !{!6, !11, i64 416}
!21 = !{!6, !11, i64 440}
!22 = !{!6, !11, i64 424}
!23 = !{!6, !11, i64 448}
!24 = !{!6, !11, i64 664}
!25 = !{!6, !11, i64 672}
!26 = !{!6, !7, i64 100}
!27 = !{!7, !7, i64 0}
!28 = !{!10, !10, i64 0}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = distinct !{!31, !30}
!32 = distinct !{!32, !30}
!33 = distinct !{!33, !30}
!34 = distinct !{!34, !30}
!35 = distinct !{!35, !30}
!36 = distinct !{!36, !30}
!37 = distinct !{!37, !30}
!38 = distinct !{!38, !30}
!39 = distinct !{!39, !30}
!40 = distinct !{!40, !30}
!41 = distinct !{!41, !42}
!42 = !{!"llvm.loop.unroll.disable"}
!43 = distinct !{!43, !30}
!44 = distinct !{!44, !30}
!45 = distinct !{!45, !30}
!46 = !{!6, !10, i64 288}
!47 = !{!6, !10, i64 296}
!48 = !{!6, !10, i64 304}


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