; LLVM IR from dartsim/dart :: dart/external/odelcpsolver (lcp)

; 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.dart::external::ode::dLCP" = type { i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN4dart8external3ode4dLCPC2EiiiPdS3_S3_S3_S3_S3_S3_S3_S3_S3_S3_PbPiS5_S5_PS3_(ptr noundef nonnull align 8 dereferenceable(144) %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7, ptr noundef %8, ptr noundef %9, ptr noundef %10, ptr noundef %11, ptr noundef %12, ptr noundef %13, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %17, ptr noundef %18, ptr noundef %19) unnamed_addr #0 align 2 {
  %21 = alloca ptr, align 8
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %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 ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca i32, align 4
  %44 = alloca i32, align 4
  %45 = alloca i32, align 4
  %46 = alloca ptr, align 8
  %47 = alloca i32, align 4
  %48 = alloca i32, align 4
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca ptr, align 8
  %52 = alloca i32, align 4
  %53 = alloca i32, align 4
  %54 = alloca i32, align 4
  %55 = alloca ptr, align 8
  %56 = alloca i32, align 4
  %57 = alloca i32, align 4
  %58 = alloca ptr, align 8
  %59 = alloca i32, align 4
  %60 = alloca i32, align 4
  %61 = alloca ptr, align 8
  %62 = alloca i32, align 4
  %63 = alloca i32, align 4
  store ptr %0, ptr %21, align 8, !tbaa !5
  store i32 %1, ptr %22, align 4, !tbaa !9
  store i32 %2, ptr %23, align 4, !tbaa !9
  store i32 %3, ptr %24, align 4, !tbaa !9
  store ptr %4, ptr %25, align 8, !tbaa !5
  store ptr %5, ptr %26, align 8, !tbaa !5
  store ptr %6, ptr %27, align 8, !tbaa !5
  store ptr %7, ptr %28, align 8, !tbaa !5
  store ptr %8, ptr %29, align 8, !tbaa !5
  store ptr %9, ptr %30, align 8, !tbaa !5
  store ptr %10, ptr %31, align 8, !tbaa !5
  store ptr %11, ptr %32, align 8, !tbaa !5
  store ptr %12, ptr %33, align 8, !tbaa !5
  store ptr %13, ptr %34, align 8, !tbaa !5
  store ptr %14, ptr %35, align 8, !tbaa !5
  store ptr %15, ptr %36, align 8, !tbaa !5
  store ptr %16, ptr %37, align 8, !tbaa !5
  store ptr %17, ptr %38, align 8, !tbaa !5
  store ptr %18, ptr %39, align 8, !tbaa !5
  store ptr %19, ptr %40, align 8, !tbaa !5
  %64 = load ptr, ptr %21, align 8
  %65 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %66 = load i32, ptr %22, align 4, !tbaa !9
  store i32 %66, ptr %65, align 8, !tbaa !11
  %67 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 1
  %68 = load i32, ptr %23, align 4, !tbaa !9
  store i32 %68, ptr %67, align 4, !tbaa !13
  %69 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 2
  %70 = load i32, ptr %24, align 4, !tbaa !9
  store i32 %70, ptr %69, align 8, !tbaa !14
  %71 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 3
  store i32 0, ptr %71, align 4, !tbaa !15
  %72 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 4
  store i32 0, ptr %72, align 8, !tbaa !16
  %73 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 5
  %74 = load ptr, ptr %40, align 8, !tbaa !5
  store ptr %74, ptr %73, align 8, !tbaa !17
  %75 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 6
  %76 = load ptr, ptr %26, align 8, !tbaa !5
  store ptr %76, ptr %75, align 8, !tbaa !18
  %77 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 7
  %78 = load ptr, ptr %27, align 8, !tbaa !5
  store ptr %78, ptr %77, align 8, !tbaa !19
  %79 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 8
  %80 = load ptr, ptr %28, align 8, !tbaa !5
  store ptr %80, ptr %79, align 8, !tbaa !20
  %81 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 9
  %82 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %82, ptr %81, align 8, !tbaa !21
  %83 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 10
  %84 = load ptr, ptr %30, align 8, !tbaa !5
  store ptr %84, ptr %83, align 8, !tbaa !22
  %85 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 11
  %86 = load ptr, ptr %31, align 8, !tbaa !5
  store ptr %86, ptr %85, align 8, !tbaa !23
  %87 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 12
  %88 = load ptr, ptr %32, align 8, !tbaa !5
  store ptr %88, ptr %87, align 8, !tbaa !24
  %89 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 13
  %90 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %90, ptr %89, align 8, !tbaa !25
  %91 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 14
  %92 = load ptr, ptr %34, align 8, !tbaa !5
  store ptr %92, ptr %91, align 8, !tbaa !26
  %93 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 15
  %94 = load ptr, ptr %35, align 8, !tbaa !5
  store ptr %94, ptr %93, align 8, !tbaa !27
  %95 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 16
  %96 = load ptr, ptr %36, align 8, !tbaa !5
  store ptr %96, ptr %95, align 8, !tbaa !28
  %97 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 17
  %98 = load ptr, ptr %37, align 8, !tbaa !5
  store ptr %98, ptr %97, align 8, !tbaa !29
  %99 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 18
  %100 = load ptr, ptr %38, align 8, !tbaa !5
  store ptr %100, ptr %99, align 8, !tbaa !30
  %101 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 19
  %102 = load ptr, ptr %39, align 8, !tbaa !5
  store ptr %102, ptr %101, align 8, !tbaa !31
  %103 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 6
  %104 = load ptr, ptr %103, align 8, !tbaa !18
  %105 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %106 = load i32, ptr %105, align 8, !tbaa !11
  %107 = sext i32 %106 to i64
  call void @_ZN4dart8external3ode9_dSetZeroEPdm(ptr noundef %104, i64 noundef %107)
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #4
  %108 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %108, ptr %41, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #4
  %109 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 5
  %110 = load ptr, ptr %109, align 8, !tbaa !17
  store ptr %110, ptr %42, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #4
  %111 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %112 = load i32, ptr %111, align 8, !tbaa !11
  store i32 %112, ptr %43, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #4
  %113 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 1
  %114 = load i32, ptr %113, align 4, !tbaa !13
  store i32 %114, ptr %44, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #4
  store i32 0, ptr %45, align 4, !tbaa !9
  br label %115

115:                                              ; preds = %126, %20
  %116 = load i32, ptr %45, align 4, !tbaa !9
  %117 = load i32, ptr %43, align 4, !tbaa !9
  %118 = icmp slt i32 %116, %117
  br i1 %118, label %120, label %119

