; LLVM IR from microsoft/LightAIMD :: src (dft_matrices)

; 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.timespec = type { i64, i64 }
%struct.molecular_grid_desc = type { ptr, i64, i64, i64, i64, i64, ptr, ptr, i64, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, double, double, ptr, ptr, ptr, ptr, i64, 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, i64, i64, ptr, ptr, ptr, ptr, ptr }
%struct.scf_context = type { ptr, i64, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, i64, double, double, double, i64, double, double, i64, double, i64, i64, ptr, ptr, ptr, i64, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, ptr, ptr, ptr, ptr, i64 }

@.str = external hidden unnamed_addr constant [32 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [32 x i8], align 1
@XC_TYPE_LDA = external constant i64, align 8
@XC_TYPE_GGA = external constant i64, align 8
@XC_TYPE_MGGA = external constant i64, align 8
@.str.2 = external hidden unnamed_addr constant [31 x i8], align 1

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

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

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

declare void @mat_add(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef) #2

declare void @mat_scalar_multiply(ptr noundef, ptr noundef, i64 noundef, i64 noundef, double noundef) #2

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

98:                                               ; preds = %1
  call void @get_wall_time(ptr noundef %19)
  %99 = load ptr, ptr %2, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.molecular_grid_desc, ptr %99, i32 0, i32 70
  %101 = load i64, ptr %100, align 8, !tbaa !31
  %102 = load ptr, ptr %2, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.molecular_grid_desc, ptr %102, i32 0, i32 8
  %104 = load i64, ptr %103, align 8, !tbaa !32
  %105 = load ptr, ptr %5, align 8, !tbaa !5
  %106 = load ptr, ptr %6, align 8, !tbaa !5
  %107 = load ptr, ptr %7, align 8, !tbaa !5
  %108 = load ptr, ptr %8, align 8, !tbaa !5
  %109 = load ptr, ptr %9, align 8, !tbaa !5
  %110 = load ptr, ptr %10, align 8, !tbaa !5
  %111 = load ptr, ptr %2, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.molecular_grid_desc, ptr %111, i32 0, i32 45
  %113 = load ptr, ptr %112, align 8, !tbaa !33
  %114 = load ptr, ptr %2, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.molecular_grid_desc, ptr %114, i32 0, i32 46
  %116 = load ptr, ptr %115, align 8, !tbaa !34
  %117 = load ptr, ptr %2, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.molecular_grid_desc, ptr %117, i32 0, i32 47
  %119 = load ptr, ptr %118, align 8, !tbaa !35
  call void @libxc_exc_vxc(i64 noundef %101, i64 noundef %104, ptr noundef %105, ptr noundef %106, ptr noundef %107, ptr noundef %108, ptr noundef %109, ptr noundef %110, ptr noundef %113, ptr noundef %116, ptr noundef %119)
  call void @get_wall_time(ptr noundef %20)
  br label %120

120:                                              ; preds = %98
  %121 = load ptr, ptr %3, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.scf_context, ptr %121, i32 0, i32 55
  %123 = load i64, ptr %122, align 8, !tbaa !36
  %124 = icmp ne i64 %123, 0
  br i1 %124, label %128, label %125

125:                                              ; preds = %120
  %126 = call double @diff_time_ms(ptr noundef %19, ptr noundef %20)
  %127 = call i32 (ptr, ...) @printf(ptr noundef @.str, double noundef %126)
  br label %128

128:                                              ; preds = %125, %120
  br label %129

129:                                              ; preds = %128
  br label %130

130:                                              ; preds = %129
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  %131 = load ptr, ptr %2, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.molecular_grid_desc, ptr %131, i32 0, i32 70
  %133 = load i64, ptr %132, align 8, !tbaa !31
  %134 = call double @libxc_hyb_coef(i64 noundef %133)
  store double %134, ptr %21, align 8, !tbaa !37
  %135 = load double, ptr %21, align 8, !tbaa !37
  %136 = fcmp ogt double %135, 0.000000e+00
  br i1 %136, label %137, label %156

137:                                              ; preds = %130
  %138 = load ptr, ptr %3, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.scf_context, ptr %138, i32 0, i32 22
  %140 = load ptr, ptr %139, align 8, !tbaa !38
  %141 = load ptr, ptr %2, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.molecular_grid_desc, ptr %141, i32 0, i32 27
  %143 = load ptr, ptr %142, align 8, !tbaa !39
  %144 = load ptr, ptr %14, align 8, !tbaa !5
  %145 = load i64, ptr %4, align 8, !tbaa !15
  %146 = load i64, ptr %4, align 8, !tbaa !15
  %147 = load i64, ptr %4, align 8, !tbaa !15
  call void @einsum_mn_np__mp(ptr noundef %140, ptr noundef %143, ptr noundef %144, i64 noundef %145, i64 noundef %146, i64 noundef %147)
  %148 = load ptr, ptr %14, align 8, !tbaa !5
  %149 = load i64, ptr %4, align 8, !tbaa !15
  %150 = call double @mattrace(ptr noundef %148, i64 noundef %149)
  %151 = fmul double -2.500000e-01, %150
  %152 = load double, ptr %21, align 8, !tbaa !37
  %153 = fmul double %151, %152
  %154 = load ptr, ptr %2, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.molecular_grid_desc, ptr %154, i32 0, i32 28
  store double %153, ptr %155, align 8, !tbaa !30
  br label %156

156:                                              ; preds = %137, %130
  %157 = load double, ptr %21, align 8, !tbaa !37
  %158 = load ptr, ptr %2, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.molecular_grid_desc, ptr %158, i32 0, i32 30
  store double %157, ptr %159, align 8, !tbaa !40
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  br label %185

160:                                              ; preds = %1
  %161 = load ptr, ptr %9, align 8, !tbaa !5
  %162 = load ptr, ptr %2, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.molecular_grid_desc, ptr %162, i32 0, i32 8
  %164 = load i64, ptr %163, align 8, !tbaa !32
  %165 = mul i64 %164, 8
  call void @llvm.memset.p0.i64(ptr align 8 %161, i8 0, i64 %165, i1 false)
  %166 = load ptr, ptr %10, align 8, !tbaa !5
  %167 = load ptr, ptr %2, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct.molecular_grid_desc, ptr %167, i32 0, i32 8
  %169 = load i64, ptr %168, align 8, !tbaa !32
  %170 = mul i64 %169, 8
  call void @llvm.memset.p0.i64(ptr align 8 %166, i8 0, i64 %170, i1 false)
  %171 = load ptr, ptr %2, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.molecular_grid_desc, ptr %171, i32 0, i32 45
  %173 = load ptr, ptr %172, align 8, !tbaa !33
  %174 = load ptr, ptr %2, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.molecular_grid_desc, ptr %174, i32 0, i32 8
  %176 = load i64, ptr %175, align 8, !tbaa !32
  %177 = mul i64 %176, 8
  call void @llvm.memset.p0.i64(ptr align 8 %173, i8 0, i64 %177, i1 false)
  %178 = load ptr, ptr %2, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.molecular_grid_desc, ptr %178, i32 0, i32 47
  %180 = load ptr, ptr %179, align 8, !tbaa !35
  %181 = load ptr, ptr %2, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.molecular_grid_desc, ptr %181, i32 0, i32 8
  %183 = load i64, ptr %182, align 8, !tbaa !32
  %184 = mul i64 %183, 8
  call void @llvm.memset.p0.i64(ptr align 8 %180, i8 0, i64 %184, i1 false)
  br label %185

185:                                              ; preds = %160, %156
  %186 = load ptr, ptr %2, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.molecular_grid_desc, ptr %186, i32 0, i32 71
  %188 = load i64, ptr %187, align 8, !tbaa !41
  %189 = icmp ne i64 %188, 0
  br i1 %189, label %190, label %223

190:                                              ; preds = %185
  call void @get_wall_time(ptr noundef %19)
  %191 = load ptr, ptr %2, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.molecular_grid_desc, ptr %191, i32 0, i32 71
  %193 = load i64, ptr %192, align 8, !tbaa !41
  %194 = load ptr, ptr %2, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.molecular_grid_desc, ptr %194, i32 0, i32 8
  %196 = load i64, ptr %195, align 8, !tbaa !32
  %197 = load ptr, ptr %5, align 8, !tbaa !5
  %198 = load ptr, ptr %6, align 8, !tbaa !5
  %199 = load ptr, ptr %7, align 8, !tbaa !5
  %200 = load ptr, ptr %8, align 8, !tbaa !5
  %201 = load ptr, ptr %11, align 8, !tbaa !5
  %202 = load ptr, ptr %12, align 8, !tbaa !5
  %203 = load ptr, ptr %2, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.molecular_grid_desc, ptr %203, i32 0, i32 50
  %205 = load ptr, ptr %204, align 8, !tbaa !42
  %206 = load ptr, ptr %2, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.molecular_grid_desc, ptr %206, i32 0, i32 51
  %208 = load ptr, ptr %207, align 8, !tbaa !43
  %209 = load ptr, ptr %2, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.molecular_grid_desc, ptr %209, i32 0, i32 52
  %211 = load ptr, ptr %210, align 8, !tbaa !44
  call void @libxc_exc_vxc(i64 noundef %193, i64 noundef %196, ptr noundef %197, ptr noundef %198, ptr noundef %199, ptr noundef %200, ptr noundef %201, ptr noundef %202, ptr noundef %205, ptr noundef %208, ptr noundef %211)
  call void @get_wall_time(ptr noundef %20)
  br label %212

212:                                              ; preds = %190
  %213 = load ptr, ptr %3, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.scf_context, ptr %213, i32 0, i32 55
  %215 = load i64, ptr %214, align 8, !tbaa !36
  %216 = icmp ne i64 %215, 0
  br i1 %216, label %220, label %217

217:                                              ; preds = %212
  %218 = call double @diff_time_ms(ptr noundef %19, ptr noundef %20)
  %219 = call i32 (ptr, ...) @printf(ptr noundef @.str.1, double noundef %218)
  br label %220

220:                                              ; preds = %217, %212
  br label %221

221:                                              ; preds = %220
  br label %222

222:                                              ; preds = %221
  br label %248

223:                                              ; preds = %185
  %224 = load ptr, ptr %11, align 8, !tbaa !5
  %225 = load ptr, ptr %2, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.molecular_grid_desc, ptr %225, i32 0, i32 8
  %227 = load i64, ptr %226, align 8, !tbaa !32
  %228 = mul i64 %227, 8
  call void @llvm.memset.p0.i64(ptr align 8 %224, i8 0, i64 %228, i1 false)
  %229 = load ptr, ptr %12, align 8, !tbaa !5
  %230 = load ptr, ptr %2, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.molecular_grid_desc, ptr %230, i32 0, i32 8
  %232 = load i64, ptr %231, align 8, !tbaa !32
  %233 = mul i64 %232, 8
  call void @llvm.memset.p0.i64(ptr align 8 %229, i8 0, i64 %233, i1 false)
  %234 = load ptr, ptr %2, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.molecular_grid_desc, ptr %234, i32 0, i32 50
  %236 = load ptr, ptr %235, align 8, !tbaa !42
  %237 = load ptr, ptr %2, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.molecular_grid_desc, ptr %237, i32 0, i32 8
  %239 = load i64, ptr %238, align 8, !tbaa !32
  %240 = mul i64 %239, 8
  call void @llvm.memset.p0.i64(ptr align 8 %236, i8 0, i64 %240, i1 false)
  %241 = load ptr, ptr %2, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.molecular_grid_desc, ptr %241, i32 0, i32 52
  %243 = load ptr, ptr %242, align 8, !tbaa !44
  %244 = load ptr, ptr %2, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.molecular_grid_desc, ptr %244, i32 0, i32 8
  %246 = load i64, ptr %245, align 8, !tbaa !32
  %247 = mul i64 %246, 8
  call void @llvm.memset.p0.i64(ptr align 8 %243, i8 0, i64 %247, i1 false)
  br label %248

248:                                              ; preds = %223, %222
  %249 = load ptr, ptr %2, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.molecular_grid_desc, ptr %249, i32 0, i32 28
  %251 = load double, ptr %250, align 8, !tbaa !30
  %252 = load ptr, ptr %2, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.molecular_grid_desc, ptr %252, i32 0, i32 29
  store double %251, ptr %253, align 8, !tbaa !45
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #6
  store i64 0, ptr %22, align 8, !tbaa !15
  br label %254

254:                                              ; preds = %286, %248
  %255 = load i64, ptr %22, align 8, !tbaa !15
  %256 = load ptr, ptr %2, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.molecular_grid_desc, ptr %256, i32 0, i32 8
  %258 = load i64, ptr %257, align 8, !tbaa !32
  %259 = icmp ult i64 %255, %258
  br i1 %259, label %261, label %260

260:                                              ; preds = %254
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #6
  br label %289

261:                                              ; preds = %254
  %262 = load ptr, ptr %2, align 8, !tbaa !5
  %263 = getelementptr inbounds %struct.molecular_grid_desc, ptr %262, i32 0, i32 11
  %264 = load ptr, ptr %263, align 8, !tbaa !46
  %265 = load i64, ptr %22, align 8, !tbaa !15
  %266 = getelementptr inbounds double, ptr %264, i64 %265
  %267 = load double, ptr %266, align 8, !tbaa !37
  %268 = load ptr, ptr %9, align 8, !tbaa !5
  %269 = load i64, ptr %22, align 8, !tbaa !15
  %270 = getelementptr inbounds double, ptr %268, i64 %269
  %271 = load double, ptr %270, align 8, !tbaa !37
  %272 = load ptr, ptr %11, align 8, !tbaa !5
  %273 = load i64, ptr %22, align 8, !tbaa !15
  %274 = getelementptr inbounds double, ptr %272, i64 %273
  %275 = load double, ptr %274, align 8, !tbaa !37
  %276 = fadd double %271, %275
  %277 = fmul double %267, %276
  %278 = load ptr, ptr %5, align 8, !tbaa !5
  %279 = load i64, ptr %22, align 8, !tbaa !15
  %280 = getelementptr inbounds double, ptr %278, i64 %279
  %281 = load double, ptr %280, align 8, !tbaa !37
  %282 = load ptr, ptr %2, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.molecular_grid_desc, ptr %282, i32 0, i32 29
  %284 = load double, ptr %283, align 8, !tbaa !45
  %285 = call double @llvm.fmuladd.f64(double %277, double %281, double %284)
  store double %285, ptr %283, align 8, !tbaa !45
  br label %286

286:                                              ; preds = %261
  %287 = load i64, ptr %22, align 8, !tbaa !15
  %288 = add i64 %287, 1
  store i64 %288, ptr %22, align 8, !tbaa !15
  br label %254, !llvm.loop !47

289:                                              ; preds = %260
  %290 = load ptr, ptr %2, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.molecular_grid_desc, ptr %290, i32 0, i32 44
  %292 = load ptr, ptr %291, align 8, !tbaa !21
  %293 = load ptr, ptr %2, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.molecular_grid_desc, ptr %293, i32 0, i32 49
  %295 = load ptr, ptr %294, align 8, !tbaa !23
  %296 = load ptr, ptr %18, align 8, !tbaa !5
  %297 = load ptr, ptr %2, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.molecular_grid_desc, ptr %297, i32 0, i32 8
  %299 = load i64, ptr %298, align 8, !tbaa !32
  call void @mat_add(ptr noundef %292, ptr noundef %295, ptr noundef %296, i64 noundef %299, i64 noundef 1)
  %300 = load ptr, ptr %2, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.molecular_grid_desc, ptr %300, i32 0, i32 11
  %302 = load ptr, ptr %301, align 8, !tbaa !46
  %303 = load ptr, ptr %18, align 8, !tbaa !5
  %304 = load ptr, ptr %16, align 8, !tbaa !5
  %305 = load ptr, ptr %2, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.molecular_grid_desc, ptr %305, i32 0, i32 8
  %307 = load i64, ptr %306, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %302, ptr noundef %303, ptr noundef %304, i64 noundef %307, i64 noundef 1)
  %308 = load ptr, ptr %16, align 8, !tbaa !5
  %309 = load ptr, ptr %16, align 8, !tbaa !5
  %310 = load ptr, ptr %2, align 8, !tbaa !5
  %311 = getelementptr inbounds %struct.molecular_grid_desc, ptr %310, i32 0, i32 8
  %312 = load i64, ptr %311, align 8, !tbaa !32
  call void @mat_scalar_multiply(ptr noundef %308, ptr noundef %309, i64 noundef %312, i64 noundef 1, double noundef 5.000000e-01)
  %313 = load ptr, ptr %2, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.molecular_grid_desc, ptr %313, i32 0, i32 35
  %315 = load i64, ptr %314, align 8, !tbaa !49
  %316 = load i64, ptr @XC_TYPE_LDA, align 8, !tbaa !15
  %317 = icmp eq i64 %315, %316
  br i1 %317, label %318, label %332