119:                                              ; preds = %115
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #4
  br label %133

120:                                              ; preds = %115
  %121 = load ptr, ptr %41, align 8, !tbaa !5
  %122 = load ptr, ptr %42, align 8, !tbaa !5
  %123 = load i32, ptr %45, align 4, !tbaa !9
  %124 = sext i32 %123 to i64
  %125 = getelementptr inbounds ptr, ptr %122, i64 %124
  store ptr %121, ptr %125, align 8, !tbaa !5
  br label %126

126:                                              ; preds = %120
  %127 = load i32, ptr %44, align 4, !tbaa !9
  %128 = load ptr, ptr %41, align 8, !tbaa !5
  %129 = sext i32 %127 to i64
  %130 = getelementptr inbounds double, ptr %128, i64 %129
  store ptr %130, ptr %41, align 8, !tbaa !5
  %131 = load i32, ptr %45, align 4, !tbaa !9
  %132 = add nsw i32 %131, 1
  store i32 %132, ptr %45, align 4, !tbaa !9
  br label %115, !llvm.loop !32

133:                                              ; preds = %119
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #4
  %134 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 18
  %135 = load ptr, ptr %134, align 8, !tbaa !30
  store ptr %135, ptr %46, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #4
  %136 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %137 = load i32, ptr %136, align 8, !tbaa !11
  store i32 %137, ptr %47, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #4
  store i32 0, ptr %48, align 4, !tbaa !9
  br label %138

138:                                              ; preds = %149, %133
  %139 = load i32, ptr %48, align 4, !tbaa !9
  %140 = load i32, ptr %47, align 4, !tbaa !9
  %141 = icmp slt i32 %139, %140
  br i1 %141, label %143, label %142

142:                                              ; preds = %138
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #4
  br label %152

143:                                              ; preds = %138
  %144 = load i32, ptr %48, align 4, !tbaa !9
  %145 = load ptr, ptr %46, align 8, !tbaa !5
  %146 = load i32, ptr %48, align 4, !tbaa !9
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds i32, ptr %145, i64 %147
  store i32 %144, ptr %148, align 4, !tbaa !9
  br label %149

149:                                              ; preds = %143
  %150 = load i32, ptr %48, align 4, !tbaa !9
  %151 = add nsw i32 %150, 1
  store i32 %151, ptr %48, align 4, !tbaa !9
  br label %138, !llvm.loop !34

152:                                              ; preds = %142
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #4
  %153 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 17
  %154 = load ptr, ptr %153, align 8, !tbaa !29
  store ptr %154, ptr %49, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #4
  %155 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 9
  %156 = load ptr, ptr %155, align 8, !tbaa !21
  store ptr %156, ptr %50, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #4
  %157 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 10
  %158 = load ptr, ptr %157, align 8, !tbaa !22
  store ptr %158, ptr %51, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #4
  %159 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %160 = load i32, ptr %159, align 8, !tbaa !11
  store i32 %160, ptr %52, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #4
  %161 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 2
  %162 = load i32, ptr %161, align 8, !tbaa !14
  store i32 %162, ptr %53, align 4, !tbaa !9
  br label %163

163:                                              ; preds = %219, %152
  %164 = load i32, ptr %53, align 4, !tbaa !9
  %165 = load i32, ptr %52, align 4, !tbaa !9
  %166 = icmp slt i32 %164, %165
  br i1 %166, label %168, label %167

167:                                              ; preds = %163
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #4
  br label %222

168:                                              ; preds = %163
  %169 = load ptr, ptr %49, align 8, !tbaa !5
  %170 = icmp ne ptr %169, null
  br i1 %170, label %171, label %179

171:                                              ; preds = %168
  %172 = load ptr, ptr %49, align 8, !tbaa !5
  %173 = load i32, ptr %53, align 4, !tbaa !9
  %174 = sext i32 %173 to i64
  %175 = getelementptr inbounds i32, ptr %172, i64 %174
  %176 = load i32, ptr %175, align 4, !tbaa !9
  %177 = icmp sge i32 %176, 0
  br i1 %177, label %178, label %179

178:                                              ; preds = %171
  br label %219

179:                                              ; preds = %171, %168
  %180 = load ptr, ptr %50, align 8, !tbaa !5
  %181 = load i32, ptr %53, align 4, !tbaa !9
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds double, ptr %180, i64 %182
  %184 = load double, ptr %183, align 8, !tbaa !35
  %185 = fcmp oeq double %184, 0xFFF0000000000000
  br i1 %185, label %186, label %218

186:                                              ; preds = %179
  %187 = load ptr, ptr %51, align 8, !tbaa !5
  %188 = load i32, ptr %53, align 4, !tbaa !9
  %189 = sext i32 %188 to i64
  %190 = getelementptr inbounds double, ptr %187, i64 %189
  %191 = load double, ptr %190, align 8, !tbaa !35
  %192 = fcmp oeq double %191, 0x7FF0000000000000
  br i1 %192, label %193, label %218

193:                                              ; preds = %186
  %194 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 5
  %195 = load ptr, ptr %194, align 8, !tbaa !17
  %196 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 6
  %197 = load ptr, ptr %196, align 8, !tbaa !18
  %198 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 7
  %199 = load ptr, ptr %198, align 8, !tbaa !19
  %200 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 8
  %201 = load ptr, ptr %200, align 8, !tbaa !20
  %202 = load ptr, ptr %50, align 8, !tbaa !5
  %203 = load ptr, ptr %51, align 8, !tbaa !5
  %204 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 18
  %205 = load ptr, ptr %204, align 8, !tbaa !30
  %206 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 16
  %207 = load ptr, ptr %206, align 8, !tbaa !28
  %208 = load ptr, ptr %49, align 8, !tbaa !5
  %209 = load i32, ptr %52, align 4, !tbaa !9
  %210 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 2
  %211 = load i32, ptr %210, align 8, !tbaa !14
  %212 = load i32, ptr %53, align 4, !tbaa !9
  %213 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 1
  %214 = load i32, ptr %213, align 4, !tbaa !13
  call void @_ZN4dart8external3odeL11swapProblemEPPdS2_S2_S2_S2_S2_PiPbS4_iiiii(ptr noundef %195, ptr noundef %197, ptr noundef %199, ptr noundef %201, ptr noundef %202, ptr noundef %203, ptr noundef %205, ptr noundef %207, ptr noundef %208, i32 noundef %209, i32 noundef %211, i32 noundef %212, i32 noundef %214, i32 noundef 0)
  %215 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 2
  %216 = load i32, ptr %215, align 8, !tbaa !14
  %217 = add nsw i32 %216, 1
  store i32 %217, ptr %215, align 8, !tbaa !14
  br label %218

218:                                              ; preds = %193, %186, %179
  br label %219

219:                                              ; preds = %218, %178
  %220 = load i32, ptr %53, align 4, !tbaa !9
  %221 = add nsw i32 %220, 1
  store i32 %221, ptr %53, align 4, !tbaa !9
  br label %163, !llvm.loop !37

222:                                              ; preds = %167
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #4
  %223 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 2
  %224 = load i32, ptr %223, align 8, !tbaa !14
  %225 = icmp sgt i32 %224, 0
  br i1 %225, label %226, label %304

226:                                              ; preds = %222
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #4
  %227 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 2
  %228 = load i32, ptr %227, align 8, !tbaa !14
  store i32 %228, ptr %54, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #4
  %229 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 11
  %230 = load ptr, ptr %229, align 8, !tbaa !23
  store ptr %230, ptr %55, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #4
  %231 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 1
  %232 = load i32, ptr %231, align 4, !tbaa !13
  store i32 %232, ptr %56, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #4
  store i32 0, ptr %57, align 4, !tbaa !9
  br label %233

233:                                              ; preds = %250, %226
  %234 = load i32, ptr %57, align 4, !tbaa !9
  %235 = load i32, ptr %54, align 4, !tbaa !9
  %236 = icmp slt i32 %234, %235
  br i1 %236, label %238, label %237

237:                                              ; preds = %233
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #4
  br label %257

238:                                              ; preds = %233
  %239 = load ptr, ptr %55, align 8, !tbaa !5
  %240 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 5
  %241 = load ptr, ptr %240, align 8, !tbaa !17
  %242 = load i32, ptr %57, align 4, !tbaa !9
  %243 = sext i32 %242 to i64
  %244 = getelementptr inbounds ptr, ptr %241, i64 %243
  %245 = load ptr, ptr %244, align 8, !tbaa !5
  %246 = load i32, ptr %57, align 4, !tbaa !9
  %247 = add nsw i32 %246, 1
  %248 = sext i32 %247 to i64
  %249 = mul i64 %248, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %239, ptr align 8 %245, i64 %249, i1 false)
  br label %250

250:                                              ; preds = %238
  %251 = load i32, ptr %56, align 4, !tbaa !9
  %252 = load ptr, ptr %55, align 8, !tbaa !5
  %253 = sext i32 %251 to i64
  %254 = getelementptr inbounds double, ptr %252, i64 %253
  store ptr %254, ptr %55, align 8, !tbaa !5
  %255 = load i32, ptr %57, align 4, !tbaa !9
  %256 = add nsw i32 %255, 1
  store i32 %256, ptr %57, align 4, !tbaa !9
  br label %233, !llvm.loop !38

257:                                              ; preds = %237
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #4
  %258 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 11
  %259 = load ptr, ptr %258, align 8, !tbaa !23
  %260 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 12
  %261 = load ptr, ptr %260, align 8, !tbaa !24
  %262 = load i32, ptr %54, align 4, !tbaa !9
  %263 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 1
  %264 = load i32, ptr %263, align 4, !tbaa !13
  call void @_ZN4dart8external3ode12_dFactorLDLTEPdS2_ii(ptr noundef %259, ptr noundef %261, i32 noundef %262, i32 noundef %264)
  %265 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 6
  %266 = load ptr, ptr %265, align 8, !tbaa !18
  %267 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 7
  %268 = load ptr, ptr %267, align 8, !tbaa !19
  %269 = load i32, ptr %54, align 4, !tbaa !9
  %270 = sext i32 %269 to i64
  %271 = mul i64 %270, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %266, ptr align 8 %268, i64 %271, i1 false)
  %272 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 11
  %273 = load ptr, ptr %272, align 8, !tbaa !23
  %274 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 12
  %275 = load ptr, ptr %274, align 8, !tbaa !24
  %276 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 6
  %277 = load ptr, ptr %276, align 8, !tbaa !18
  %278 = load i32, ptr %54, align 4, !tbaa !9
  %279 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 1
  %280 = load i32, ptr %279, align 4, !tbaa !13
  call void @_ZN4dart8external3ode11_dSolveLDLTEPKdS3_Pdii(ptr noundef %273, ptr noundef %275, ptr noundef %277, i32 noundef %278, i32 noundef %280)
  %281 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 8
  %282 = load ptr, ptr %281, align 8, !tbaa !20
  %283 = load i32, ptr %54, align 4, !tbaa !9
  %284 = sext i32 %283 to i64
  call void @_ZN4dart8external3ode9_dSetZeroEPdm(ptr noundef %282, i64 noundef %284)
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #4
  %285 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 19
  %286 = load ptr, ptr %285, align 8, !tbaa !31
  store ptr %286, ptr %58, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #4
  store i32 0, ptr %59, align 4, !tbaa !9
  br label %287

287:                                              ; preds = %298, %257
  %288 = load i32, ptr %59, align 4, !tbaa !9
  %289 = load i32, ptr %54, align 4, !tbaa !9
  %290 = icmp slt i32 %288, %289
  br i1 %290, label %292, label %291

291:                                              ; preds = %287
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #4
  br label %301

292:                                              ; preds = %287
  %293 = load i32, ptr %59, align 4, !tbaa !9
  %294 = load ptr, ptr %58, align 8, !tbaa !5
  %295 = load i32, ptr %59, align 4, !tbaa !9
  %296 = sext i32 %295 to i64
  %297 = getelementptr inbounds i32, ptr %294, i64 %296
  store i32 %293, ptr %297, align 4, !tbaa !9
  br label %298

298:                                              ; preds = %292
  %299 = load i32, ptr %59, align 4, !tbaa !9
  %300 = add nsw i32 %299, 1
  store i32 %300, ptr %59, align 4, !tbaa !9
  br label %287, !llvm.loop !39

301:                                              ; preds = %291
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #4
  %302 = load i32, ptr %54, align 4, !tbaa !9
  %303 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 3
  store i32 %302, ptr %303, align 4, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #4
  br label %304

304:                                              ; preds = %301, %222
  %305 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 17
  %306 = load ptr, ptr %305, align 8, !tbaa !29
  %307 = icmp ne ptr %306, null
  br i1 %307, label %308, label %363