318:                                              ; preds = %289
  %319 = load ptr, ptr %2, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.molecular_grid_desc, ptr %319, i32 0, i32 13
  %321 = load ptr, ptr %320, align 8, !tbaa !50
  %322 = load ptr, ptr %2, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.molecular_grid_desc, ptr %322, i32 0, i32 13
  %324 = load ptr, ptr %323, align 8, !tbaa !50
  %325 = load ptr, ptr %16, align 8, !tbaa !5
  %326 = load ptr, ptr %13, align 8, !tbaa !5
  %327 = load ptr, ptr %2, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.molecular_grid_desc, ptr %327, i32 0, i32 8
  %329 = load i64, ptr %328, align 8, !tbaa !32
  %330 = load i64, ptr %4, align 8, !tbaa !15
  %331 = load i64, ptr %4, align 8, !tbaa !15
  call void @einsum_mn_mp_m__np(ptr noundef %321, ptr noundef %324, ptr noundef %325, ptr noundef %326, i64 noundef %329, i64 noundef %330, i64 noundef %331)
  br label %332

332:                                              ; preds = %318, %289
  %333 = load ptr, ptr %2, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.molecular_grid_desc, ptr %333, i32 0, i32 35
  %335 = load i64, ptr %334, align 8, !tbaa !49
  %336 = load i64, ptr @XC_TYPE_GGA, align 8, !tbaa !15
  %337 = icmp eq i64 %335, %336
  br i1 %337, label %344, label %338

338:                                              ; preds = %332
  %339 = load ptr, ptr %2, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.molecular_grid_desc, ptr %339, i32 0, i32 35
  %341 = load i64, ptr %340, align 8, !tbaa !49
  %342 = load i64, ptr @XC_TYPE_MGGA, align 8, !tbaa !15
  %343 = icmp eq i64 %341, %342
  br i1 %343, label %344, label %743

344:                                              ; preds = %338, %332
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  %345 = load ptr, ptr %2, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.molecular_grid_desc, ptr %345, i32 0, i32 64
  %347 = load ptr, ptr %346, align 8, !tbaa !51
  store ptr %347, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %348 = load ptr, ptr %2, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.molecular_grid_desc, ptr %348, i32 0, i32 65
  %350 = load ptr, ptr %349, align 8, !tbaa !52
  store ptr %350, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #6
  %351 = load ptr, ptr %2, align 8, !tbaa !5
  %352 = getelementptr inbounds %struct.molecular_grid_desc, ptr %351, i32 0, i32 66
  %353 = load ptr, ptr %352, align 8, !tbaa !53
  store ptr %353, ptr %25, align 8, !tbaa !5
  %354 = load ptr, ptr %2, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.molecular_grid_desc, ptr %354, i32 0, i32 45
  %356 = load ptr, ptr %355, align 8, !tbaa !33
  %357 = load ptr, ptr %2, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.molecular_grid_desc, ptr %357, i32 0, i32 50
  %359 = load ptr, ptr %358, align 8, !tbaa !42
  %360 = load ptr, ptr %18, align 8, !tbaa !5
  %361 = load ptr, ptr %2, align 8, !tbaa !5
  %362 = getelementptr inbounds %struct.molecular_grid_desc, ptr %361, i32 0, i32 8
  %363 = load i64, ptr %362, align 8, !tbaa !32
  call void @mat_add(ptr noundef %356, ptr noundef %359, ptr noundef %360, i64 noundef %363, i64 noundef 1)
  %364 = load ptr, ptr %2, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.molecular_grid_desc, ptr %364, i32 0, i32 11
  %366 = load ptr, ptr %365, align 8, !tbaa !46
  %367 = load ptr, ptr %18, align 8, !tbaa !5
  %368 = load ptr, ptr %23, align 8, !tbaa !5
  %369 = load ptr, ptr %2, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.molecular_grid_desc, ptr %369, i32 0, i32 8
  %371 = load i64, ptr %370, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %366, ptr noundef %367, ptr noundef %368, i64 noundef %371, i64 noundef 1)
  %372 = load ptr, ptr %23, align 8, !tbaa !5
  %373 = load ptr, ptr %2, align 8, !tbaa !5
  %374 = getelementptr inbounds %struct.molecular_grid_desc, ptr %373, i32 0, i32 37
  %375 = load ptr, ptr %374, align 8, !tbaa !54
  %376 = load ptr, ptr %23, align 8, !tbaa !5
  %377 = load ptr, ptr %2, align 8, !tbaa !5
  %378 = getelementptr inbounds %struct.molecular_grid_desc, ptr %377, i32 0, i32 8
  %379 = load i64, ptr %378, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %372, ptr noundef %375, ptr noundef %376, i64 noundef %379, i64 noundef 1)
  %380 = load ptr, ptr %23, align 8, !tbaa !5
  %381 = load ptr, ptr %23, align 8, !tbaa !5
  %382 = load ptr, ptr %2, align 8, !tbaa !5
  %383 = getelementptr inbounds %struct.molecular_grid_desc, ptr %382, i32 0, i32 8
  %384 = load i64, ptr %383, align 8, !tbaa !32
  call void @mat_scalar_multiply(ptr noundef %380, ptr noundef %381, i64 noundef %384, i64 noundef 1, double noundef 2.000000e+00)
  %385 = load ptr, ptr %2, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.molecular_grid_desc, ptr %385, i32 0, i32 11
  %387 = load ptr, ptr %386, align 8, !tbaa !46
  %388 = load ptr, ptr %18, align 8, !tbaa !5
  %389 = load ptr, ptr %24, align 8, !tbaa !5
  %390 = load ptr, ptr %2, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.molecular_grid_desc, ptr %390, i32 0, i32 8
  %392 = load i64, ptr %391, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %387, ptr noundef %388, ptr noundef %389, i64 noundef %392, i64 noundef 1)
  %393 = load ptr, ptr %24, align 8, !tbaa !5
  %394 = load ptr, ptr %2, align 8, !tbaa !5
  %395 = getelementptr inbounds %struct.molecular_grid_desc, ptr %394, i32 0, i32 38
  %396 = load ptr, ptr %395, align 8, !tbaa !55
  %397 = load ptr, ptr %24, align 8, !tbaa !5
  %398 = load ptr, ptr %2, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct.molecular_grid_desc, ptr %398, i32 0, i32 8
  %400 = load i64, ptr %399, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %393, ptr noundef %396, ptr noundef %397, i64 noundef %400, i64 noundef 1)
  %401 = load ptr, ptr %24, align 8, !tbaa !5
  %402 = load ptr, ptr %24, align 8, !tbaa !5
  %403 = load ptr, ptr %2, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.molecular_grid_desc, ptr %403, i32 0, i32 8
  %405 = load i64, ptr %404, align 8, !tbaa !32
  call void @mat_scalar_multiply(ptr noundef %401, ptr noundef %402, i64 noundef %405, i64 noundef 1, double noundef 2.000000e+00)
  %406 = load ptr, ptr %2, align 8, !tbaa !5
  %407 = getelementptr inbounds %struct.molecular_grid_desc, ptr %406, i32 0, i32 11
  %408 = load ptr, ptr %407, align 8, !tbaa !46
  %409 = load ptr, ptr %18, align 8, !tbaa !5
  %410 = load ptr, ptr %25, align 8, !tbaa !5
  %411 = load ptr, ptr %2, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.molecular_grid_desc, ptr %411, i32 0, i32 8
  %413 = load i64, ptr %412, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %408, ptr noundef %409, ptr noundef %410, i64 noundef %413, i64 noundef 1)
  %414 = load ptr, ptr %25, align 8, !tbaa !5
  %415 = load ptr, ptr %2, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.molecular_grid_desc, ptr %415, i32 0, i32 39
  %417 = load ptr, ptr %416, align 8, !tbaa !56
  %418 = load ptr, ptr %25, align 8, !tbaa !5
  %419 = load ptr, ptr %2, align 8, !tbaa !5
  %420 = getelementptr inbounds %struct.molecular_grid_desc, ptr %419, i32 0, i32 8
  %421 = load i64, ptr %420, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %414, ptr noundef %417, ptr noundef %418, i64 noundef %421, i64 noundef 1)
  %422 = load ptr, ptr %25, align 8, !tbaa !5
  %423 = load ptr, ptr %25, align 8, !tbaa !5
  %424 = load ptr, ptr %2, align 8, !tbaa !5
  %425 = getelementptr inbounds %struct.molecular_grid_desc, ptr %424, i32 0, i32 8
  %426 = load i64, ptr %425, align 8, !tbaa !32
  call void @mat_scalar_multiply(ptr noundef %422, ptr noundef %423, i64 noundef %426, i64 noundef 1, double noundef 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #6
  store i64 0, ptr %26, align 8, !tbaa !15
  br label %427

427:                                              ; preds = %498, %344
  %428 = load i64, ptr %26, align 8, !tbaa !15
  %429 = load ptr, ptr %2, align 8, !tbaa !5
  %430 = getelementptr inbounds %struct.molecular_grid_desc, ptr %429, i32 0, i32 8
  %431 = load i64, ptr %430, align 8, !tbaa !32
  %432 = icmp ult i64 %428, %431
  br i1 %432, label %434, label %433

433:                                              ; preds = %427
  store i32 9, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #6
  br label %501

434:                                              ; preds = %427
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  %435 = load i64, ptr %26, align 8, !tbaa !15
  %436 = load i64, ptr %4, align 8, !tbaa !15
  %437 = mul i64 %435, %436
  store i64 %437, ptr %28, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #6
  store i64 0, ptr %29, align 8, !tbaa !15
  br label %438

438:                                              ; preds = %494, %434
  %439 = load i64, ptr %29, align 8, !tbaa !15
  %440 = load i64, ptr %4, align 8, !tbaa !15
  %441 = icmp ult i64 %439, %440
  br i1 %441, label %443, label %442

442:                                              ; preds = %438
  store i32 12, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #6
  br label %497

443:                                              ; preds = %438
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #6
  %444 = load i64, ptr %28, align 8, !tbaa !15
  %445 = load i64, ptr %29, align 8, !tbaa !15
  %446 = add i64 %444, %445
  store i64 %446, ptr %30, align 8, !tbaa !15
  %447 = load ptr, ptr %2, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.molecular_grid_desc, ptr %447, i32 0, i32 13
  %449 = load ptr, ptr %448, align 8, !tbaa !50
  %450 = load i64, ptr %30, align 8, !tbaa !15
  %451 = getelementptr inbounds double, ptr %449, i64 %450
  %452 = load double, ptr %451, align 8, !tbaa !37
  %453 = load ptr, ptr %16, align 8, !tbaa !5
  %454 = load i64, ptr %26, align 8, !tbaa !15
  %455 = getelementptr inbounds double, ptr %453, i64 %454
  %456 = load double, ptr %455, align 8, !tbaa !37
  %457 = load ptr, ptr %2, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.molecular_grid_desc, ptr %457, i32 0, i32 14
  %459 = load ptr, ptr %458, align 8, !tbaa !57
  %460 = load i64, ptr %30, align 8, !tbaa !15
  %461 = getelementptr inbounds double, ptr %459, i64 %460
  %462 = load double, ptr %461, align 8, !tbaa !37
  %463 = load ptr, ptr %23, align 8, !tbaa !5
  %464 = load i64, ptr %26, align 8, !tbaa !15
  %465 = getelementptr inbounds double, ptr %463, i64 %464
  %466 = load double, ptr %465, align 8, !tbaa !37
  %467 = fmul double %462, %466
  %468 = call double @llvm.fmuladd.f64(double %452, double %456, double %467)
  %469 = load ptr, ptr %2, align 8, !tbaa !5
  %470 = getelementptr inbounds %struct.molecular_grid_desc, ptr %469, i32 0, i32 15
  %471 = load ptr, ptr %470, align 8, !tbaa !58
  %472 = load i64, ptr %30, align 8, !tbaa !15
  %473 = getelementptr inbounds double, ptr %471, i64 %472
  %474 = load double, ptr %473, align 8, !tbaa !37
  %475 = load ptr, ptr %24, align 8, !tbaa !5
  %476 = load i64, ptr %26, align 8, !tbaa !15
  %477 = getelementptr inbounds double, ptr %475, i64 %476
  %478 = load double, ptr %477, align 8, !tbaa !37
  %479 = call double @llvm.fmuladd.f64(double %474, double %478, double %468)
  %480 = load ptr, ptr %2, align 8, !tbaa !5
  %481 = getelementptr inbounds %struct.molecular_grid_desc, ptr %480, i32 0, i32 16
  %482 = load ptr, ptr %481, align 8, !tbaa !59
  %483 = load i64, ptr %30, align 8, !tbaa !15
  %484 = getelementptr inbounds double, ptr %482, i64 %483
  %485 = load double, ptr %484, align 8, !tbaa !37
  %486 = load ptr, ptr %25, align 8, !tbaa !5
  %487 = load i64, ptr %26, align 8, !tbaa !15
  %488 = getelementptr inbounds double, ptr %486, i64 %487
  %489 = load double, ptr %488, align 8, !tbaa !37
  %490 = call double @llvm.fmuladd.f64(double %485, double %489, double %479)
  %491 = load ptr, ptr %15, align 8, !tbaa !5
  %492 = load i64, ptr %30, align 8, !tbaa !15
  %493 = getelementptr inbounds double, ptr %491, i64 %492
  store double %490, ptr %493, align 8, !tbaa !37
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #6
  br label %494

494:                                              ; preds = %443
  %495 = load i64, ptr %29, align 8, !tbaa !15
  %496 = add i64 %495, 1
  store i64 %496, ptr %29, align 8, !tbaa !15
  br label %438, !llvm.loop !60

497:                                              ; preds = %442
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  br label %498

498:                                              ; preds = %497
  %499 = load i64, ptr %26, align 8, !tbaa !15
  %500 = add i64 %499, 1
  store i64 %500, ptr %26, align 8, !tbaa !15
  br label %427, !llvm.loop !61

501:                                              ; preds = %433
  call void @get_wall_time(ptr noundef %19)
  %502 = load ptr, ptr %2, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct.molecular_grid_desc, ptr %502, i32 0, i32 13
  %504 = load ptr, ptr %503, align 8, !tbaa !50
  %505 = load ptr, ptr %15, align 8, !tbaa !5
  %506 = load ptr, ptr %13, align 8, !tbaa !5
  %507 = load ptr, ptr %2, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.molecular_grid_desc, ptr %507, i32 0, i32 8
  %509 = load i64, ptr %508, align 8, !tbaa !32
  %510 = load i64, ptr %4, align 8, !tbaa !15
  %511 = load i64, ptr %4, align 8, !tbaa !15
  %512 = load ptr, ptr %3, align 8, !tbaa !5
  %513 = getelementptr inbounds %struct.scf_context, ptr %512, i32 0, i32 36
  %514 = load ptr, ptr %513, align 8, !tbaa !62
  call void @einsum_mn_mp__np_parallel(ptr noundef %504, ptr noundef %505, ptr noundef %506, i64 noundef %509, i64 noundef %510, i64 noundef %511, ptr noundef %514)
  call void @get_wall_time(ptr noundef %20)
  br label %515

515:                                              ; preds = %501
  %516 = load ptr, ptr %3, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct.scf_context, ptr %516, i32 0, i32 55
  %518 = load i64, ptr %517, align 8, !tbaa !36
  %519 = icmp ne i64 %518, 0
  br i1 %519, label %523, label %520

520:                                              ; preds = %515
  %521 = call double @diff_time_ms(ptr noundef %19, ptr noundef %20)
  %522 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %521)
  br label %523