308:                                              ; preds = %304
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #4
  %309 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 2
  %310 = load i32, ptr %309, align 8, !tbaa !14
  store i32 %310, ptr %60, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #4
  %311 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 17
  %312 = load ptr, ptr %311, align 8, !tbaa !29
  store ptr %312, ptr %61, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %62) #4
  store i32 0, ptr %62, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %63) #4
  %313 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %314 = load i32, ptr %313, align 8, !tbaa !11
  %315 = sub nsw i32 %314, 1
  store i32 %315, ptr %63, align 4, !tbaa !9
  br label %316

316:                                              ; preds = %359, %308
  %317 = load i32, ptr %63, align 4, !tbaa !9
  %318 = load i32, ptr %60, align 4, !tbaa !9
  %319 = icmp sge i32 %317, %318
  br i1 %319, label %321, label %320

320:                                              ; preds = %316
  call void @llvm.lifetime.end.p0(i64 4, ptr %63) #4
  br label %362

321:                                              ; preds = %316
  %322 = load ptr, ptr %61, align 8, !tbaa !5
  %323 = load i32, ptr %63, align 4, !tbaa !9
  %324 = sext i32 %323 to i64
  %325 = getelementptr inbounds i32, ptr %322, i64 %324
  %326 = load i32, ptr %325, align 4, !tbaa !9
  %327 = icmp sge i32 %326, 0
  br i1 %327, label %328, label %358

328:                                              ; preds = %321
  %329 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 5
  %330 = load ptr, ptr %329, align 8, !tbaa !17
  %331 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 6
  %332 = load ptr, ptr %331, align 8, !tbaa !18
  %333 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 7
  %334 = load ptr, ptr %333, align 8, !tbaa !19
  %335 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 8
  %336 = load ptr, ptr %335, align 8, !tbaa !20
  %337 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 9
  %338 = load ptr, ptr %337, align 8, !tbaa !21
  %339 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 10
  %340 = load ptr, ptr %339, align 8, !tbaa !22
  %341 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 18
  %342 = load ptr, ptr %341, align 8, !tbaa !30
  %343 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 16
  %344 = load ptr, ptr %343, align 8, !tbaa !28
  %345 = load ptr, ptr %61, align 8, !tbaa !5
  %346 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %347 = load i32, ptr %346, align 8, !tbaa !11
  %348 = load i32, ptr %63, align 4, !tbaa !9
  %349 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 0
  %350 = load i32, ptr %349, align 8, !tbaa !11
  %351 = sub nsw i32 %350, 1
  %352 = load i32, ptr %62, align 4, !tbaa !9
  %353 = sub nsw i32 %351, %352
  %354 = getelementptr inbounds %"struct.dart::external::ode::dLCP", ptr %64, i32 0, i32 1
  %355 = load i32, ptr %354, align 4, !tbaa !13
  call void @_ZN4dart8external3odeL11swapProblemEPPdS2_S2_S2_S2_S2_PiPbS4_iiiii(ptr noundef %330, ptr noundef %332, ptr noundef %334, ptr noundef %336, ptr noundef %338, ptr noundef %340, ptr noundef %342, ptr noundef %344, ptr noundef %345, i32 noundef %347, i32 noundef %348, i32 noundef %353, i32 noundef %355, i32 noundef 1)
  %356 = load i32, ptr %62, align 4, !tbaa !9
  %357 = add nsw i32 %356, 1
  store i32 %357, ptr %62, align 4, !tbaa !9
  br label %358

358:                                              ; preds = %328, %321
  br label %359

359:                                              ; preds = %358
  %360 = load i32, ptr %63, align 4, !tbaa !9
  %361 = add nsw i32 %360, -1
  store i32 %361, ptr %63, align 4, !tbaa !9
  br label %316, !llvm.loop !40

362:                                              ; preds = %320
  call void @llvm.lifetime.end.p0(i64 4, ptr %62) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #4
  br label %363

363:                                              ; preds = %362, %304
  ret void
}

declare void @_ZN4dart8external3ode9_dSetZeroEPdm(ptr noundef, i64 noundef) #1

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

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

; Function Attrs: mustprogress uwtable
declare hidden void @_ZN4dart8external3odeL11swapProblemEPPdS2_S2_S2_S2_S2_PiPbS4_iiiii(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #0

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

declare void @_ZN4dart8external3ode12_dFactorLDLTEPdS2_ii(ptr noundef, ptr noundef, i32 noundef, i32 noundef) #1

declare void @_ZN4dart8external3ode11_dSolveLDLTEPKdS3_Pdii(ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef) #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 0}
!12 = !{!"_ZTSN4dart8external3ode4dLCPE", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136}
!13 = !{!12, !10, i64 4}
!14 = !{!12, !10, i64 8}
!15 = !{!12, !10, i64 12}
!16 = !{!12, !10, i64 16}
!17 = !{!12, !6, i64 24}
!18 = !{!12, !6, i64 32}
!19 = !{!12, !6, i64 40}
!20 = !{!12, !6, i64 48}
!21 = !{!12, !6, i64 56}
!22 = !{!12, !6, i64 64}
!23 = !{!12, !6, i64 72}
!24 = !{!12, !6, i64 80}
!25 = !{!12, !6, i64 88}
!26 = !{!12, !6, i64 96}
!27 = !{!12, !6, i64 104}
!28 = !{!12, !6, i64 112}
!29 = !{!12, !6, i64 120}
!30 = !{!12, !6, i64 128}
!31 = !{!12, !6, i64 136}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}
!35 = !{!36, !36, i64 0}
!36 = !{!"double", !7, i64 0}
!37 = distinct !{!37, !33}
!38 = distinct !{!38, !33}
!39 = distinct !{!39, !33}
!40 = distinct !{!40, !33}


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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN4dart8external3ode4dLCPC2EiiiPdS3_S3_S3_S3_S3_S3_S3_S3_S3_S3_PbPiS5_S5_PS3_(ptr nocapture noundef nonnull align 8 dereferenceable(144) %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7, ptr noundef %8, ptr noundef %9, ptr noundef %10, ptr noundef %11, ptr noundef %12, ptr noundef %13, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %17, ptr noundef %18, ptr noundef %19) unnamed_addr #0 align 2 {
  store i32 %1, ptr %0, align 8, !tbaa !5
  %21 = getelementptr inbounds i8, ptr %0, i64 4
  store i32 %2, ptr %21, align 4, !tbaa !11
  %22 = getelementptr inbounds i8, ptr %0, i64 8
  store i32 %3, ptr %22, align 8, !tbaa !12
  %23 = getelementptr inbounds i8, ptr %0, i64 12
  store i32 0, ptr %23, align 4, !tbaa !13
  %24 = getelementptr inbounds i8, ptr %0, i64 16
  store i32 0, ptr %24, align 8, !tbaa !14
  %25 = getelementptr inbounds i8, ptr %0, i64 24
  store ptr %19, ptr %25, align 8, !tbaa !15
  %26 = getelementptr inbounds i8, ptr %0, i64 32
  store ptr %5, ptr %26, align 8, !tbaa !16
  %27 = getelementptr inbounds i8, ptr %0, i64 40
  store ptr %6, ptr %27, align 8, !tbaa !17
  %28 = getelementptr inbounds i8, ptr %0, i64 48
  store ptr %7, ptr %28, align 8, !tbaa !18
  %29 = getelementptr inbounds i8, ptr %0, i64 56
  store ptr %8, ptr %29, align 8, !tbaa !19
  %30 = getelementptr inbounds i8, ptr %0, i64 64
  store ptr %9, ptr %30, align 8, !tbaa !20
  %31 = getelementptr inbounds i8, ptr %0, i64 72
  store ptr %10, ptr %31, align 8, !tbaa !21
  %32 = getelementptr inbounds i8, ptr %0, i64 80
  store ptr %11, ptr %32, align 8, !tbaa !22
  %33 = getelementptr inbounds i8, ptr %0, i64 88
  store ptr %12, ptr %33, align 8, !tbaa !23
  %34 = getelementptr inbounds i8, ptr %0, i64 96
  store ptr %13, ptr %34, align 8, !tbaa !24
  %35 = getelementptr inbounds i8, ptr %0, i64 104
  store ptr %14, ptr %35, align 8, !tbaa !25
  %36 = getelementptr inbounds i8, ptr %0, i64 112
  store ptr %15, ptr %36, align 8, !tbaa !26
  %37 = getelementptr inbounds i8, ptr %0, i64 120
  store ptr %16, ptr %37, align 8, !tbaa !27
  %38 = getelementptr inbounds i8, ptr %0, i64 128
  store ptr %17, ptr %38, align 8, !tbaa !28
  %39 = getelementptr inbounds i8, ptr %0, i64 136
  store ptr %18, ptr %39, align 8, !tbaa !29
  %40 = sext i32 %1 to i64
  tail call void @_ZN4dart8external3ode9_dSetZeroEPdm(ptr noundef %5, i64 noundef %40)
  %41 = load ptr, ptr %25, align 8, !tbaa !15
  %42 = load i32, ptr %0, align 8, !tbaa !5
  %43 = icmp sgt i32 %42, 0
  br i1 %43, label %.lr.ph, label %._crit_edge95

.lr.ph:                                           ; preds = %20
  %44 = load i32, ptr %21, align 4, !tbaa !11
  %45 = sext i32 %44 to i64
  %wide.trip.count = zext nneg i32 %42 to i64
  %xtraiter = and i64 %wide.trip.count, 7
  %46 = icmp ult i32 %42, 8
  br i1 %46, label %._crit_edge.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %wide.trip.count, 2147483640
  br label %53

._crit_edge.unr-lcssa:                            ; preds = %53, %.lr.ph
  %indvars.iv.unr = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next.7, %53 ]
  %.07791.unr = phi ptr [ %4, %.lr.ph ], [ %69, %53 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge.unr-lcssa, %.epil.preheader
  %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %.epil.preheader ], [ %indvars.iv.unr, %._crit_edge.unr-lcssa ]
  %.07791.epil = phi ptr [ %48, %.epil.preheader ], [ %.07791.unr, %._crit_edge.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge.unr-lcssa ]
  %47 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.epil
  store ptr %.07791.epil, ptr %47, align 8, !tbaa !30
  %48 = getelementptr inbounds double, ptr %.07791.epil, i64 %45
  %indvars.iv.next.epil = add nuw nsw i64 %indvars.iv.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge, label %.epil.preheader, !llvm.loop !31

._crit_edge:                                      ; preds = %.epil.preheader, %._crit_edge.unr-lcssa
  %49 = load ptr, ptr %38, align 8, !tbaa !28
  br i1 %43, label %.lr.ph94.preheader, label %._crit_edge95

.lr.ph94.preheader:                               ; preds = %._crit_edge
  %wide.trip.count116 = zext nneg i32 %42 to i64
  %min.iters.check = icmp ult i32 %42, 8
  br i1 %min.iters.check, label %.lr.ph94.preheader152, label %vector.ph

.lr.ph94.preheader152:                            ; preds = %middle.block, %.lr.ph94.preheader
  %indvars.iv113.ph = phi i64 [ 0, %.lr.ph94.preheader ], [ %n.vec, %middle.block ]
  br label %.lr.ph94

vector.ph:                                        ; preds = %.lr.ph94.preheader
  %n.vec = and i64 %wide.trip.count, 2147483640
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
  %step.add = add <4 x i32> %vec.ind, <i32 4, i32 4, i32 4, i32 4>
  %50 = getelementptr inbounds i32, ptr %49, i64 %index
  %51 = getelementptr inbounds i8, ptr %50, i64 16
  store <4 x i32> %vec.ind, ptr %50, align 4, !tbaa !33
  store <4 x i32> %step.add, ptr %51, align 4, !tbaa !33
  %index.next = add nuw i64 %index, 8
  %vec.ind.next = add <4 x i32> %vec.ind, <i32 8, i32 8, i32 8, i32 8>
  %52 = icmp eq i64 %index.next, %n.vec
  br i1 %52, label %middle.block, label %vector.body, !llvm.loop !34

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %._crit_edge95.loopexit, label %.lr.ph94.preheader152