523:                                              ; preds = %520, %515
  br label %524

524:                                              ; preds = %523
  br label %525

525:                                              ; preds = %524
  %526 = load ptr, ptr %2, align 8, !tbaa !5
  %527 = getelementptr inbounds %struct.molecular_grid_desc, ptr %526, i32 0, i32 35
  %528 = load i64, ptr %527, align 8, !tbaa !49
  %529 = load i64, ptr @XC_TYPE_MGGA, align 8, !tbaa !15
  %530 = icmp eq i64 %528, %529
  br i1 %530, label %531, label %742

531:                                              ; preds = %525
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #6
  %532 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %532, ptr %31, align 8, !tbaa !5
  %533 = load ptr, ptr %2, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.molecular_grid_desc, ptr %533, i32 0, i32 47
  %535 = load ptr, ptr %534, align 8, !tbaa !35
  %536 = load ptr, ptr %2, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.molecular_grid_desc, ptr %536, i32 0, i32 52
  %538 = load ptr, ptr %537, align 8, !tbaa !44
  %539 = load ptr, ptr %31, align 8, !tbaa !5
  %540 = load ptr, ptr %2, align 8, !tbaa !5
  %541 = getelementptr inbounds %struct.molecular_grid_desc, ptr %540, i32 0, i32 8
  %542 = load i64, ptr %541, align 8, !tbaa !32
  call void @mat_add(ptr noundef %535, ptr noundef %538, ptr noundef %539, i64 noundef %542, i64 noundef 1)
  %543 = load ptr, ptr %2, align 8, !tbaa !5
  %544 = getelementptr inbounds %struct.molecular_grid_desc, ptr %543, i32 0, i32 11
  %545 = load ptr, ptr %544, align 8, !tbaa !46
  %546 = load ptr, ptr %31, align 8, !tbaa !5
  %547 = load ptr, ptr %31, align 8, !tbaa !5
  %548 = load ptr, ptr %2, align 8, !tbaa !5
  %549 = getelementptr inbounds %struct.molecular_grid_desc, ptr %548, i32 0, i32 8
  %550 = load i64, ptr %549, align 8, !tbaa !32
  call void @mat_multiply(ptr noundef %545, ptr noundef %546, ptr noundef %547, i64 noundef %550, i64 noundef 1)
  %551 = load ptr, ptr %31, align 8, !tbaa !5
  %552 = load ptr, ptr %31, align 8, !tbaa !5
  %553 = load ptr, ptr %2, align 8, !tbaa !5
  %554 = getelementptr inbounds %struct.molecular_grid_desc, ptr %553, i32 0, i32 8
  %555 = load i64, ptr %554, align 8, !tbaa !32
  call void @mat_scalar_multiply(ptr noundef %551, ptr noundef %552, i64 noundef %555, i64 noundef 1, double noundef 2.500000e-01)
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #6
  store i64 0, ptr %32, align 8, !tbaa !15
  br label %556

556:                                              ; preds = %596, %531
  %557 = load i64, ptr %32, align 8, !tbaa !15
  %558 = load ptr, ptr %2, align 8, !tbaa !5
  %559 = getelementptr inbounds %struct.molecular_grid_desc, ptr %558, i32 0, i32 8
  %560 = load i64, ptr %559, align 8, !tbaa !32
  %561 = icmp ult i64 %557, %560
  br i1 %561, label %563, label %562

562:                                              ; preds = %556
  store i32 17, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #6
  br label %599

563:                                              ; preds = %556
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #6
  %564 = load ptr, ptr %31, align 8, !tbaa !5
  %565 = load i64, ptr %32, align 8, !tbaa !15
  %566 = getelementptr inbounds double, ptr %564, i64 %565
  %567 = load double, ptr %566, align 8, !tbaa !37
  store double %567, ptr %33, align 8, !tbaa !37
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #6
  %568 = load i64, ptr %32, align 8, !tbaa !15
  %569 = load i64, ptr %4, align 8, !tbaa !15
  %570 = mul i64 %568, %569
  store i64 %570, ptr %34, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #6
  store i64 0, ptr %35, align 8, !tbaa !15
  br label %571

571:                                              ; preds = %592, %563
  %572 = load i64, ptr %35, align 8, !tbaa !15
  %573 = load i64, ptr %4, align 8, !tbaa !15
  %574 = icmp ult i64 %572, %573
  br i1 %574, label %576, label %575

575:                                              ; preds = %571
  store i32 20, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #6
  br label %595

576:                                              ; preds = %571
  %577 = load double, ptr %33, align 8, !tbaa !37
  %578 = load ptr, ptr %2, align 8, !tbaa !5
  %579 = getelementptr inbounds %struct.molecular_grid_desc, ptr %578, i32 0, i32 14
  %580 = load ptr, ptr %579, align 8, !tbaa !57
  %581 = load i64, ptr %34, align 8, !tbaa !15
  %582 = load i64, ptr %35, align 8, !tbaa !15
  %583 = add i64 %581, %582
  %584 = getelementptr inbounds double, ptr %580, i64 %583
  %585 = load double, ptr %584, align 8, !tbaa !37
  %586 = fmul double %577, %585
  %587 = load ptr, ptr %17, align 8, !tbaa !5
  %588 = load i64, ptr %34, align 8, !tbaa !15
  %589 = load i64, ptr %35, align 8, !tbaa !15
  %590 = add i64 %588, %589
  %591 = getelementptr inbounds double, ptr %587, i64 %590
  store double %586, ptr %591, align 8, !tbaa !37
  br label %592

592:                                              ; preds = %576
  %593 = load i64, ptr %35, align 8, !tbaa !15
  %594 = add i64 %593, 1
  store i64 %594, ptr %35, align 8, !tbaa !15
  br label %571, !llvm.loop !63

595:                                              ; preds = %575
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #6
  br label %596

596:                                              ; preds = %595
  %597 = load i64, ptr %32, align 8, !tbaa !15
  %598 = add i64 %597, 1
  store i64 %598, ptr %32, align 8, !tbaa !15
  br label %556, !llvm.loop !64

599:                                              ; preds = %562
  %600 = load ptr, ptr %2, align 8, !tbaa !5
  %601 = getelementptr inbounds %struct.molecular_grid_desc, ptr %600, i32 0, i32 14
  %602 = load ptr, ptr %601, align 8, !tbaa !57
  %603 = load ptr, ptr %17, align 8, !tbaa !5
  %604 = load ptr, ptr %14, align 8, !tbaa !5
  %605 = load ptr, ptr %2, align 8, !tbaa !5
  %606 = getelementptr inbounds %struct.molecular_grid_desc, ptr %605, i32 0, i32 8
  %607 = load i64, ptr %606, align 8, !tbaa !32
  %608 = load i64, ptr %4, align 8, !tbaa !15
  %609 = load i64, ptr %4, align 8, !tbaa !15
  %610 = load ptr, ptr %3, align 8, !tbaa !5
  %611 = getelementptr inbounds %struct.scf_context, ptr %610, i32 0, i32 36
  %612 = load ptr, ptr %611, align 8, !tbaa !62
  call void @einsum_mn_mp__np_parallel(ptr noundef %602, ptr noundef %603, ptr noundef %604, i64 noundef %607, i64 noundef %608, i64 noundef %609, ptr noundef %612)
  %613 = load ptr, ptr %13, align 8, !tbaa !5
  %614 = load ptr, ptr %14, align 8, !tbaa !5
  %615 = load ptr, ptr %13, align 8, !tbaa !5
  %616 = load i64, ptr %4, align 8, !tbaa !15
  %617 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %613, ptr noundef %614, ptr noundef %615, i64 noundef %616, i64 noundef %617)
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #6
  store i64 0, ptr %36, align 8, !tbaa !15
  br label %618

618:                                              ; preds = %658, %599
  %619 = load i64, ptr %36, align 8, !tbaa !15
  %620 = load ptr, ptr %2, align 8, !tbaa !5
  %621 = getelementptr inbounds %struct.molecular_grid_desc, ptr %620, i32 0, i32 8
  %622 = load i64, ptr %621, align 8, !tbaa !32
  %623 = icmp ult i64 %619, %622
  br i1 %623, label %625, label %624

624:                                              ; preds = %618
  store i32 23, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #6
  br label %661

625:                                              ; preds = %618
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #6
  %626 = load ptr, ptr %31, align 8, !tbaa !5
  %627 = load i64, ptr %36, align 8, !tbaa !15
  %628 = getelementptr inbounds double, ptr %626, i64 %627
  %629 = load double, ptr %628, align 8, !tbaa !37
  store double %629, ptr %37, align 8, !tbaa !37
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #6
  %630 = load i64, ptr %36, align 8, !tbaa !15
  %631 = load i64, ptr %4, align 8, !tbaa !15
  %632 = mul i64 %630, %631
  store i64 %632, ptr %38, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #6
  store i64 0, ptr %39, align 8, !tbaa !15
  br label %633

633:                                              ; preds = %654, %625
  %634 = load i64, ptr %39, align 8, !tbaa !15
  %635 = load i64, ptr %4, align 8, !tbaa !15
  %636 = icmp ult i64 %634, %635
  br i1 %636, label %638, label %637

637:                                              ; preds = %633
  store i32 26, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #6
  br label %657

638:                                              ; preds = %633
  %639 = load double, ptr %37, align 8, !tbaa !37
  %640 = load ptr, ptr %2, align 8, !tbaa !5
  %641 = getelementptr inbounds %struct.molecular_grid_desc, ptr %640, i32 0, i32 15
  %642 = load ptr, ptr %641, align 8, !tbaa !58
  %643 = load i64, ptr %38, align 8, !tbaa !15
  %644 = load i64, ptr %39, align 8, !tbaa !15
  %645 = add i64 %643, %644
  %646 = getelementptr inbounds double, ptr %642, i64 %645
  %647 = load double, ptr %646, align 8, !tbaa !37
  %648 = fmul double %639, %647
  %649 = load ptr, ptr %17, align 8, !tbaa !5
  %650 = load i64, ptr %38, align 8, !tbaa !15
  %651 = load i64, ptr %39, align 8, !tbaa !15
  %652 = add i64 %650, %651
  %653 = getelementptr inbounds double, ptr %649, i64 %652
  store double %648, ptr %653, align 8, !tbaa !37
  br label %654

654:                                              ; preds = %638
  %655 = load i64, ptr %39, align 8, !tbaa !15
  %656 = add i64 %655, 1
  store i64 %656, ptr %39, align 8, !tbaa !15
  br label %633, !llvm.loop !65

657:                                              ; preds = %637
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #6
  br label %658

658:                                              ; preds = %657
  %659 = load i64, ptr %36, align 8, !tbaa !15
  %660 = add i64 %659, 1
  store i64 %660, ptr %36, align 8, !tbaa !15
  br label %618, !llvm.loop !66