53:                                               ; preds = %53, %.lr.ph.new
  %indvars.iv = phi i64 [ 0, %.lr.ph.new ], [ %indvars.iv.next.7, %53 ]
  %.07791 = phi ptr [ %4, %.lr.ph.new ], [ %69, %53 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.7, %53 ]
  %54 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv
  store ptr %.07791, ptr %54, align 8, !tbaa !30
  %55 = getelementptr inbounds double, ptr %.07791, i64 %45
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %56 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.next
  store ptr %55, ptr %56, align 8, !tbaa !30
  %57 = getelementptr inbounds double, ptr %55, i64 %45
  %indvars.iv.next.1 = or disjoint i64 %indvars.iv, 2
  %58 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.next.1
  store ptr %57, ptr %58, align 8, !tbaa !30
  %59 = getelementptr inbounds double, ptr %57, i64 %45
  %indvars.iv.next.2 = or disjoint i64 %indvars.iv, 3
  %60 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.next.2
  store ptr %59, ptr %60, align 8, !tbaa !30
  %61 = getelementptr inbounds double, ptr %59, i64 %45
  %indvars.iv.next.3 = or disjoint i64 %indvars.iv, 4
  %62 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.next.3
  store ptr %61, ptr %62, align 8, !tbaa !30
  %63 = getelementptr inbounds double, ptr %61, i64 %45
  %indvars.iv.next.4 = or disjoint i64 %indvars.iv, 5
  %64 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.next.4
  store ptr %63, ptr %64, align 8, !tbaa !30
  %65 = getelementptr inbounds double, ptr %63, i64 %45
  %indvars.iv.next.5 = or disjoint i64 %indvars.iv, 6
  %66 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.next.5
  store ptr %65, ptr %66, align 8, !tbaa !30
  %67 = getelementptr inbounds double, ptr %65, i64 %45
  %indvars.iv.next.6 = or disjoint i64 %indvars.iv, 7
  %68 = getelementptr inbounds ptr, ptr %41, i64 %indvars.iv.next.6
  store ptr %67, ptr %68, align 8, !tbaa !30
  %69 = getelementptr inbounds double, ptr %67, i64 %45
  %indvars.iv.next.7 = add nuw nsw i64 %indvars.iv, 8
  %niter.next.7 = add i64 %niter, 8
  %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
  br i1 %niter.ncmp.7, label %._crit_edge.unr-lcssa, label %53, !llvm.loop !38

._crit_edge95.loopexit:                           ; preds = %.lr.ph94, %middle.block
  %.pre = load i32, ptr %0, align 8, !tbaa !5
  br label %._crit_edge95

._crit_edge95:                                    ; preds = %20, %._crit_edge95.loopexit, %._crit_edge
  %70 = phi i32 [ %.pre, %._crit_edge95.loopexit ], [ %42, %._crit_edge ], [ %42, %20 ]
  %71 = load ptr, ptr %37, align 8, !tbaa !27
  %72 = load ptr, ptr %29, align 8, !tbaa !19
  %73 = load ptr, ptr %30, align 8, !tbaa !20
  %74 = load i32, ptr %22, align 8, !tbaa !12
  %75 = icmp slt i32 %74, %70
  br i1 %75, label %.lr.ph98, label %._crit_edge99

.lr.ph98:                                         ; preds = %._crit_edge95
  %.not89 = icmp eq ptr %71, null
  %76 = sext i32 %74 to i64
  br label %81

.lr.ph94:                                         ; preds = %.lr.ph94.preheader152, %.lr.ph94
  %indvars.iv113 = phi i64 [ %indvars.iv.next114, %.lr.ph94 ], [ %indvars.iv113.ph, %.lr.ph94.preheader152 ]
  %77 = getelementptr inbounds i32, ptr %49, i64 %indvars.iv113
  %78 = trunc nuw nsw i64 %indvars.iv113 to i32
  store i32 %78, ptr %77, align 4, !tbaa !33
  %indvars.iv.next114 = add nuw nsw i64 %indvars.iv113, 1
  %exitcond117.not = icmp eq i64 %indvars.iv.next114, %wide.trip.count116
  br i1 %exitcond117.not, label %._crit_edge95.loopexit, label %.lr.ph94, !llvm.loop !39

._crit_edge99:                                    ; preds = %106, %._crit_edge95
  %79 = phi i32 [ %74, %._crit_edge95 ], [ %107, %106 ]
  %80 = icmp sgt i32 %79, 0
  br i1 %80, label %108, label %145

81:                                               ; preds = %.lr.ph98, %106
  %82 = phi i32 [ %74, %.lr.ph98 ], [ %107, %106 ]
  %indvars.iv118 = phi i64 [ %76, %.lr.ph98 ], [ %indvars.iv.next119, %106 ]
  br i1 %.not89, label %87, label %83

83:                                               ; preds = %81
  %84 = getelementptr inbounds i32, ptr %71, i64 %indvars.iv118
  %85 = load i32, ptr %84, align 4, !tbaa !33
  %86 = icmp sgt i32 %85, -1
  br i1 %86, label %106, label %87

87:                                               ; preds = %83, %81
  %88 = getelementptr inbounds double, ptr %72, i64 %indvars.iv118
  %89 = load double, ptr %88, align 8, !tbaa !40
  %90 = fcmp oeq double %89, 0xFFF0000000000000
  br i1 %90, label %91, label %106

91:                                               ; preds = %87
  %92 = getelementptr inbounds double, ptr %73, i64 %indvars.iv118
  %93 = load double, ptr %92, align 8, !tbaa !40
  %94 = fcmp oeq double %93, 0x7FF0000000000000
  br i1 %94, label %95, label %106

95:                                               ; preds = %91
  %96 = load ptr, ptr %25, align 8, !tbaa !15
  %97 = load ptr, ptr %26, align 8, !tbaa !16
  %98 = load ptr, ptr %27, align 8, !tbaa !17
  %99 = load ptr, ptr %28, align 8, !tbaa !18
  %100 = load ptr, ptr %38, align 8, !tbaa !28
  %101 = load ptr, ptr %36, align 8, !tbaa !26
  %102 = load i32, ptr %21, align 4, !tbaa !11
  %103 = trunc nsw i64 %indvars.iv118 to i32
  tail call void @_ZN4dart8external3odeL11swapProblemEPPdS2_S2_S2_S2_S2_PiPbS4_iiiii(ptr noundef %96, ptr noundef %97, ptr noundef %98, ptr noundef %99, ptr noundef nonnull %72, ptr noundef nonnull %73, ptr noundef %100, ptr noundef %101, ptr noundef %71, i32 noundef %70, i32 noundef %82, i32 noundef %103, i32 noundef %102, i32 noundef 0)
  %104 = load i32, ptr %22, align 8, !tbaa !12
  %105 = add nsw i32 %104, 1
  store i32 %105, ptr %22, align 8, !tbaa !12
  br label %106

106:                                              ; preds = %87, %91, %95, %83
  %107 = phi i32 [ %82, %87 ], [ %82, %91 ], [ %105, %95 ], [ %82, %83 ]
  %indvars.iv.next119 = add nsw i64 %indvars.iv118, 1
  %lftr.wideiv = trunc i64 %indvars.iv.next119 to i32
  %exitcond121.not = icmp eq i32 %70, %lftr.wideiv
  br i1 %exitcond121.not, label %._crit_edge99, label %81, !llvm.loop !42

108:                                              ; preds = %._crit_edge99
  %109 = load ptr, ptr %31, align 8, !tbaa !21
  %110 = load i32, ptr %21, align 4, !tbaa !11
  %111 = sext i32 %110 to i64
  %wide.trip.count125 = zext nneg i32 %79 to i64
  %xtraiter154 = and i64 %wide.trip.count125, 1
  %112 = icmp eq i32 %79, 1
  br i1 %112, label %.lr.ph104.preheader.unr-lcssa, label %.new