661:                                              ; preds = %624
  %662 = load ptr, ptr %2, align 8, !tbaa !5
  %663 = getelementptr inbounds %struct.molecular_grid_desc, ptr %662, i32 0, i32 15
  %664 = load ptr, ptr %663, align 8, !tbaa !58
  %665 = load ptr, ptr %17, align 8, !tbaa !5
  %666 = load ptr, ptr %14, align 8, !tbaa !5
  %667 = load ptr, ptr %2, align 8, !tbaa !5
  %668 = getelementptr inbounds %struct.molecular_grid_desc, ptr %667, i32 0, i32 8
  %669 = load i64, ptr %668, align 8, !tbaa !32
  %670 = load i64, ptr %4, align 8, !tbaa !15
  %671 = load i64, ptr %4, align 8, !tbaa !15
  %672 = load ptr, ptr %3, align 8, !tbaa !5
  %673 = getelementptr inbounds %struct.scf_context, ptr %672, i32 0, i32 36
  %674 = load ptr, ptr %673, align 8, !tbaa !62
  call void @einsum_mn_mp__np_parallel(ptr noundef %664, ptr noundef %665, ptr noundef %666, i64 noundef %669, i64 noundef %670, i64 noundef %671, ptr noundef %674)
  %675 = load ptr, ptr %13, align 8, !tbaa !5
  %676 = load ptr, ptr %14, align 8, !tbaa !5
  %677 = load ptr, ptr %13, align 8, !tbaa !5
  %678 = load i64, ptr %4, align 8, !tbaa !15
  %679 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %675, ptr noundef %676, ptr noundef %677, i64 noundef %678, i64 noundef %679)
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #6
  store i64 0, ptr %40, align 8, !tbaa !15
  br label %680

680:                                              ; preds = %720, %661
  %681 = load i64, ptr %40, align 8, !tbaa !15
  %682 = load ptr, ptr %2, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.molecular_grid_desc, ptr %682, i32 0, i32 8
  %684 = load i64, ptr %683, align 8, !tbaa !32
  %685 = icmp ult i64 %681, %684
  br i1 %685, label %687, label %686

686:                                              ; preds = %680
  store i32 29, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #6
  br label %723

687:                                              ; preds = %680
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #6
  %688 = load ptr, ptr %31, align 8, !tbaa !5
  %689 = load i64, ptr %40, align 8, !tbaa !15
  %690 = getelementptr inbounds double, ptr %688, i64 %689
  %691 = load double, ptr %690, align 8, !tbaa !37
  store double %691, ptr %41, align 8, !tbaa !37
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #6
  %692 = load i64, ptr %40, align 8, !tbaa !15
  %693 = load i64, ptr %4, align 8, !tbaa !15
  %694 = mul i64 %692, %693
  store i64 %694, ptr %42, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #6
  store i64 0, ptr %43, align 8, !tbaa !15
  br label %695

695:                                              ; preds = %716, %687
  %696 = load i64, ptr %43, align 8, !tbaa !15
  %697 = load i64, ptr %4, align 8, !tbaa !15
  %698 = icmp ult i64 %696, %697
  br i1 %698, label %700, label %699

699:                                              ; preds = %695
  store i32 32, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #6
  br label %719

700:                                              ; preds = %695
  %701 = load double, ptr %41, align 8, !tbaa !37
  %702 = load ptr, ptr %2, align 8, !tbaa !5
  %703 = getelementptr inbounds %struct.molecular_grid_desc, ptr %702, i32 0, i32 16
  %704 = load ptr, ptr %703, align 8, !tbaa !59
  %705 = load i64, ptr %42, align 8, !tbaa !15
  %706 = load i64, ptr %43, align 8, !tbaa !15
  %707 = add i64 %705, %706
  %708 = getelementptr inbounds double, ptr %704, i64 %707
  %709 = load double, ptr %708, align 8, !tbaa !37
  %710 = fmul double %701, %709
  %711 = load ptr, ptr %17, align 8, !tbaa !5
  %712 = load i64, ptr %42, align 8, !tbaa !15
  %713 = load i64, ptr %43, align 8, !tbaa !15
  %714 = add i64 %712, %713
  %715 = getelementptr inbounds double, ptr %711, i64 %714
  store double %710, ptr %715, align 8, !tbaa !37
  br label %716

716:                                              ; preds = %700
  %717 = load i64, ptr %43, align 8, !tbaa !15
  %718 = add i64 %717, 1
  store i64 %718, ptr %43, align 8, !tbaa !15
  br label %695, !llvm.loop !67

719:                                              ; preds = %699
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #6
  br label %720

720:                                              ; preds = %719
  %721 = load i64, ptr %40, align 8, !tbaa !15
  %722 = add i64 %721, 1
  store i64 %722, ptr %40, align 8, !tbaa !15
  br label %680, !llvm.loop !68

723:                                              ; preds = %686
  %724 = load ptr, ptr %2, align 8, !tbaa !5
  %725 = getelementptr inbounds %struct.molecular_grid_desc, ptr %724, i32 0, i32 16
  %726 = load ptr, ptr %725, align 8, !tbaa !59
  %727 = load ptr, ptr %17, align 8, !tbaa !5
  %728 = load ptr, ptr %14, align 8, !tbaa !5
  %729 = load ptr, ptr %2, align 8, !tbaa !5
  %730 = getelementptr inbounds %struct.molecular_grid_desc, ptr %729, i32 0, i32 8
  %731 = load i64, ptr %730, align 8, !tbaa !32
  %732 = load i64, ptr %4, align 8, !tbaa !15
  %733 = load i64, ptr %4, align 8, !tbaa !15
  %734 = load ptr, ptr %3, align 8, !tbaa !5
  %735 = getelementptr inbounds %struct.scf_context, ptr %734, i32 0, i32 36
  %736 = load ptr, ptr %735, align 8, !tbaa !62
  call void @einsum_mn_mp__np_parallel(ptr noundef %726, ptr noundef %727, ptr noundef %728, i64 noundef %731, i64 noundef %732, i64 noundef %733, ptr noundef %736)
  %737 = load ptr, ptr %13, align 8, !tbaa !5
  %738 = load ptr, ptr %14, align 8, !tbaa !5
  %739 = load ptr, ptr %13, align 8, !tbaa !5
  %740 = load i64, ptr %4, align 8, !tbaa !15
  %741 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %737, ptr noundef %738, ptr noundef %739, i64 noundef %740, i64 noundef %741)
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #6
  br label %742

742:                                              ; preds = %723, %525
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  br label %743

743:                                              ; preds = %742, %338
  %744 = load ptr, ptr %13, align 8, !tbaa !5
  %745 = load ptr, ptr %14, align 8, !tbaa !5
  %746 = load i64, ptr %4, align 8, !tbaa !15
  %747 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add_A_AT(ptr noundef %744, ptr noundef %745, i64 noundef %746, i64 noundef %747)
  %748 = load ptr, ptr %13, align 8, !tbaa !5
  %749 = load ptr, ptr %14, align 8, !tbaa !5
  %750 = load i64, ptr %4, align 8, !tbaa !15
  %751 = load i64, ptr %4, align 8, !tbaa !15
  %752 = mul i64 %750, %751
  %753 = mul i64 %752, 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %748, ptr align 8 %749, i64 %753, i1 false)
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #6
  ret void
}

declare void @get_wall_time(ptr noundef) #2

declare void @libxc_exc_vxc(i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @printf(ptr noundef, ...) #2

declare double @diff_time_ms(ptr noundef, ptr noundef) #2

declare double @libxc_hyb_coef(i64 noundef) #2

declare void @einsum_mn_np__mp(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef) #2

declare double @mattrace(ptr noundef, i64 noundef) #2

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

declare void @mat_multiply(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef) #2

declare void @einsum_mn_mp_m__np(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef) #2

declare void @einsum_mn_mp__np_parallel(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef, ptr noundef) #2

declare void @mat_add_A_AT(ptr noundef, ptr noundef, i64 noundef, i64 noundef) #2

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 608}
!10 = !{!"molecular_grid_desc", !6, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !6, i64 48, !6, i64 56, !11, 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, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !12, i64 224, !12, i64 232, !12, i64 240, !6, i64 248, !6, i64 256, !6, i64 264, !6, i64 272, !11, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !6, i64 312, !6, i64 320, !6, i64 328, !6, i64 336, !6, i64 344, !6, i64 352, !6, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !6, i64 392, !6, i64 400, !6, i64 408, !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, !11, i64 560, !11, i64 568, !6, i64 576, !6, i64 584, !6, i64 592, !6, i64 600, !6, i64 608}
!11 = !{!"long", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !11, i64 8}
!14 = !{!"scf_context", !6, i64 0, !11, i64 8, !11, i64 16, !11, 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, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !12, i64 192, !11, i64 200, !12, i64 208, !12, i64 216, !12, i64 224, !11, i64 232, !12, i64 240, !12, i64 248, !11, i64 256, !12, i64 264, !11, i64 272, !11, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !11, i64 312, !11, i64 320, !11, i64 328, !6, i64 336, !6, i64 344, !6, i64 352, !6, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !6, i64 392, !12, i64 400, !6, i64 408, !6, i64 416, !6, i64 424, !6, i64 432, !11, i64 440}
!15 = !{!11, !11, i64 0}
!16 = !{!10, !6, i64 288}
!17 = !{!10, !6, i64 320}
!18 = !{!10, !6, i64 328}
!19 = !{!10, !6, i64 336}
!20 = !{!10, !6, i64 344}
!21 = !{!10, !6, i64 352}
!22 = !{!10, !6, i64 384}
!23 = !{!10, !6, i64 392}
!24 = !{!10, !6, i64 248}
!25 = !{!10, !6, i64 576}
!26 = !{!10, !6, i64 496}
!27 = !{!10, !6, i64 504}
!28 = !{!10, !6, i64 584}
!29 = !{!10, !6, i64 600}
!30 = !{!10, !12, i64 224}
!31 = !{!10, !11, i64 560}
!32 = !{!10, !11, i64 64}
!33 = !{!10, !6, i64 360}
!34 = !{!10, !6, i64 368}
!35 = !{!10, !6, i64 376}
!36 = !{!14, !11, i64 440}
!37 = !{!12, !12, i64 0}
!38 = !{!14, !6, i64 176}
!39 = !{!10, !6, i64 216}
!40 = !{!10, !12, i64 240}
!41 = !{!10, !11, i64 568}
!42 = !{!10, !6, i64 400}
!43 = !{!10, !6, i64 408}
!44 = !{!10, !6, i64 416}
!45 = !{!10, !12, i64 232}
!46 = !{!10, !6, i64 88}
!47 = distinct !{!47, !48}
!48 = !{!"llvm.loop.mustprogress"}
!49 = !{!10, !11, i64 280}
!50 = !{!10, !6, i64 104}
!51 = !{!10, !6, i64 512}
!52 = !{!10, !6, i64 520}
!53 = !{!10, !6, i64 528}
!54 = !{!10, !6, i64 296}
!55 = !{!10, !6, i64 304}
!56 = !{!10, !6, i64 312}
!57 = !{!10, !6, i64 112}
!58 = !{!10, !6, i64 120}
!59 = !{!10, !6, i64 128}
!60 = distinct !{!60, !48}
!61 = distinct !{!61, !48}
!62 = !{!14, !6, i64 288}
!63 = distinct !{!63, !48}
!64 = distinct !{!64, !48}
!65 = distinct !{!65, !48}
!66 = distinct !{!66, !48}
!67 = distinct !{!67, !48}
!68 = distinct !{!68, !48}


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

%struct.timespec = type { i64, i64 }

@.str = external hidden unnamed_addr constant [32 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [32 x i8], align 1
@XC_TYPE_LDA = external local_unnamed_addr constant i64, align 8
@XC_TYPE_GGA = external local_unnamed_addr constant i64, align 8
@XC_TYPE_MGGA = external local_unnamed_addr constant i64, align 8
@.str.2 = external hidden unnamed_addr constant [31 x i8], align 1

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

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

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

declare void @mat_add(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

declare void @mat_scalar_multiply(ptr noundef, ptr noundef, i64 noundef, i64 noundef, double noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local void @build_xc_matrix_with_grid(ptr noundef %0) local_unnamed_addr #3 {
  %2 = alloca %struct.timespec, align 8
  %3 = alloca %struct.timespec, align 8
  %4 = getelementptr inbounds i8, ptr %0, i64 608
  %5 = load ptr, ptr %4, align 8, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %5, i64 8
  %7 = load i64, ptr %6, align 8, !tbaa !12
  %8 = getelementptr inbounds i8, ptr %0, i64 288
  %9 = load ptr, ptr %8, align 8, !tbaa !14
  %10 = getelementptr inbounds i8, ptr %0, i64 320
  %11 = load ptr, ptr %10, align 8, !tbaa !15
  %12 = getelementptr inbounds i8, ptr %0, i64 328
  %13 = load ptr, ptr %12, align 8, !tbaa !16
  %14 = getelementptr inbounds i8, ptr %0, i64 336
  %15 = load ptr, ptr %14, align 8, !tbaa !17
  %16 = getelementptr inbounds i8, ptr %0, i64 344
  %17 = load ptr, ptr %16, align 8, !tbaa !18
  %18 = getelementptr inbounds i8, ptr %0, i64 352
  %19 = load ptr, ptr %18, align 8, !tbaa !19
  %20 = getelementptr inbounds i8, ptr %0, i64 384
  %21 = load ptr, ptr %20, align 8, !tbaa !20
  %22 = getelementptr inbounds i8, ptr %0, i64 392
  %23 = load ptr, ptr %22, align 8, !tbaa !21
  %24 = getelementptr inbounds i8, ptr %0, i64 248
  %25 = load ptr, ptr %24, align 8, !tbaa !22
  %26 = getelementptr inbounds i8, ptr %0, i64 576
  %27 = load ptr, ptr %26, align 8, !tbaa !23
  %28 = getelementptr inbounds i8, ptr %0, i64 496
  %29 = load ptr, ptr %28, align 8, !tbaa !24
  %30 = getelementptr inbounds i8, ptr %0, i64 504
  %31 = load ptr, ptr %30, align 8, !tbaa !25
  %32 = getelementptr inbounds i8, ptr %0, i64 584
  %33 = load ptr, ptr %32, align 8, !tbaa !26
  %34 = ptrtoint ptr %33 to i64
  %35 = getelementptr inbounds i8, ptr %0, i64 600
  %36 = load ptr, ptr %35, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3) #8
  %37 = getelementptr inbounds i8, ptr %0, i64 224
  store double 0.000000e+00, ptr %37, align 8, !tbaa !28
  %38 = getelementptr inbounds i8, ptr %0, i64 560
  %39 = load i64, ptr %38, align 8, !tbaa !29
  %.not = icmp eq i64 %39, 0
  br i1 %.not, label %69, label %40

40:                                               ; preds = %1
  call void @get_wall_time(ptr noundef nonnull %2) #8
  %41 = load i64, ptr %38, align 8, !tbaa !29
  %42 = getelementptr inbounds i8, ptr %0, i64 64
  %43 = load i64, ptr %42, align 8, !tbaa !30
  %44 = getelementptr inbounds i8, ptr %0, i64 360
  %45 = load ptr, ptr %44, align 8, !tbaa !31
  %46 = getelementptr inbounds i8, ptr %0, i64 368
  %47 = load ptr, ptr %46, align 8, !tbaa !32
  %48 = getelementptr inbounds i8, ptr %0, i64 376
  %49 = load ptr, ptr %48, align 8, !tbaa !33
  call void @libxc_exc_vxc(i64 noundef %41, i64 noundef %43, ptr noundef %9, ptr noundef %11, ptr noundef %13, ptr noundef %15, ptr noundef %17, ptr noundef %19, ptr noundef %45, ptr noundef %47, ptr noundef %49) #8
  call void @get_wall_time(ptr noundef nonnull %3) #8
  %50 = getelementptr inbounds i8, ptr %5, i64 440
  %51 = load i64, ptr %50, align 8, !tbaa !34
  %.not305 = icmp eq i64 %51, 0
  br i1 %.not305, label %52, label %55

52:                                               ; preds = %40
  %53 = call double @diff_time_ms(ptr noundef nonnull %2, ptr noundef nonnull %3) #8
  %54 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str, double noundef %53)
  br label %55

55:                                               ; preds = %52, %40
  %56 = load i64, ptr %38, align 8, !tbaa !29
  %57 = call double @libxc_hyb_coef(i64 noundef %56) #8
  %58 = fcmp ogt double %57, 0.000000e+00
  br i1 %58, label %59, label %67

59:                                               ; preds = %55
  %60 = getelementptr inbounds i8, ptr %5, i64 176
  %61 = load ptr, ptr %60, align 8, !tbaa !35
  %62 = getelementptr inbounds i8, ptr %0, i64 216
  %63 = load ptr, ptr %62, align 8, !tbaa !36
  call void @einsum_mn_np__mp(ptr noundef %61, ptr noundef %63, ptr noundef %27, i64 noundef %7, i64 noundef %7, i64 noundef %7) #8
  %64 = call double @mattrace(ptr noundef %27, i64 noundef %7) #8
  %65 = fmul double %64, -2.500000e-01
  %66 = fmul double %57, %65
  store double %66, ptr %37, align 8, !tbaa !28
  br label %67

67:                                               ; preds = %59, %55
  %68 = getelementptr inbounds i8, ptr %0, i64 240
  store double %57, ptr %68, align 8, !tbaa !37
  br label %83

69:                                               ; preds = %1
  %70 = getelementptr inbounds i8, ptr %0, i64 64
  %71 = load i64, ptr %70, align 8, !tbaa !30
  %72 = shl i64 %71, 3
  tail call void @llvm.memset.p0.i64(ptr align 8 %17, i8 0, i64 %72, i1 false)
  %73 = load i64, ptr %70, align 8, !tbaa !30
  %74 = shl i64 %73, 3
  tail call void @llvm.memset.p0.i64(ptr align 8 %19, i8 0, i64 %74, i1 false)
  %75 = getelementptr inbounds i8, ptr %0, i64 360
  %76 = load ptr, ptr %75, align 8, !tbaa !31
  %77 = load i64, ptr %70, align 8, !tbaa !30
  %78 = shl i64 %77, 3
  tail call void @llvm.memset.p0.i64(ptr align 8 %76, i8 0, i64 %78, i1 false)
  %79 = getelementptr inbounds i8, ptr %0, i64 376
  %80 = load ptr, ptr %79, align 8, !tbaa !33
  %81 = load i64, ptr %70, align 8, !tbaa !30
  %82 = shl i64 %81, 3
  tail call void @llvm.memset.p0.i64(ptr align 8 %80, i8 0, i64 %82, i1 false)
  br label %83

83:                                               ; preds = %69, %67
  %84 = getelementptr inbounds i8, ptr %0, i64 568
  %85 = load i64, ptr %84, align 8, !tbaa !38
  %.not306 = icmp eq i64 %85, 0
  br i1 %.not306, label %101, label %86

86:                                               ; preds = %83
  call void @get_wall_time(ptr noundef nonnull %2) #8
  %87 = load i64, ptr %84, align 8, !tbaa !38
  %88 = getelementptr inbounds i8, ptr %0, i64 64
  %89 = load i64, ptr %88, align 8, !tbaa !30
  %90 = getelementptr inbounds i8, ptr %0, i64 400
  %91 = load ptr, ptr %90, align 8, !tbaa !39
  %92 = getelementptr inbounds i8, ptr %0, i64 408
  %93 = load ptr, ptr %92, align 8, !tbaa !40
  %94 = getelementptr inbounds i8, ptr %0, i64 416
  %95 = load ptr, ptr %94, align 8, !tbaa !41
  call void @libxc_exc_vxc(i64 noundef %87, i64 noundef %89, ptr noundef %9, ptr noundef %11, ptr noundef %13, ptr noundef %15, ptr noundef %21, ptr noundef %23, ptr noundef %91, ptr noundef %93, ptr noundef %95) #8
  call void @get_wall_time(ptr noundef nonnull %3) #8
  %96 = getelementptr inbounds i8, ptr %5, i64 440
  %97 = load i64, ptr %96, align 8, !tbaa !34
  %.not307 = icmp eq i64 %97, 0
  br i1 %.not307, label %98, label %115

98:                                               ; preds = %86
  %99 = call double @diff_time_ms(ptr noundef nonnull %2, ptr noundef nonnull %3) #8
  %100 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.1, double noundef %99)
  br label %115

101:                                              ; preds = %83
  %102 = getelementptr inbounds i8, ptr %0, i64 64
  %103 = load i64, ptr %102, align 8, !tbaa !30
  %104 = shl i64 %103, 3
  call void @llvm.memset.p0.i64(ptr align 8 %21, i8 0, i64 %104, i1 false)
  %105 = load i64, ptr %102, align 8, !tbaa !30
  %106 = shl i64 %105, 3
  call void @llvm.memset.p0.i64(ptr align 8 %23, i8 0, i64 %106, i1 false)
  %107 = getelementptr inbounds i8, ptr %0, i64 400
  %108 = load ptr, ptr %107, align 8, !tbaa !39
  %109 = load i64, ptr %102, align 8, !tbaa !30
  %110 = shl i64 %109, 3
  call void @llvm.memset.p0.i64(ptr align 8 %108, i8 0, i64 %110, i1 false)
  %111 = getelementptr inbounds i8, ptr %0, i64 416
  %112 = load ptr, ptr %111, align 8, !tbaa !41
  %113 = load i64, ptr %102, align 8, !tbaa !30
  %114 = shl i64 %113, 3
  call void @llvm.memset.p0.i64(ptr align 8 %112, i8 0, i64 %114, i1 false)
  br label %115

115:                                              ; preds = %86, %98, %101
  %116 = load double, ptr %37, align 8, !tbaa !28
  %117 = getelementptr inbounds i8, ptr %0, i64 232
  store double %116, ptr %117, align 8, !tbaa !42
  %118 = getelementptr inbounds i8, ptr %0, i64 64
  %119 = load i64, ptr %118, align 8, !tbaa !30
  %.not352 = icmp eq i64 %119, 0
  br i1 %.not352, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %115
  %120 = getelementptr inbounds i8, ptr %0, i64 88
  %121 = load ptr, ptr %120, align 8, !tbaa !43
  %xtraiter = and i64 %119, 1
  %122 = icmp eq i64 %119, 1
  br i1 %122, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %119, -2
  br label %144

._crit_edge.loopexit.unr-lcssa:                   ; preds = %144, %.lr.ph
  %.unr = phi double [ %116, %.lr.ph ], [ %168, %144 ]
  %.0291314.unr = phi i64 [ 0, %.lr.ph ], [ %169, %144 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %._crit_edge.loopexit.epilog-lcssa

._crit_edge.loopexit.epilog-lcssa:                ; preds = %._crit_edge.loopexit.unr-lcssa
  %123 = getelementptr inbounds double, ptr %121, i64 %.0291314.unr
  %124 = load double, ptr %123, align 8, !tbaa !44
  %125 = getelementptr inbounds double, ptr %17, i64 %.0291314.unr
  %126 = load double, ptr %125, align 8, !tbaa !44
  %127 = getelementptr inbounds double, ptr %21, i64 %.0291314.unr
  %128 = load double, ptr %127, align 8, !tbaa !44
  %129 = fadd double %126, %128
  %130 = fmul double %124, %129
  %131 = getelementptr inbounds double, ptr %9, i64 %.0291314.unr
  %132 = load double, ptr %131, align 8, !tbaa !44
  %133 = call double @llvm.fmuladd.f64(double %130, double %132, double %.unr)
  store double %133, ptr %117, align 8, !tbaa !42
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit.epilog-lcssa, %._crit_edge.loopexit.unr-lcssa, %115
  %134 = load ptr, ptr %18, align 8, !tbaa !19
  %135 = load ptr, ptr %22, align 8, !tbaa !21
  call void @mat_add(ptr noundef %134, ptr noundef %135, ptr noundef %36, i64 noundef %119, i64 noundef 1) #8
  %136 = getelementptr inbounds i8, ptr %0, i64 88
  %137 = load ptr, ptr %136, align 8, !tbaa !43
  %138 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %137, ptr noundef %36, ptr noundef %31, i64 noundef %138, i64 noundef 1) #8
  %139 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_scalar_multiply(ptr noundef %31, ptr noundef %31, i64 noundef %139, i64 noundef 1, double noundef 5.000000e-01) #8
  %140 = getelementptr inbounds i8, ptr %0, i64 280
  %141 = load i64, ptr %140, align 8, !tbaa !45
  %142 = load i64, ptr @XC_TYPE_LDA, align 8, !tbaa !46
  %143 = icmp eq i64 %141, %142
  br i1 %143, label %170, label %174

144:                                              ; preds = %144, %.lr.ph.new
  %145 = phi double [ %116, %.lr.ph.new ], [ %168, %144 ]
  %.0291314 = phi i64 [ 0, %.lr.ph.new ], [ %169, %144 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.1, %144 ]
  %146 = getelementptr inbounds double, ptr %121, i64 %.0291314
  %147 = load double, ptr %146, align 8, !tbaa !44
  %148 = getelementptr inbounds double, ptr %17, i64 %.0291314
  %149 = load double, ptr %148, align 8, !tbaa !44
  %150 = getelementptr inbounds double, ptr %21, i64 %.0291314
  %151 = load double, ptr %150, align 8, !tbaa !44
  %152 = fadd double %149, %151
  %153 = fmul double %147, %152
  %154 = getelementptr inbounds double, ptr %9, i64 %.0291314
  %155 = load double, ptr %154, align 8, !tbaa !44
  %156 = call double @llvm.fmuladd.f64(double %153, double %155, double %145)
  store double %156, ptr %117, align 8, !tbaa !42
  %157 = or disjoint i64 %.0291314, 1
  %158 = getelementptr inbounds double, ptr %121, i64 %157
  %159 = load double, ptr %158, align 8, !tbaa !44
  %160 = getelementptr inbounds double, ptr %17, i64 %157
  %161 = load double, ptr %160, align 8, !tbaa !44
  %162 = getelementptr inbounds double, ptr %21, i64 %157
  %163 = load double, ptr %162, align 8, !tbaa !44
  %164 = fadd double %161, %163
  %165 = fmul double %159, %164
  %166 = getelementptr inbounds double, ptr %9, i64 %157
  %167 = load double, ptr %166, align 8, !tbaa !44
  %168 = call double @llvm.fmuladd.f64(double %165, double %167, double %156)
  store double %168, ptr %117, align 8, !tbaa !42
  %169 = add nuw i64 %.0291314, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.loopexit.unr-lcssa, label %144, !llvm.loop !47

170:                                              ; preds = %._crit_edge
  %171 = getelementptr inbounds i8, ptr %0, i64 104
  %172 = load ptr, ptr %171, align 8, !tbaa !49
  %173 = load i64, ptr %118, align 8, !tbaa !30
  call void @einsum_mn_mp_m__np(ptr noundef %172, ptr noundef %172, ptr noundef %31, ptr noundef %25, i64 noundef %173, i64 noundef %7, i64 noundef %7) #8
  %.pre = load i64, ptr %140, align 8, !tbaa !45
  br label %174

174:                                              ; preds = %170, %._crit_edge
  %175 = phi i64 [ %.pre, %170 ], [ %141, %._crit_edge ]
  %176 = load i64, ptr @XC_TYPE_GGA, align 8, !tbaa !46
  %177 = icmp eq i64 %175, %176
  %178 = load i64, ptr @XC_TYPE_MGGA, align 8
  %179 = icmp eq i64 %175, %178
  %or.cond = select i1 %177, i1 true, i1 %179
  br i1 %or.cond, label %180, label %457

180:                                              ; preds = %174
  %181 = getelementptr inbounds i8, ptr %0, i64 512
  %182 = load ptr, ptr %181, align 8, !tbaa !50
  %183 = getelementptr inbounds i8, ptr %0, i64 520
  %184 = load ptr, ptr %183, align 8, !tbaa !51
  %185 = getelementptr inbounds i8, ptr %0, i64 528
  %186 = load ptr, ptr %185, align 8, !tbaa !52
  %187 = getelementptr inbounds i8, ptr %0, i64 360
  %188 = load ptr, ptr %187, align 8, !tbaa !31
  %189 = getelementptr inbounds i8, ptr %0, i64 400
  %190 = load ptr, ptr %189, align 8, !tbaa !39
  %191 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_add(ptr noundef %188, ptr noundef %190, ptr noundef %36, i64 noundef %191, i64 noundef 1) #8
  %192 = load ptr, ptr %136, align 8, !tbaa !43
  %193 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %192, ptr noundef %36, ptr noundef %182, i64 noundef %193, i64 noundef 1) #8
  %194 = getelementptr inbounds i8, ptr %0, i64 296
  %195 = load ptr, ptr %194, align 8, !tbaa !53
  %196 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %182, ptr noundef %195, ptr noundef %182, i64 noundef %196, i64 noundef 1) #8
  %197 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_scalar_multiply(ptr noundef %182, ptr noundef %182, i64 noundef %197, i64 noundef 1, double noundef 2.000000e+00) #8
  %198 = load ptr, ptr %136, align 8, !tbaa !43
  %199 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %198, ptr noundef %36, ptr noundef %184, i64 noundef %199, i64 noundef 1) #8
  %200 = getelementptr inbounds i8, ptr %0, i64 304
  %201 = load ptr, ptr %200, align 8, !tbaa !54
  %202 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %184, ptr noundef %201, ptr noundef %184, i64 noundef %202, i64 noundef 1) #8
  %203 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_scalar_multiply(ptr noundef %184, ptr noundef %184, i64 noundef %203, i64 noundef 1, double noundef 2.000000e+00) #8
  %204 = load ptr, ptr %136, align 8, !tbaa !43
  %205 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %204, ptr noundef %36, ptr noundef %186, i64 noundef %205, i64 noundef 1) #8
  %206 = getelementptr inbounds i8, ptr %0, i64 312
  %207 = load ptr, ptr %206, align 8, !tbaa !55
  %208 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %186, ptr noundef %207, ptr noundef %186, i64 noundef %208, i64 noundef 1) #8
  %209 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_scalar_multiply(ptr noundef %186, ptr noundef %186, i64 noundef %209, i64 noundef 1, double noundef 2.000000e+00) #8
  %210 = load i64, ptr %118, align 8, !tbaa !30
  %.not353 = icmp eq i64 %210, 0
  %.not354 = icmp eq i64 %7, 0
  %or.cond373 = select i1 %.not353, i1 true, i1 %.not354
  br i1 %or.cond373, label %._crit_edge322, label %.lr.ph321.split.us