.new:                                             ; preds = %108
  %unroll_iter157 = and i64 %wide.trip.count125, 2147483646
  br label %132

.lr.ph104.preheader.unr-lcssa:                    ; preds = %132, %108
  %indvars.iv122.unr = phi i64 [ 0, %108 ], [ %indvars.iv.next123.1, %132 ]
  %.083100.unr = phi ptr [ %109, %108 ], [ %142, %132 ]
  %lcmp.mod156.not = icmp eq i64 %xtraiter154, 0
  br i1 %lcmp.mod156.not, label %.lr.ph104.preheader, label %.lr.ph104.preheader.epilog-lcssa

.lr.ph104.preheader.epilog-lcssa:                 ; preds = %.lr.ph104.preheader.unr-lcssa
  %113 = load ptr, ptr %25, align 8, !tbaa !15
  %114 = getelementptr inbounds ptr, ptr %113, i64 %indvars.iv122.unr
  %115 = load ptr, ptr %114, align 8, !tbaa !30
  %indvars.iv.next123.epil = shl i64 %indvars.iv122.unr, 3
  %116 = add i64 %indvars.iv.next123.epil, 8
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %.083100.unr, ptr noundef nonnull align 8 dereferenceable(1) %115, i64 %116, i1 false)
  br label %.lr.ph104.preheader

.lr.ph104.preheader:                              ; preds = %.lr.ph104.preheader.unr-lcssa, %.lr.ph104.preheader.epilog-lcssa
  %117 = load ptr, ptr %31, align 8, !tbaa !21
  %118 = load ptr, ptr %32, align 8, !tbaa !22
  %119 = load i32, ptr %21, align 4, !tbaa !11
  tail call void @_ZN4dart8external3ode12_dFactorLDLTEPdS2_ii(ptr noundef %117, ptr noundef %118, i32 noundef %79, i32 noundef %119)
  %120 = load ptr, ptr %26, align 8, !tbaa !16
  %121 = load ptr, ptr %27, align 8, !tbaa !17
  %122 = shl nuw nsw i64 %wide.trip.count125, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %120, ptr align 8 %121, i64 %122, i1 false)
  %123 = load ptr, ptr %31, align 8, !tbaa !21
  %124 = load ptr, ptr %32, align 8, !tbaa !22
  %125 = load ptr, ptr %26, align 8, !tbaa !16
  %126 = load i32, ptr %21, align 4, !tbaa !11
  tail call void @_ZN4dart8external3ode11_dSolveLDLTEPKdS3_Pdii(ptr noundef %123, ptr noundef %124, ptr noundef %125, i32 noundef %79, i32 noundef %126)
  %127 = load ptr, ptr %28, align 8, !tbaa !18
  tail call void @_ZN4dart8external3ode9_dSetZeroEPdm(ptr noundef %127, i64 noundef %wide.trip.count125)
  %128 = load ptr, ptr %39, align 8, !tbaa !29
  %min.iters.check138 = icmp ult i32 %79, 8
  br i1 %min.iters.check138, label %.lr.ph104.preheader151, label %vector.ph139

.lr.ph104.preheader151:                           ; preds = %middle.block136, %.lr.ph104.preheader
  %indvars.iv127.ph = phi i64 [ 0, %.lr.ph104.preheader ], [ %n.vec141, %middle.block136 ]
  br label %.lr.ph104

vector.ph139:                                     ; preds = %.lr.ph104.preheader
  %n.vec141 = and i64 %wide.trip.count125, 2147483640
  br label %vector.body143

vector.body143:                                   ; preds = %vector.body143, %vector.ph139
  %index144 = phi i64 [ 0, %vector.ph139 ], [ %index.next149, %vector.body143 ]
  %vec.ind145 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph139 ], [ %vec.ind.next148, %vector.body143 ]
  %step.add146 = add <4 x i32> %vec.ind145, <i32 4, i32 4, i32 4, i32 4>
  %129 = getelementptr inbounds i32, ptr %128, i64 %index144
  %130 = getelementptr inbounds i8, ptr %129, i64 16
  store <4 x i32> %vec.ind145, ptr %129, align 4, !tbaa !33
  store <4 x i32> %step.add146, ptr %130, align 4, !tbaa !33
  %index.next149 = add nuw i64 %index144, 8
  %vec.ind.next148 = add <4 x i32> %vec.ind145, <i32 8, i32 8, i32 8, i32 8>
  %131 = icmp eq i64 %index.next149, %n.vec141
  br i1 %131, label %middle.block136, label %vector.body143, !llvm.loop !43

middle.block136:                                  ; preds = %vector.body143
  %cmp.n150 = icmp eq i64 %n.vec141, %wide.trip.count125
  br i1 %cmp.n150, label %._crit_edge105, label %.lr.ph104.preheader151

132:                                              ; preds = %132, %.new
  %indvars.iv122 = phi i64 [ 0, %.new ], [ %indvars.iv.next123.1, %132 ]
  %.083100 = phi ptr [ %109, %.new ], [ %142, %132 ]
  %niter158 = phi i64 [ 0, %.new ], [ %niter158.next.1, %132 ]
  %133 = load ptr, ptr %25, align 8, !tbaa !15
  %134 = getelementptr inbounds ptr, ptr %133, i64 %indvars.iv122
  %135 = load ptr, ptr %134, align 8, !tbaa !30
  %indvars.iv.next123 = or disjoint i64 %indvars.iv122, 1
  %136 = shl nuw nsw i64 %indvars.iv.next123, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %.083100, ptr noundef nonnull align 8 dereferenceable(1) %135, i64 %136, i1 false)
  %137 = getelementptr inbounds double, ptr %.083100, i64 %111
  %138 = load ptr, ptr %25, align 8, !tbaa !15
  %139 = getelementptr inbounds ptr, ptr %138, i64 %indvars.iv.next123
  %140 = load ptr, ptr %139, align 8, !tbaa !30
  %indvars.iv.next123.1 = add nuw nsw i64 %indvars.iv122, 2
  %141 = shl nuw nsw i64 %indvars.iv.next123.1, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %137, ptr noundef nonnull align 8 dereferenceable(1) %140, i64 %141, i1 false)
  %142 = getelementptr inbounds double, ptr %137, i64 %111
  %niter158.next.1 = add i64 %niter158, 2
  %niter158.ncmp.1 = icmp eq i64 %niter158.next.1, %unroll_iter157
  br i1 %niter158.ncmp.1, label %.lr.ph104.preheader.unr-lcssa, label %132, !llvm.loop !44