.lr.ph321.split.us:                               ; preds = %180
  %211 = getelementptr inbounds i8, ptr %0, i64 128
  %212 = getelementptr inbounds i8, ptr %0, i64 120
  %213 = getelementptr inbounds i8, ptr %0, i64 112
  %214 = getelementptr inbounds i8, ptr %0, i64 104
  %215 = load ptr, ptr %214, align 8, !tbaa !49
  %216 = load ptr, ptr %213, align 8, !tbaa !56
  %217 = load ptr, ptr %212, align 8, !tbaa !57
  %218 = load ptr, ptr %211, align 8, !tbaa !58
  %219 = mul i64 %210, %7
  %220 = shl i64 %219, 3
  %scevgep = getelementptr i8, ptr %29, i64 %220
  %scevgep377 = getelementptr i8, ptr %215, i64 %220
  %221 = shl i64 %210, 3
  %scevgep378 = getelementptr i8, ptr %31, i64 %221
  %scevgep379 = getelementptr i8, ptr %216, i64 %220
  %scevgep380 = getelementptr i8, ptr %182, i64 %221
  %scevgep381 = getelementptr i8, ptr %217, i64 %220
  %scevgep382 = getelementptr i8, ptr %184, i64 %221
  %scevgep383 = getelementptr i8, ptr %218, i64 %220
  %scevgep384 = getelementptr i8, ptr %186, i64 %221
  %222 = insertelement <4 x ptr> poison, ptr %29, i64 0
  %223 = shufflevector <4 x ptr> %222, <4 x ptr> poison, <4 x i32> zeroinitializer
  %224 = insertelement <4 x ptr> poison, ptr %scevgep377, i64 0
  %225 = insertelement <4 x ptr> %224, ptr %scevgep379, i64 1
  %226 = insertelement <4 x ptr> %225, ptr %scevgep380, i64 2
  %227 = insertelement <4 x ptr> %226, ptr %scevgep381, i64 3
  %228 = insertelement <4 x ptr> poison, ptr %215, i64 0
  %229 = insertelement <4 x ptr> %228, ptr %216, i64 1
  %230 = insertelement <4 x ptr> %229, ptr %182, i64 2
  %231 = insertelement <4 x ptr> %230, ptr %217, i64 3
  %232 = insertelement <4 x ptr> poison, ptr %scevgep, i64 0
  %233 = shufflevector <4 x ptr> %232, <4 x ptr> poison, <4 x i32> zeroinitializer
  %min.iters.check = icmp ult i64 %7, 10
  %234 = icmp ult <4 x ptr> %223, %227
  %235 = icmp ult <4 x ptr> %231, %233
  %bound0386 = icmp ult ptr %29, %scevgep378
  %bound1387 = icmp ult ptr %31, %scevgep
  %found.conflict388 = and i1 %bound0386, %bound1387
  %.mask = and i64 %7, 1152921504606846976
  %stride.check389 = icmp ne i64 %.mask, 0
  %236 = and <4 x i1> %234, %235
  %bound0407 = icmp ult ptr %29, %scevgep382
  %bound1408 = icmp ult ptr %184, %scevgep
  %found.conflict409 = and i1 %bound0407, %bound1408
  %bound0412 = icmp ult ptr %29, %scevgep383
  %bound1413 = icmp ult ptr %218, %scevgep
  %found.conflict414 = and i1 %bound0412, %bound1413
  %bound0418 = icmp ult ptr %29, %scevgep384
  %bound1419 = icmp ult ptr %186, %scevgep
  %found.conflict420 = and i1 %bound0418, %bound1419
  %237 = bitcast <4 x i1> %236 to i4
  %238 = icmp ne i4 %237, 0
  %op.rdx = or i1 %238, %found.conflict388
  %op.rdx485 = or i1 %found.conflict409, %found.conflict414
  %op.rdx486 = or i1 %found.conflict420, %stride.check389
  %op.rdx487 = or i1 %op.rdx, %op.rdx485
  %op.rdx488 = or i1 %op.rdx487, %op.rdx486
  %n.vec = and i64 %7, -1152921504606846978
  %cmp.n = icmp eq i64 %7, %n.vec
  br label %.lr.ph317.us

.lr.ph317.us:                                     ; preds = %._crit_edge318.us, %.lr.ph321.split.us
  %.0292319.us = phi i64 [ 0, %.lr.ph321.split.us ], [ %278, %._crit_edge318.us ]
  %239 = mul i64 %.0292319.us, %7
  %240 = getelementptr inbounds double, ptr %31, i64 %.0292319.us
  %241 = getelementptr inbounds double, ptr %182, i64 %.0292319.us
  %242 = getelementptr inbounds double, ptr %184, i64 %.0292319.us
  %243 = getelementptr inbounds double, ptr %186, i64 %.0292319.us
  %brmerge = select i1 %min.iters.check, i1 true, i1 %op.rdx488
  br i1 %brmerge, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph317.us
  %244 = load double, ptr %240, align 8, !tbaa !44, !alias.scope !59
  %broadcast.splatinsert424 = insertelement <2 x double> poison, double %244, i64 0
  %broadcast.splat425 = shufflevector <2 x double> %broadcast.splatinsert424, <2 x double> poison, <2 x i32> zeroinitializer
  %245 = load double, ptr %241, align 8, !tbaa !44, !alias.scope !62
  %broadcast.splatinsert = insertelement <2 x double> poison, double %245, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  %246 = load double, ptr %242, align 8, !tbaa !44, !alias.scope !64
  %broadcast.splatinsert427 = insertelement <2 x double> poison, double %246, i64 0
  %broadcast.splat428 = shufflevector <2 x double> %broadcast.splatinsert427, <2 x double> poison, <2 x i32> zeroinitializer
  %247 = load double, ptr %243, align 8, !tbaa !44, !alias.scope !66
  %broadcast.splatinsert430 = insertelement <2 x double> poison, double %247, i64 0
  %broadcast.splat431 = shufflevector <2 x double> %broadcast.splatinsert430, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %248 = add i64 %index, %239
  %249 = getelementptr inbounds double, ptr %215, i64 %248
  %wide.load = load <2 x double>, ptr %249, align 8, !tbaa !44, !alias.scope !68
  %250 = getelementptr inbounds double, ptr %216, i64 %248
  %wide.load423 = load <2 x double>, ptr %250, align 8, !tbaa !44, !alias.scope !70
  %251 = fmul <2 x double> %wide.load423, %broadcast.splat
  %252 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load, <2 x double> %broadcast.splat425, <2 x double> %251)
  %253 = getelementptr inbounds double, ptr %217, i64 %248
  %wide.load426 = load <2 x double>, ptr %253, align 8, !tbaa !44, !alias.scope !72
  %254 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load426, <2 x double> %broadcast.splat428, <2 x double> %252)
  %255 = getelementptr inbounds double, ptr %218, i64 %248
  %wide.load429 = load <2 x double>, ptr %255, align 8, !tbaa !44, !alias.scope !74
  %256 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load429, <2 x double> %broadcast.splat431, <2 x double> %254)
  %257 = getelementptr inbounds double, ptr %29, i64 %248
  store <2 x double> %256, ptr %257, align 8, !tbaa !44, !alias.scope !76, !noalias !78
  %index.next = add nuw i64 %index, 2
  %258 = icmp eq i64 %index.next, %n.vec
  br i1 %258, label %middle.block, label %vector.body, !llvm.loop !79

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

scalar.ph.preheader:                              ; preds = %.lr.ph317.us, %middle.block
  %.0295315.us.ph = phi i64 [ 0, %.lr.ph317.us ], [ %n.vec, %middle.block ]
  br label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0295315.us = phi i64 [ %277, %scalar.ph ], [ %.0295315.us.ph, %scalar.ph.preheader ]
  %259 = add i64 %.0295315.us, %239
  %260 = getelementptr inbounds double, ptr %215, i64 %259
  %261 = load double, ptr %260, align 8, !tbaa !44
  %262 = load double, ptr %240, align 8, !tbaa !44
  %263 = getelementptr inbounds double, ptr %216, i64 %259
  %264 = load double, ptr %263, align 8, !tbaa !44
  %265 = load double, ptr %241, align 8, !tbaa !44
  %266 = fmul double %264, %265
  %267 = call double @llvm.fmuladd.f64(double %261, double %262, double %266)
  %268 = getelementptr inbounds double, ptr %217, i64 %259
  %269 = load double, ptr %268, align 8, !tbaa !44
  %270 = load double, ptr %242, align 8, !tbaa !44
  %271 = call double @llvm.fmuladd.f64(double %269, double %270, double %267)
  %272 = getelementptr inbounds double, ptr %218, i64 %259
  %273 = load double, ptr %272, align 8, !tbaa !44
  %274 = load double, ptr %243, align 8, !tbaa !44
  %275 = call double @llvm.fmuladd.f64(double %273, double %274, double %271)
  %276 = getelementptr inbounds double, ptr %29, i64 %259
  store double %275, ptr %276, align 8, !tbaa !44
  %277 = add nuw i64 %.0295315.us, 1
  %exitcond365.not = icmp eq i64 %277, %7
  br i1 %exitcond365.not, label %._crit_edge318.us, label %scalar.ph, !llvm.loop !82

._crit_edge318.us:                                ; preds = %scalar.ph, %middle.block
  %278 = add nuw i64 %.0292319.us, 1
  %exitcond366.not = icmp eq i64 %278, %210
  br i1 %exitcond366.not, label %._crit_edge322, label %.lr.ph317.us, !llvm.loop !83

._crit_edge322:                                   ; preds = %._crit_edge318.us, %180
  call void @get_wall_time(ptr noundef nonnull %2) #8
  %279 = getelementptr inbounds i8, ptr %0, i64 104
  %280 = load ptr, ptr %279, align 8, !tbaa !49
  %281 = load i64, ptr %118, align 8, !tbaa !30
  %282 = getelementptr inbounds i8, ptr %5, i64 288
  %283 = load ptr, ptr %282, align 8, !tbaa !84
  call void @einsum_mn_mp__np_parallel(ptr noundef %280, ptr noundef %29, ptr noundef %25, i64 noundef %281, i64 noundef %7, i64 noundef %7, ptr noundef %283) #8
  call void @get_wall_time(ptr noundef nonnull %3) #8
  %284 = getelementptr inbounds i8, ptr %5, i64 440
  %285 = load i64, ptr %284, align 8, !tbaa !34
  %.not308 = icmp eq i64 %285, 0
  br i1 %.not308, label %286, label %289

286:                                              ; preds = %._crit_edge322
  %287 = call double @diff_time_ms(ptr noundef nonnull %2, ptr noundef nonnull %3) #8
  %288 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %287)
  br label %289

289:                                              ; preds = %286, %._crit_edge322
  %290 = load i64, ptr %140, align 8, !tbaa !45
  %291 = icmp eq i64 %290, %178
  br i1 %291, label %292, label %457

292:                                              ; preds = %289
  %293 = getelementptr inbounds i8, ptr %0, i64 376
  %294 = load ptr, ptr %293, align 8, !tbaa !33
  %295 = getelementptr inbounds i8, ptr %0, i64 416
  %296 = load ptr, ptr %295, align 8, !tbaa !41
  %297 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_add(ptr noundef %294, ptr noundef %296, ptr noundef %36, i64 noundef %297, i64 noundef 1) #8
  %298 = load ptr, ptr %136, align 8, !tbaa !43
  %299 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_multiply(ptr noundef %298, ptr noundef %36, ptr noundef %36, i64 noundef %299, i64 noundef 1) #8
  %300 = load i64, ptr %118, align 8, !tbaa !30
  call void @mat_scalar_multiply(ptr noundef %36, ptr noundef %36, i64 noundef %300, i64 noundef 1, double noundef 2.500000e-01) #8
  %301 = load i64, ptr %118, align 8, !tbaa !30
  %.not355 = icmp eq i64 %301, 0
  %.not356 = icmp eq i64 %7, 0
  %or.cond374 = select i1 %.not355, i1 true, i1 %.not356
  br i1 %or.cond374, label %._crit_edge330, label %.lr.ph329.split.us

.lr.ph329.split.us:                               ; preds = %292
  %302 = getelementptr inbounds i8, ptr %0, i64 112
  %303 = load ptr, ptr %302, align 8, !tbaa !56
  %304 = ptrtoint ptr %303 to i64
  %305 = sub i64 %34, %304
  %min.iters.check435 = icmp ult i64 %7, 4
  %diff.check = icmp ult i64 %305, 32
  %or.cond482 = select i1 %min.iters.check435, i1 true, i1 %diff.check
  %n.vec438 = and i64 %7, -4
  %cmp.n447 = icmp eq i64 %7, %n.vec438
  %xtraiter489 = and i64 %7, 3
  %lcmp.mod490.not = icmp eq i64 %xtraiter489, 0
  br label %.lr.ph325.us

.lr.ph325.us:                                     ; preds = %._crit_edge326.us, %.lr.ph329.split.us
  %.0298327.us = phi i64 [ 0, %.lr.ph329.split.us ], [ %349, %._crit_edge326.us ]
  %306 = getelementptr inbounds double, ptr %36, i64 %.0298327.us
  %307 = load double, ptr %306, align 8, !tbaa !44
  %308 = mul i64 %.0298327.us, %7
  br i1 %or.cond482, label %scalar.ph434.preheader, label %vector.ph436

vector.ph436:                                     ; preds = %.lr.ph325.us
  %broadcast.splatinsert444 = insertelement <2 x double> poison, double %307, i64 0
  %broadcast.splat445 = shufflevector <2 x double> %broadcast.splatinsert444, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body440

vector.body440:                                   ; preds = %vector.body440, %vector.ph436
  %index441 = phi i64 [ 0, %vector.ph436 ], [ %index.next446, %vector.body440 ]
  %309 = add i64 %index441, %308
  %310 = getelementptr inbounds double, ptr %303, i64 %309
  %311 = getelementptr inbounds i8, ptr %310, i64 16
  %wide.load442 = load <2 x double>, ptr %310, align 8, !tbaa !44
  %wide.load443 = load <2 x double>, ptr %311, align 8, !tbaa !44
  %312 = fmul <2 x double> %broadcast.splat445, %wide.load442
  %313 = fmul <2 x double> %broadcast.splat445, %wide.load443
  %314 = getelementptr inbounds double, ptr %33, i64 %309
  %315 = getelementptr inbounds i8, ptr %314, i64 16
  store <2 x double> %312, ptr %314, align 8, !tbaa !44
  store <2 x double> %313, ptr %315, align 8, !tbaa !44
  %index.next446 = add nuw i64 %index441, 4
  %316 = icmp eq i64 %index.next446, %n.vec438
  br i1 %316, label %middle.block433, label %vector.body440, !llvm.loop !85

middle.block433:                                  ; preds = %vector.body440
  br i1 %cmp.n447, label %._crit_edge326.us, label %scalar.ph434.preheader

scalar.ph434.preheader:                           ; preds = %middle.block433, %.lr.ph325.us
  %.0297323.us.ph = phi i64 [ 0, %.lr.ph325.us ], [ %n.vec438, %middle.block433 ]
  br i1 %lcmp.mod490.not, label %scalar.ph434.prol.loopexit, label %scalar.ph434.prol

scalar.ph434.prol:                                ; preds = %scalar.ph434.preheader, %scalar.ph434.prol
  %.0297323.us.prol = phi i64 [ %322, %scalar.ph434.prol ], [ %.0297323.us.ph, %scalar.ph434.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph434.prol ], [ 0, %scalar.ph434.preheader ]
  %317 = add i64 %.0297323.us.prol, %308
  %318 = getelementptr inbounds double, ptr %303, i64 %317
  %319 = load double, ptr %318, align 8, !tbaa !44
  %320 = fmul double %307, %319
  %321 = getelementptr inbounds double, ptr %33, i64 %317
  store double %320, ptr %321, align 8, !tbaa !44
  %322 = add nuw i64 %.0297323.us.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter489
  br i1 %prol.iter.cmp.not, label %scalar.ph434.prol.loopexit, label %scalar.ph434.prol, !llvm.loop !86

scalar.ph434.prol.loopexit:                       ; preds = %scalar.ph434.prol, %scalar.ph434.preheader
  %.0297323.us.unr = phi i64 [ %.0297323.us.ph, %scalar.ph434.preheader ], [ %322, %scalar.ph434.prol ]
  %323 = sub i64 %.0297323.us.ph, %7
  %324 = icmp ugt i64 %323, -4
  br i1 %324, label %._crit_edge326.us, label %scalar.ph434

scalar.ph434:                                     ; preds = %scalar.ph434.prol.loopexit, %scalar.ph434
  %.0297323.us = phi i64 [ %348, %scalar.ph434 ], [ %.0297323.us.unr, %scalar.ph434.prol.loopexit ]
  %325 = add i64 %.0297323.us, %308
  %326 = getelementptr inbounds double, ptr %303, i64 %325
  %327 = load double, ptr %326, align 8, !tbaa !44
  %328 = fmul double %307, %327
  %329 = getelementptr inbounds double, ptr %33, i64 %325
  store double %328, ptr %329, align 8, !tbaa !44
  %330 = add nuw i64 %.0297323.us, 1
  %331 = add i64 %330, %308
  %332 = getelementptr inbounds double, ptr %303, i64 %331
  %333 = load double, ptr %332, align 8, !tbaa !44
  %334 = fmul double %307, %333
  %335 = getelementptr inbounds double, ptr %33, i64 %331
  store double %334, ptr %335, align 8, !tbaa !44
  %336 = add nuw i64 %.0297323.us, 2
  %337 = add i64 %336, %308
  %338 = getelementptr inbounds double, ptr %303, i64 %337
  %339 = load double, ptr %338, align 8, !tbaa !44
  %340 = fmul double %307, %339
  %341 = getelementptr inbounds double, ptr %33, i64 %337
  store double %340, ptr %341, align 8, !tbaa !44
  %342 = add nuw i64 %.0297323.us, 3
  %343 = add i64 %342, %308
  %344 = getelementptr inbounds double, ptr %303, i64 %343
  %345 = load double, ptr %344, align 8, !tbaa !44
  %346 = fmul double %307, %345
  %347 = getelementptr inbounds double, ptr %33, i64 %343
  store double %346, ptr %347, align 8, !tbaa !44
  %348 = add nuw i64 %.0297323.us, 4
  %exitcond367.not.3 = icmp eq i64 %348, %7
  br i1 %exitcond367.not.3, label %._crit_edge326.us, label %scalar.ph434, !llvm.loop !88

._crit_edge326.us:                                ; preds = %scalar.ph434.prol.loopexit, %scalar.ph434, %middle.block433
  %349 = add nuw i64 %.0298327.us, 1
  %exitcond368.not = icmp eq i64 %349, %301
  br i1 %exitcond368.not, label %._crit_edge330, label %.lr.ph325.us, !llvm.loop !89

._crit_edge330:                                   ; preds = %._crit_edge326.us, %292
  %350 = getelementptr inbounds i8, ptr %0, i64 112
  %351 = load ptr, ptr %350, align 8, !tbaa !56
  %352 = load ptr, ptr %282, align 8, !tbaa !84
  call void @einsum_mn_mp__np_parallel(ptr noundef %351, ptr noundef %33, ptr noundef %27, i64 noundef %301, i64 noundef %7, i64 noundef %7, ptr noundef %352) #8
  call void @mat_add(ptr noundef %25, ptr noundef %27, ptr noundef %25, i64 noundef %7, i64 noundef %7) #8
  %353 = load i64, ptr %118, align 8, !tbaa !30
  %.not357 = icmp eq i64 %353, 0
  %.not358 = icmp eq i64 %7, 0
  %or.cond375 = select i1 %.not357, i1 true, i1 %.not358
  br i1 %or.cond375, label %._crit_edge339, label %.lr.ph338.split.us

.lr.ph338.split.us:                               ; preds = %._crit_edge330
  %354 = getelementptr inbounds i8, ptr %0, i64 120
  %355 = load ptr, ptr %354, align 8, !tbaa !57
  %356 = ptrtoint ptr %355 to i64
  %357 = sub i64 %34, %356
  %min.iters.check452 = icmp ult i64 %7, 4
  %diff.check449 = icmp ult i64 %357, 32
  %or.cond483 = select i1 %min.iters.check452, i1 true, i1 %diff.check449
  %n.vec455 = and i64 %7, -4
  %cmp.n464 = icmp eq i64 %7, %n.vec455
  %xtraiter491 = and i64 %7, 3
  %lcmp.mod492.not = icmp eq i64 %xtraiter491, 0
  br label %.lr.ph334.us

.lr.ph334.us:                                     ; preds = %._crit_edge335.us, %.lr.ph338.split.us
  %.0296336.us = phi i64 [ 0, %.lr.ph338.split.us ], [ %401, %._crit_edge335.us ]
  %358 = getelementptr inbounds double, ptr %36, i64 %.0296336.us
  %359 = load double, ptr %358, align 8, !tbaa !44
  %360 = mul i64 %.0296336.us, %7
  br i1 %or.cond483, label %scalar.ph451.preheader, label %vector.ph453

vector.ph453:                                     ; preds = %.lr.ph334.us
  %broadcast.splatinsert461 = insertelement <2 x double> poison, double %359, i64 0
  %broadcast.splat462 = shufflevector <2 x double> %broadcast.splatinsert461, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body457

vector.body457:                                   ; preds = %vector.body457, %vector.ph453
  %index458 = phi i64 [ 0, %vector.ph453 ], [ %index.next463, %vector.body457 ]
  %361 = add i64 %index458, %360
  %362 = getelementptr inbounds double, ptr %355, i64 %361
  %363 = getelementptr inbounds i8, ptr %362, i64 16
  %wide.load459 = load <2 x double>, ptr %362, align 8, !tbaa !44
  %wide.load460 = load <2 x double>, ptr %363, align 8, !tbaa !44
  %364 = fmul <2 x double> %broadcast.splat462, %wide.load459
  %365 = fmul <2 x double> %broadcast.splat462, %wide.load460
  %366 = getelementptr inbounds double, ptr %33, i64 %361
  %367 = getelementptr inbounds i8, ptr %366, i64 16
  store <2 x double> %364, ptr %366, align 8, !tbaa !44
  store <2 x double> %365, ptr %367, align 8, !tbaa !44
  %index.next463 = add nuw i64 %index458, 4
  %368 = icmp eq i64 %index.next463, %n.vec455
  br i1 %368, label %middle.block450, label %vector.body457, !llvm.loop !90

middle.block450:                                  ; preds = %vector.body457
  br i1 %cmp.n464, label %._crit_edge335.us, label %scalar.ph451.preheader

scalar.ph451.preheader:                           ; preds = %middle.block450, %.lr.ph334.us
  %.0294332.us.ph = phi i64 [ 0, %.lr.ph334.us ], [ %n.vec455, %middle.block450 ]
  br i1 %lcmp.mod492.not, label %scalar.ph451.prol.loopexit, label %scalar.ph451.prol

scalar.ph451.prol:                                ; preds = %scalar.ph451.preheader, %scalar.ph451.prol
  %.0294332.us.prol = phi i64 [ %374, %scalar.ph451.prol ], [ %.0294332.us.ph, %scalar.ph451.preheader ]
  %prol.iter493 = phi i64 [ %prol.iter493.next, %scalar.ph451.prol ], [ 0, %scalar.ph451.preheader ]
  %369 = add i64 %.0294332.us.prol, %360
  %370 = getelementptr inbounds double, ptr %355, i64 %369
  %371 = load double, ptr %370, align 8, !tbaa !44
  %372 = fmul double %359, %371
  %373 = getelementptr inbounds double, ptr %33, i64 %369
  store double %372, ptr %373, align 8, !tbaa !44
  %374 = add nuw i64 %.0294332.us.prol, 1
  %prol.iter493.next = add i64 %prol.iter493, 1
  %prol.iter493.cmp.not = icmp eq i64 %prol.iter493.next, %xtraiter491
  br i1 %prol.iter493.cmp.not, label %scalar.ph451.prol.loopexit, label %scalar.ph451.prol, !llvm.loop !91

scalar.ph451.prol.loopexit:                       ; preds = %scalar.ph451.prol, %scalar.ph451.preheader
  %.0294332.us.unr = phi i64 [ %.0294332.us.ph, %scalar.ph451.preheader ], [ %374, %scalar.ph451.prol ]
  %375 = sub i64 %.0294332.us.ph, %7
  %376 = icmp ugt i64 %375, -4
  br i1 %376, label %._crit_edge335.us, label %scalar.ph451

scalar.ph451:                                     ; preds = %scalar.ph451.prol.loopexit, %scalar.ph451
  %.0294332.us = phi i64 [ %400, %scalar.ph451 ], [ %.0294332.us.unr, %scalar.ph451.prol.loopexit ]
  %377 = add i64 %.0294332.us, %360
  %378 = getelementptr inbounds double, ptr %355, i64 %377
  %379 = load double, ptr %378, align 8, !tbaa !44
  %380 = fmul double %359, %379
  %381 = getelementptr inbounds double, ptr %33, i64 %377
  store double %380, ptr %381, align 8, !tbaa !44
  %382 = add nuw i64 %.0294332.us, 1
  %383 = add i64 %382, %360
  %384 = getelementptr inbounds double, ptr %355, i64 %383
  %385 = load double, ptr %384, align 8, !tbaa !44
  %386 = fmul double %359, %385
  %387 = getelementptr inbounds double, ptr %33, i64 %383
  store double %386, ptr %387, align 8, !tbaa !44
  %388 = add nuw i64 %.0294332.us, 2
  %389 = add i64 %388, %360
  %390 = getelementptr inbounds double, ptr %355, i64 %389
  %391 = load double, ptr %390, align 8, !tbaa !44
  %392 = fmul double %359, %391
  %393 = getelementptr inbounds double, ptr %33, i64 %389
  store double %392, ptr %393, align 8, !tbaa !44
  %394 = add nuw i64 %.0294332.us, 3
  %395 = add i64 %394, %360
  %396 = getelementptr inbounds double, ptr %355, i64 %395
  %397 = load double, ptr %396, align 8, !tbaa !44
  %398 = fmul double %359, %397
  %399 = getelementptr inbounds double, ptr %33, i64 %395
  store double %398, ptr %399, align 8, !tbaa !44
  %400 = add nuw i64 %.0294332.us, 4
  %exitcond369.not.3 = icmp eq i64 %400, %7
  br i1 %exitcond369.not.3, label %._crit_edge335.us, label %scalar.ph451, !llvm.loop !92

._crit_edge335.us:                                ; preds = %scalar.ph451.prol.loopexit, %scalar.ph451, %middle.block450
  %401 = add nuw i64 %.0296336.us, 1
  %exitcond370.not = icmp eq i64 %401, %353
  br i1 %exitcond370.not, label %._crit_edge339, label %.lr.ph334.us, !llvm.loop !93

._crit_edge339:                                   ; preds = %._crit_edge335.us, %._crit_edge330
  %402 = getelementptr inbounds i8, ptr %0, i64 120
  %403 = load ptr, ptr %402, align 8, !tbaa !57
  %404 = load ptr, ptr %282, align 8, !tbaa !84
  call void @einsum_mn_mp__np_parallel(ptr noundef %403, ptr noundef %33, ptr noundef %27, i64 noundef %353, i64 noundef %7, i64 noundef %7, ptr noundef %404) #8
  call void @mat_add(ptr noundef %25, ptr noundef %27, ptr noundef %25, i64 noundef %7, i64 noundef %7) #8
  %405 = load i64, ptr %118, align 8, !tbaa !30
  %.not359 = icmp eq i64 %405, 0
  %.not360 = icmp eq i64 %7, 0
  %or.cond376 = select i1 %.not359, i1 true, i1 %.not360
  br i1 %or.cond376, label %._crit_edge349, label %.lr.ph348.split.us