._crit_edge105:                                   ; preds = %.lr.ph104, %middle.block136
  store i32 %79, ptr %23, align 4, !tbaa !13
  br label %145

.lr.ph104:                                        ; preds = %.lr.ph104.preheader151, %.lr.ph104
  %indvars.iv127 = phi i64 [ %indvars.iv.next128, %.lr.ph104 ], [ %indvars.iv127.ph, %.lr.ph104.preheader151 ]
  %143 = getelementptr inbounds i32, ptr %128, i64 %indvars.iv127
  %144 = trunc nuw nsw i64 %indvars.iv127 to i32
  store i32 %144, ptr %143, align 4, !tbaa !33
  %indvars.iv.next128 = add nuw nsw i64 %indvars.iv127, 1
  %exitcond131.not = icmp eq i64 %indvars.iv.next128, %wide.trip.count125
  br i1 %exitcond131.not, label %._crit_edge105, label %.lr.ph104, !llvm.loop !45

145:                                              ; preds = %._crit_edge105, %._crit_edge99
  %146 = load ptr, ptr %37, align 8, !tbaa !27
  %.not = icmp eq ptr %146, null
  br i1 %.not, label %.loopexit, label %147

147:                                              ; preds = %145
  %148 = load i32, ptr %22, align 8, !tbaa !12
  %149 = load i32, ptr %0, align 8, !tbaa !5
  %.not88.not107 = icmp sgt i32 %149, %148
  br i1 %.not88.not107, label %.lr.ph111.preheader, label %.loopexit

.lr.ph111.preheader:                              ; preds = %147
  %150 = sext i32 %149 to i64
  %151 = sext i32 %148 to i64
  br label %.lr.ph111

.lr.ph111:                                        ; preds = %.lr.ph111.preheader, %170
  %indvars.iv132 = phi i64 [ %150, %.lr.ph111.preheader ], [ %indvars.iv.next133, %170 ]
  %.076108 = phi i32 [ 0, %.lr.ph111.preheader ], [ %.1, %170 ]
  %indvars.iv.next133 = add nsw i64 %indvars.iv132, -1
  %152 = getelementptr inbounds i32, ptr %146, i64 %indvars.iv.next133
  %153 = load i32, ptr %152, align 4, !tbaa !33
  %154 = icmp sgt i32 %153, -1
  br i1 %154, label %155, label %170

155:                                              ; preds = %.lr.ph111
  %156 = load ptr, ptr %25, align 8, !tbaa !15
  %157 = load ptr, ptr %26, align 8, !tbaa !16
  %158 = load ptr, ptr %27, align 8, !tbaa !17
  %159 = load ptr, ptr %28, align 8, !tbaa !18
  %160 = load ptr, ptr %29, align 8, !tbaa !19
  %161 = load ptr, ptr %30, align 8, !tbaa !20
  %162 = load ptr, ptr %38, align 8, !tbaa !28
  %163 = load ptr, ptr %36, align 8, !tbaa !26
  %164 = load i32, ptr %0, align 8, !tbaa !5
  %165 = xor i32 %.076108, -1
  %166 = add i32 %164, %165
  %167 = load i32, ptr %21, align 4, !tbaa !11
  %168 = trunc nsw i64 %indvars.iv.next133 to i32
  tail call void @_ZN4dart8external3odeL11swapProblemEPPdS2_S2_S2_S2_S2_PiPbS4_iiiii(ptr noundef %156, ptr noundef %157, ptr noundef %158, ptr noundef %159, ptr noundef %160, ptr noundef %161, ptr noundef %162, ptr noundef %163, ptr noundef nonnull %146, i32 noundef %164, i32 noundef %168, i32 noundef %166, i32 noundef %167, i32 noundef 1)
  %169 = add nsw i32 %.076108, 1
  br label %170

170:                                              ; preds = %.lr.ph111, %155
  %.1 = phi i32 [ %169, %155 ], [ %.076108, %.lr.ph111 ]
  %.not88.not = icmp sgt i64 %indvars.iv.next133, %151
  br i1 %.not88.not, label %.lr.ph111, label %.loopexit, !llvm.loop !46

.loopexit:                                        ; preds = %170, %147, %145
  ret void
}

declare void @_ZN4dart8external3ode9_dSetZeroEPdm(ptr noundef, i64 noundef) local_unnamed_addr #1

; Function Attrs: mustprogress uwtable
declare hidden void @_ZN4dart8external3odeL11swapProblemEPPdS2_S2_S2_S2_S2_PiPbS4_iiiii(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

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

declare void @_ZN4dart8external3ode12_dFactorLDLTEPdS2_ii(ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

declare void @_ZN4dart8external3ode11_dSolveLDLTEPKdS3_Pdii(ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

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

!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 0}
!6 = !{!"_ZTSN4dart8external3ode4dLCPE", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!6, !7, i64 4}
!12 = !{!6, !7, i64 8}
!13 = !{!6, !7, i64 12}
!14 = !{!6, !7, i64 16}
!15 = !{!6, !10, i64 24}
!16 = !{!6, !10, i64 32}
!17 = !{!6, !10, i64 40}
!18 = !{!6, !10, i64 48}
!19 = !{!6, !10, i64 56}
!20 = !{!6, !10, i64 64}
!21 = !{!6, !10, i64 72}
!22 = !{!6, !10, i64 80}
!23 = !{!6, !10, i64 88}
!24 = !{!6, !10, i64 96}
!25 = !{!6, !10, i64 104}
!26 = !{!6, !10, i64 112}
!27 = !{!6, !10, i64 120}
!28 = !{!6, !10, i64 128}
!29 = !{!6, !10, i64 136}
!30 = !{!10, !10, i64 0}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.unroll.disable"}
!33 = !{!7, !7, i64 0}
!34 = distinct !{!34, !35, !36, !37}
!35 = !{!"llvm.loop.mustprogress"}
!36 = !{!"llvm.loop.isvectorized", i32 1}
!37 = !{!"llvm.loop.unroll.runtime.disable"}
!38 = distinct !{!38, !35}
!39 = distinct !{!39, !35, !37, !36}
!40 = !{!41, !41, i64 0}
!41 = !{!"double", !8, i64 0}
!42 = distinct !{!42, !35}
!43 = distinct !{!43, !35, !36, !37}
!44 = distinct !{!44, !35}
!45 = distinct !{!45, !35, !37, !36}
!46 = distinct !{!46, !35}


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