.lr.ph348.split.us:                               ; preds = %._crit_edge339
  %406 = getelementptr inbounds i8, ptr %0, i64 128
  %407 = load ptr, ptr %406, align 8, !tbaa !58
  %408 = ptrtoint ptr %407 to i64
  %409 = sub i64 %34, %408
  %min.iters.check469 = icmp ult i64 %7, 4
  %diff.check466 = icmp ult i64 %409, 32
  %or.cond484 = select i1 %min.iters.check469, i1 true, i1 %diff.check466
  %n.vec472 = and i64 %7, -4
  %cmp.n481 = icmp eq i64 %7, %n.vec472
  %xtraiter494 = and i64 %7, 3
  %lcmp.mod495.not = icmp eq i64 %xtraiter494, 0
  br label %.lr.ph344.us

.lr.ph344.us:                                     ; preds = %._crit_edge345.us, %.lr.ph348.split.us
  %.0293346.us = phi i64 [ 0, %.lr.ph348.split.us ], [ %453, %._crit_edge345.us ]
  %410 = getelementptr inbounds double, ptr %36, i64 %.0293346.us
  %411 = load double, ptr %410, align 8, !tbaa !44
  %412 = mul i64 %.0293346.us, %7
  br i1 %or.cond484, label %scalar.ph468.preheader, label %vector.ph470

vector.ph470:                                     ; preds = %.lr.ph344.us
  %broadcast.splatinsert478 = insertelement <2 x double> poison, double %411, i64 0
  %broadcast.splat479 = shufflevector <2 x double> %broadcast.splatinsert478, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body474

vector.body474:                                   ; preds = %vector.body474, %vector.ph470
  %index475 = phi i64 [ 0, %vector.ph470 ], [ %index.next480, %vector.body474 ]
  %413 = add i64 %index475, %412
  %414 = getelementptr inbounds double, ptr %407, i64 %413
  %415 = getelementptr inbounds i8, ptr %414, i64 16
  %wide.load476 = load <2 x double>, ptr %414, align 8, !tbaa !44
  %wide.load477 = load <2 x double>, ptr %415, align 8, !tbaa !44
  %416 = fmul <2 x double> %broadcast.splat479, %wide.load476
  %417 = fmul <2 x double> %broadcast.splat479, %wide.load477
  %418 = getelementptr inbounds double, ptr %33, i64 %413
  %419 = getelementptr inbounds i8, ptr %418, i64 16
  store <2 x double> %416, ptr %418, align 8, !tbaa !44
  store <2 x double> %417, ptr %419, align 8, !tbaa !44
  %index.next480 = add nuw i64 %index475, 4
  %420 = icmp eq i64 %index.next480, %n.vec472
  br i1 %420, label %middle.block467, label %vector.body474, !llvm.loop !94

middle.block467:                                  ; preds = %vector.body474
  br i1 %cmp.n481, label %._crit_edge345.us, label %scalar.ph468.preheader

scalar.ph468.preheader:                           ; preds = %middle.block467, %.lr.ph344.us
  %.0342.us.ph = phi i64 [ 0, %.lr.ph344.us ], [ %n.vec472, %middle.block467 ]
  br i1 %lcmp.mod495.not, label %scalar.ph468.prol.loopexit, label %scalar.ph468.prol

scalar.ph468.prol:                                ; preds = %scalar.ph468.preheader, %scalar.ph468.prol
  %.0342.us.prol = phi i64 [ %426, %scalar.ph468.prol ], [ %.0342.us.ph, %scalar.ph468.preheader ]
  %prol.iter496 = phi i64 [ %prol.iter496.next, %scalar.ph468.prol ], [ 0, %scalar.ph468.preheader ]
  %421 = add i64 %.0342.us.prol, %412
  %422 = getelementptr inbounds double, ptr %407, i64 %421
  %423 = load double, ptr %422, align 8, !tbaa !44
  %424 = fmul double %411, %423
  %425 = getelementptr inbounds double, ptr %33, i64 %421
  store double %424, ptr %425, align 8, !tbaa !44
  %426 = add nuw i64 %.0342.us.prol, 1
  %prol.iter496.next = add i64 %prol.iter496, 1
  %prol.iter496.cmp.not = icmp eq i64 %prol.iter496.next, %xtraiter494
  br i1 %prol.iter496.cmp.not, label %scalar.ph468.prol.loopexit, label %scalar.ph468.prol, !llvm.loop !95

scalar.ph468.prol.loopexit:                       ; preds = %scalar.ph468.prol, %scalar.ph468.preheader
  %.0342.us.unr = phi i64 [ %.0342.us.ph, %scalar.ph468.preheader ], [ %426, %scalar.ph468.prol ]
  %427 = sub i64 %.0342.us.ph, %7
  %428 = icmp ugt i64 %427, -4
  br i1 %428, label %._crit_edge345.us, label %scalar.ph468

scalar.ph468:                                     ; preds = %scalar.ph468.prol.loopexit, %scalar.ph468
  %.0342.us = phi i64 [ %452, %scalar.ph468 ], [ %.0342.us.unr, %scalar.ph468.prol.loopexit ]
  %429 = add i64 %.0342.us, %412
  %430 = getelementptr inbounds double, ptr %407, i64 %429
  %431 = load double, ptr %430, align 8, !tbaa !44
  %432 = fmul double %411, %431
  %433 = getelementptr inbounds double, ptr %33, i64 %429
  store double %432, ptr %433, align 8, !tbaa !44
  %434 = add nuw i64 %.0342.us, 1
  %435 = add i64 %434, %412
  %436 = getelementptr inbounds double, ptr %407, i64 %435
  %437 = load double, ptr %436, align 8, !tbaa !44
  %438 = fmul double %411, %437
  %439 = getelementptr inbounds double, ptr %33, i64 %435
  store double %438, ptr %439, align 8, !tbaa !44
  %440 = add nuw i64 %.0342.us, 2
  %441 = add i64 %440, %412
  %442 = getelementptr inbounds double, ptr %407, i64 %441
  %443 = load double, ptr %442, align 8, !tbaa !44
  %444 = fmul double %411, %443
  %445 = getelementptr inbounds double, ptr %33, i64 %441
  store double %444, ptr %445, align 8, !tbaa !44
  %446 = add nuw i64 %.0342.us, 3
  %447 = add i64 %446, %412
  %448 = getelementptr inbounds double, ptr %407, i64 %447
  %449 = load double, ptr %448, align 8, !tbaa !44
  %450 = fmul double %411, %449
  %451 = getelementptr inbounds double, ptr %33, i64 %447
  store double %450, ptr %451, align 8, !tbaa !44
  %452 = add nuw i64 %.0342.us, 4
  %exitcond371.not.3 = icmp eq i64 %452, %7
  br i1 %exitcond371.not.3, label %._crit_edge345.us, label %scalar.ph468, !llvm.loop !96

._crit_edge345.us:                                ; preds = %scalar.ph468.prol.loopexit, %scalar.ph468, %middle.block467
  %453 = add nuw i64 %.0293346.us, 1
  %exitcond372.not = icmp eq i64 %453, %405
  br i1 %exitcond372.not, label %._crit_edge349, label %.lr.ph344.us, !llvm.loop !97

._crit_edge349:                                   ; preds = %._crit_edge345.us, %._crit_edge339
  %454 = getelementptr inbounds i8, ptr %0, i64 128
  %455 = load ptr, ptr %454, align 8, !tbaa !58
  %456 = load ptr, ptr %282, align 8, !tbaa !84
  call void @einsum_mn_mp__np_parallel(ptr noundef %455, ptr noundef %33, ptr noundef %27, i64 noundef %405, i64 noundef %7, i64 noundef %7, ptr noundef %456) #8
  call void @mat_add(ptr noundef %25, ptr noundef %27, ptr noundef %25, i64 noundef %7, i64 noundef %7) #8
  br label %457

457:                                              ; preds = %289, %._crit_edge349, %174
  call void @mat_add_A_AT(ptr noundef %25, ptr noundef %27, i64 noundef %7, i64 noundef %7) #8
  %458 = shl i64 %7, 3
  %459 = mul i64 %458, %7
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %25, ptr align 8 %27, i64 %459, i1 false)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2) #8
  ret void
}

declare void @get_wall_time(ptr noundef) local_unnamed_addr #2

declare void @libxc_exc_vxc(i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #4

declare double @diff_time_ms(ptr noundef, ptr noundef) local_unnamed_addr #2

declare double @libxc_hyb_coef(i64 noundef) local_unnamed_addr #2

declare void @einsum_mn_np__mp(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

declare double @mattrace(ptr noundef, i64 noundef) local_unnamed_addr #2

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

declare void @mat_multiply(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

declare void @einsum_mn_mp_m__np(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

declare void @einsum_mn_mp__np_parallel(ptr noundef, ptr noundef, ptr noundef, i64 noundef, i64 noundef, i64 noundef, ptr noundef) local_unnamed_addr #2

declare void @mat_add_A_AT(ptr noundef, ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nofree 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 #5 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #8 = { 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 608}
!6 = !{!"molecular_grid_desc", !7, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !7, i64 48, !7, i64 56, !10, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136, !7, i64 144, !7, i64 152, !7, i64 160, !7, i64 168, !7, i64 176, !7, i64 184, !7, i64 192, !7, i64 200, !7, i64 208, !7, i64 216, !11, i64 224, !11, i64 232, !11, i64 240, !7, i64 248, !7, i64 256, !7, i64 264, !7, i64 272, !10, i64 280, !7, i64 288, !7, i64 296, !7, i64 304, !7, i64 312, !7, i64 320, !7, i64 328, !7, i64 336, !7, i64 344, !7, i64 352, !7, i64 360, !7, i64 368, !7, i64 376, !7, i64 384, !7, i64 392, !7, i64 400, !7, i64 408, !7, i64 416, !7, i64 424, !7, i64 432, !7, i64 440, !7, i64 448, !7, i64 456, !7, i64 464, !7, i64 472, !7, i64 480, !7, i64 488, !7, i64 496, !7, i64 504, !7, i64 512, !7, i64 520, !7, i64 528, !7, i64 536, !7, i64 544, !7, i64 552, !10, i64 560, !10, i64 568, !7, i64 576, !7, i64 584, !7, i64 592, !7, i64 600, !7, i64 608}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"long", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!13, !10, i64 8}
!13 = !{!"scf_context", !7, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136, !7, i64 144, !7, i64 152, !7, i64 160, !7, i64 168, !7, i64 176, !7, i64 184, !11, i64 192, !10, i64 200, !11, i64 208, !11, i64 216, !11, i64 224, !10, i64 232, !11, i64 240, !11, i64 248, !10, i64 256, !11, i64 264, !10, i64 272, !10, i64 280, !7, i64 288, !7, i64 296, !7, i64 304, !10, i64 312, !10, i64 320, !10, i64 328, !7, i64 336, !7, i64 344, !7, i64 352, !7, i64 360, !7, i64 368, !7, i64 376, !7, i64 384, !7, i64 392, !11, i64 400, !7, i64 408, !7, i64 416, !7, i64 424, !7, i64 432, !10, i64 440}
!14 = !{!6, !7, i64 288}
!15 = !{!6, !7, i64 320}
!16 = !{!6, !7, i64 328}
!17 = !{!6, !7, i64 336}
!18 = !{!6, !7, i64 344}
!19 = !{!6, !7, i64 352}
!20 = !{!6, !7, i64 384}
!21 = !{!6, !7, i64 392}
!22 = !{!6, !7, i64 248}
!23 = !{!6, !7, i64 576}
!24 = !{!6, !7, i64 496}
!25 = !{!6, !7, i64 504}
!26 = !{!6, !7, i64 584}
!27 = !{!6, !7, i64 600}
!28 = !{!6, !11, i64 224}
!29 = !{!6, !10, i64 560}
!30 = !{!6, !10, i64 64}
!31 = !{!6, !7, i64 360}
!32 = !{!6, !7, i64 368}
!33 = !{!6, !7, i64 376}
!34 = !{!13, !10, i64 440}
!35 = !{!13, !7, i64 176}
!36 = !{!6, !7, i64 216}
!37 = !{!6, !11, i64 240}
!38 = !{!6, !10, i64 568}
!39 = !{!6, !7, i64 400}
!40 = !{!6, !7, i64 408}
!41 = !{!6, !7, i64 416}
!42 = !{!6, !11, i64 232}
!43 = !{!6, !7, i64 88}
!44 = !{!11, !11, i64 0}
!45 = !{!6, !10, i64 280}
!46 = !{!10, !10, i64 0}
!47 = distinct !{!47, !48}
!48 = !{!"llvm.loop.mustprogress"}
!49 = !{!6, !7, i64 104}
!50 = !{!6, !7, i64 512}
!51 = !{!6, !7, i64 520}
!52 = !{!6, !7, i64 528}
!53 = !{!6, !7, i64 296}
!54 = !{!6, !7, i64 304}
!55 = !{!6, !7, i64 312}
!56 = !{!6, !7, i64 112}
!57 = !{!6, !7, i64 120}
!58 = !{!6, !7, i64 128}
!59 = !{!60}
!60 = distinct !{!60, !61}
!61 = distinct !{!61, !"LVerDomain"}
!62 = !{!63}
!63 = distinct !{!63, !61}
!64 = !{!65}
!65 = distinct !{!65, !61}
!66 = !{!67}
!67 = distinct !{!67, !61}
!68 = !{!69}
!69 = distinct !{!69, !61}
!70 = !{!71}
!71 = distinct !{!71, !61}
!72 = !{!73}
!73 = distinct !{!73, !61}
!74 = !{!75}
!75 = distinct !{!75, !61}
!76 = !{!77}
!77 = distinct !{!77, !61}
!78 = !{!69, !60, !71, !63, !73, !65, !75, !67}
!79 = distinct !{!79, !48, !80, !81}
!80 = !{!"llvm.loop.isvectorized", i32 1}
!81 = !{!"llvm.loop.unroll.runtime.disable"}
!82 = distinct !{!82, !48, !80}
!83 = distinct !{!83, !48}
!84 = !{!13, !7, i64 288}
!85 = distinct !{!85, !48, !80, !81}
!86 = distinct !{!86, !87}
!87 = !{!"llvm.loop.unroll.disable"}
!88 = distinct !{!88, !48, !80}
!89 = distinct !{!89, !48}
!90 = distinct !{!90, !48, !80, !81}
!91 = distinct !{!91, !87}
!92 = distinct !{!92, !48, !80}
!93 = distinct !{!93, !48}
!94 = distinct !{!94, !48, !80, !81}
!95 = distinct !{!95, !87}
!96 = distinct !{!96, !48, !80}
!97 = distinct !{!97, !48}


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