; 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.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 }

@XC_TYPE_LDA = external constant i64, align 8
@XC_TYPE_GGA = external constant i64, align 8
@XC_TYPE_MGGA = external constant i64, align 8

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

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

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

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

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

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

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

99:                                               ; preds = %1
  %100 = load ptr, ptr %2, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.molecular_grid_desc, ptr %100, i32 0, i32 14
  %102 = load ptr, ptr %101, align 8, !tbaa !26
  %103 = load ptr, ptr %2, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.molecular_grid_desc, ptr %103, i32 0, i32 13
  %105 = load ptr, ptr %104, align 8, !tbaa !27
  %106 = load ptr, ptr %7, align 8, !tbaa !5
  %107 = load ptr, ptr %2, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.molecular_grid_desc, ptr %107, i32 0, i32 32
  %109 = load ptr, ptr %108, align 8, !tbaa !28
  %110 = load ptr, ptr %2, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.molecular_grid_desc, ptr %110, i32 0, i32 8
  %112 = load i64, ptr %111, align 8, !tbaa !23
  %113 = load i64, ptr %4, align 8, !tbaa !15
  %114 = load i64, ptr %4, align 8, !tbaa !15
  call void @einsum_mn_mp_m__np(ptr noundef %102, ptr noundef %105, ptr noundef %106, ptr noundef %109, i64 noundef %112, i64 noundef %113, i64 noundef %114)
  %115 = load ptr, ptr %2, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.molecular_grid_desc, ptr %115, i32 0, i32 15
  %117 = load ptr, ptr %116, align 8, !tbaa !29
  %118 = load ptr, ptr %2, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.molecular_grid_desc, ptr %118, i32 0, i32 13
  %120 = load ptr, ptr %119, align 8, !tbaa !27
  %121 = load ptr, ptr %7, align 8, !tbaa !5
  %122 = load ptr, ptr %2, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.molecular_grid_desc, ptr %122, i32 0, i32 33
  %124 = load ptr, ptr %123, align 8, !tbaa !30
  %125 = load ptr, ptr %2, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.molecular_grid_desc, ptr %125, i32 0, i32 8
  %127 = load i64, ptr %126, align 8, !tbaa !23
  %128 = load i64, ptr %4, align 8, !tbaa !15
  %129 = load i64, ptr %4, align 8, !tbaa !15
  call void @einsum_mn_mp_m__np(ptr noundef %117, ptr noundef %120, ptr noundef %121, ptr noundef %124, i64 noundef %127, i64 noundef %128, i64 noundef %129)
  %130 = load ptr, ptr %2, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.molecular_grid_desc, ptr %130, i32 0, i32 16
  %132 = load ptr, ptr %131, align 8, !tbaa !31
  %133 = load ptr, ptr %2, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.molecular_grid_desc, ptr %133, i32 0, i32 13
  %135 = load ptr, ptr %134, align 8, !tbaa !27
  %136 = load ptr, ptr %7, align 8, !tbaa !5
  %137 = load ptr, ptr %2, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.molecular_grid_desc, ptr %137, i32 0, i32 34
  %139 = load ptr, ptr %138, align 8, !tbaa !32
  %140 = load ptr, ptr %2, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.molecular_grid_desc, ptr %140, i32 0, i32 8
  %142 = load i64, ptr %141, align 8, !tbaa !23
  %143 = load i64, ptr %4, align 8, !tbaa !15
  %144 = load i64, ptr %4, align 8, !tbaa !15
  call void @einsum_mn_mp_m__np(ptr noundef %132, ptr noundef %135, ptr noundef %136, ptr noundef %139, i64 noundef %142, i64 noundef %143, i64 noundef %144)
  %145 = load ptr, ptr %2, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.molecular_grid_desc, ptr %145, i32 0, i32 32
  %147 = load ptr, ptr %146, align 8, !tbaa !28
  %148 = load ptr, ptr %2, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.molecular_grid_desc, ptr %148, i32 0, i32 32
  %150 = load ptr, ptr %149, align 8, !tbaa !28
  %151 = load i64, ptr %4, align 8, !tbaa !15
  %152 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_scalar_multiply(ptr noundef %147, ptr noundef %150, i64 noundef %151, i64 noundef %152, double noundef 2.000000e+00)
  %153 = load ptr, ptr %2, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.molecular_grid_desc, ptr %153, i32 0, i32 33
  %155 = load ptr, ptr %154, align 8, !tbaa !30
  %156 = load ptr, ptr %2, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct.molecular_grid_desc, ptr %156, i32 0, i32 33
  %158 = load ptr, ptr %157, align 8, !tbaa !30
  %159 = load i64, ptr %4, align 8, !tbaa !15
  %160 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_scalar_multiply(ptr noundef %155, ptr noundef %158, i64 noundef %159, i64 noundef %160, double noundef 2.000000e+00)
  %161 = load ptr, ptr %2, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.molecular_grid_desc, ptr %161, i32 0, i32 34
  %163 = load ptr, ptr %162, align 8, !tbaa !32
  %164 = load ptr, ptr %2, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.molecular_grid_desc, ptr %164, i32 0, i32 34
  %166 = load ptr, ptr %165, align 8, !tbaa !32
  %167 = load i64, ptr %4, align 8, !tbaa !15
  %168 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_scalar_multiply(ptr noundef %163, ptr noundef %166, i64 noundef %167, i64 noundef %168, double noundef 2.000000e+00)
  br label %169

169:                                              ; preds = %99, %1
  %170 = load ptr, ptr %2, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.molecular_grid_desc, ptr %170, i32 0, i32 35
  %172 = load i64, ptr %171, align 8, !tbaa !25
  %173 = load i64, ptr @XC_TYPE_GGA, align 8, !tbaa !15
  %174 = icmp eq i64 %172, %173
  br i1 %174, label %181, label %175

175:                                              ; preds = %169
  %176 = load ptr, ptr %2, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.molecular_grid_desc, ptr %176, i32 0, i32 35
  %178 = load i64, ptr %177, align 8, !tbaa !25
  %179 = load i64, ptr @XC_TYPE_MGGA, align 8, !tbaa !15
  %180 = icmp eq i64 %178, %179
  br i1 %180, label %181, label %1421

181:                                              ; preds = %175, %169
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #4
  %182 = load ptr, ptr %2, align 8, !tbaa !5
  %183 = getelementptr inbounds %struct.molecular_grid_desc, ptr %182, i32 0, i32 64
  %184 = load ptr, ptr %183, align 8, !tbaa !33
  store ptr %184, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  %185 = load ptr, ptr %2, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.molecular_grid_desc, ptr %185, i32 0, i32 65
  %187 = load ptr, ptr %186, align 8, !tbaa !34
  store ptr %187, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  %188 = load ptr, ptr %2, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.molecular_grid_desc, ptr %188, i32 0, i32 66
  %190 = load ptr, ptr %189, align 8, !tbaa !35
  store ptr %190, ptr %12, align 8, !tbaa !5
  %191 = load ptr, ptr %2, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.molecular_grid_desc, ptr %191, i32 0, i32 45
  %193 = load ptr, ptr %192, align 8, !tbaa !36
  %194 = load ptr, ptr %2, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.molecular_grid_desc, ptr %194, i32 0, i32 50
  %196 = load ptr, ptr %195, align 8, !tbaa !37
  %197 = load ptr, ptr %9, align 8, !tbaa !5
  %198 = load ptr, ptr %2, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.molecular_grid_desc, ptr %198, i32 0, i32 8
  %200 = load i64, ptr %199, align 8, !tbaa !23
  call void @mat_add(ptr noundef %193, ptr noundef %196, ptr noundef %197, i64 noundef %200, i64 noundef 1)
  %201 = load ptr, ptr %2, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.molecular_grid_desc, ptr %201, i32 0, i32 11
  %203 = load ptr, ptr %202, align 8, !tbaa !24
  %204 = load ptr, ptr %9, align 8, !tbaa !5
  %205 = load ptr, ptr %10, align 8, !tbaa !5
  %206 = load ptr, ptr %2, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.molecular_grid_desc, ptr %206, i32 0, i32 8
  %208 = load i64, ptr %207, align 8, !tbaa !23
  call void @mat_multiply(ptr noundef %203, ptr noundef %204, ptr noundef %205, i64 noundef %208, i64 noundef 1)
  %209 = load ptr, ptr %10, align 8, !tbaa !5
  %210 = load ptr, ptr %2, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.molecular_grid_desc, ptr %210, i32 0, i32 37
  %212 = load ptr, ptr %211, align 8, !tbaa !38
  %213 = load ptr, ptr %10, align 8, !tbaa !5
  %214 = load ptr, ptr %2, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.molecular_grid_desc, ptr %214, i32 0, i32 8
  %216 = load i64, ptr %215, align 8, !tbaa !23
  call void @mat_multiply(ptr noundef %209, ptr noundef %212, ptr noundef %213, i64 noundef %216, i64 noundef 1)
  %217 = load ptr, ptr %10, align 8, !tbaa !5
  %218 = load ptr, ptr %10, align 8, !tbaa !5
  %219 = load ptr, ptr %2, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.molecular_grid_desc, ptr %219, i32 0, i32 8
  %221 = load i64, ptr %220, align 8, !tbaa !23
  call void @mat_scalar_multiply(ptr noundef %217, ptr noundef %218, i64 noundef %221, i64 noundef 1, double noundef 2.000000e+00)
  %222 = load ptr, ptr %2, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct.molecular_grid_desc, ptr %222, i32 0, i32 11
  %224 = load ptr, ptr %223, align 8, !tbaa !24
  %225 = load ptr, ptr %9, align 8, !tbaa !5
  %226 = load ptr, ptr %11, align 8, !tbaa !5
  %227 = load ptr, ptr %2, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.molecular_grid_desc, ptr %227, i32 0, i32 8
  %229 = load i64, ptr %228, align 8, !tbaa !23
  call void @mat_multiply(ptr noundef %224, ptr noundef %225, ptr noundef %226, i64 noundef %229, i64 noundef 1)
  %230 = load ptr, ptr %11, align 8, !tbaa !5
  %231 = load ptr, ptr %2, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.molecular_grid_desc, ptr %231, i32 0, i32 38
  %233 = load ptr, ptr %232, align 8, !tbaa !39
  %234 = load ptr, ptr %11, align 8, !tbaa !5
  %235 = load ptr, ptr %2, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.molecular_grid_desc, ptr %235, i32 0, i32 8
  %237 = load i64, ptr %236, align 8, !tbaa !23
  call void @mat_multiply(ptr noundef %230, ptr noundef %233, ptr noundef %234, i64 noundef %237, i64 noundef 1)
  %238 = load ptr, ptr %11, align 8, !tbaa !5
  %239 = load ptr, ptr %11, align 8, !tbaa !5
  %240 = load ptr, ptr %2, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.molecular_grid_desc, ptr %240, i32 0, i32 8
  %242 = load i64, ptr %241, align 8, !tbaa !23
  call void @mat_scalar_multiply(ptr noundef %238, ptr noundef %239, i64 noundef %242, i64 noundef 1, double noundef 2.000000e+00)
  %243 = load ptr, ptr %2, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.molecular_grid_desc, ptr %243, i32 0, i32 11
  %245 = load ptr, ptr %244, align 8, !tbaa !24
  %246 = load ptr, ptr %9, align 8, !tbaa !5
  %247 = load ptr, ptr %12, align 8, !tbaa !5
  %248 = load ptr, ptr %2, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.molecular_grid_desc, ptr %248, i32 0, i32 8
  %250 = load i64, ptr %249, align 8, !tbaa !23
  call void @mat_multiply(ptr noundef %245, ptr noundef %246, ptr noundef %247, i64 noundef %250, i64 noundef 1)
  %251 = load ptr, ptr %12, align 8, !tbaa !5
  %252 = load ptr, ptr %2, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.molecular_grid_desc, ptr %252, i32 0, i32 39
  %254 = load ptr, ptr %253, align 8, !tbaa !40
  %255 = load ptr, ptr %12, align 8, !tbaa !5
  %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 !23
  call void @mat_multiply(ptr noundef %251, ptr noundef %254, ptr noundef %255, i64 noundef %258, i64 noundef 1)
  %259 = load ptr, ptr %12, align 8, !tbaa !5
  %260 = load ptr, ptr %12, align 8, !tbaa !5
  %261 = load ptr, ptr %2, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.molecular_grid_desc, ptr %261, i32 0, i32 8
  %263 = load i64, ptr %262, align 8, !tbaa !23
  call void @mat_scalar_multiply(ptr noundef %259, ptr noundef %260, i64 noundef %263, i64 noundef 1, double noundef 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  store i64 0, ptr %13, align 8, !tbaa !15
  br label %264

264:                                              ; preds = %335, %181
  %265 = load i64, ptr %13, align 8, !tbaa !15
  %266 = load ptr, ptr %2, align 8, !tbaa !5
  %267 = getelementptr inbounds %struct.molecular_grid_desc, ptr %266, i32 0, i32 8
  %268 = load i64, ptr %267, align 8, !tbaa !23
  %269 = icmp ult i64 %265, %268
  br i1 %269, label %271, label %270

270:                                              ; preds = %264
  store i32 2, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  br label %338

271:                                              ; preds = %264
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  %272 = load i64, ptr %13, align 8, !tbaa !15
  %273 = load i64, ptr %4, align 8, !tbaa !15
  %274 = mul i64 %272, %273
  store i64 %274, ptr %15, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  store i64 0, ptr %16, align 8, !tbaa !15
  br label %275

275:                                              ; preds = %331, %271
  %276 = load i64, ptr %16, align 8, !tbaa !15
  %277 = load i64, ptr %4, align 8, !tbaa !15
  %278 = icmp ult i64 %276, %277
  br i1 %278, label %280, label %279

279:                                              ; preds = %275
  store i32 5, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  br label %334

280:                                              ; preds = %275
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %281 = load i64, ptr %15, align 8, !tbaa !15
  %282 = load i64, ptr %16, align 8, !tbaa !15
  %283 = add i64 %281, %282
  store i64 %283, ptr %17, align 8, !tbaa !15
  %284 = load ptr, ptr %2, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.molecular_grid_desc, ptr %284, i32 0, i32 13
  %286 = load ptr, ptr %285, align 8, !tbaa !27
  %287 = load i64, ptr %17, align 8, !tbaa !15
  %288 = getelementptr inbounds double, ptr %286, i64 %287
  %289 = load double, ptr %288, align 8, !tbaa !41
  %290 = load ptr, ptr %7, align 8, !tbaa !5
  %291 = load i64, ptr %13, align 8, !tbaa !15
  %292 = getelementptr inbounds double, ptr %290, i64 %291
  %293 = load double, ptr %292, align 8, !tbaa !41
  %294 = load ptr, ptr %2, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.molecular_grid_desc, ptr %294, i32 0, i32 14
  %296 = load ptr, ptr %295, align 8, !tbaa !26
  %297 = load i64, ptr %17, align 8, !tbaa !15
  %298 = getelementptr inbounds double, ptr %296, i64 %297
  %299 = load double, ptr %298, align 8, !tbaa !41
  %300 = load ptr, ptr %10, align 8, !tbaa !5
  %301 = load i64, ptr %13, align 8, !tbaa !15
  %302 = getelementptr inbounds double, ptr %300, i64 %301
  %303 = load double, ptr %302, align 8, !tbaa !41
  %304 = fmul double %299, %303
  %305 = call double @llvm.fmuladd.f64(double %289, double %293, double %304)
  %306 = load ptr, ptr %2, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.molecular_grid_desc, ptr %306, i32 0, i32 15
  %308 = load ptr, ptr %307, align 8, !tbaa !29
  %309 = load i64, ptr %17, align 8, !tbaa !15
  %310 = getelementptr inbounds double, ptr %308, i64 %309
  %311 = load double, ptr %310, align 8, !tbaa !41
  %312 = load ptr, ptr %11, align 8, !tbaa !5
  %313 = load i64, ptr %13, align 8, !tbaa !15
  %314 = getelementptr inbounds double, ptr %312, i64 %313
  %315 = load double, ptr %314, align 8, !tbaa !41
  %316 = call double @llvm.fmuladd.f64(double %311, double %315, double %305)
  %317 = load ptr, ptr %2, align 8, !tbaa !5
  %318 = getelementptr inbounds %struct.molecular_grid_desc, ptr %317, i32 0, i32 16
  %319 = load ptr, ptr %318, align 8, !tbaa !31
  %320 = load i64, ptr %17, align 8, !tbaa !15
  %321 = getelementptr inbounds double, ptr %319, i64 %320
  %322 = load double, ptr %321, align 8, !tbaa !41
  %323 = load ptr, ptr %12, align 8, !tbaa !5
  %324 = load i64, ptr %13, align 8, !tbaa !15
  %325 = getelementptr inbounds double, ptr %323, i64 %324
  %326 = load double, ptr %325, align 8, !tbaa !41
  %327 = call double @llvm.fmuladd.f64(double %322, double %326, double %316)
  %328 = load ptr, ptr %6, align 8, !tbaa !5
  %329 = load i64, ptr %17, align 8, !tbaa !15
  %330 = getelementptr inbounds double, ptr %328, i64 %329
  store double %327, ptr %330, align 8, !tbaa !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  br label %331

331:                                              ; preds = %280
  %332 = load i64, ptr %16, align 8, !tbaa !15
  %333 = add i64 %332, 1
  store i64 %333, ptr %16, align 8, !tbaa !15
  br label %275, !llvm.loop !42

334:                                              ; preds = %279
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  br label %335

335:                                              ; preds = %334
  %336 = load i64, ptr %13, align 8, !tbaa !15
  %337 = add i64 %336, 1
  store i64 %337, ptr %13, align 8, !tbaa !15
  br label %264, !llvm.loop !44

338:                                              ; preds = %270
  %339 = load ptr, ptr %2, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.molecular_grid_desc, ptr %339, i32 0, i32 14
  %341 = load ptr, ptr %340, align 8, !tbaa !26
  %342 = load ptr, ptr %6, align 8, !tbaa !5
  %343 = load ptr, ptr %2, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.molecular_grid_desc, ptr %343, i32 0, i32 32
  %345 = load ptr, ptr %344, align 8, !tbaa !28
  %346 = load ptr, ptr %2, align 8, !tbaa !5
  %347 = getelementptr inbounds %struct.molecular_grid_desc, ptr %346, i32 0, i32 8
  %348 = load i64, ptr %347, align 8, !tbaa !23
  %349 = load i64, ptr %4, align 8, !tbaa !15
  %350 = load i64, ptr %4, align 8, !tbaa !15
  %351 = load ptr, ptr %3, align 8, !tbaa !5
  %352 = getelementptr inbounds %struct.scf_context, ptr %351, i32 0, i32 36
  %353 = load ptr, ptr %352, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %341, ptr noundef %342, ptr noundef %345, i64 noundef %348, i64 noundef %349, i64 noundef %350, ptr noundef %353)
  %354 = load ptr, ptr %2, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.molecular_grid_desc, ptr %354, i32 0, i32 15
  %356 = load ptr, ptr %355, align 8, !tbaa !29
  %357 = load ptr, ptr %6, align 8, !tbaa !5
  %358 = load ptr, ptr %2, align 8, !tbaa !5
  %359 = getelementptr inbounds %struct.molecular_grid_desc, ptr %358, i32 0, i32 33
  %360 = load ptr, ptr %359, align 8, !tbaa !30
  %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 !23
  %364 = load i64, ptr %4, align 8, !tbaa !15
  %365 = load i64, ptr %4, align 8, !tbaa !15
  %366 = load ptr, ptr %3, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.scf_context, ptr %366, i32 0, i32 36
  %368 = load ptr, ptr %367, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %356, ptr noundef %357, ptr noundef %360, i64 noundef %363, i64 noundef %364, i64 noundef %365, ptr noundef %368)
  %369 = load ptr, ptr %2, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.molecular_grid_desc, ptr %369, i32 0, i32 16
  %371 = load ptr, ptr %370, align 8, !tbaa !31
  %372 = load ptr, ptr %6, 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 34
  %375 = load ptr, ptr %374, align 8, !tbaa !32
  %376 = load ptr, ptr %2, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.molecular_grid_desc, ptr %376, i32 0, i32 8
  %378 = load i64, ptr %377, align 8, !tbaa !23
  %379 = load i64, ptr %4, align 8, !tbaa !15
  %380 = load i64, ptr %4, align 8, !tbaa !15
  %381 = load ptr, ptr %3, align 8, !tbaa !5
  %382 = getelementptr inbounds %struct.scf_context, ptr %381, i32 0, i32 36
  %383 = load ptr, ptr %382, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %371, ptr noundef %372, ptr noundef %375, i64 noundef %378, i64 noundef %379, i64 noundef %380, ptr noundef %383)
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  store i64 0, ptr %18, align 8, !tbaa !15
  br label %384

384:                                              ; preds = %555, %338
  %385 = load i64, ptr %18, align 8, !tbaa !15
  %386 = load ptr, ptr %2, align 8, !tbaa !5
  %387 = getelementptr inbounds %struct.molecular_grid_desc, ptr %386, i32 0, i32 8
  %388 = load i64, ptr %387, align 8, !tbaa !23
  %389 = icmp ult i64 %385, %388
  br i1 %389, label %391, label %390

390:                                              ; preds = %384
  store i32 8, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  br label %558

391:                                              ; preds = %384
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %392 = load i64, ptr %18, align 8, !tbaa !15
  %393 = load i64, ptr %4, align 8, !tbaa !15
  %394 = mul i64 %392, %393
  store i64 %394, ptr %19, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  store i64 0, ptr %20, align 8, !tbaa !15
  br label %395

395:                                              ; preds = %551, %391
  %396 = load i64, ptr %20, align 8, !tbaa !15
  %397 = load i64, ptr %4, align 8, !tbaa !15
  %398 = icmp ult i64 %396, %397
  br i1 %398, label %400, label %399

399:                                              ; preds = %395
  store i32 11, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  br label %554

400:                                              ; preds = %395
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  %401 = load i64, ptr %19, align 8, !tbaa !15
  %402 = load i64, ptr %20, align 8, !tbaa !15
  %403 = add i64 %401, %402
  store i64 %403, ptr %21, align 8, !tbaa !15
  %404 = load ptr, ptr %2, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.molecular_grid_desc, ptr %404, i32 0, i32 14
  %406 = load ptr, ptr %405, align 8, !tbaa !26
  %407 = load i64, ptr %21, align 8, !tbaa !15
  %408 = getelementptr inbounds double, ptr %406, i64 %407
  %409 = load double, ptr %408, align 8, !tbaa !41
  %410 = load ptr, ptr %7, align 8, !tbaa !5
  %411 = load i64, ptr %18, align 8, !tbaa !15
  %412 = getelementptr inbounds double, ptr %410, i64 %411
  %413 = load double, ptr %412, align 8, !tbaa !41
  %414 = load ptr, ptr %2, align 8, !tbaa !5
  %415 = getelementptr inbounds %struct.molecular_grid_desc, ptr %414, i32 0, i32 18
  %416 = load ptr, ptr %415, align 8, !tbaa !46
  %417 = load i64, ptr %21, align 8, !tbaa !15
  %418 = getelementptr inbounds double, ptr %416, i64 %417
  %419 = load double, ptr %418, align 8, !tbaa !41
  %420 = load ptr, ptr %10, align 8, !tbaa !5
  %421 = load i64, ptr %18, align 8, !tbaa !15
  %422 = getelementptr inbounds double, ptr %420, i64 %421
  %423 = load double, ptr %422, align 8, !tbaa !41
  %424 = fmul double %419, %423
  %425 = call double @llvm.fmuladd.f64(double %409, double %413, double %424)
  %426 = load ptr, ptr %2, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.molecular_grid_desc, ptr %426, i32 0, i32 21
  %428 = load ptr, ptr %427, align 8, !tbaa !47
  %429 = load i64, ptr %21, align 8, !tbaa !15
  %430 = getelementptr inbounds double, ptr %428, i64 %429
  %431 = load double, ptr %430, align 8, !tbaa !41
  %432 = load ptr, ptr %11, align 8, !tbaa !5
  %433 = load i64, ptr %18, align 8, !tbaa !15
  %434 = getelementptr inbounds double, ptr %432, i64 %433
  %435 = load double, ptr %434, align 8, !tbaa !41
  %436 = call double @llvm.fmuladd.f64(double %431, double %435, double %425)
  %437 = load ptr, ptr %2, align 8, !tbaa !5
  %438 = getelementptr inbounds %struct.molecular_grid_desc, ptr %437, i32 0, i32 22
  %439 = load ptr, ptr %438, align 8, !tbaa !48
  %440 = load i64, ptr %21, align 8, !tbaa !15
  %441 = getelementptr inbounds double, ptr %439, i64 %440
  %442 = load double, ptr %441, align 8, !tbaa !41
  %443 = load ptr, ptr %12, align 8, !tbaa !5
  %444 = load i64, ptr %18, align 8, !tbaa !15
  %445 = getelementptr inbounds double, ptr %443, i64 %444
  %446 = load double, ptr %445, align 8, !tbaa !41
  %447 = call double @llvm.fmuladd.f64(double %442, double %446, double %436)
  %448 = load ptr, ptr %2, align 8, !tbaa !5
  %449 = getelementptr inbounds %struct.molecular_grid_desc, ptr %448, i32 0, i32 67
  %450 = load ptr, ptr %449, align 8, !tbaa !49
  %451 = load i64, ptr %21, align 8, !tbaa !15
  %452 = getelementptr inbounds double, ptr %450, i64 %451
  store double %447, ptr %452, align 8, !tbaa !41
  %453 = load ptr, ptr %2, align 8, !tbaa !5
  %454 = getelementptr inbounds %struct.molecular_grid_desc, ptr %453, i32 0, i32 15
  %455 = load ptr, ptr %454, align 8, !tbaa !29
  %456 = load i64, ptr %21, align 8, !tbaa !15
  %457 = getelementptr inbounds double, ptr %455, i64 %456
  %458 = load double, ptr %457, align 8, !tbaa !41
  %459 = load ptr, ptr %7, align 8, !tbaa !5
  %460 = load i64, ptr %18, align 8, !tbaa !15
  %461 = getelementptr inbounds double, ptr %459, i64 %460
  %462 = load double, ptr %461, align 8, !tbaa !41
  %463 = load ptr, ptr %2, align 8, !tbaa !5
  %464 = getelementptr inbounds %struct.molecular_grid_desc, ptr %463, i32 0, i32 21
  %465 = load ptr, ptr %464, align 8, !tbaa !47
  %466 = load i64, ptr %21, align 8, !tbaa !15
  %467 = getelementptr inbounds double, ptr %465, i64 %466
  %468 = load double, ptr %467, align 8, !tbaa !41
  %469 = load ptr, ptr %10, align 8, !tbaa !5
  %470 = load i64, ptr %18, align 8, !tbaa !15
  %471 = getelementptr inbounds double, ptr %469, i64 %470
  %472 = load double, ptr %471, align 8, !tbaa !41
  %473 = fmul double %468, %472
  %474 = call double @llvm.fmuladd.f64(double %458, double %462, double %473)
  %475 = load ptr, ptr %2, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.molecular_grid_desc, ptr %475, i32 0, i32 19
  %477 = load ptr, ptr %476, align 8, !tbaa !50
  %478 = load i64, ptr %21, align 8, !tbaa !15
  %479 = getelementptr inbounds double, ptr %477, i64 %478
  %480 = load double, ptr %479, align 8, !tbaa !41
  %481 = load ptr, ptr %11, align 8, !tbaa !5
  %482 = load i64, ptr %18, align 8, !tbaa !15
  %483 = getelementptr inbounds double, ptr %481, i64 %482
  %484 = load double, ptr %483, align 8, !tbaa !41
  %485 = call double @llvm.fmuladd.f64(double %480, double %484, double %474)
  %486 = load ptr, ptr %2, align 8, !tbaa !5
  %487 = getelementptr inbounds %struct.molecular_grid_desc, ptr %486, i32 0, i32 23
  %488 = load ptr, ptr %487, align 8, !tbaa !51
  %489 = load i64, ptr %21, align 8, !tbaa !15
  %490 = getelementptr inbounds double, ptr %488, i64 %489
  %491 = load double, ptr %490, align 8, !tbaa !41
  %492 = load ptr, ptr %12, align 8, !tbaa !5
  %493 = load i64, ptr %18, align 8, !tbaa !15
  %494 = getelementptr inbounds double, ptr %492, i64 %493
  %495 = load double, ptr %494, align 8, !tbaa !41
  %496 = call double @llvm.fmuladd.f64(double %491, double %495, double %485)
  %497 = load ptr, ptr %2, align 8, !tbaa !5
  %498 = getelementptr inbounds %struct.molecular_grid_desc, ptr %497, i32 0, i32 68
  %499 = load ptr, ptr %498, align 8, !tbaa !52
  %500 = load i64, ptr %21, align 8, !tbaa !15
  %501 = getelementptr inbounds double, ptr %499, i64 %500
  store double %496, ptr %501, align 8, !tbaa !41
  %502 = load ptr, ptr %2, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct.molecular_grid_desc, ptr %502, i32 0, i32 16
  %504 = load ptr, ptr %503, align 8, !tbaa !31
  %505 = load i64, ptr %21, align 8, !tbaa !15
  %506 = getelementptr inbounds double, ptr %504, i64 %505
  %507 = load double, ptr %506, align 8, !tbaa !41
  %508 = load ptr, ptr %7, align 8, !tbaa !5
  %509 = load i64, ptr %18, align 8, !tbaa !15
  %510 = getelementptr inbounds double, ptr %508, i64 %509
  %511 = load double, ptr %510, align 8, !tbaa !41
  %512 = load ptr, ptr %2, align 8, !tbaa !5
  %513 = getelementptr inbounds %struct.molecular_grid_desc, ptr %512, i32 0, i32 22
  %514 = load ptr, ptr %513, align 8, !tbaa !48
  %515 = load i64, ptr %21, align 8, !tbaa !15
  %516 = getelementptr inbounds double, ptr %514, i64 %515
  %517 = load double, ptr %516, align 8, !tbaa !41
  %518 = load ptr, ptr %10, align 8, !tbaa !5
  %519 = load i64, ptr %18, align 8, !tbaa !15
  %520 = getelementptr inbounds double, ptr %518, i64 %519
  %521 = load double, ptr %520, align 8, !tbaa !41
  %522 = fmul double %517, %521
  %523 = call double @llvm.fmuladd.f64(double %507, double %511, double %522)
  %524 = load ptr, ptr %2, align 8, !tbaa !5
  %525 = getelementptr inbounds %struct.molecular_grid_desc, ptr %524, i32 0, i32 23
  %526 = load ptr, ptr %525, align 8, !tbaa !51
  %527 = load i64, ptr %21, align 8, !tbaa !15
  %528 = getelementptr inbounds double, ptr %526, i64 %527
  %529 = load double, ptr %528, align 8, !tbaa !41
  %530 = load ptr, ptr %11, align 8, !tbaa !5
  %531 = load i64, ptr %18, align 8, !tbaa !15
  %532 = getelementptr inbounds double, ptr %530, i64 %531
  %533 = load double, ptr %532, align 8, !tbaa !41
  %534 = call double @llvm.fmuladd.f64(double %529, double %533, double %523)
  %535 = load ptr, ptr %2, align 8, !tbaa !5
  %536 = getelementptr inbounds %struct.molecular_grid_desc, ptr %535, i32 0, i32 20
  %537 = load ptr, ptr %536, align 8, !tbaa !53
  %538 = load i64, ptr %21, align 8, !tbaa !15
  %539 = getelementptr inbounds double, ptr %537, i64 %538
  %540 = load double, ptr %539, align 8, !tbaa !41
  %541 = load ptr, ptr %12, align 8, !tbaa !5
  %542 = load i64, ptr %18, align 8, !tbaa !15
  %543 = getelementptr inbounds double, ptr %541, i64 %542
  %544 = load double, ptr %543, align 8, !tbaa !41
  %545 = call double @llvm.fmuladd.f64(double %540, double %544, double %534)
  %546 = load ptr, ptr %2, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.molecular_grid_desc, ptr %546, i32 0, i32 69
  %548 = load ptr, ptr %547, align 8, !tbaa !54
  %549 = load i64, ptr %21, align 8, !tbaa !15
  %550 = getelementptr inbounds double, ptr %548, i64 %549
  store double %545, ptr %550, align 8, !tbaa !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  br label %551

551:                                              ; preds = %400
  %552 = load i64, ptr %20, align 8, !tbaa !15
  %553 = add i64 %552, 1
  store i64 %553, ptr %20, align 8, !tbaa !15
  br label %395, !llvm.loop !55

554:                                              ; preds = %399
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  br label %555

555:                                              ; preds = %554
  %556 = load i64, ptr %18, align 8, !tbaa !15
  %557 = add i64 %556, 1
  store i64 %557, ptr %18, align 8, !tbaa !15
  br label %384, !llvm.loop !56

558:                                              ; preds = %390
  %559 = load ptr, ptr %2, align 8, !tbaa !5
  %560 = getelementptr inbounds %struct.molecular_grid_desc, ptr %559, i32 0, i32 67
  %561 = load ptr, ptr %560, align 8, !tbaa !49
  %562 = load ptr, ptr %2, align 8, !tbaa !5
  %563 = getelementptr inbounds %struct.molecular_grid_desc, ptr %562, i32 0, i32 13
  %564 = load ptr, ptr %563, align 8, !tbaa !27
  %565 = load ptr, ptr %5, align 8, !tbaa !5
  %566 = load ptr, ptr %2, align 8, !tbaa !5
  %567 = getelementptr inbounds %struct.molecular_grid_desc, ptr %566, i32 0, i32 8
  %568 = load i64, ptr %567, align 8, !tbaa !23
  %569 = load i64, ptr %4, align 8, !tbaa !15
  %570 = load i64, ptr %4, align 8, !tbaa !15
  %571 = load ptr, ptr %3, align 8, !tbaa !5
  %572 = getelementptr inbounds %struct.scf_context, ptr %571, i32 0, i32 36
  %573 = load ptr, ptr %572, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %561, ptr noundef %564, ptr noundef %565, i64 noundef %568, i64 noundef %569, i64 noundef %570, ptr noundef %573)
  %574 = load ptr, ptr %2, align 8, !tbaa !5
  %575 = getelementptr inbounds %struct.molecular_grid_desc, ptr %574, i32 0, i32 32
  %576 = load ptr, ptr %575, align 8, !tbaa !28
  %577 = load ptr, ptr %5, align 8, !tbaa !5
  %578 = load ptr, ptr %2, align 8, !tbaa !5
  %579 = getelementptr inbounds %struct.molecular_grid_desc, ptr %578, i32 0, i32 32
  %580 = load ptr, ptr %579, align 8, !tbaa !28
  %581 = load i64, ptr %4, align 8, !tbaa !15
  %582 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %576, ptr noundef %577, ptr noundef %580, i64 noundef %581, i64 noundef %582)
  %583 = load ptr, ptr %2, align 8, !tbaa !5
  %584 = getelementptr inbounds %struct.molecular_grid_desc, ptr %583, i32 0, i32 68
  %585 = load ptr, ptr %584, align 8, !tbaa !52
  %586 = load ptr, ptr %2, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.molecular_grid_desc, ptr %586, i32 0, i32 13
  %588 = load ptr, ptr %587, align 8, !tbaa !27
  %589 = load ptr, ptr %5, align 8, !tbaa !5
  %590 = load ptr, ptr %2, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct.molecular_grid_desc, ptr %590, i32 0, i32 8
  %592 = load i64, ptr %591, align 8, !tbaa !23
  %593 = load i64, ptr %4, align 8, !tbaa !15
  %594 = load i64, ptr %4, align 8, !tbaa !15
  %595 = load ptr, ptr %3, align 8, !tbaa !5
  %596 = getelementptr inbounds %struct.scf_context, ptr %595, i32 0, i32 36
  %597 = load ptr, ptr %596, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %585, ptr noundef %588, ptr noundef %589, i64 noundef %592, i64 noundef %593, i64 noundef %594, ptr noundef %597)
  %598 = load ptr, ptr %2, align 8, !tbaa !5
  %599 = getelementptr inbounds %struct.molecular_grid_desc, ptr %598, i32 0, i32 33
  %600 = load ptr, ptr %599, align 8, !tbaa !30
  %601 = load ptr, ptr %5, align 8, !tbaa !5
  %602 = load ptr, ptr %2, align 8, !tbaa !5
  %603 = getelementptr inbounds %struct.molecular_grid_desc, ptr %602, i32 0, i32 33
  %604 = load ptr, ptr %603, align 8, !tbaa !30
  %605 = load i64, ptr %4, align 8, !tbaa !15
  %606 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %600, ptr noundef %601, ptr noundef %604, i64 noundef %605, i64 noundef %606)
  %607 = load ptr, ptr %2, align 8, !tbaa !5
  %608 = getelementptr inbounds %struct.molecular_grid_desc, ptr %607, i32 0, i32 69
  %609 = load ptr, ptr %608, align 8, !tbaa !54
  %610 = load ptr, ptr %2, align 8, !tbaa !5
  %611 = getelementptr inbounds %struct.molecular_grid_desc, ptr %610, i32 0, i32 13
  %612 = load ptr, ptr %611, align 8, !tbaa !27
  %613 = load ptr, ptr %5, align 8, !tbaa !5
  %614 = load ptr, ptr %2, align 8, !tbaa !5
  %615 = getelementptr inbounds %struct.molecular_grid_desc, ptr %614, i32 0, i32 8
  %616 = load i64, ptr %615, align 8, !tbaa !23
  %617 = load i64, ptr %4, align 8, !tbaa !15
  %618 = load i64, ptr %4, align 8, !tbaa !15
  %619 = load ptr, ptr %3, align 8, !tbaa !5
  %620 = getelementptr inbounds %struct.scf_context, ptr %619, i32 0, i32 36
  %621 = load ptr, ptr %620, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %609, ptr noundef %612, ptr noundef %613, i64 noundef %616, i64 noundef %617, i64 noundef %618, ptr noundef %621)
  %622 = load ptr, ptr %2, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.molecular_grid_desc, ptr %622, i32 0, i32 34
  %624 = load ptr, ptr %623, align 8, !tbaa !32
  %625 = load ptr, ptr %5, align 8, !tbaa !5
  %626 = load ptr, ptr %2, align 8, !tbaa !5
  %627 = getelementptr inbounds %struct.molecular_grid_desc, ptr %626, i32 0, i32 34
  %628 = load ptr, ptr %627, align 8, !tbaa !32
  %629 = load i64, ptr %4, align 8, !tbaa !15
  %630 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %624, ptr noundef %625, ptr noundef %628, i64 noundef %629, i64 noundef %630)
  %631 = load ptr, ptr %2, align 8, !tbaa !5
  %632 = getelementptr inbounds %struct.molecular_grid_desc, ptr %631, i32 0, i32 35
  %633 = load i64, ptr %632, align 8, !tbaa !25
  %634 = load i64, ptr @XC_TYPE_MGGA, align 8, !tbaa !15
  %635 = icmp eq i64 %633, %634
  br i1 %635, label %636, label %1420

636:                                              ; preds = %558
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  %637 = load ptr, ptr %9, align 8, !tbaa !5
  store ptr %637, ptr %22, align 8, !tbaa !5
  %638 = load ptr, ptr %2, align 8, !tbaa !5
  %639 = getelementptr inbounds %struct.molecular_grid_desc, ptr %638, i32 0, i32 47
  %640 = load ptr, ptr %639, align 8, !tbaa !57
  %641 = load ptr, ptr %2, align 8, !tbaa !5
  %642 = getelementptr inbounds %struct.molecular_grid_desc, ptr %641, i32 0, i32 52
  %643 = load ptr, ptr %642, align 8, !tbaa !58
  %644 = load ptr, ptr %22, align 8, !tbaa !5
  %645 = load ptr, ptr %2, align 8, !tbaa !5
  %646 = getelementptr inbounds %struct.molecular_grid_desc, ptr %645, i32 0, i32 8
  %647 = load i64, ptr %646, align 8, !tbaa !23
  call void @mat_add(ptr noundef %640, ptr noundef %643, ptr noundef %644, i64 noundef %647, i64 noundef 1)
  %648 = load ptr, ptr %2, align 8, !tbaa !5
  %649 = getelementptr inbounds %struct.molecular_grid_desc, ptr %648, i32 0, i32 11
  %650 = load ptr, ptr %649, align 8, !tbaa !24
  %651 = load ptr, ptr %22, align 8, !tbaa !5
  %652 = load ptr, ptr %22, align 8, !tbaa !5
  %653 = load ptr, ptr %2, align 8, !tbaa !5
  %654 = getelementptr inbounds %struct.molecular_grid_desc, ptr %653, i32 0, i32 8
  %655 = load i64, ptr %654, align 8, !tbaa !23
  call void @mat_multiply(ptr noundef %650, ptr noundef %651, ptr noundef %652, i64 noundef %655, i64 noundef 1)
  %656 = load ptr, ptr %22, align 8, !tbaa !5
  %657 = load ptr, ptr %22, align 8, !tbaa !5
  %658 = load ptr, ptr %2, align 8, !tbaa !5
  %659 = getelementptr inbounds %struct.molecular_grid_desc, ptr %658, i32 0, i32 8
  %660 = load i64, ptr %659, align 8, !tbaa !23
  call void @mat_scalar_multiply(ptr noundef %656, ptr noundef %657, i64 noundef %660, i64 noundef 1, double noundef 2.500000e-01)
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  store i64 0, ptr %23, align 8, !tbaa !15
  br label %661

661:                                              ; preds = %701, %636
  %662 = load i64, ptr %23, align 8, !tbaa !15
  %663 = load ptr, ptr %2, align 8, !tbaa !5
  %664 = getelementptr inbounds %struct.molecular_grid_desc, ptr %663, i32 0, i32 8
  %665 = load i64, ptr %664, align 8, !tbaa !23
  %666 = icmp ult i64 %662, %665
  br i1 %666, label %668, label %667

667:                                              ; preds = %661
  store i32 14, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  br label %704

668:                                              ; preds = %661
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  %669 = load ptr, ptr %22, align 8, !tbaa !5
  %670 = load i64, ptr %23, align 8, !tbaa !15
  %671 = getelementptr inbounds double, ptr %669, i64 %670
  %672 = load double, ptr %671, align 8, !tbaa !41
  store double %672, ptr %24, align 8, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %673 = load i64, ptr %23, align 8, !tbaa !15
  %674 = load i64, ptr %4, align 8, !tbaa !15
  %675 = mul i64 %673, %674
  store i64 %675, ptr %25, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  store i64 0, ptr %26, align 8, !tbaa !15
  br label %676

676:                                              ; preds = %697, %668
  %677 = load i64, ptr %26, align 8, !tbaa !15
  %678 = load i64, ptr %4, align 8, !tbaa !15
  %679 = icmp ult i64 %677, %678
  br i1 %679, label %681, label %680

680:                                              ; preds = %676
  store i32 17, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  br label %700

681:                                              ; preds = %676
  %682 = load double, ptr %24, align 8, !tbaa !41
  %683 = load ptr, ptr %2, align 8, !tbaa !5
  %684 = getelementptr inbounds %struct.molecular_grid_desc, ptr %683, i32 0, i32 14
  %685 = load ptr, ptr %684, align 8, !tbaa !26
  %686 = load i64, ptr %25, align 8, !tbaa !15
  %687 = load i64, ptr %26, align 8, !tbaa !15
  %688 = add i64 %686, %687
  %689 = getelementptr inbounds double, ptr %685, i64 %688
  %690 = load double, ptr %689, align 8, !tbaa !41
  %691 = fmul double %682, %690
  %692 = load ptr, ptr %8, align 8, !tbaa !5
  %693 = load i64, ptr %25, align 8, !tbaa !15
  %694 = load i64, ptr %26, align 8, !tbaa !15
  %695 = add i64 %693, %694
  %696 = getelementptr inbounds double, ptr %692, i64 %695
  store double %691, ptr %696, align 8, !tbaa !41
  br label %697

697:                                              ; preds = %681
  %698 = load i64, ptr %26, align 8, !tbaa !15
  %699 = add i64 %698, 1
  store i64 %699, ptr %26, align 8, !tbaa !15
  br label %676, !llvm.loop !59

700:                                              ; preds = %680
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  br label %701

701:                                              ; preds = %700
  %702 = load i64, ptr %23, align 8, !tbaa !15
  %703 = add i64 %702, 1
  store i64 %703, ptr %23, align 8, !tbaa !15
  br label %661, !llvm.loop !60

704:                                              ; preds = %667
  %705 = load ptr, ptr %2, align 8, !tbaa !5
  %706 = getelementptr inbounds %struct.molecular_grid_desc, ptr %705, i32 0, i32 18
  %707 = load ptr, ptr %706, align 8, !tbaa !46
  %708 = load ptr, ptr %8, align 8, !tbaa !5
  %709 = load ptr, ptr %5, align 8, !tbaa !5
  %710 = load ptr, ptr %2, align 8, !tbaa !5
  %711 = getelementptr inbounds %struct.molecular_grid_desc, ptr %710, i32 0, i32 8
  %712 = load i64, ptr %711, align 8, !tbaa !23
  %713 = load i64, ptr %4, align 8, !tbaa !15
  %714 = load i64, ptr %4, align 8, !tbaa !15
  %715 = load ptr, ptr %3, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct.scf_context, ptr %715, i32 0, i32 36
  %717 = load ptr, ptr %716, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %707, ptr noundef %708, ptr noundef %709, i64 noundef %712, i64 noundef %713, i64 noundef %714, ptr noundef %717)
  %718 = load ptr, ptr %2, align 8, !tbaa !5
  %719 = getelementptr inbounds %struct.molecular_grid_desc, ptr %718, i32 0, i32 32
  %720 = load ptr, ptr %719, align 8, !tbaa !28
  %721 = load ptr, ptr %5, align 8, !tbaa !5
  %722 = load ptr, ptr %2, align 8, !tbaa !5
  %723 = getelementptr inbounds %struct.molecular_grid_desc, ptr %722, i32 0, i32 32
  %724 = load ptr, ptr %723, align 8, !tbaa !28
  %725 = load i64, ptr %4, align 8, !tbaa !15
  %726 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %720, ptr noundef %721, ptr noundef %724, i64 noundef %725, i64 noundef %726)
  %727 = load ptr, ptr %2, align 8, !tbaa !5
  %728 = getelementptr inbounds %struct.molecular_grid_desc, ptr %727, i32 0, i32 21
  %729 = load ptr, ptr %728, align 8, !tbaa !47
  %730 = load ptr, ptr %8, align 8, !tbaa !5
  %731 = load ptr, ptr %5, align 8, !tbaa !5
  %732 = load ptr, ptr %2, align 8, !tbaa !5
  %733 = getelementptr inbounds %struct.molecular_grid_desc, ptr %732, i32 0, i32 8
  %734 = load i64, ptr %733, align 8, !tbaa !23
  %735 = load i64, ptr %4, align 8, !tbaa !15
  %736 = load i64, ptr %4, align 8, !tbaa !15
  %737 = load ptr, ptr %3, align 8, !tbaa !5
  %738 = getelementptr inbounds %struct.scf_context, ptr %737, i32 0, i32 36
  %739 = load ptr, ptr %738, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %729, ptr noundef %730, ptr noundef %731, i64 noundef %734, i64 noundef %735, i64 noundef %736, ptr noundef %739)
  %740 = load ptr, ptr %2, align 8, !tbaa !5
  %741 = getelementptr inbounds %struct.molecular_grid_desc, ptr %740, i32 0, i32 33
  %742 = load ptr, ptr %741, align 8, !tbaa !30
  %743 = load ptr, ptr %5, align 8, !tbaa !5
  %744 = load ptr, ptr %2, align 8, !tbaa !5
  %745 = getelementptr inbounds %struct.molecular_grid_desc, ptr %744, i32 0, i32 33
  %746 = load ptr, ptr %745, align 8, !tbaa !30
  %747 = load i64, ptr %4, align 8, !tbaa !15
  %748 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %742, ptr noundef %743, ptr noundef %746, i64 noundef %747, i64 noundef %748)
  %749 = load ptr, ptr %2, align 8, !tbaa !5
  %750 = getelementptr inbounds %struct.molecular_grid_desc, ptr %749, i32 0, i32 22
  %751 = load ptr, ptr %750, align 8, !tbaa !48
  %752 = load ptr, ptr %8, align 8, !tbaa !5
  %753 = load ptr, ptr %5, align 8, !tbaa !5
  %754 = load ptr, ptr %2, align 8, !tbaa !5
  %755 = getelementptr inbounds %struct.molecular_grid_desc, ptr %754, i32 0, i32 8
  %756 = load i64, ptr %755, align 8, !tbaa !23
  %757 = load i64, ptr %4, align 8, !tbaa !15
  %758 = load i64, ptr %4, align 8, !tbaa !15
  %759 = load ptr, ptr %3, align 8, !tbaa !5
  %760 = getelementptr inbounds %struct.scf_context, ptr %759, i32 0, i32 36
  %761 = load ptr, ptr %760, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %751, ptr noundef %752, ptr noundef %753, i64 noundef %756, i64 noundef %757, i64 noundef %758, ptr noundef %761)
  %762 = load ptr, ptr %2, align 8, !tbaa !5
  %763 = getelementptr inbounds %struct.molecular_grid_desc, ptr %762, i32 0, i32 34
  %764 = load ptr, ptr %763, align 8, !tbaa !32
  %765 = load ptr, ptr %5, align 8, !tbaa !5
  %766 = load ptr, ptr %2, align 8, !tbaa !5
  %767 = getelementptr inbounds %struct.molecular_grid_desc, ptr %766, i32 0, i32 34
  %768 = load ptr, ptr %767, align 8, !tbaa !32
  %769 = load i64, ptr %4, align 8, !tbaa !15
  %770 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %764, ptr noundef %765, ptr noundef %768, i64 noundef %769, i64 noundef %770)
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  store i64 0, ptr %27, align 8, !tbaa !15
  br label %771

771:                                              ; preds = %838, %704
  %772 = load i64, ptr %27, align 8, !tbaa !15
  %773 = load ptr, ptr %2, align 8, !tbaa !5
  %774 = getelementptr inbounds %struct.molecular_grid_desc, ptr %773, i32 0, i32 8
  %775 = load i64, ptr %774, align 8, !tbaa !23
  %776 = icmp ult i64 %772, %775
  br i1 %776, label %778, label %777

777:                                              ; preds = %771
  store i32 20, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  br label %841

778:                                              ; preds = %771
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  %779 = load ptr, ptr %22, align 8, !tbaa !5
  %780 = load i64, ptr %27, align 8, !tbaa !15
  %781 = getelementptr inbounds double, ptr %779, i64 %780
  %782 = load double, ptr %781, align 8, !tbaa !41
  store double %782, ptr %28, align 8, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  %783 = load i64, ptr %27, align 8, !tbaa !15
  %784 = load i64, ptr %4, align 8, !tbaa !15
  %785 = mul i64 %783, %784
  store i64 %785, ptr %29, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  store i64 0, ptr %30, align 8, !tbaa !15
  br label %786

786:                                              ; preds = %834, %778
  %787 = load i64, ptr %30, align 8, !tbaa !15
  %788 = load i64, ptr %4, align 8, !tbaa !15
  %789 = icmp ult i64 %787, %788
  br i1 %789, label %791, label %790

790:                                              ; preds = %786
  store i32 23, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #4
  br label %837

791:                                              ; preds = %786
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  %792 = load i64, ptr %29, align 8, !tbaa !15
  %793 = load i64, ptr %30, align 8, !tbaa !15
  %794 = add i64 %792, %793
  store i64 %794, ptr %31, align 8, !tbaa !15
  %795 = load double, ptr %28, align 8, !tbaa !41
  %796 = load ptr, ptr %2, align 8, !tbaa !5
  %797 = getelementptr inbounds %struct.molecular_grid_desc, ptr %796, i32 0, i32 18
  %798 = load ptr, ptr %797, align 8, !tbaa !46
  %799 = load i64, ptr %31, align 8, !tbaa !15
  %800 = getelementptr inbounds double, ptr %798, i64 %799
  %801 = load double, ptr %800, align 8, !tbaa !41
  %802 = fmul double %795, %801
  %803 = load ptr, ptr %2, align 8, !tbaa !5
  %804 = getelementptr inbounds %struct.molecular_grid_desc, ptr %803, i32 0, i32 67
  %805 = load ptr, ptr %804, align 8, !tbaa !49
  %806 = load i64, ptr %31, align 8, !tbaa !15
  %807 = getelementptr inbounds double, ptr %805, i64 %806
  store double %802, ptr %807, align 8, !tbaa !41
  %808 = load double, ptr %28, align 8, !tbaa !41
  %809 = load ptr, ptr %2, align 8, !tbaa !5
  %810 = getelementptr inbounds %struct.molecular_grid_desc, ptr %809, i32 0, i32 21
  %811 = load ptr, ptr %810, align 8, !tbaa !47
  %812 = load i64, ptr %31, align 8, !tbaa !15
  %813 = getelementptr inbounds double, ptr %811, i64 %812
  %814 = load double, ptr %813, align 8, !tbaa !41
  %815 = fmul double %808, %814
  %816 = load ptr, ptr %2, align 8, !tbaa !5
  %817 = getelementptr inbounds %struct.molecular_grid_desc, ptr %816, i32 0, i32 68
  %818 = load ptr, ptr %817, align 8, !tbaa !52
  %819 = load i64, ptr %31, align 8, !tbaa !15
  %820 = getelementptr inbounds double, ptr %818, i64 %819
  store double %815, ptr %820, align 8, !tbaa !41
  %821 = load double, ptr %28, align 8, !tbaa !41
  %822 = load ptr, ptr %2, align 8, !tbaa !5
  %823 = getelementptr inbounds %struct.molecular_grid_desc, ptr %822, i32 0, i32 22
  %824 = load ptr, ptr %823, align 8, !tbaa !48
  %825 = load i64, ptr %31, align 8, !tbaa !15
  %826 = getelementptr inbounds double, ptr %824, i64 %825
  %827 = load double, ptr %826, align 8, !tbaa !41
  %828 = fmul double %821, %827
  %829 = load ptr, ptr %2, align 8, !tbaa !5
  %830 = getelementptr inbounds %struct.molecular_grid_desc, ptr %829, i32 0, i32 69
  %831 = load ptr, ptr %830, align 8, !tbaa !54
  %832 = load i64, ptr %31, align 8, !tbaa !15
  %833 = getelementptr inbounds double, ptr %831, i64 %832
  store double %828, ptr %833, align 8, !tbaa !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  br label %834

834:                                              ; preds = %791
  %835 = load i64, ptr %30, align 8, !tbaa !15
  %836 = add i64 %835, 1
  store i64 %836, ptr %30, align 8, !tbaa !15
  br label %786, !llvm.loop !61

837:                                              ; preds = %790
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  br label %838

838:                                              ; preds = %837
  %839 = load i64, ptr %27, align 8, !tbaa !15
  %840 = add i64 %839, 1
  store i64 %840, ptr %27, align 8, !tbaa !15
  br label %771, !llvm.loop !62

841:                                              ; preds = %777
  %842 = load ptr, ptr %2, align 8, !tbaa !5
  %843 = getelementptr inbounds %struct.molecular_grid_desc, ptr %842, i32 0, i32 67
  %844 = load ptr, ptr %843, align 8, !tbaa !49
  %845 = load ptr, ptr %2, align 8, !tbaa !5
  %846 = getelementptr inbounds %struct.molecular_grid_desc, ptr %845, i32 0, i32 14
  %847 = load ptr, ptr %846, align 8, !tbaa !26
  %848 = load ptr, ptr %5, align 8, !tbaa !5
  %849 = load ptr, ptr %2, align 8, !tbaa !5
  %850 = getelementptr inbounds %struct.molecular_grid_desc, ptr %849, i32 0, i32 8
  %851 = load i64, ptr %850, align 8, !tbaa !23
  %852 = load i64, ptr %4, align 8, !tbaa !15
  %853 = load i64, ptr %4, align 8, !tbaa !15
  %854 = load ptr, ptr %3, align 8, !tbaa !5
  %855 = getelementptr inbounds %struct.scf_context, ptr %854, i32 0, i32 36
  %856 = load ptr, ptr %855, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %844, ptr noundef %847, ptr noundef %848, i64 noundef %851, i64 noundef %852, i64 noundef %853, ptr noundef %856)
  %857 = load ptr, ptr %2, align 8, !tbaa !5
  %858 = getelementptr inbounds %struct.molecular_grid_desc, ptr %857, i32 0, i32 32
  %859 = load ptr, ptr %858, align 8, !tbaa !28
  %860 = load ptr, ptr %5, align 8, !tbaa !5
  %861 = load ptr, ptr %2, align 8, !tbaa !5
  %862 = getelementptr inbounds %struct.molecular_grid_desc, ptr %861, i32 0, i32 32
  %863 = load ptr, ptr %862, align 8, !tbaa !28
  %864 = load i64, ptr %4, align 8, !tbaa !15
  %865 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %859, ptr noundef %860, ptr noundef %863, i64 noundef %864, i64 noundef %865)
  %866 = load ptr, ptr %2, align 8, !tbaa !5
  %867 = getelementptr inbounds %struct.molecular_grid_desc, ptr %866, i32 0, i32 68
  %868 = load ptr, ptr %867, align 8, !tbaa !52
  %869 = load ptr, ptr %2, align 8, !tbaa !5
  %870 = getelementptr inbounds %struct.molecular_grid_desc, ptr %869, i32 0, i32 14
  %871 = load ptr, ptr %870, align 8, !tbaa !26
  %872 = load ptr, ptr %5, align 8, !tbaa !5
  %873 = load ptr, ptr %2, align 8, !tbaa !5
  %874 = getelementptr inbounds %struct.molecular_grid_desc, ptr %873, i32 0, i32 8
  %875 = load i64, ptr %874, align 8, !tbaa !23
  %876 = load i64, ptr %4, align 8, !tbaa !15
  %877 = load i64, ptr %4, align 8, !tbaa !15
  %878 = load ptr, ptr %3, align 8, !tbaa !5
  %879 = getelementptr inbounds %struct.scf_context, ptr %878, i32 0, i32 36
  %880 = load ptr, ptr %879, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %868, ptr noundef %871, ptr noundef %872, i64 noundef %875, i64 noundef %876, i64 noundef %877, ptr noundef %880)
  %881 = load ptr, ptr %2, align 8, !tbaa !5
  %882 = getelementptr inbounds %struct.molecular_grid_desc, ptr %881, i32 0, i32 33
  %883 = load ptr, ptr %882, align 8, !tbaa !30
  %884 = load ptr, ptr %5, align 8, !tbaa !5
  %885 = load ptr, ptr %2, align 8, !tbaa !5
  %886 = getelementptr inbounds %struct.molecular_grid_desc, ptr %885, i32 0, i32 33
  %887 = load ptr, ptr %886, align 8, !tbaa !30
  %888 = load i64, ptr %4, align 8, !tbaa !15
  %889 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %883, ptr noundef %884, ptr noundef %887, i64 noundef %888, i64 noundef %889)
  %890 = load ptr, ptr %2, align 8, !tbaa !5
  %891 = getelementptr inbounds %struct.molecular_grid_desc, ptr %890, i32 0, i32 69
  %892 = load ptr, ptr %891, align 8, !tbaa !54
  %893 = load ptr, ptr %2, align 8, !tbaa !5
  %894 = getelementptr inbounds %struct.molecular_grid_desc, ptr %893, i32 0, i32 14
  %895 = load ptr, ptr %894, align 8, !tbaa !26
  %896 = load ptr, ptr %5, align 8, !tbaa !5
  %897 = load ptr, ptr %2, align 8, !tbaa !5
  %898 = getelementptr inbounds %struct.molecular_grid_desc, ptr %897, i32 0, i32 8
  %899 = load i64, ptr %898, align 8, !tbaa !23
  %900 = load i64, ptr %4, align 8, !tbaa !15
  %901 = load i64, ptr %4, align 8, !tbaa !15
  %902 = load ptr, ptr %3, align 8, !tbaa !5
  %903 = getelementptr inbounds %struct.scf_context, ptr %902, i32 0, i32 36
  %904 = load ptr, ptr %903, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %892, ptr noundef %895, ptr noundef %896, i64 noundef %899, i64 noundef %900, i64 noundef %901, ptr noundef %904)
  %905 = load ptr, ptr %2, align 8, !tbaa !5
  %906 = getelementptr inbounds %struct.molecular_grid_desc, ptr %905, i32 0, i32 34
  %907 = load ptr, ptr %906, align 8, !tbaa !32
  %908 = load ptr, ptr %5, align 8, !tbaa !5
  %909 = load ptr, ptr %2, align 8, !tbaa !5
  %910 = getelementptr inbounds %struct.molecular_grid_desc, ptr %909, i32 0, i32 34
  %911 = load ptr, ptr %910, align 8, !tbaa !32
  %912 = load i64, ptr %4, align 8, !tbaa !15
  %913 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %907, ptr noundef %908, ptr noundef %911, i64 noundef %912, i64 noundef %913)
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  store i64 0, ptr %32, align 8, !tbaa !15
  br label %914

914:                                              ; preds = %954, %841
  %915 = load i64, ptr %32, align 8, !tbaa !15
  %916 = load ptr, ptr %2, align 8, !tbaa !5
  %917 = getelementptr inbounds %struct.molecular_grid_desc, ptr %916, i32 0, i32 8
  %918 = load i64, ptr %917, align 8, !tbaa !23
  %919 = icmp ult i64 %915, %918
  br i1 %919, label %921, label %920

920:                                              ; preds = %914
  store i32 26, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  br label %957

921:                                              ; preds = %914
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #4
  %922 = load ptr, ptr %22, align 8, !tbaa !5
  %923 = load i64, ptr %32, align 8, !tbaa !15
  %924 = getelementptr inbounds double, ptr %922, i64 %923
  %925 = load double, ptr %924, align 8, !tbaa !41
  store double %925, ptr %33, align 8, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #4
  %926 = load i64, ptr %32, align 8, !tbaa !15
  %927 = load i64, ptr %4, align 8, !tbaa !15
  %928 = mul i64 %926, %927
  store i64 %928, ptr %34, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #4
  store i64 0, ptr %35, align 8, !tbaa !15
  br label %929

929:                                              ; preds = %950, %921
  %930 = load i64, ptr %35, align 8, !tbaa !15
  %931 = load i64, ptr %4, align 8, !tbaa !15
  %932 = icmp ult i64 %930, %931
  br i1 %932, label %934, label %933

933:                                              ; preds = %929
  store i32 29, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #4
  br label %953

934:                                              ; preds = %929
  %935 = load double, ptr %33, align 8, !tbaa !41
  %936 = load ptr, ptr %2, align 8, !tbaa !5
  %937 = getelementptr inbounds %struct.molecular_grid_desc, ptr %936, i32 0, i32 15
  %938 = load ptr, ptr %937, align 8, !tbaa !29
  %939 = load i64, ptr %34, align 8, !tbaa !15
  %940 = load i64, ptr %35, align 8, !tbaa !15
  %941 = add i64 %939, %940
  %942 = getelementptr inbounds double, ptr %938, i64 %941
  %943 = load double, ptr %942, align 8, !tbaa !41
  %944 = fmul double %935, %943
  %945 = load ptr, ptr %8, align 8, !tbaa !5
  %946 = load i64, ptr %34, align 8, !tbaa !15
  %947 = load i64, ptr %35, align 8, !tbaa !15
  %948 = add i64 %946, %947
  %949 = getelementptr inbounds double, ptr %945, i64 %948
  store double %944, ptr %949, align 8, !tbaa !41
  br label %950

950:                                              ; preds = %934
  %951 = load i64, ptr %35, align 8, !tbaa !15
  %952 = add i64 %951, 1
  store i64 %952, ptr %35, align 8, !tbaa !15
  br label %929, !llvm.loop !63

953:                                              ; preds = %933
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  br label %954

954:                                              ; preds = %953
  %955 = load i64, ptr %32, align 8, !tbaa !15
  %956 = add i64 %955, 1
  store i64 %956, ptr %32, align 8, !tbaa !15
  br label %914, !llvm.loop !64

957:                                              ; preds = %920
  %958 = load ptr, ptr %2, align 8, !tbaa !5
  %959 = getelementptr inbounds %struct.molecular_grid_desc, ptr %958, i32 0, i32 21
  %960 = load ptr, ptr %959, align 8, !tbaa !47
  %961 = load ptr, ptr %8, align 8, !tbaa !5
  %962 = load ptr, ptr %5, align 8, !tbaa !5
  %963 = load ptr, ptr %2, align 8, !tbaa !5
  %964 = getelementptr inbounds %struct.molecular_grid_desc, ptr %963, i32 0, i32 8
  %965 = load i64, ptr %964, align 8, !tbaa !23
  %966 = load i64, ptr %4, align 8, !tbaa !15
  %967 = load i64, ptr %4, align 8, !tbaa !15
  %968 = load ptr, ptr %3, align 8, !tbaa !5
  %969 = getelementptr inbounds %struct.scf_context, ptr %968, i32 0, i32 36
  %970 = load ptr, ptr %969, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %960, ptr noundef %961, ptr noundef %962, i64 noundef %965, i64 noundef %966, i64 noundef %967, ptr noundef %970)
  %971 = load ptr, ptr %2, align 8, !tbaa !5
  %972 = getelementptr inbounds %struct.molecular_grid_desc, ptr %971, i32 0, i32 32
  %973 = load ptr, ptr %972, align 8, !tbaa !28
  %974 = load ptr, ptr %5, align 8, !tbaa !5
  %975 = load ptr, ptr %2, align 8, !tbaa !5
  %976 = getelementptr inbounds %struct.molecular_grid_desc, ptr %975, i32 0, i32 32
  %977 = load ptr, ptr %976, align 8, !tbaa !28
  %978 = load i64, ptr %4, align 8, !tbaa !15
  %979 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %973, ptr noundef %974, ptr noundef %977, i64 noundef %978, i64 noundef %979)
  %980 = load ptr, ptr %2, align 8, !tbaa !5
  %981 = getelementptr inbounds %struct.molecular_grid_desc, ptr %980, i32 0, i32 19
  %982 = load ptr, ptr %981, align 8, !tbaa !50
  %983 = load ptr, ptr %8, align 8, !tbaa !5
  %984 = load ptr, ptr %5, align 8, !tbaa !5
  %985 = load ptr, ptr %2, align 8, !tbaa !5
  %986 = getelementptr inbounds %struct.molecular_grid_desc, ptr %985, i32 0, i32 8
  %987 = load i64, ptr %986, align 8, !tbaa !23
  %988 = load i64, ptr %4, align 8, !tbaa !15
  %989 = load i64, ptr %4, align 8, !tbaa !15
  %990 = load ptr, ptr %3, align 8, !tbaa !5
  %991 = getelementptr inbounds %struct.scf_context, ptr %990, i32 0, i32 36
  %992 = load ptr, ptr %991, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %982, ptr noundef %983, ptr noundef %984, i64 noundef %987, i64 noundef %988, i64 noundef %989, ptr noundef %992)
  %993 = load ptr, ptr %2, align 8, !tbaa !5
  %994 = getelementptr inbounds %struct.molecular_grid_desc, ptr %993, i32 0, i32 33
  %995 = load ptr, ptr %994, align 8, !tbaa !30
  %996 = load ptr, ptr %5, align 8, !tbaa !5
  %997 = load ptr, ptr %2, align 8, !tbaa !5
  %998 = getelementptr inbounds %struct.molecular_grid_desc, ptr %997, i32 0, i32 33
  %999 = load ptr, ptr %998, align 8, !tbaa !30
  %1000 = load i64, ptr %4, align 8, !tbaa !15
  %1001 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %995, ptr noundef %996, ptr noundef %999, i64 noundef %1000, i64 noundef %1001)
  %1002 = load ptr, ptr %2, align 8, !tbaa !5
  %1003 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1002, i32 0, i32 23
  %1004 = load ptr, ptr %1003, align 8, !tbaa !51
  %1005 = load ptr, ptr %8, align 8, !tbaa !5
  %1006 = load ptr, ptr %5, align 8, !tbaa !5
  %1007 = load ptr, ptr %2, align 8, !tbaa !5
  %1008 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1007, i32 0, i32 8
  %1009 = load i64, ptr %1008, align 8, !tbaa !23
  %1010 = load i64, ptr %4, align 8, !tbaa !15
  %1011 = load i64, ptr %4, align 8, !tbaa !15
  %1012 = load ptr, ptr %3, align 8, !tbaa !5
  %1013 = getelementptr inbounds %struct.scf_context, ptr %1012, i32 0, i32 36
  %1014 = load ptr, ptr %1013, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1004, ptr noundef %1005, ptr noundef %1006, i64 noundef %1009, i64 noundef %1010, i64 noundef %1011, ptr noundef %1014)
  %1015 = load ptr, ptr %2, align 8, !tbaa !5
  %1016 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1015, i32 0, i32 34
  %1017 = load ptr, ptr %1016, align 8, !tbaa !32
  %1018 = load ptr, ptr %5, align 8, !tbaa !5
  %1019 = load ptr, ptr %2, align 8, !tbaa !5
  %1020 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1019, i32 0, i32 34
  %1021 = load ptr, ptr %1020, align 8, !tbaa !32
  %1022 = load i64, ptr %4, align 8, !tbaa !15
  %1023 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1017, ptr noundef %1018, ptr noundef %1021, i64 noundef %1022, i64 noundef %1023)
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  store i64 0, ptr %36, align 8, !tbaa !15
  br label %1024

1024:                                             ; preds = %1091, %957
  %1025 = load i64, ptr %36, align 8, !tbaa !15
  %1026 = load ptr, ptr %2, align 8, !tbaa !5
  %1027 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1026, i32 0, i32 8
  %1028 = load i64, ptr %1027, align 8, !tbaa !23
  %1029 = icmp ult i64 %1025, %1028
  br i1 %1029, label %1031, label %1030

1030:                                             ; preds = %1024
  store i32 32, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  br label %1094

1031:                                             ; preds = %1024
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  %1032 = load ptr, ptr %22, align 8, !tbaa !5
  %1033 = load i64, ptr %36, align 8, !tbaa !15
  %1034 = getelementptr inbounds double, ptr %1032, i64 %1033
  %1035 = load double, ptr %1034, align 8, !tbaa !41
  store double %1035, ptr %37, align 8, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  %1036 = load i64, ptr %36, align 8, !tbaa !15
  %1037 = load i64, ptr %4, align 8, !tbaa !15
  %1038 = mul i64 %1036, %1037
  store i64 %1038, ptr %38, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  store i64 0, ptr %39, align 8, !tbaa !15
  br label %1039

1039:                                             ; preds = %1087, %1031
  %1040 = load i64, ptr %39, align 8, !tbaa !15
  %1041 = load i64, ptr %4, align 8, !tbaa !15
  %1042 = icmp ult i64 %1040, %1041
  br i1 %1042, label %1044, label %1043

1043:                                             ; preds = %1039
  store i32 35, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  br label %1090

1044:                                             ; preds = %1039
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #4
  %1045 = load i64, ptr %38, align 8, !tbaa !15
  %1046 = load i64, ptr %39, align 8, !tbaa !15
  %1047 = add i64 %1045, %1046
  store i64 %1047, ptr %40, align 8, !tbaa !15
  %1048 = load double, ptr %37, align 8, !tbaa !41
  %1049 = load ptr, ptr %2, align 8, !tbaa !5
  %1050 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1049, i32 0, i32 21
  %1051 = load ptr, ptr %1050, align 8, !tbaa !47
  %1052 = load i64, ptr %40, align 8, !tbaa !15
  %1053 = getelementptr inbounds double, ptr %1051, i64 %1052
  %1054 = load double, ptr %1053, align 8, !tbaa !41
  %1055 = fmul double %1048, %1054
  %1056 = load ptr, ptr %2, align 8, !tbaa !5
  %1057 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1056, i32 0, i32 67
  %1058 = load ptr, ptr %1057, align 8, !tbaa !49
  %1059 = load i64, ptr %40, align 8, !tbaa !15
  %1060 = getelementptr inbounds double, ptr %1058, i64 %1059
  store double %1055, ptr %1060, align 8, !tbaa !41
  %1061 = load double, ptr %37, align 8, !tbaa !41
  %1062 = load ptr, ptr %2, align 8, !tbaa !5
  %1063 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1062, i32 0, i32 19
  %1064 = load ptr, ptr %1063, align 8, !tbaa !50
  %1065 = load i64, ptr %40, align 8, !tbaa !15
  %1066 = getelementptr inbounds double, ptr %1064, i64 %1065
  %1067 = load double, ptr %1066, align 8, !tbaa !41
  %1068 = fmul double %1061, %1067
  %1069 = load ptr, ptr %2, align 8, !tbaa !5
  %1070 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1069, i32 0, i32 68
  %1071 = load ptr, ptr %1070, align 8, !tbaa !52
  %1072 = load i64, ptr %40, align 8, !tbaa !15
  %1073 = getelementptr inbounds double, ptr %1071, i64 %1072
  store double %1068, ptr %1073, align 8, !tbaa !41
  %1074 = load double, ptr %37, align 8, !tbaa !41
  %1075 = load ptr, ptr %2, align 8, !tbaa !5
  %1076 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1075, i32 0, i32 23
  %1077 = load ptr, ptr %1076, align 8, !tbaa !51
  %1078 = load i64, ptr %40, align 8, !tbaa !15
  %1079 = getelementptr inbounds double, ptr %1077, i64 %1078
  %1080 = load double, ptr %1079, align 8, !tbaa !41
  %1081 = fmul double %1074, %1080
  %1082 = load ptr, ptr %2, align 8, !tbaa !5
  %1083 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1082, i32 0, i32 69
  %1084 = load ptr, ptr %1083, align 8, !tbaa !54
  %1085 = load i64, ptr %40, align 8, !tbaa !15
  %1086 = getelementptr inbounds double, ptr %1084, i64 %1085
  store double %1081, ptr %1086, align 8, !tbaa !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  br label %1087

1087:                                             ; preds = %1044
  %1088 = load i64, ptr %39, align 8, !tbaa !15
  %1089 = add i64 %1088, 1
  store i64 %1089, ptr %39, align 8, !tbaa !15
  br label %1039, !llvm.loop !65

1090:                                             ; preds = %1043
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  br label %1091

1091:                                             ; preds = %1090
  %1092 = load i64, ptr %36, align 8, !tbaa !15
  %1093 = add i64 %1092, 1
  store i64 %1093, ptr %36, align 8, !tbaa !15
  br label %1024, !llvm.loop !66

1094:                                             ; preds = %1030
  %1095 = load ptr, ptr %2, align 8, !tbaa !5
  %1096 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1095, i32 0, i32 67
  %1097 = load ptr, ptr %1096, align 8, !tbaa !49
  %1098 = load ptr, ptr %2, align 8, !tbaa !5
  %1099 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1098, i32 0, i32 15
  %1100 = load ptr, ptr %1099, align 8, !tbaa !29
  %1101 = load ptr, ptr %5, align 8, !tbaa !5
  %1102 = load ptr, ptr %2, align 8, !tbaa !5
  %1103 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1102, i32 0, i32 8
  %1104 = load i64, ptr %1103, align 8, !tbaa !23
  %1105 = load i64, ptr %4, align 8, !tbaa !15
  %1106 = load i64, ptr %4, align 8, !tbaa !15
  %1107 = load ptr, ptr %3, align 8, !tbaa !5
  %1108 = getelementptr inbounds %struct.scf_context, ptr %1107, i32 0, i32 36
  %1109 = load ptr, ptr %1108, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1097, ptr noundef %1100, ptr noundef %1101, i64 noundef %1104, i64 noundef %1105, i64 noundef %1106, ptr noundef %1109)
  %1110 = load ptr, ptr %2, align 8, !tbaa !5
  %1111 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1110, i32 0, i32 32
  %1112 = load ptr, ptr %1111, align 8, !tbaa !28
  %1113 = load ptr, ptr %5, align 8, !tbaa !5
  %1114 = load ptr, ptr %2, align 8, !tbaa !5
  %1115 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1114, i32 0, i32 32
  %1116 = load ptr, ptr %1115, align 8, !tbaa !28
  %1117 = load i64, ptr %4, align 8, !tbaa !15
  %1118 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1112, ptr noundef %1113, ptr noundef %1116, i64 noundef %1117, i64 noundef %1118)
  %1119 = load ptr, ptr %2, align 8, !tbaa !5
  %1120 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1119, i32 0, i32 68
  %1121 = load ptr, ptr %1120, align 8, !tbaa !52
  %1122 = load ptr, ptr %2, align 8, !tbaa !5
  %1123 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1122, i32 0, i32 15
  %1124 = load ptr, ptr %1123, align 8, !tbaa !29
  %1125 = load ptr, ptr %5, align 8, !tbaa !5
  %1126 = load ptr, ptr %2, align 8, !tbaa !5
  %1127 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1126, i32 0, i32 8
  %1128 = load i64, ptr %1127, align 8, !tbaa !23
  %1129 = load i64, ptr %4, align 8, !tbaa !15
  %1130 = load i64, ptr %4, align 8, !tbaa !15
  %1131 = load ptr, ptr %3, align 8, !tbaa !5
  %1132 = getelementptr inbounds %struct.scf_context, ptr %1131, i32 0, i32 36
  %1133 = load ptr, ptr %1132, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1121, ptr noundef %1124, ptr noundef %1125, i64 noundef %1128, i64 noundef %1129, i64 noundef %1130, ptr noundef %1133)
  %1134 = load ptr, ptr %2, align 8, !tbaa !5
  %1135 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1134, i32 0, i32 33
  %1136 = load ptr, ptr %1135, align 8, !tbaa !30
  %1137 = load ptr, ptr %5, align 8, !tbaa !5
  %1138 = load ptr, ptr %2, align 8, !tbaa !5
  %1139 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1138, i32 0, i32 33
  %1140 = load ptr, ptr %1139, align 8, !tbaa !30
  %1141 = load i64, ptr %4, align 8, !tbaa !15
  %1142 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1136, ptr noundef %1137, ptr noundef %1140, i64 noundef %1141, i64 noundef %1142)
  %1143 = load ptr, ptr %2, align 8, !tbaa !5
  %1144 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1143, i32 0, i32 69
  %1145 = load ptr, ptr %1144, align 8, !tbaa !54
  %1146 = load ptr, ptr %2, align 8, !tbaa !5
  %1147 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1146, i32 0, i32 15
  %1148 = load ptr, ptr %1147, align 8, !tbaa !29
  %1149 = load ptr, ptr %5, align 8, !tbaa !5
  %1150 = load ptr, ptr %2, align 8, !tbaa !5
  %1151 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1150, i32 0, i32 8
  %1152 = load i64, ptr %1151, align 8, !tbaa !23
  %1153 = load i64, ptr %4, align 8, !tbaa !15
  %1154 = load i64, ptr %4, align 8, !tbaa !15
  %1155 = load ptr, ptr %3, align 8, !tbaa !5
  %1156 = getelementptr inbounds %struct.scf_context, ptr %1155, i32 0, i32 36
  %1157 = load ptr, ptr %1156, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1145, ptr noundef %1148, ptr noundef %1149, i64 noundef %1152, i64 noundef %1153, i64 noundef %1154, ptr noundef %1157)
  %1158 = load ptr, ptr %2, align 8, !tbaa !5
  %1159 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1158, i32 0, i32 34
  %1160 = load ptr, ptr %1159, align 8, !tbaa !32
  %1161 = load ptr, ptr %5, align 8, !tbaa !5
  %1162 = load ptr, ptr %2, align 8, !tbaa !5
  %1163 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1162, i32 0, i32 34
  %1164 = load ptr, ptr %1163, align 8, !tbaa !32
  %1165 = load i64, ptr %4, align 8, !tbaa !15
  %1166 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1160, ptr noundef %1161, ptr noundef %1164, i64 noundef %1165, i64 noundef %1166)
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #4
  store i64 0, ptr %41, align 8, !tbaa !15
  br label %1167

1167:                                             ; preds = %1207, %1094
  %1168 = load i64, ptr %41, align 8, !tbaa !15
  %1169 = load ptr, ptr %2, align 8, !tbaa !5
  %1170 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1169, i32 0, i32 8
  %1171 = load i64, ptr %1170, align 8, !tbaa !23
  %1172 = icmp ult i64 %1168, %1171
  br i1 %1172, label %1174, label %1173

1173:                                             ; preds = %1167
  store i32 38, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #4
  br label %1210

1174:                                             ; preds = %1167
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #4
  %1175 = load ptr, ptr %22, align 8, !tbaa !5
  %1176 = load i64, ptr %41, align 8, !tbaa !15
  %1177 = getelementptr inbounds double, ptr %1175, i64 %1176
  %1178 = load double, ptr %1177, align 8, !tbaa !41
  store double %1178, ptr %42, align 8, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #4
  %1179 = load i64, ptr %41, align 8, !tbaa !15
  %1180 = load i64, ptr %4, align 8, !tbaa !15
  %1181 = mul i64 %1179, %1180
  store i64 %1181, ptr %43, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #4
  store i64 0, ptr %44, align 8, !tbaa !15
  br label %1182

1182:                                             ; preds = %1203, %1174
  %1183 = load i64, ptr %44, align 8, !tbaa !15
  %1184 = load i64, ptr %4, align 8, !tbaa !15
  %1185 = icmp ult i64 %1183, %1184
  br i1 %1185, label %1187, label %1186

1186:                                             ; preds = %1182
  store i32 41, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #4
  br label %1206

1187:                                             ; preds = %1182
  %1188 = load double, ptr %42, align 8, !tbaa !41
  %1189 = load ptr, ptr %2, align 8, !tbaa !5
  %1190 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1189, i32 0, i32 16
  %1191 = load ptr, ptr %1190, align 8, !tbaa !31
  %1192 = load i64, ptr %43, align 8, !tbaa !15
  %1193 = load i64, ptr %44, align 8, !tbaa !15
  %1194 = add i64 %1192, %1193
  %1195 = getelementptr inbounds double, ptr %1191, i64 %1194
  %1196 = load double, ptr %1195, align 8, !tbaa !41
  %1197 = fmul double %1188, %1196
  %1198 = load ptr, ptr %8, align 8, !tbaa !5
  %1199 = load i64, ptr %43, align 8, !tbaa !15
  %1200 = load i64, ptr %44, align 8, !tbaa !15
  %1201 = add i64 %1199, %1200
  %1202 = getelementptr inbounds double, ptr %1198, i64 %1201
  store double %1197, ptr %1202, align 8, !tbaa !41
  br label %1203

1203:                                             ; preds = %1187
  %1204 = load i64, ptr %44, align 8, !tbaa !15
  %1205 = add i64 %1204, 1
  store i64 %1205, ptr %44, align 8, !tbaa !15
  br label %1182, !llvm.loop !67

1206:                                             ; preds = %1186
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  br label %1207

1207:                                             ; preds = %1206
  %1208 = load i64, ptr %41, align 8, !tbaa !15
  %1209 = add i64 %1208, 1
  store i64 %1209, ptr %41, align 8, !tbaa !15
  br label %1167, !llvm.loop !68

1210:                                             ; preds = %1173
  %1211 = load ptr, ptr %2, align 8, !tbaa !5
  %1212 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1211, i32 0, i32 22
  %1213 = load ptr, ptr %1212, align 8, !tbaa !48
  %1214 = load ptr, ptr %8, align 8, !tbaa !5
  %1215 = load ptr, ptr %5, align 8, !tbaa !5
  %1216 = load ptr, ptr %2, align 8, !tbaa !5
  %1217 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1216, i32 0, i32 8
  %1218 = load i64, ptr %1217, align 8, !tbaa !23
  %1219 = load i64, ptr %4, align 8, !tbaa !15
  %1220 = load i64, ptr %4, align 8, !tbaa !15
  %1221 = load ptr, ptr %3, align 8, !tbaa !5
  %1222 = getelementptr inbounds %struct.scf_context, ptr %1221, i32 0, i32 36
  %1223 = load ptr, ptr %1222, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1213, ptr noundef %1214, ptr noundef %1215, i64 noundef %1218, i64 noundef %1219, i64 noundef %1220, ptr noundef %1223)
  %1224 = load ptr, ptr %2, align 8, !tbaa !5
  %1225 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1224, i32 0, i32 32
  %1226 = load ptr, ptr %1225, align 8, !tbaa !28
  %1227 = load ptr, ptr %5, align 8, !tbaa !5
  %1228 = load ptr, ptr %2, align 8, !tbaa !5
  %1229 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1228, i32 0, i32 32
  %1230 = load ptr, ptr %1229, align 8, !tbaa !28
  %1231 = load i64, ptr %4, align 8, !tbaa !15
  %1232 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1226, ptr noundef %1227, ptr noundef %1230, i64 noundef %1231, i64 noundef %1232)
  %1233 = load ptr, ptr %2, align 8, !tbaa !5
  %1234 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1233, i32 0, i32 23
  %1235 = load ptr, ptr %1234, align 8, !tbaa !51
  %1236 = load ptr, ptr %8, align 8, !tbaa !5
  %1237 = load ptr, ptr %5, align 8, !tbaa !5
  %1238 = load ptr, ptr %2, align 8, !tbaa !5
  %1239 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1238, i32 0, i32 8
  %1240 = load i64, ptr %1239, align 8, !tbaa !23
  %1241 = load i64, ptr %4, align 8, !tbaa !15
  %1242 = load i64, ptr %4, align 8, !tbaa !15
  %1243 = load ptr, ptr %3, align 8, !tbaa !5
  %1244 = getelementptr inbounds %struct.scf_context, ptr %1243, i32 0, i32 36
  %1245 = load ptr, ptr %1244, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1235, ptr noundef %1236, ptr noundef %1237, i64 noundef %1240, i64 noundef %1241, i64 noundef %1242, ptr noundef %1245)
  %1246 = load ptr, ptr %2, align 8, !tbaa !5
  %1247 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1246, i32 0, i32 33
  %1248 = load ptr, ptr %1247, align 8, !tbaa !30
  %1249 = load ptr, ptr %5, align 8, !tbaa !5
  %1250 = load ptr, ptr %2, align 8, !tbaa !5
  %1251 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1250, i32 0, i32 33
  %1252 = load ptr, ptr %1251, align 8, !tbaa !30
  %1253 = load i64, ptr %4, align 8, !tbaa !15
  %1254 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1248, ptr noundef %1249, ptr noundef %1252, i64 noundef %1253, i64 noundef %1254)
  %1255 = load ptr, ptr %2, align 8, !tbaa !5
  %1256 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1255, i32 0, i32 20
  %1257 = load ptr, ptr %1256, align 8, !tbaa !53
  %1258 = load ptr, ptr %8, align 8, !tbaa !5
  %1259 = load ptr, ptr %5, align 8, !tbaa !5
  %1260 = load ptr, ptr %2, align 8, !tbaa !5
  %1261 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1260, i32 0, i32 8
  %1262 = load i64, ptr %1261, align 8, !tbaa !23
  %1263 = load i64, ptr %4, align 8, !tbaa !15
  %1264 = load i64, ptr %4, align 8, !tbaa !15
  %1265 = load ptr, ptr %3, align 8, !tbaa !5
  %1266 = getelementptr inbounds %struct.scf_context, ptr %1265, i32 0, i32 36
  %1267 = load ptr, ptr %1266, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1257, ptr noundef %1258, ptr noundef %1259, i64 noundef %1262, i64 noundef %1263, i64 noundef %1264, ptr noundef %1267)
  %1268 = load ptr, ptr %2, align 8, !tbaa !5
  %1269 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1268, i32 0, i32 34
  %1270 = load ptr, ptr %1269, align 8, !tbaa !32
  %1271 = load ptr, ptr %5, align 8, !tbaa !5
  %1272 = load ptr, ptr %2, align 8, !tbaa !5
  %1273 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1272, i32 0, i32 34
  %1274 = load ptr, ptr %1273, align 8, !tbaa !32
  %1275 = load i64, ptr %4, align 8, !tbaa !15
  %1276 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1270, ptr noundef %1271, ptr noundef %1274, i64 noundef %1275, i64 noundef %1276)
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #4
  store i64 0, ptr %45, align 8, !tbaa !15
  br label %1277

1277:                                             ; preds = %1344, %1210
  %1278 = load i64, ptr %45, align 8, !tbaa !15
  %1279 = load ptr, ptr %2, align 8, !tbaa !5
  %1280 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1279, i32 0, i32 8
  %1281 = load i64, ptr %1280, align 8, !tbaa !23
  %1282 = icmp ult i64 %1278, %1281
  br i1 %1282, label %1284, label %1283

1283:                                             ; preds = %1277
  store i32 44, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #4
  br label %1347

1284:                                             ; preds = %1277
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #4
  %1285 = load ptr, ptr %22, align 8, !tbaa !5
  %1286 = load i64, ptr %45, align 8, !tbaa !15
  %1287 = getelementptr inbounds double, ptr %1285, i64 %1286
  %1288 = load double, ptr %1287, align 8, !tbaa !41
  store double %1288, ptr %46, align 8, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #4
  %1289 = load i64, ptr %45, align 8, !tbaa !15
  %1290 = load i64, ptr %4, align 8, !tbaa !15
  %1291 = mul i64 %1289, %1290
  store i64 %1291, ptr %47, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #4
  store i64 0, ptr %48, align 8, !tbaa !15
  br label %1292

1292:                                             ; preds = %1340, %1284
  %1293 = load i64, ptr %48, align 8, !tbaa !15
  %1294 = load i64, ptr %4, align 8, !tbaa !15
  %1295 = icmp ult i64 %1293, %1294
  br i1 %1295, label %1297, label %1296

1296:                                             ; preds = %1292
  store i32 47, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #4
  br label %1343

1297:                                             ; preds = %1292
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #4
  %1298 = load i64, ptr %47, align 8, !tbaa !15
  %1299 = load i64, ptr %48, align 8, !tbaa !15
  %1300 = add i64 %1298, %1299
  store i64 %1300, ptr %49, align 8, !tbaa !15
  %1301 = load double, ptr %46, align 8, !tbaa !41
  %1302 = load ptr, ptr %2, align 8, !tbaa !5
  %1303 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1302, i32 0, i32 22
  %1304 = load ptr, ptr %1303, align 8, !tbaa !48
  %1305 = load i64, ptr %49, align 8, !tbaa !15
  %1306 = getelementptr inbounds double, ptr %1304, i64 %1305
  %1307 = load double, ptr %1306, align 8, !tbaa !41
  %1308 = fmul double %1301, %1307
  %1309 = load ptr, ptr %2, align 8, !tbaa !5
  %1310 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1309, i32 0, i32 67
  %1311 = load ptr, ptr %1310, align 8, !tbaa !49
  %1312 = load i64, ptr %49, align 8, !tbaa !15
  %1313 = getelementptr inbounds double, ptr %1311, i64 %1312
  store double %1308, ptr %1313, align 8, !tbaa !41
  %1314 = load double, ptr %46, align 8, !tbaa !41
  %1315 = load ptr, ptr %2, align 8, !tbaa !5
  %1316 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1315, i32 0, i32 23
  %1317 = load ptr, ptr %1316, align 8, !tbaa !51
  %1318 = load i64, ptr %49, align 8, !tbaa !15
  %1319 = getelementptr inbounds double, ptr %1317, i64 %1318
  %1320 = load double, ptr %1319, align 8, !tbaa !41
  %1321 = fmul double %1314, %1320
  %1322 = load ptr, ptr %2, align 8, !tbaa !5
  %1323 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1322, i32 0, i32 68
  %1324 = load ptr, ptr %1323, align 8, !tbaa !52
  %1325 = load i64, ptr %49, align 8, !tbaa !15
  %1326 = getelementptr inbounds double, ptr %1324, i64 %1325
  store double %1321, ptr %1326, align 8, !tbaa !41
  %1327 = load double, ptr %46, align 8, !tbaa !41
  %1328 = load ptr, ptr %2, align 8, !tbaa !5
  %1329 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1328, i32 0, i32 20
  %1330 = load ptr, ptr %1329, align 8, !tbaa !53
  %1331 = load i64, ptr %49, align 8, !tbaa !15
  %1332 = getelementptr inbounds double, ptr %1330, i64 %1331
  %1333 = load double, ptr %1332, align 8, !tbaa !41
  %1334 = fmul double %1327, %1333
  %1335 = load ptr, ptr %2, align 8, !tbaa !5
  %1336 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1335, i32 0, i32 69
  %1337 = load ptr, ptr %1336, align 8, !tbaa !54
  %1338 = load i64, ptr %49, align 8, !tbaa !15
  %1339 = getelementptr inbounds double, ptr %1337, i64 %1338
  store double %1334, ptr %1339, align 8, !tbaa !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #4
  br label %1340

1340:                                             ; preds = %1297
  %1341 = load i64, ptr %48, align 8, !tbaa !15
  %1342 = add i64 %1341, 1
  store i64 %1342, ptr %48, align 8, !tbaa !15
  br label %1292, !llvm.loop !69

1343:                                             ; preds = %1296
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #4
  br label %1344

1344:                                             ; preds = %1343
  %1345 = load i64, ptr %45, align 8, !tbaa !15
  %1346 = add i64 %1345, 1
  store i64 %1346, ptr %45, align 8, !tbaa !15
  br label %1277, !llvm.loop !70

1347:                                             ; preds = %1283
  %1348 = load ptr, ptr %2, align 8, !tbaa !5
  %1349 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1348, i32 0, i32 67
  %1350 = load ptr, ptr %1349, align 8, !tbaa !49
  %1351 = load ptr, ptr %2, align 8, !tbaa !5
  %1352 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1351, i32 0, i32 16
  %1353 = load ptr, ptr %1352, align 8, !tbaa !31
  %1354 = load ptr, ptr %5, align 8, !tbaa !5
  %1355 = load ptr, ptr %2, align 8, !tbaa !5
  %1356 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1355, i32 0, i32 8
  %1357 = load i64, ptr %1356, align 8, !tbaa !23
  %1358 = load i64, ptr %4, align 8, !tbaa !15
  %1359 = load i64, ptr %4, align 8, !tbaa !15
  %1360 = load ptr, ptr %3, align 8, !tbaa !5
  %1361 = getelementptr inbounds %struct.scf_context, ptr %1360, i32 0, i32 36
  %1362 = load ptr, ptr %1361, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1350, ptr noundef %1353, ptr noundef %1354, i64 noundef %1357, i64 noundef %1358, i64 noundef %1359, ptr noundef %1362)
  %1363 = load ptr, ptr %2, align 8, !tbaa !5
  %1364 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1363, i32 0, i32 32
  %1365 = load ptr, ptr %1364, align 8, !tbaa !28
  %1366 = load ptr, ptr %5, align 8, !tbaa !5
  %1367 = load ptr, ptr %2, align 8, !tbaa !5
  %1368 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1367, i32 0, i32 32
  %1369 = load ptr, ptr %1368, align 8, !tbaa !28
  %1370 = load i64, ptr %4, align 8, !tbaa !15
  %1371 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1365, ptr noundef %1366, ptr noundef %1369, i64 noundef %1370, i64 noundef %1371)
  %1372 = load ptr, ptr %2, align 8, !tbaa !5
  %1373 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1372, i32 0, i32 68
  %1374 = load ptr, ptr %1373, align 8, !tbaa !52
  %1375 = load ptr, ptr %2, align 8, !tbaa !5
  %1376 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1375, i32 0, i32 16
  %1377 = load ptr, ptr %1376, align 8, !tbaa !31
  %1378 = load ptr, ptr %5, align 8, !tbaa !5
  %1379 = load ptr, ptr %2, align 8, !tbaa !5
  %1380 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1379, i32 0, i32 8
  %1381 = load i64, ptr %1380, align 8, !tbaa !23
  %1382 = load i64, ptr %4, align 8, !tbaa !15
  %1383 = load i64, ptr %4, align 8, !tbaa !15
  %1384 = load ptr, ptr %3, align 8, !tbaa !5
  %1385 = getelementptr inbounds %struct.scf_context, ptr %1384, i32 0, i32 36
  %1386 = load ptr, ptr %1385, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1374, ptr noundef %1377, ptr noundef %1378, i64 noundef %1381, i64 noundef %1382, i64 noundef %1383, ptr noundef %1386)
  %1387 = load ptr, ptr %2, align 8, !tbaa !5
  %1388 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1387, i32 0, i32 33
  %1389 = load ptr, ptr %1388, align 8, !tbaa !30
  %1390 = load ptr, ptr %5, align 8, !tbaa !5
  %1391 = load ptr, ptr %2, align 8, !tbaa !5
  %1392 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1391, i32 0, i32 33
  %1393 = load ptr, ptr %1392, align 8, !tbaa !30
  %1394 = load i64, ptr %4, align 8, !tbaa !15
  %1395 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1389, ptr noundef %1390, ptr noundef %1393, i64 noundef %1394, i64 noundef %1395)
  %1396 = load ptr, ptr %2, align 8, !tbaa !5
  %1397 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1396, i32 0, i32 69
  %1398 = load ptr, ptr %1397, align 8, !tbaa !54
  %1399 = load ptr, ptr %2, align 8, !tbaa !5
  %1400 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1399, i32 0, i32 16
  %1401 = load ptr, ptr %1400, align 8, !tbaa !31
  %1402 = load ptr, ptr %5, align 8, !tbaa !5
  %1403 = load ptr, ptr %2, align 8, !tbaa !5
  %1404 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1403, i32 0, i32 8
  %1405 = load i64, ptr %1404, align 8, !tbaa !23
  %1406 = load i64, ptr %4, align 8, !tbaa !15
  %1407 = load i64, ptr %4, align 8, !tbaa !15
  %1408 = load ptr, ptr %3, align 8, !tbaa !5
  %1409 = getelementptr inbounds %struct.scf_context, ptr %1408, i32 0, i32 36
  %1410 = load ptr, ptr %1409, align 8, !tbaa !45
  call void @einsum_mn_mp__np_parallel(ptr noundef %1398, ptr noundef %1401, ptr noundef %1402, i64 noundef %1405, i64 noundef %1406, i64 noundef %1407, ptr noundef %1410)
  %1411 = load ptr, ptr %2, align 8, !tbaa !5
  %1412 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1411, i32 0, i32 34
  %1413 = load ptr, ptr %1412, align 8, !tbaa !32
  %1414 = load ptr, ptr %5, align 8, !tbaa !5
  %1415 = load ptr, ptr %2, align 8, !tbaa !5
  %1416 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1415, i32 0, i32 34
  %1417 = load ptr, ptr %1416, align 8, !tbaa !32
  %1418 = load i64, ptr %4, align 8, !tbaa !15
  %1419 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_add(ptr noundef %1413, ptr noundef %1414, ptr noundef %1417, i64 noundef %1418, i64 noundef %1419)
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  br label %1420

1420:                                             ; preds = %1347, %558
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #4
  br label %1421

1421:                                             ; preds = %1420, %175
  %1422 = load ptr, ptr %2, align 8, !tbaa !5
  %1423 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1422, i32 0, i32 32
  %1424 = load ptr, ptr %1423, align 8, !tbaa !28
  %1425 = load ptr, ptr %2, align 8, !tbaa !5
  %1426 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1425, i32 0, i32 32
  %1427 = load ptr, ptr %1426, align 8, !tbaa !28
  %1428 = load i64, ptr %4, align 8, !tbaa !15
  %1429 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_scalar_multiply(ptr noundef %1424, ptr noundef %1427, i64 noundef %1428, i64 noundef %1429, double noundef -1.000000e+00)
  %1430 = load ptr, ptr %2, align 8, !tbaa !5
  %1431 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1430, i32 0, i32 33
  %1432 = load ptr, ptr %1431, align 8, !tbaa !30
  %1433 = load ptr, ptr %2, align 8, !tbaa !5
  %1434 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1433, i32 0, i32 33
  %1435 = load ptr, ptr %1434, align 8, !tbaa !30
  %1436 = load i64, ptr %4, align 8, !tbaa !15
  %1437 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_scalar_multiply(ptr noundef %1432, ptr noundef %1435, i64 noundef %1436, i64 noundef %1437, double noundef -1.000000e+00)
  %1438 = load ptr, ptr %2, align 8, !tbaa !5
  %1439 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1438, i32 0, i32 34
  %1440 = load ptr, ptr %1439, align 8, !tbaa !32
  %1441 = load ptr, ptr %2, align 8, !tbaa !5
  %1442 = getelementptr inbounds %struct.molecular_grid_desc, ptr %1441, i32 0, i32 34
  %1443 = load ptr, ptr %1442, align 8, !tbaa !32
  %1444 = load i64, ptr %4, align 8, !tbaa !15
  %1445 = load i64, ptr %4, align 8, !tbaa !15
  call void @mat_scalar_multiply(ptr noundef %1440, ptr noundef %1443, i64 noundef %1444, i64 noundef %1445, double noundef -1.000000e+00)
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #4
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { 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 576}
!17 = !{!10, !6, i64 496}
!18 = !{!10, !6, i64 504}
!19 = !{!10, !6, i64 584}
!20 = !{!10, !6, i64 600}
!21 = !{!10, !6, i64 352}
!22 = !{!10, !6, i64 392}
!23 = !{!10, !11, i64 64}
!24 = !{!10, !6, i64 88}
!25 = !{!10, !11, i64 280}
!26 = !{!10, !6, i64 112}
!27 = !{!10, !6, i64 104}
!28 = !{!10, !6, i64 256}
!29 = !{!10, !6, i64 120}
!30 = !{!10, !6, i64 264}
!31 = !{!10, !6, i64 128}
!32 = !{!10, !6, i64 272}
!33 = !{!10, !6, i64 512}
!34 = !{!10, !6, i64 520}
!35 = !{!10, !6, i64 528}
!36 = !{!10, !6, i64 360}
!37 = !{!10, !6, i64 400}
!38 = !{!10, !6, i64 296}
!39 = !{!10, !6, i64 304}
!40 = !{!10, !6, i64 312}
!41 = !{!12, !12, i64 0}
!42 = distinct !{!42, !43}
!43 = !{!"llvm.loop.mustprogress"}
!44 = distinct !{!44, !43}
!45 = !{!14, !6, i64 288}
!46 = !{!10, !6, i64 144}
!47 = !{!10, !6, i64 168}
!48 = !{!10, !6, i64 176}
!49 = !{!10, !6, i64 536}
!50 = !{!10, !6, i64 152}
!51 = !{!10, !6, i64 184}
!52 = !{!10, !6, i64 544}
!53 = !{!10, !6, i64 160}
!54 = !{!10, !6, i64 552}
!55 = distinct !{!55, !43}
!56 = distinct !{!56, !43}
!57 = !{!10, !6, i64 376}
!58 = !{!10, !6, i64 416}
!59 = distinct !{!59, !43}
!60 = distinct !{!60, !43}
!61 = distinct !{!61, !43}
!62 = distinct !{!62, !43}
!63 = distinct !{!63, !43}
!64 = distinct !{!64, !43}
!65 = distinct !{!65, !43}
!66 = distinct !{!66, !43}
!67 = distinct !{!67, !43}
!68 = distinct !{!68, !43}
!69 = distinct !{!69, !43}
!70 = distinct !{!70, !43}


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

@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

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local void @calc_xc_gradients(ptr noundef readonly %0) local_unnamed_addr #2 {
  %2 = getelementptr inbounds i8, ptr %0, i64 608
  %3 = load ptr, ptr %2, align 8, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %3, i64 8
  %5 = load i64, ptr %4, align 8, !tbaa !12
  %6 = getelementptr inbounds i8, ptr %0, i64 576
  %7 = load ptr, ptr %6, align 8, !tbaa !14
  %8 = getelementptr inbounds i8, ptr %0, i64 496
  %9 = load ptr, ptr %8, align 8, !tbaa !15
  %10 = getelementptr inbounds i8, ptr %0, i64 504
  %11 = load ptr, ptr %10, align 8, !tbaa !16
  %12 = getelementptr inbounds i8, ptr %0, i64 584
  %13 = load ptr, ptr %12, align 8, !tbaa !17
  %14 = ptrtoint ptr %13 to i64
  %15 = getelementptr inbounds i8, ptr %0, i64 600
  %16 = load ptr, ptr %15, align 8, !tbaa !18
  %17 = getelementptr inbounds i8, ptr %0, i64 352
  %18 = load ptr, ptr %17, align 8, !tbaa !19
  %19 = getelementptr inbounds i8, ptr %0, i64 392
  %20 = load ptr, ptr %19, align 8, !tbaa !20
  %21 = getelementptr inbounds i8, ptr %0, i64 64
  %22 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_add(ptr noundef %18, ptr noundef %20, ptr noundef %16, i64 noundef %22, i64 noundef 1) #4
  %23 = getelementptr inbounds i8, ptr %0, i64 88
  %24 = load ptr, ptr %23, align 8, !tbaa !22
  %25 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %24, ptr noundef %16, ptr noundef %11, i64 noundef %25, i64 noundef 1) #4
  %26 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_scalar_multiply(ptr noundef %11, ptr noundef %11, i64 noundef %26, i64 noundef 1, double noundef 5.000000e-01) #4
  %27 = getelementptr inbounds i8, ptr %0, i64 280
  %28 = load i64, ptr %27, align 8, !tbaa !23
  %29 = load i64, ptr @XC_TYPE_LDA, align 8, !tbaa !24
  %30 = icmp eq i64 %28, %29
  br i1 %30, label %31, label %54

31:                                               ; preds = %1
  %32 = getelementptr inbounds i8, ptr %0, i64 112
  %33 = load ptr, ptr %32, align 8, !tbaa !25
  %34 = getelementptr inbounds i8, ptr %0, i64 104
  %35 = load ptr, ptr %34, align 8, !tbaa !26
  %36 = getelementptr inbounds i8, ptr %0, i64 256
  %37 = load ptr, ptr %36, align 8, !tbaa !27
  %38 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @einsum_mn_mp_m__np(ptr noundef %33, ptr noundef %35, ptr noundef %11, ptr noundef %37, i64 noundef %38, i64 noundef %5, i64 noundef %5) #4
  %39 = getelementptr inbounds i8, ptr %0, i64 120
  %40 = load ptr, ptr %39, align 8, !tbaa !28
  %41 = load ptr, ptr %34, align 8, !tbaa !26
  %42 = getelementptr inbounds i8, ptr %0, i64 264
  %43 = load ptr, ptr %42, align 8, !tbaa !29
  %44 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @einsum_mn_mp_m__np(ptr noundef %40, ptr noundef %41, ptr noundef %11, ptr noundef %43, i64 noundef %44, i64 noundef %5, i64 noundef %5) #4
  %45 = getelementptr inbounds i8, ptr %0, i64 128
  %46 = load ptr, ptr %45, align 8, !tbaa !30
  %47 = load ptr, ptr %34, align 8, !tbaa !26
  %48 = getelementptr inbounds i8, ptr %0, i64 272
  %49 = load ptr, ptr %48, align 8, !tbaa !31
  %50 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @einsum_mn_mp_m__np(ptr noundef %46, ptr noundef %47, ptr noundef %11, ptr noundef %49, i64 noundef %50, i64 noundef %5, i64 noundef %5) #4
  %51 = load ptr, ptr %36, align 8, !tbaa !27
  tail call void @mat_scalar_multiply(ptr noundef %51, ptr noundef %51, i64 noundef %5, i64 noundef %5, double noundef 2.000000e+00) #4
  %52 = load ptr, ptr %42, align 8, !tbaa !29
  tail call void @mat_scalar_multiply(ptr noundef %52, ptr noundef %52, i64 noundef %5, i64 noundef %5, double noundef 2.000000e+00) #4
  %53 = load ptr, ptr %48, align 8, !tbaa !31
  tail call void @mat_scalar_multiply(ptr noundef %53, ptr noundef %53, i64 noundef %5, i64 noundef %5, double noundef 2.000000e+00) #4
  %.pre = load i64, ptr %27, align 8, !tbaa !23
  br label %54

54:                                               ; preds = %31, %1
  %55 = phi i64 [ %.pre, %31 ], [ %28, %1 ]
  %56 = load i64, ptr @XC_TYPE_GGA, align 8, !tbaa !24
  %57 = icmp eq i64 %55, %56
  %58 = load i64, ptr @XC_TYPE_MGGA, align 8
  %59 = icmp eq i64 %55, %58
  %or.cond = select i1 %57, i1 true, i1 %59
  br i1 %or.cond, label %60, label %811

60:                                               ; preds = %54
  %61 = getelementptr inbounds i8, ptr %0, i64 512
  %62 = load ptr, ptr %61, align 8, !tbaa !32
  %63 = getelementptr inbounds i8, ptr %0, i64 520
  %64 = load ptr, ptr %63, align 8, !tbaa !33
  %65 = getelementptr inbounds i8, ptr %0, i64 528
  %66 = load ptr, ptr %65, align 8, !tbaa !34
  %67 = getelementptr inbounds i8, ptr %0, i64 360
  %68 = load ptr, ptr %67, align 8, !tbaa !35
  %69 = getelementptr inbounds i8, ptr %0, i64 400
  %70 = load ptr, ptr %69, align 8, !tbaa !36
  %71 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_add(ptr noundef %68, ptr noundef %70, ptr noundef %16, i64 noundef %71, i64 noundef 1) #4
  %72 = load ptr, ptr %23, align 8, !tbaa !22
  %73 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %72, ptr noundef %16, ptr noundef %62, i64 noundef %73, i64 noundef 1) #4
  %74 = getelementptr inbounds i8, ptr %0, i64 296
  %75 = load ptr, ptr %74, align 8, !tbaa !37
  %76 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %62, ptr noundef %75, ptr noundef %62, i64 noundef %76, i64 noundef 1) #4
  %77 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_scalar_multiply(ptr noundef %62, ptr noundef %62, i64 noundef %77, i64 noundef 1, double noundef 2.000000e+00) #4
  %78 = load ptr, ptr %23, align 8, !tbaa !22
  %79 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %78, ptr noundef %16, ptr noundef %64, i64 noundef %79, i64 noundef 1) #4
  %80 = getelementptr inbounds i8, ptr %0, i64 304
  %81 = load ptr, ptr %80, align 8, !tbaa !38
  %82 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %64, ptr noundef %81, ptr noundef %64, i64 noundef %82, i64 noundef 1) #4
  %83 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_scalar_multiply(ptr noundef %64, ptr noundef %64, i64 noundef %83, i64 noundef 1, double noundef 2.000000e+00) #4
  %84 = load ptr, ptr %23, align 8, !tbaa !22
  %85 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %84, ptr noundef %16, ptr noundef %66, i64 noundef %85, i64 noundef 1) #4
  %86 = getelementptr inbounds i8, ptr %0, i64 312
  %87 = load ptr, ptr %86, align 8, !tbaa !39
  %88 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %66, ptr noundef %87, ptr noundef %66, i64 noundef %88, i64 noundef 1) #4
  %89 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_scalar_multiply(ptr noundef %66, ptr noundef %66, i64 noundef %89, i64 noundef 1, double noundef 2.000000e+00) #4
  %90 = load i64, ptr %21, align 8, !tbaa !21
  %.not = icmp eq i64 %90, 0
  %.not715 = icmp eq i64 %5, 0
  %or.cond753 = select i1 %.not, i1 true, i1 %.not715
  br i1 %or.cond753, label %._crit_edge651, label %.lr.ph650.split.us

.lr.ph650.split.us:                               ; preds = %60
  %91 = getelementptr inbounds i8, ptr %0, i64 128
  %92 = getelementptr inbounds i8, ptr %0, i64 120
  %93 = getelementptr inbounds i8, ptr %0, i64 112
  %94 = getelementptr inbounds i8, ptr %0, i64 104
  %95 = load ptr, ptr %94, align 8, !tbaa !26
  %96 = load ptr, ptr %93, align 8, !tbaa !25
  %97 = load ptr, ptr %92, align 8, !tbaa !28
  %98 = load ptr, ptr %91, align 8, !tbaa !30
  %99 = mul i64 %90, %5
  %100 = shl i64 %99, 3
  %scevgep = getelementptr i8, ptr %9, i64 %100
  %scevgep761 = getelementptr i8, ptr %95, i64 %100
  %101 = shl i64 %90, 3
  %scevgep762 = getelementptr i8, ptr %11, i64 %101
  %scevgep763 = getelementptr i8, ptr %96, i64 %100
  %scevgep764 = getelementptr i8, ptr %62, i64 %101
  %scevgep765 = getelementptr i8, ptr %97, i64 %100
  %scevgep766 = getelementptr i8, ptr %64, i64 %101
  %scevgep767 = getelementptr i8, ptr %98, i64 %100
  %scevgep768 = getelementptr i8, ptr %66, i64 %101
  %102 = insertelement <4 x ptr> poison, ptr %9, i64 0
  %103 = shufflevector <4 x ptr> %102, <4 x ptr> poison, <4 x i32> zeroinitializer
  %104 = insertelement <4 x ptr> poison, ptr %scevgep761, i64 0
  %105 = insertelement <4 x ptr> %104, ptr %scevgep763, i64 1
  %106 = insertelement <4 x ptr> %105, ptr %scevgep764, i64 2
  %107 = insertelement <4 x ptr> %106, ptr %scevgep765, i64 3
  %108 = insertelement <4 x ptr> poison, ptr %95, i64 0
  %109 = insertelement <4 x ptr> %108, ptr %96, i64 1
  %110 = insertelement <4 x ptr> %109, ptr %62, i64 2
  %111 = insertelement <4 x ptr> %110, ptr %97, i64 3
  %112 = insertelement <4 x ptr> poison, ptr %scevgep, i64 0
  %113 = shufflevector <4 x ptr> %112, <4 x ptr> poison, <4 x i32> zeroinitializer
  %min.iters.check = icmp ult i64 %5, 10
  %114 = icmp ult <4 x ptr> %103, %107
  %115 = icmp ult <4 x ptr> %111, %113
  %bound0770 = icmp ult ptr %9, %scevgep762
  %bound1771 = icmp ult ptr %11, %scevgep
  %found.conflict772 = and i1 %bound0770, %bound1771
  %.mask = and i64 %5, 1152921504606846976
  %stride.check773 = icmp ne i64 %.mask, 0
  %116 = and <4 x i1> %114, %115
  %bound0791 = icmp ult ptr %9, %scevgep766
  %bound1792 = icmp ult ptr %64, %scevgep
  %found.conflict793 = and i1 %bound0791, %bound1792
  %bound0796 = icmp ult ptr %9, %scevgep767
  %bound1797 = icmp ult ptr %98, %scevgep
  %found.conflict798 = and i1 %bound0796, %bound1797
  %bound0802 = icmp ult ptr %9, %scevgep768
  %bound1803 = icmp ult ptr %66, %scevgep
  %found.conflict804 = and i1 %bound0802, %bound1803
  %117 = bitcast <4 x i1> %116 to i4
  %118 = icmp ne i4 %117, 0
  %op.rdx = or i1 %118, %found.conflict772
  %op.rdx1331 = or i1 %found.conflict793, %found.conflict798
  %op.rdx1332 = or i1 %found.conflict804, %stride.check773
  %op.rdx1333 = or i1 %op.rdx, %op.rdx1331
  %op.rdx1334 = or i1 %op.rdx1333, %op.rdx1332
  %n.vec = and i64 %5, -1152921504606846978
  %cmp.n = icmp eq i64 %5, %n.vec
  br label %.lr.ph.us

.lr.ph.us:                                        ; preds = %._crit_edge.us, %.lr.ph650.split.us
  %.0648.us = phi i64 [ 0, %.lr.ph650.split.us ], [ %158, %._crit_edge.us ]
  %119 = mul i64 %.0648.us, %5
  %120 = getelementptr inbounds double, ptr %11, i64 %.0648.us
  %121 = getelementptr inbounds double, ptr %62, i64 %.0648.us
  %122 = getelementptr inbounds double, ptr %64, i64 %.0648.us
  %123 = getelementptr inbounds double, ptr %66, i64 %.0648.us
  %brmerge = select i1 %min.iters.check, i1 true, i1 %op.rdx1334
  br i1 %brmerge, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph.us
  %124 = load double, ptr %120, align 8, !tbaa !40, !alias.scope !41
  %broadcast.splatinsert808 = insertelement <2 x double> poison, double %124, i64 0
  %broadcast.splat809 = shufflevector <2 x double> %broadcast.splatinsert808, <2 x double> poison, <2 x i32> zeroinitializer
  %125 = load double, ptr %121, align 8, !tbaa !40, !alias.scope !44
  %broadcast.splatinsert = insertelement <2 x double> poison, double %125, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  %126 = load double, ptr %122, align 8, !tbaa !40, !alias.scope !46
  %broadcast.splatinsert811 = insertelement <2 x double> poison, double %126, i64 0
  %broadcast.splat812 = shufflevector <2 x double> %broadcast.splatinsert811, <2 x double> poison, <2 x i32> zeroinitializer
  %127 = load double, ptr %123, align 8, !tbaa !40, !alias.scope !48
  %broadcast.splatinsert814 = insertelement <2 x double> poison, double %127, i64 0
  %broadcast.splat815 = shufflevector <2 x double> %broadcast.splatinsert814, <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 ]
  %128 = add i64 %index, %119
  %129 = getelementptr inbounds double, ptr %95, i64 %128
  %wide.load = load <2 x double>, ptr %129, align 8, !tbaa !40, !alias.scope !50
  %130 = getelementptr inbounds double, ptr %96, i64 %128
  %wide.load807 = load <2 x double>, ptr %130, align 8, !tbaa !40, !alias.scope !52
  %131 = fmul <2 x double> %wide.load807, %broadcast.splat
  %132 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load, <2 x double> %broadcast.splat809, <2 x double> %131)
  %133 = getelementptr inbounds double, ptr %97, i64 %128
  %wide.load810 = load <2 x double>, ptr %133, align 8, !tbaa !40, !alias.scope !54
  %134 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load810, <2 x double> %broadcast.splat812, <2 x double> %132)
  %135 = getelementptr inbounds double, ptr %98, i64 %128
  %wide.load813 = load <2 x double>, ptr %135, align 8, !tbaa !40, !alias.scope !56
  %136 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load813, <2 x double> %broadcast.splat815, <2 x double> %134)
  %137 = getelementptr inbounds double, ptr %9, i64 %128
  store <2 x double> %136, ptr %137, align 8, !tbaa !40, !alias.scope !58, !noalias !60
  %index.next = add nuw i64 %index, 2
  %138 = icmp eq i64 %index.next, %n.vec
  br i1 %138, label %middle.block, label %vector.body, !llvm.loop !61

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

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

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0616647.us = phi i64 [ %157, %scalar.ph ], [ %.0616647.us.ph, %scalar.ph.preheader ]
  %139 = add i64 %.0616647.us, %119
  %140 = getelementptr inbounds double, ptr %95, i64 %139
  %141 = load double, ptr %140, align 8, !tbaa !40
  %142 = load double, ptr %120, align 8, !tbaa !40
  %143 = getelementptr inbounds double, ptr %96, i64 %139
  %144 = load double, ptr %143, align 8, !tbaa !40
  %145 = load double, ptr %121, align 8, !tbaa !40
  %146 = fmul double %144, %145
  %147 = tail call double @llvm.fmuladd.f64(double %141, double %142, double %146)
  %148 = getelementptr inbounds double, ptr %97, i64 %139
  %149 = load double, ptr %148, align 8, !tbaa !40
  %150 = load double, ptr %122, align 8, !tbaa !40
  %151 = tail call double @llvm.fmuladd.f64(double %149, double %150, double %147)
  %152 = getelementptr inbounds double, ptr %98, i64 %139
  %153 = load double, ptr %152, align 8, !tbaa !40
  %154 = load double, ptr %123, align 8, !tbaa !40
  %155 = tail call double @llvm.fmuladd.f64(double %153, double %154, double %151)
  %156 = getelementptr inbounds double, ptr %9, i64 %139
  store double %155, ptr %156, align 8, !tbaa !40
  %157 = add nuw i64 %.0616647.us, 1
  %exitcond.not = icmp eq i64 %157, %5
  br i1 %exitcond.not, label %._crit_edge.us, label %scalar.ph, !llvm.loop !65

._crit_edge.us:                                   ; preds = %scalar.ph, %middle.block
  %158 = add nuw i64 %.0648.us, 1
  %exitcond738.not = icmp eq i64 %158, %90
  br i1 %exitcond738.not, label %._crit_edge651, label %.lr.ph.us, !llvm.loop !66

._crit_edge651:                                   ; preds = %._crit_edge.us, %60
  %159 = getelementptr inbounds i8, ptr %0, i64 112
  %160 = load ptr, ptr %159, align 8, !tbaa !25
  %161 = getelementptr inbounds i8, ptr %0, i64 256
  %162 = load ptr, ptr %161, align 8, !tbaa !27
  %163 = getelementptr inbounds i8, ptr %3, i64 288
  %164 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %160, ptr noundef %9, ptr noundef %162, i64 noundef %90, i64 noundef %5, i64 noundef %5, ptr noundef %164) #4
  %165 = getelementptr inbounds i8, ptr %0, i64 120
  %166 = load ptr, ptr %165, align 8, !tbaa !28
  %167 = getelementptr inbounds i8, ptr %0, i64 264
  %168 = load ptr, ptr %167, align 8, !tbaa !29
  %169 = load i64, ptr %21, align 8, !tbaa !21
  %170 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %166, ptr noundef %9, ptr noundef %168, i64 noundef %169, i64 noundef %5, i64 noundef %5, ptr noundef %170) #4
  %171 = getelementptr inbounds i8, ptr %0, i64 128
  %172 = load ptr, ptr %171, align 8, !tbaa !30
  %173 = getelementptr inbounds i8, ptr %0, i64 272
  %174 = load ptr, ptr %173, align 8, !tbaa !31
  %175 = load i64, ptr %21, align 8, !tbaa !21
  %176 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %172, ptr noundef %9, ptr noundef %174, i64 noundef %175, i64 noundef %5, i64 noundef %5, ptr noundef %176) #4
  %177 = load i64, ptr %21, align 8, !tbaa !21
  %.not716 = icmp eq i64 %177, 0
  %.not717 = icmp eq i64 %5, 0
  %or.cond754 = select i1 %.not716, i1 true, i1 %.not717
  br i1 %or.cond754, label %._crit_edge656, label %.lr.ph655.split.us

.lr.ph655.split.us:                               ; preds = %._crit_edge651
  %178 = getelementptr inbounds i8, ptr %0, i64 552
  %179 = getelementptr inbounds i8, ptr %0, i64 160
  %180 = getelementptr inbounds i8, ptr %0, i64 184
  %181 = getelementptr inbounds i8, ptr %0, i64 152
  %182 = getelementptr inbounds i8, ptr %0, i64 536
  %183 = getelementptr inbounds i8, ptr %0, i64 176
  %184 = getelementptr inbounds i8, ptr %0, i64 168
  %185 = getelementptr inbounds i8, ptr %0, i64 144
  %186 = load ptr, ptr %159, align 8, !tbaa !25
  %187 = load ptr, ptr %185, align 8, !tbaa !68
  %188 = load ptr, ptr %184, align 8, !tbaa !69
  %189 = load ptr, ptr %183, align 8, !tbaa !70
  %190 = load ptr, ptr %165, align 8, !tbaa !28
  %191 = load ptr, ptr %181, align 8, !tbaa !71
  %192 = load ptr, ptr %180, align 8, !tbaa !72
  %193 = load <2 x ptr>, ptr %182, align 8, !tbaa !73
  %194 = load ptr, ptr %171, align 8, !tbaa !30
  %195 = load ptr, ptr %179, align 8, !tbaa !74
  %196 = load ptr, ptr %178, align 8, !tbaa !75
  %197 = mul i64 %177, %5
  %198 = shl i64 %197, 3
  %199 = extractelement <2 x ptr> %193, i64 0
  %scevgep817 = getelementptr i8, ptr %199, i64 %198
  %200 = shl i64 %5, 3
  %201 = extractelement <2 x ptr> %193, i64 1
  %scevgep818 = getelementptr i8, ptr %201, i64 %198
  %scevgep819 = getelementptr i8, ptr %196, i64 %198
  %scevgep820 = getelementptr i8, ptr %186, i64 %198
  %202 = shl i64 %177, 3
  %scevgep821 = getelementptr i8, ptr %11, i64 %202
  %scevgep822 = getelementptr i8, ptr %187, i64 %198
  %scevgep823 = getelementptr i8, ptr %62, i64 %202
  %scevgep824 = getelementptr i8, ptr %188, i64 %198
  %scevgep825 = getelementptr i8, ptr %64, i64 %202
  %scevgep826 = getelementptr i8, ptr %189, i64 %198
  %scevgep827 = getelementptr i8, ptr %66, i64 %202
  %scevgep828 = getelementptr i8, ptr %190, i64 %198
  %scevgep829 = getelementptr i8, ptr %191, i64 %198
  %scevgep830 = getelementptr i8, ptr %192, i64 %198
  %scevgep831 = getelementptr i8, ptr %194, i64 %198
  %scevgep832 = getelementptr i8, ptr %195, i64 %198
  %203 = insertelement <8 x ptr> poison, ptr %scevgep820, i64 0
  %204 = insertelement <8 x ptr> %203, ptr %scevgep821, i64 1
  %205 = insertelement <8 x ptr> %204, ptr %scevgep822, i64 2
  %206 = insertelement <8 x ptr> %205, ptr %scevgep823, i64 3
  %207 = insertelement <8 x ptr> %206, ptr %scevgep824, i64 4
  %208 = insertelement <8 x ptr> %207, ptr %scevgep825, i64 5
  %209 = insertelement <8 x ptr> %208, ptr %scevgep826, i64 6
  %210 = insertelement <8 x ptr> %209, ptr %scevgep827, i64 7
  %211 = insertelement <8 x ptr> poison, ptr %186, i64 0
  %212 = insertelement <8 x ptr> %211, ptr %11, i64 1
  %213 = insertelement <8 x ptr> %212, ptr %187, i64 2
  %214 = insertelement <8 x ptr> %213, ptr %62, i64 3
  %215 = insertelement <8 x ptr> %214, ptr %188, i64 4
  %216 = insertelement <8 x ptr> %215, ptr %64, i64 5
  %217 = insertelement <8 x ptr> %216, ptr %189, i64 6
  %218 = insertelement <8 x ptr> %217, ptr %66, i64 7
  %219 = insertelement <8 x ptr> poison, ptr %scevgep817, i64 0
  %220 = shufflevector <8 x ptr> %219, <8 x ptr> poison, <8 x i32> zeroinitializer
  %221 = insertelement <8 x ptr> poison, ptr %scevgep818, i64 0
  %222 = shufflevector <8 x ptr> %221, <8 x ptr> poison, <8 x i32> zeroinitializer
  %223 = insertelement <8 x ptr> poison, ptr %196, i64 0
  %224 = shufflevector <8 x ptr> %223, <8 x ptr> poison, <8 x i32> zeroinitializer
  %225 = insertelement <8 x ptr> poison, ptr %scevgep819, i64 0
  %226 = shufflevector <8 x ptr> %225, <8 x ptr> poison, <8 x i32> zeroinitializer
  %227 = insertelement <4 x ptr> poison, ptr %196, i64 0
  %228 = shufflevector <4 x ptr> %227, <4 x ptr> poison, <4 x i32> zeroinitializer
  %229 = insertelement <4 x ptr> poison, ptr %scevgep828, i64 0
  %230 = insertelement <4 x ptr> %229, ptr %scevgep829, i64 1
  %231 = insertelement <4 x ptr> %230, ptr %scevgep830, i64 2
  %232 = insertelement <4 x ptr> %231, ptr %scevgep831, i64 3
  %233 = insertelement <4 x ptr> poison, ptr %190, i64 0
  %234 = insertelement <4 x ptr> %233, ptr %191, i64 1
  %235 = insertelement <4 x ptr> %234, ptr %192, i64 2
  %236 = insertelement <4 x ptr> %235, ptr %194, i64 3
  %237 = insertelement <4 x ptr> poison, ptr %scevgep819, i64 0
  %238 = shufflevector <4 x ptr> %237, <4 x ptr> poison, <4 x i32> zeroinitializer
  %239 = insertelement <4 x ptr> poison, ptr %scevgep817, i64 0
  %240 = shufflevector <4 x ptr> %239, <4 x ptr> poison, <4 x i32> zeroinitializer
  %241 = insertelement <4 x ptr> poison, ptr %scevgep818, i64 0
  %242 = shufflevector <4 x ptr> %241, <4 x ptr> poison, <4 x i32> zeroinitializer
  %243 = insertelement <2 x ptr> poison, ptr %scevgep818, i64 0
  %244 = insertelement <2 x ptr> %243, ptr %scevgep819, i64 1
  %245 = insertelement <2 x ptr> poison, ptr %196, i64 1
  %246 = shufflevector <2 x ptr> %244, <2 x ptr> poison, <2 x i32> <i32 1, i32 0>
  %247 = insertelement <2 x ptr> %246, ptr %scevgep817, i64 0
  %248 = insertelement <2 x ptr> %246, ptr %scevgep832, i64 1
  %249 = insertelement <2 x ptr> poison, ptr %196, i64 0
  %250 = insertelement <2 x ptr> %249, ptr %195, i64 1
  %251 = insertelement <2 x ptr> %244, ptr %scevgep817, i64 0
  %252 = shufflevector <2 x ptr> %248, <2 x ptr> poison, <2 x i32> <i32 1, i32 1>
  %253 = shufflevector <2 x ptr> %250, <2 x ptr> poison, <2 x i32> <i32 1, i32 1>
  %254 = shufflevector <2 x ptr> %245, <2 x ptr> %193, <2 x i32> <i32 3, i32 1>
  %255 = insertelement <2 x ptr> %193, ptr %196, i64 1
  %min.iters.check1074 = icmp ult i64 %5, 20
  %256 = icmp ult <2 x ptr> %193, %244
  %257 = icmp ult <2 x ptr> %254, %247
  %258 = icmp ult <2 x ptr> %255, %248
  %259 = icmp ult <2 x ptr> %250, %251
  %stride.check841 = icmp slt i64 %200, 0
  %260 = shufflevector <2 x ptr> %193, <2 x ptr> poison, <8 x i32> zeroinitializer
  %261 = icmp ult <8 x ptr> %260, %210
  %262 = icmp ult <8 x ptr> %218, %220
  %263 = and <8 x i1> %261, %262
  %264 = shufflevector <2 x ptr> %193, <2 x ptr> poison, <4 x i32> zeroinitializer
  %265 = icmp ult <4 x ptr> %264, %232
  %266 = icmp ult <4 x ptr> %236, %240
  %267 = and <4 x i1> %265, %266
  %268 = icmp ult <2 x ptr> %193, %252
  %269 = icmp ult <2 x ptr> %253, %247
  %270 = shufflevector <2 x ptr> %193, <2 x ptr> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
  %271 = icmp ult <8 x ptr> %270, %210
  %272 = icmp ult <8 x ptr> %218, %222
  %273 = and <8 x i1> %271, %272
  %274 = shufflevector <2 x ptr> %193, <2 x ptr> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
  %275 = icmp ult <4 x ptr> %274, %232
  %276 = icmp ult <4 x ptr> %236, %242
  %277 = and <4 x i1> %275, %276
  %278 = icmp ult <8 x ptr> %224, %210
  %279 = icmp ult <8 x ptr> %218, %226
  %280 = and <8 x i1> %278, %279
  %281 = icmp ult <4 x ptr> %228, %232
  %282 = icmp ult <4 x ptr> %236, %238
  %283 = and <4 x i1> %281, %282
  %stride.check1069 = icmp slt i64 %200, 0
  %284 = bitcast <8 x i1> %263 to i8
  %285 = icmp ne i8 %284, 0
  %286 = bitcast <4 x i1> %283 to i4
  %287 = icmp ne i4 %286, 0
  %288 = or <4 x i1> %267, %277
  %289 = bitcast <4 x i1> %288 to i4
  %op.rdx1314 = icmp ne i4 %289, 0
  %op.rdx1321 = or i1 %stride.check1069, %287
  %290 = or <8 x i1> %280, %273
  %291 = bitcast <8 x i1> %290 to i8
  %op.rdx1322 = icmp ne i8 %291, 0
  %292 = and <2 x i1> %256, %257
  %293 = and <2 x i1> %268, %269
  %294 = and <2 x i1> %258, %259
  %295 = or <2 x i1> %292, %293
  %296 = insertelement <2 x i1> poison, i1 %op.rdx1314, i64 0
  %297 = insertelement <2 x i1> %296, i1 %stride.check841, i64 1
  %298 = or <2 x i1> %294, %297
  %299 = or <2 x i1> %295, %298
  %op.rdx1326 = or i1 %op.rdx1321, %op.rdx1322
  %shift = shufflevector <2 x i1> %299, <2 x i1> poison, <2 x i32> <i32 1, i32 poison>
  %300 = or <2 x i1> %299, %shift
  %op.rdx1327 = extractelement <2 x i1> %300, i64 0
  %op.rdx1329 = or i1 %op.rdx1327, %op.rdx1326
  %op.rdx1330 = or i1 %op.rdx1329, %285
  %n.vec1077 = and i64 %5, -2
  %cmp.n1118 = icmp eq i64 %5, %n.vec1077
  br label %.lr.ph.us658

.lr.ph.us658:                                     ; preds = %._crit_edge.us659, %.lr.ph655.split.us
  %.0619653.us = phi i64 [ 0, %.lr.ph655.split.us ], [ %394, %._crit_edge.us659 ]
  %301 = mul i64 %.0619653.us, %5
  %302 = getelementptr inbounds double, ptr %11, i64 %.0619653.us
  %303 = getelementptr inbounds double, ptr %62, i64 %.0619653.us
  %304 = getelementptr inbounds double, ptr %64, i64 %.0619653.us
  %305 = getelementptr inbounds double, ptr %66, i64 %.0619653.us
  %brmerge1344 = select i1 %min.iters.check1074, i1 true, i1 %op.rdx1330
  br i1 %brmerge1344, label %scalar.ph1073.preheader, label %vector.ph1075

vector.ph1075:                                    ; preds = %.lr.ph.us658
  %306 = load double, ptr %302, align 8, !tbaa !40, !alias.scope !76
  %broadcast.splatinsert1085 = insertelement <2 x double> poison, double %306, i64 0
  %broadcast.splat1086 = shufflevector <2 x double> %broadcast.splatinsert1085, <2 x double> poison, <2 x i32> zeroinitializer
  %307 = load double, ptr %303, align 8, !tbaa !40, !alias.scope !79
  %broadcast.splatinsert1083 = insertelement <2 x double> poison, double %307, i64 0
  %broadcast.splat1084 = shufflevector <2 x double> %broadcast.splatinsert1083, <2 x double> poison, <2 x i32> zeroinitializer
  %308 = load double, ptr %304, align 8, !tbaa !40, !alias.scope !81
  %broadcast.splatinsert1088 = insertelement <2 x double> poison, double %308, i64 0
  %broadcast.splat1089 = shufflevector <2 x double> %broadcast.splatinsert1088, <2 x double> poison, <2 x i32> zeroinitializer
  %309 = load double, ptr %305, align 8, !tbaa !40, !alias.scope !83
  %broadcast.splatinsert1091 = insertelement <2 x double> poison, double %309, i64 0
  %broadcast.splat1092 = shufflevector <2 x double> %broadcast.splatinsert1091, <2 x double> poison, <2 x i32> zeroinitializer
  %310 = load double, ptr %302, align 8, !tbaa !40, !alias.scope !76
  %broadcast.splatinsert1097 = insertelement <2 x double> poison, double %310, i64 0
  %broadcast.splat1098 = shufflevector <2 x double> %broadcast.splatinsert1097, <2 x double> poison, <2 x i32> zeroinitializer
  %311 = load double, ptr %303, align 8, !tbaa !40, !alias.scope !79
  %broadcast.splatinsert1095 = insertelement <2 x double> poison, double %311, i64 0
  %broadcast.splat1096 = shufflevector <2 x double> %broadcast.splatinsert1095, <2 x double> poison, <2 x i32> zeroinitializer
  %312 = load double, ptr %304, align 8, !tbaa !40, !alias.scope !81
  %broadcast.splatinsert1100 = insertelement <2 x double> poison, double %312, i64 0
  %broadcast.splat1101 = shufflevector <2 x double> %broadcast.splatinsert1100, <2 x double> poison, <2 x i32> zeroinitializer
  %313 = load double, ptr %305, align 8, !tbaa !40, !alias.scope !83
  %broadcast.splatinsert1103 = insertelement <2 x double> poison, double %313, i64 0
  %broadcast.splat1104 = shufflevector <2 x double> %broadcast.splatinsert1103, <2 x double> poison, <2 x i32> zeroinitializer
  %314 = load double, ptr %302, align 8, !tbaa !40, !alias.scope !76
  %broadcast.splatinsert1109 = insertelement <2 x double> poison, double %314, i64 0
  %broadcast.splat1110 = shufflevector <2 x double> %broadcast.splatinsert1109, <2 x double> poison, <2 x i32> zeroinitializer
  %315 = load double, ptr %303, align 8, !tbaa !40, !alias.scope !79
  %broadcast.splatinsert1107 = insertelement <2 x double> poison, double %315, i64 0
  %broadcast.splat1108 = shufflevector <2 x double> %broadcast.splatinsert1107, <2 x double> poison, <2 x i32> zeroinitializer
  %316 = load double, ptr %304, align 8, !tbaa !40, !alias.scope !81
  %broadcast.splatinsert1112 = insertelement <2 x double> poison, double %316, i64 0
  %broadcast.splat1113 = shufflevector <2 x double> %broadcast.splatinsert1112, <2 x double> poison, <2 x i32> zeroinitializer
  %317 = load double, ptr %305, align 8, !tbaa !40, !alias.scope !83
  %broadcast.splatinsert1115 = insertelement <2 x double> poison, double %317, i64 0
  %broadcast.splat1116 = shufflevector <2 x double> %broadcast.splatinsert1115, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body1079

vector.body1079:                                  ; preds = %vector.body1079, %vector.ph1075
  %index1080 = phi i64 [ 0, %vector.ph1075 ], [ %index.next1117, %vector.body1079 ]
  %318 = add i64 %index1080, %301
  %319 = getelementptr inbounds double, ptr %186, i64 %318
  %wide.load1081 = load <2 x double>, ptr %319, align 8, !tbaa !40, !alias.scope !85
  %320 = getelementptr inbounds double, ptr %187, i64 %318
  %wide.load1082 = load <2 x double>, ptr %320, align 8, !tbaa !40, !alias.scope !87
  %321 = fmul <2 x double> %wide.load1082, %broadcast.splat1084
  %322 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1081, <2 x double> %broadcast.splat1086, <2 x double> %321)
  %323 = getelementptr inbounds double, ptr %188, i64 %318
  %wide.load1087 = load <2 x double>, ptr %323, align 8, !tbaa !40, !alias.scope !89
  %324 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1087, <2 x double> %broadcast.splat1089, <2 x double> %322)
  %325 = getelementptr inbounds double, ptr %189, i64 %318
  %wide.load1090 = load <2 x double>, ptr %325, align 8, !tbaa !40, !alias.scope !91
  %326 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1090, <2 x double> %broadcast.splat1092, <2 x double> %324)
  %327 = getelementptr inbounds double, ptr %199, i64 %318
  store <2 x double> %326, ptr %327, align 8, !tbaa !40, !alias.scope !93, !noalias !95
  %328 = getelementptr inbounds double, ptr %190, i64 %318
  %wide.load1093 = load <2 x double>, ptr %328, align 8, !tbaa !40, !alias.scope !103
  %wide.load1094 = load <2 x double>, ptr %323, align 8, !tbaa !40, !alias.scope !89
  %329 = fmul <2 x double> %wide.load1094, %broadcast.splat1096
  %330 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1093, <2 x double> %broadcast.splat1098, <2 x double> %329)
  %331 = getelementptr inbounds double, ptr %191, i64 %318
  %wide.load1099 = load <2 x double>, ptr %331, align 8, !tbaa !40, !alias.scope !104
  %332 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1099, <2 x double> %broadcast.splat1101, <2 x double> %330)
  %333 = getelementptr inbounds double, ptr %192, i64 %318
  %wide.load1102 = load <2 x double>, ptr %333, align 8, !tbaa !40, !alias.scope !105
  %334 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1102, <2 x double> %broadcast.splat1104, <2 x double> %332)
  %335 = getelementptr inbounds double, ptr %201, i64 %318
  store <2 x double> %334, ptr %335, align 8, !tbaa !40, !alias.scope !106, !noalias !107
  %336 = getelementptr inbounds double, ptr %194, i64 %318
  %wide.load1105 = load <2 x double>, ptr %336, align 8, !tbaa !40, !alias.scope !108
  %wide.load1106 = load <2 x double>, ptr %325, align 8, !tbaa !40, !alias.scope !91
  %337 = fmul <2 x double> %wide.load1106, %broadcast.splat1108
  %338 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1105, <2 x double> %broadcast.splat1110, <2 x double> %337)
  %wide.load1111 = load <2 x double>, ptr %333, align 8, !tbaa !40, !alias.scope !105
  %339 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1111, <2 x double> %broadcast.splat1113, <2 x double> %338)
  %340 = getelementptr inbounds double, ptr %195, i64 %318
  %wide.load1114 = load <2 x double>, ptr %340, align 8, !tbaa !40, !alias.scope !109
  %341 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %wide.load1114, <2 x double> %broadcast.splat1116, <2 x double> %339)
  %342 = getelementptr inbounds double, ptr %196, i64 %318
  store <2 x double> %341, ptr %342, align 8, !tbaa !40, !alias.scope !110, !noalias !111
  %index.next1117 = add nuw i64 %index1080, 2
  %343 = icmp eq i64 %index.next1117, %n.vec1077
  br i1 %343, label %middle.block1072, label %vector.body1079, !llvm.loop !112

middle.block1072:                                 ; preds = %vector.body1079
  br i1 %cmp.n1118, label %._crit_edge.us659, label %scalar.ph1073.preheader

scalar.ph1073.preheader:                          ; preds = %.lr.ph.us658, %middle.block1072
  %.0620652.us.ph = phi i64 [ 0, %.lr.ph.us658 ], [ %n.vec1077, %middle.block1072 ]
  br label %scalar.ph1073

scalar.ph1073:                                    ; preds = %scalar.ph1073.preheader, %scalar.ph1073
  %.0620652.us = phi i64 [ %393, %scalar.ph1073 ], [ %.0620652.us.ph, %scalar.ph1073.preheader ]
  %344 = add i64 %.0620652.us, %301
  %345 = getelementptr inbounds double, ptr %186, i64 %344
  %346 = load double, ptr %345, align 8, !tbaa !40
  %347 = load double, ptr %302, align 8, !tbaa !40
  %348 = getelementptr inbounds double, ptr %187, i64 %344
  %349 = load double, ptr %348, align 8, !tbaa !40
  %350 = load double, ptr %303, align 8, !tbaa !40
  %351 = fmul double %349, %350
  %352 = tail call double @llvm.fmuladd.f64(double %346, double %347, double %351)
  %353 = getelementptr inbounds double, ptr %188, i64 %344
  %354 = load double, ptr %353, align 8, !tbaa !40
  %355 = load double, ptr %304, align 8, !tbaa !40
  %356 = tail call double @llvm.fmuladd.f64(double %354, double %355, double %352)
  %357 = getelementptr inbounds double, ptr %189, i64 %344
  %358 = load double, ptr %357, align 8, !tbaa !40
  %359 = load double, ptr %305, align 8, !tbaa !40
  %360 = tail call double @llvm.fmuladd.f64(double %358, double %359, double %356)
  %361 = getelementptr inbounds double, ptr %199, i64 %344
  store double %360, ptr %361, align 8, !tbaa !40
  %362 = getelementptr inbounds double, ptr %190, i64 %344
  %363 = load double, ptr %362, align 8, !tbaa !40
  %364 = load double, ptr %302, align 8, !tbaa !40
  %365 = load double, ptr %353, align 8, !tbaa !40
  %366 = load double, ptr %303, align 8, !tbaa !40
  %367 = fmul double %365, %366
  %368 = tail call double @llvm.fmuladd.f64(double %363, double %364, double %367)
  %369 = getelementptr inbounds double, ptr %191, i64 %344
  %370 = load double, ptr %369, align 8, !tbaa !40
  %371 = load double, ptr %304, align 8, !tbaa !40
  %372 = tail call double @llvm.fmuladd.f64(double %370, double %371, double %368)
  %373 = getelementptr inbounds double, ptr %192, i64 %344
  %374 = load double, ptr %373, align 8, !tbaa !40
  %375 = load double, ptr %305, align 8, !tbaa !40
  %376 = tail call double @llvm.fmuladd.f64(double %374, double %375, double %372)
  %377 = getelementptr inbounds double, ptr %201, i64 %344
  store double %376, ptr %377, align 8, !tbaa !40
  %378 = getelementptr inbounds double, ptr %194, i64 %344
  %379 = load double, ptr %378, align 8, !tbaa !40
  %380 = load double, ptr %302, align 8, !tbaa !40
  %381 = load double, ptr %357, align 8, !tbaa !40
  %382 = load double, ptr %303, align 8, !tbaa !40
  %383 = fmul double %381, %382
  %384 = tail call double @llvm.fmuladd.f64(double %379, double %380, double %383)
  %385 = load double, ptr %373, align 8, !tbaa !40
  %386 = load double, ptr %304, align 8, !tbaa !40
  %387 = tail call double @llvm.fmuladd.f64(double %385, double %386, double %384)
  %388 = getelementptr inbounds double, ptr %195, i64 %344
  %389 = load double, ptr %388, align 8, !tbaa !40
  %390 = load double, ptr %305, align 8, !tbaa !40
  %391 = tail call double @llvm.fmuladd.f64(double %389, double %390, double %387)
  %392 = getelementptr inbounds double, ptr %196, i64 %344
  store double %391, ptr %392, align 8, !tbaa !40
  %393 = add nuw i64 %.0620652.us, 1
  %exitcond739.not = icmp eq i64 %393, %5
  br i1 %exitcond739.not, label %._crit_edge.us659, label %scalar.ph1073, !llvm.loop !113

._crit_edge.us659:                                ; preds = %scalar.ph1073, %middle.block1072
  %394 = add nuw i64 %.0619653.us, 1
  %exitcond740.not = icmp eq i64 %394, %177
  br i1 %exitcond740.not, label %._crit_edge656, label %.lr.ph.us658, !llvm.loop !114

._crit_edge656:                                   ; preds = %._crit_edge.us659, %._crit_edge651
  %395 = getelementptr inbounds i8, ptr %0, i64 536
  %396 = load ptr, ptr %395, align 8, !tbaa !115
  %397 = getelementptr inbounds i8, ptr %0, i64 104
  %398 = load ptr, ptr %397, align 8, !tbaa !26
  %399 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %396, ptr noundef %398, ptr noundef %7, i64 noundef %177, i64 noundef %5, i64 noundef %5, ptr noundef %399) #4
  %400 = load ptr, ptr %161, align 8, !tbaa !27
  tail call void @mat_add(ptr noundef %400, ptr noundef %7, ptr noundef %400, i64 noundef %5, i64 noundef %5) #4
  %401 = getelementptr inbounds i8, ptr %0, i64 544
  %402 = load ptr, ptr %401, align 8, !tbaa !116
  %403 = load ptr, ptr %397, align 8, !tbaa !26
  %404 = load i64, ptr %21, align 8, !tbaa !21
  %405 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %402, ptr noundef %403, ptr noundef %7, i64 noundef %404, i64 noundef %5, i64 noundef %5, ptr noundef %405) #4
  %406 = load ptr, ptr %167, align 8, !tbaa !29
  tail call void @mat_add(ptr noundef %406, ptr noundef %7, ptr noundef %406, i64 noundef %5, i64 noundef %5) #4
  %407 = getelementptr inbounds i8, ptr %0, i64 552
  %408 = load ptr, ptr %407, align 8, !tbaa !75
  %409 = load ptr, ptr %397, align 8, !tbaa !26
  %410 = load i64, ptr %21, align 8, !tbaa !21
  %411 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %408, ptr noundef %409, ptr noundef %7, i64 noundef %410, i64 noundef %5, i64 noundef %5, ptr noundef %411) #4
  %412 = load ptr, ptr %173, align 8, !tbaa !31
  tail call void @mat_add(ptr noundef %412, ptr noundef %7, ptr noundef %412, i64 noundef %5, i64 noundef %5) #4
  %413 = load i64, ptr %27, align 8, !tbaa !23
  %414 = icmp eq i64 %413, %58
  br i1 %414, label %415, label %811

415:                                              ; preds = %._crit_edge656
  %416 = getelementptr inbounds i8, ptr %0, i64 376
  %417 = load ptr, ptr %416, align 8, !tbaa !117
  %418 = getelementptr inbounds i8, ptr %0, i64 416
  %419 = load ptr, ptr %418, align 8, !tbaa !118
  %420 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_add(ptr noundef %417, ptr noundef %419, ptr noundef %16, i64 noundef %420, i64 noundef 1) #4
  %421 = load ptr, ptr %23, align 8, !tbaa !22
  %422 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_multiply(ptr noundef %421, ptr noundef %16, ptr noundef %16, i64 noundef %422, i64 noundef 1) #4
  %423 = load i64, ptr %21, align 8, !tbaa !21
  tail call void @mat_scalar_multiply(ptr noundef %16, ptr noundef %16, i64 noundef %423, i64 noundef 1, double noundef 2.500000e-01) #4
  %424 = load i64, ptr %21, align 8, !tbaa !21
  %.not718 = icmp eq i64 %424, 0
  %.not719 = icmp eq i64 %5, 0
  %or.cond755 = select i1 %.not718, i1 true, i1 %.not719
  br i1 %or.cond755, label %._crit_edge665, label %.lr.ph664.split.us

.lr.ph664.split.us:                               ; preds = %415
  %425 = load ptr, ptr %159, align 8, !tbaa !25
  %426 = ptrtoint ptr %425 to i64
  %427 = sub i64 %14, %426
  %min.iters.check1122 = icmp ult i64 %5, 4
  %diff.check = icmp ult i64 %427, 32
  %or.cond1289 = select i1 %min.iters.check1122, i1 true, i1 %diff.check
  %n.vec1125 = and i64 %5, -4
  %cmp.n1134 = icmp eq i64 %5, %n.vec1125
  %xtraiter = and i64 %5, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br label %.lr.ph.us667

.lr.ph.us667:                                     ; preds = %._crit_edge.us668, %.lr.ph664.split.us
  %.0622662.us = phi i64 [ 0, %.lr.ph664.split.us ], [ %471, %._crit_edge.us668 ]
  %428 = getelementptr inbounds double, ptr %16, i64 %.0622662.us
  %429 = load double, ptr %428, align 8, !tbaa !40
  %430 = mul i64 %.0622662.us, %5
  br i1 %or.cond1289, label %scalar.ph1121.preheader, label %vector.ph1123

vector.ph1123:                                    ; preds = %.lr.ph.us667
  %broadcast.splatinsert1131 = insertelement <2 x double> poison, double %429, i64 0
  %broadcast.splat1132 = shufflevector <2 x double> %broadcast.splatinsert1131, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body1127

vector.body1127:                                  ; preds = %vector.body1127, %vector.ph1123
  %index1128 = phi i64 [ 0, %vector.ph1123 ], [ %index.next1133, %vector.body1127 ]
  %431 = add i64 %index1128, %430
  %432 = getelementptr inbounds double, ptr %425, i64 %431
  %433 = getelementptr inbounds i8, ptr %432, i64 16
  %wide.load1129 = load <2 x double>, ptr %432, align 8, !tbaa !40
  %wide.load1130 = load <2 x double>, ptr %433, align 8, !tbaa !40
  %434 = fmul <2 x double> %broadcast.splat1132, %wide.load1129
  %435 = fmul <2 x double> %broadcast.splat1132, %wide.load1130
  %436 = getelementptr inbounds double, ptr %13, i64 %431
  %437 = getelementptr inbounds i8, ptr %436, i64 16
  store <2 x double> %434, ptr %436, align 8, !tbaa !40
  store <2 x double> %435, ptr %437, align 8, !tbaa !40
  %index.next1133 = add nuw i64 %index1128, 4
  %438 = icmp eq i64 %index.next1133, %n.vec1125
  br i1 %438, label %middle.block1120, label %vector.body1127, !llvm.loop !119

middle.block1120:                                 ; preds = %vector.body1127
  br i1 %cmp.n1134, label %._crit_edge.us668, label %scalar.ph1121.preheader

scalar.ph1121.preheader:                          ; preds = %middle.block1120, %.lr.ph.us667
  %.0624661.us.ph = phi i64 [ 0, %.lr.ph.us667 ], [ %n.vec1125, %middle.block1120 ]
  br i1 %lcmp.mod.not, label %scalar.ph1121.prol.loopexit, label %scalar.ph1121.prol

scalar.ph1121.prol:                               ; preds = %scalar.ph1121.preheader, %scalar.ph1121.prol
  %.0624661.us.prol = phi i64 [ %444, %scalar.ph1121.prol ], [ %.0624661.us.ph, %scalar.ph1121.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph1121.prol ], [ 0, %scalar.ph1121.preheader ]
  %439 = add i64 %.0624661.us.prol, %430
  %440 = getelementptr inbounds double, ptr %425, i64 %439
  %441 = load double, ptr %440, align 8, !tbaa !40
  %442 = fmul double %429, %441
  %443 = getelementptr inbounds double, ptr %13, i64 %439
  store double %442, ptr %443, align 8, !tbaa !40
  %444 = add nuw i64 %.0624661.us.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %scalar.ph1121.prol.loopexit, label %scalar.ph1121.prol, !llvm.loop !120

scalar.ph1121.prol.loopexit:                      ; preds = %scalar.ph1121.prol, %scalar.ph1121.preheader
  %.0624661.us.unr = phi i64 [ %.0624661.us.ph, %scalar.ph1121.preheader ], [ %444, %scalar.ph1121.prol ]
  %445 = sub i64 %.0624661.us.ph, %5
  %446 = icmp ugt i64 %445, -4
  br i1 %446, label %._crit_edge.us668, label %scalar.ph1121

scalar.ph1121:                                    ; preds = %scalar.ph1121.prol.loopexit, %scalar.ph1121
  %.0624661.us = phi i64 [ %470, %scalar.ph1121 ], [ %.0624661.us.unr, %scalar.ph1121.prol.loopexit ]
  %447 = add i64 %.0624661.us, %430
  %448 = getelementptr inbounds double, ptr %425, i64 %447
  %449 = load double, ptr %448, align 8, !tbaa !40
  %450 = fmul double %429, %449
  %451 = getelementptr inbounds double, ptr %13, i64 %447
  store double %450, ptr %451, align 8, !tbaa !40
  %452 = add nuw i64 %.0624661.us, 1
  %453 = add i64 %452, %430
  %454 = getelementptr inbounds double, ptr %425, i64 %453
  %455 = load double, ptr %454, align 8, !tbaa !40
  %456 = fmul double %429, %455
  %457 = getelementptr inbounds double, ptr %13, i64 %453
  store double %456, ptr %457, align 8, !tbaa !40
  %458 = add nuw i64 %.0624661.us, 2
  %459 = add i64 %458, %430
  %460 = getelementptr inbounds double, ptr %425, i64 %459
  %461 = load double, ptr %460, align 8, !tbaa !40
  %462 = fmul double %429, %461
  %463 = getelementptr inbounds double, ptr %13, i64 %459
  store double %462, ptr %463, align 8, !tbaa !40
  %464 = add nuw i64 %.0624661.us, 3
  %465 = add i64 %464, %430
  %466 = getelementptr inbounds double, ptr %425, i64 %465
  %467 = load double, ptr %466, align 8, !tbaa !40
  %468 = fmul double %429, %467
  %469 = getelementptr inbounds double, ptr %13, i64 %465
  store double %468, ptr %469, align 8, !tbaa !40
  %470 = add nuw i64 %.0624661.us, 4
  %exitcond741.not.3 = icmp eq i64 %470, %5
  br i1 %exitcond741.not.3, label %._crit_edge.us668, label %scalar.ph1121, !llvm.loop !122

._crit_edge.us668:                                ; preds = %scalar.ph1121.prol.loopexit, %scalar.ph1121, %middle.block1120
  %471 = add nuw i64 %.0622662.us, 1
  %exitcond742.not = icmp eq i64 %471, %424
  br i1 %exitcond742.not, label %._crit_edge665, label %.lr.ph.us667, !llvm.loop !123

._crit_edge665:                                   ; preds = %._crit_edge.us668, %415
  %472 = getelementptr inbounds i8, ptr %0, i64 144
  %473 = load ptr, ptr %472, align 8, !tbaa !68
  %474 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %473, ptr noundef %13, ptr noundef %7, i64 noundef %424, i64 noundef %5, i64 noundef %5, ptr noundef %474) #4
  %475 = load ptr, ptr %161, align 8, !tbaa !27
  tail call void @mat_add(ptr noundef %475, ptr noundef %7, ptr noundef %475, i64 noundef %5, i64 noundef %5) #4
  %476 = getelementptr inbounds i8, ptr %0, i64 168
  %477 = load ptr, ptr %476, align 8, !tbaa !69
  %478 = load i64, ptr %21, align 8, !tbaa !21
  %479 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %477, ptr noundef %13, ptr noundef %7, i64 noundef %478, i64 noundef %5, i64 noundef %5, ptr noundef %479) #4
  %480 = load ptr, ptr %167, align 8, !tbaa !29
  tail call void @mat_add(ptr noundef %480, ptr noundef %7, ptr noundef %480, i64 noundef %5, i64 noundef %5) #4
  %481 = getelementptr inbounds i8, ptr %0, i64 176
  %482 = load ptr, ptr %481, align 8, !tbaa !70
  %483 = load i64, ptr %21, align 8, !tbaa !21
  %484 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %482, ptr noundef %13, ptr noundef %7, i64 noundef %483, i64 noundef %5, i64 noundef %5, ptr noundef %484) #4
  %485 = load ptr, ptr %173, align 8, !tbaa !31
  tail call void @mat_add(ptr noundef %485, ptr noundef %7, ptr noundef %485, i64 noundef %5, i64 noundef %5) #4
  %486 = load i64, ptr %21, align 8, !tbaa !21
  %.not720 = icmp eq i64 %486, 0
  %.not721 = icmp eq i64 %5, 0
  %or.cond756 = select i1 %.not720, i1 true, i1 %.not721
  br i1 %or.cond756, label %._crit_edge674, label %.lr.ph673.split.us

.lr.ph673.split.us:                               ; preds = %._crit_edge665
  %487 = load ptr, ptr %472, align 8, !tbaa !68
  %488 = ptrtoint ptr %487 to i64
  %489 = load ptr, ptr %395, align 8, !tbaa !115
  %490 = ptrtoint ptr %489 to i64
  %491 = load ptr, ptr %476, align 8, !tbaa !69
  %492 = ptrtoint ptr %491 to i64
  %493 = load ptr, ptr %401, align 8, !tbaa !116
  %494 = ptrtoint ptr %493 to i64
  %495 = load ptr, ptr %481, align 8, !tbaa !70
  %496 = ptrtoint ptr %495 to i64
  %497 = load ptr, ptr %407, align 8, !tbaa !75
  %498 = sub i64 %494, %490
  %499 = ptrtoint ptr %497 to i64
  %500 = sub i64 %499, %490
  %501 = sub i64 %490, %488
  %502 = sub i64 %492, %490
  %503 = sub i64 %496, %490
  %504 = sub i64 %499, %494
  %505 = sub i64 %494, %488
  %506 = sub i64 %494, %492
  %507 = sub i64 %496, %494
  %508 = sub i64 %499, %488
  %509 = sub i64 %499, %492
  %510 = sub i64 %499, %496
  %min.iters.check1161 = icmp ult i64 %5, 8
  %diff.check1136 = icmp ult i64 %498, 16
  %diff.check1137 = icmp ult i64 %500, 16
  %conflict.rdx1138 = or i1 %diff.check1136, %diff.check1137
  %diff.check1139 = icmp ult i64 %501, 16
  %conflict.rdx1140 = or i1 %conflict.rdx1138, %diff.check1139
  %diff.check1141 = icmp ult i64 %502, 16
  %conflict.rdx1142 = or i1 %conflict.rdx1140, %diff.check1141
  %diff.check1143 = icmp ult i64 %503, 16
  %conflict.rdx1144 = or i1 %conflict.rdx1142, %diff.check1143
  %diff.check1145 = icmp ult i64 %504, 16
  %conflict.rdx1146 = or i1 %conflict.rdx1144, %diff.check1145
  %diff.check1147 = icmp ult i64 %505, 16
  %conflict.rdx1148 = or i1 %conflict.rdx1146, %diff.check1147
  %diff.check1149 = icmp ult i64 %506, 16
  %conflict.rdx1150 = or i1 %conflict.rdx1148, %diff.check1149
  %diff.check1151 = icmp ult i64 %507, 16
  %conflict.rdx1152 = or i1 %conflict.rdx1150, %diff.check1151
  %diff.check1153 = icmp ult i64 %508, 16
  %conflict.rdx1154 = or i1 %conflict.rdx1152, %diff.check1153
  %diff.check1155 = icmp ult i64 %509, 16
  %conflict.rdx1156 = or i1 %conflict.rdx1154, %diff.check1155
  %diff.check1157 = icmp ult i64 %510, 16
  %conflict.rdx1158 = or i1 %conflict.rdx1156, %diff.check1157
  %n.vec1164 = and i64 %5, -2
  %cmp.n1174 = icmp eq i64 %5, %n.vec1164
  br label %.lr.ph.us676

.lr.ph.us676:                                     ; preds = %._crit_edge.us677, %.lr.ph673.split.us
  %.0625671.us = phi i64 [ 0, %.lr.ph673.split.us ], [ %539, %._crit_edge.us677 ]
  %511 = getelementptr inbounds double, ptr %16, i64 %.0625671.us
  %512 = load double, ptr %511, align 8, !tbaa !40
  %513 = mul i64 %.0625671.us, %5
  %brmerge1345 = select i1 %min.iters.check1161, i1 true, i1 %conflict.rdx1158
  br i1 %brmerge1345, label %scalar.ph1160.preheader, label %vector.ph1162

vector.ph1162:                                    ; preds = %.lr.ph.us676
  %broadcast.splatinsert1169 = insertelement <2 x double> poison, double %512, i64 0
  %broadcast.splat1170 = shufflevector <2 x double> %broadcast.splatinsert1169, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body1166

vector.body1166:                                  ; preds = %vector.body1166, %vector.ph1162
  %index1167 = phi i64 [ 0, %vector.ph1162 ], [ %index.next1173, %vector.body1166 ]
  %514 = add i64 %index1167, %513
  %515 = getelementptr inbounds double, ptr %487, i64 %514
  %wide.load1168 = load <2 x double>, ptr %515, align 8, !tbaa !40
  %516 = fmul <2 x double> %broadcast.splat1170, %wide.load1168
  %517 = getelementptr inbounds double, ptr %489, i64 %514
  store <2 x double> %516, ptr %517, align 8, !tbaa !40
  %518 = getelementptr inbounds double, ptr %491, i64 %514
  %wide.load1171 = load <2 x double>, ptr %518, align 8, !tbaa !40
  %519 = fmul <2 x double> %broadcast.splat1170, %wide.load1171
  %520 = getelementptr inbounds double, ptr %493, i64 %514
  store <2 x double> %519, ptr %520, align 8, !tbaa !40
  %521 = getelementptr inbounds double, ptr %495, i64 %514
  %wide.load1172 = load <2 x double>, ptr %521, align 8, !tbaa !40
  %522 = fmul <2 x double> %broadcast.splat1170, %wide.load1172
  %523 = getelementptr inbounds double, ptr %497, i64 %514
  store <2 x double> %522, ptr %523, align 8, !tbaa !40
  %index.next1173 = add nuw i64 %index1167, 2
  %524 = icmp eq i64 %index.next1173, %n.vec1164
  br i1 %524, label %middle.block1159, label %vector.body1166, !llvm.loop !124

middle.block1159:                                 ; preds = %vector.body1166
  br i1 %cmp.n1174, label %._crit_edge.us677, label %scalar.ph1160.preheader

scalar.ph1160.preheader:                          ; preds = %.lr.ph.us676, %middle.block1159
  %.0628670.us.ph = phi i64 [ 0, %.lr.ph.us676 ], [ %n.vec1164, %middle.block1159 ]
  br label %scalar.ph1160

scalar.ph1160:                                    ; preds = %scalar.ph1160.preheader, %scalar.ph1160
  %.0628670.us = phi i64 [ %538, %scalar.ph1160 ], [ %.0628670.us.ph, %scalar.ph1160.preheader ]
  %525 = add i64 %.0628670.us, %513
  %526 = getelementptr inbounds double, ptr %487, i64 %525
  %527 = load double, ptr %526, align 8, !tbaa !40
  %528 = fmul double %512, %527
  %529 = getelementptr inbounds double, ptr %489, i64 %525
  store double %528, ptr %529, align 8, !tbaa !40
  %530 = getelementptr inbounds double, ptr %491, i64 %525
  %531 = load double, ptr %530, align 8, !tbaa !40
  %532 = fmul double %512, %531
  %533 = getelementptr inbounds double, ptr %493, i64 %525
  store double %532, ptr %533, align 8, !tbaa !40
  %534 = getelementptr inbounds double, ptr %495, i64 %525
  %535 = load double, ptr %534, align 8, !tbaa !40
  %536 = fmul double %512, %535
  %537 = getelementptr inbounds double, ptr %497, i64 %525
  store double %536, ptr %537, align 8, !tbaa !40
  %538 = add nuw i64 %.0628670.us, 1
  %exitcond743.not = icmp eq i64 %538, %5
  br i1 %exitcond743.not, label %._crit_edge.us677, label %scalar.ph1160, !llvm.loop !125

._crit_edge.us677:                                ; preds = %scalar.ph1160, %middle.block1159
  %539 = add nuw i64 %.0625671.us, 1
  %exitcond744.not = icmp eq i64 %539, %486
  br i1 %exitcond744.not, label %._crit_edge674, label %.lr.ph.us676, !llvm.loop !126

._crit_edge674:                                   ; preds = %._crit_edge.us677, %._crit_edge665
  %540 = load ptr, ptr %395, align 8, !tbaa !115
  %541 = load ptr, ptr %159, align 8, !tbaa !25
  %542 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %540, ptr noundef %541, ptr noundef %7, i64 noundef %486, i64 noundef %5, i64 noundef %5, ptr noundef %542) #4
  %543 = load ptr, ptr %161, align 8, !tbaa !27
  tail call void @mat_add(ptr noundef %543, ptr noundef %7, ptr noundef %543, i64 noundef %5, i64 noundef %5) #4
  %544 = load ptr, ptr %401, align 8, !tbaa !116
  %545 = load ptr, ptr %159, align 8, !tbaa !25
  %546 = load i64, ptr %21, align 8, !tbaa !21
  %547 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %544, ptr noundef %545, ptr noundef %7, i64 noundef %546, i64 noundef %5, i64 noundef %5, ptr noundef %547) #4
  %548 = load ptr, ptr %167, align 8, !tbaa !29
  tail call void @mat_add(ptr noundef %548, ptr noundef %7, ptr noundef %548, i64 noundef %5, i64 noundef %5) #4
  %549 = load ptr, ptr %407, align 8, !tbaa !75
  %550 = load ptr, ptr %159, align 8, !tbaa !25
  %551 = load i64, ptr %21, align 8, !tbaa !21
  %552 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %549, ptr noundef %550, ptr noundef %7, i64 noundef %551, i64 noundef %5, i64 noundef %5, ptr noundef %552) #4
  %553 = load ptr, ptr %173, align 8, !tbaa !31
  tail call void @mat_add(ptr noundef %553, ptr noundef %7, ptr noundef %553, i64 noundef %5, i64 noundef %5) #4
  %554 = load i64, ptr %21, align 8, !tbaa !21
  %.not722 = icmp eq i64 %554, 0
  %.not723 = icmp eq i64 %5, 0
  %or.cond757 = select i1 %.not722, i1 true, i1 %.not723
  br i1 %or.cond757, label %._crit_edge683, label %.lr.ph682.split.us

.lr.ph682.split.us:                               ; preds = %._crit_edge674
  %555 = load ptr, ptr %165, align 8, !tbaa !28
  %556 = ptrtoint ptr %555 to i64
  %557 = sub i64 %14, %556
  %min.iters.check1179 = icmp ult i64 %5, 4
  %diff.check1176 = icmp ult i64 %557, 32
  %or.cond1290 = select i1 %min.iters.check1179, i1 true, i1 %diff.check1176
  %n.vec1182 = and i64 %5, -4
  %cmp.n1191 = icmp eq i64 %5, %n.vec1182
  %xtraiter1336 = and i64 %5, 3
  %lcmp.mod1337.not = icmp eq i64 %xtraiter1336, 0
  br label %.lr.ph.us685

.lr.ph.us685:                                     ; preds = %._crit_edge.us686, %.lr.ph682.split.us
  %.0629680.us = phi i64 [ 0, %.lr.ph682.split.us ], [ %601, %._crit_edge.us686 ]
  %558 = getelementptr inbounds double, ptr %16, i64 %.0629680.us
  %559 = load double, ptr %558, align 8, !tbaa !40
  %560 = mul i64 %.0629680.us, %5
  br i1 %or.cond1290, label %scalar.ph1178.preheader, label %vector.ph1180

vector.ph1180:                                    ; preds = %.lr.ph.us685
  %broadcast.splatinsert1188 = insertelement <2 x double> poison, double %559, i64 0
  %broadcast.splat1189 = shufflevector <2 x double> %broadcast.splatinsert1188, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body1184

vector.body1184:                                  ; preds = %vector.body1184, %vector.ph1180
  %index1185 = phi i64 [ 0, %vector.ph1180 ], [ %index.next1190, %vector.body1184 ]
  %561 = add i64 %index1185, %560
  %562 = getelementptr inbounds double, ptr %555, i64 %561
  %563 = getelementptr inbounds i8, ptr %562, i64 16
  %wide.load1186 = load <2 x double>, ptr %562, align 8, !tbaa !40
  %wide.load1187 = load <2 x double>, ptr %563, align 8, !tbaa !40
  %564 = fmul <2 x double> %broadcast.splat1189, %wide.load1186
  %565 = fmul <2 x double> %broadcast.splat1189, %wide.load1187
  %566 = getelementptr inbounds double, ptr %13, i64 %561
  %567 = getelementptr inbounds i8, ptr %566, i64 16
  store <2 x double> %564, ptr %566, align 8, !tbaa !40
  store <2 x double> %565, ptr %567, align 8, !tbaa !40
  %index.next1190 = add nuw i64 %index1185, 4
  %568 = icmp eq i64 %index.next1190, %n.vec1182
  br i1 %568, label %middle.block1177, label %vector.body1184, !llvm.loop !127

middle.block1177:                                 ; preds = %vector.body1184
  br i1 %cmp.n1191, label %._crit_edge.us686, label %scalar.ph1178.preheader

scalar.ph1178.preheader:                          ; preds = %middle.block1177, %.lr.ph.us685
  %.0627679.us.ph = phi i64 [ 0, %.lr.ph.us685 ], [ %n.vec1182, %middle.block1177 ]
  br i1 %lcmp.mod1337.not, label %scalar.ph1178.prol.loopexit, label %scalar.ph1178.prol

scalar.ph1178.prol:                               ; preds = %scalar.ph1178.preheader, %scalar.ph1178.prol
  %.0627679.us.prol = phi i64 [ %574, %scalar.ph1178.prol ], [ %.0627679.us.ph, %scalar.ph1178.preheader ]
  %prol.iter1338 = phi i64 [ %prol.iter1338.next, %scalar.ph1178.prol ], [ 0, %scalar.ph1178.preheader ]
  %569 = add i64 %.0627679.us.prol, %560
  %570 = getelementptr inbounds double, ptr %555, i64 %569
  %571 = load double, ptr %570, align 8, !tbaa !40
  %572 = fmul double %559, %571
  %573 = getelementptr inbounds double, ptr %13, i64 %569
  store double %572, ptr %573, align 8, !tbaa !40
  %574 = add nuw i64 %.0627679.us.prol, 1
  %prol.iter1338.next = add i64 %prol.iter1338, 1
  %prol.iter1338.cmp.not = icmp eq i64 %prol.iter1338.next, %xtraiter1336
  br i1 %prol.iter1338.cmp.not, label %scalar.ph1178.prol.loopexit, label %scalar.ph1178.prol, !llvm.loop !128

scalar.ph1178.prol.loopexit:                      ; preds = %scalar.ph1178.prol, %scalar.ph1178.preheader
  %.0627679.us.unr = phi i64 [ %.0627679.us.ph, %scalar.ph1178.preheader ], [ %574, %scalar.ph1178.prol ]
  %575 = sub i64 %.0627679.us.ph, %5
  %576 = icmp ugt i64 %575, -4
  br i1 %576, label %._crit_edge.us686, label %scalar.ph1178

scalar.ph1178:                                    ; preds = %scalar.ph1178.prol.loopexit, %scalar.ph1178
  %.0627679.us = phi i64 [ %600, %scalar.ph1178 ], [ %.0627679.us.unr, %scalar.ph1178.prol.loopexit ]
  %577 = add i64 %.0627679.us, %560
  %578 = getelementptr inbounds double, ptr %555, i64 %577
  %579 = load double, ptr %578, align 8, !tbaa !40
  %580 = fmul double %559, %579
  %581 = getelementptr inbounds double, ptr %13, i64 %577
  store double %580, ptr %581, align 8, !tbaa !40
  %582 = add nuw i64 %.0627679.us, 1
  %583 = add i64 %582, %560
  %584 = getelementptr inbounds double, ptr %555, i64 %583
  %585 = load double, ptr %584, align 8, !tbaa !40
  %586 = fmul double %559, %585
  %587 = getelementptr inbounds double, ptr %13, i64 %583
  store double %586, ptr %587, align 8, !tbaa !40
  %588 = add nuw i64 %.0627679.us, 2
  %589 = add i64 %588, %560
  %590 = getelementptr inbounds double, ptr %555, i64 %589
  %591 = load double, ptr %590, align 8, !tbaa !40
  %592 = fmul double %559, %591
  %593 = getelementptr inbounds double, ptr %13, i64 %589
  store double %592, ptr %593, align 8, !tbaa !40
  %594 = add nuw i64 %.0627679.us, 3
  %595 = add i64 %594, %560
  %596 = getelementptr inbounds double, ptr %555, i64 %595
  %597 = load double, ptr %596, align 8, !tbaa !40
  %598 = fmul double %559, %597
  %599 = getelementptr inbounds double, ptr %13, i64 %595
  store double %598, ptr %599, align 8, !tbaa !40
  %600 = add nuw i64 %.0627679.us, 4
  %exitcond745.not.3 = icmp eq i64 %600, %5
  br i1 %exitcond745.not.3, label %._crit_edge.us686, label %scalar.ph1178, !llvm.loop !129

._crit_edge.us686:                                ; preds = %scalar.ph1178.prol.loopexit, %scalar.ph1178, %middle.block1177
  %601 = add nuw i64 %.0629680.us, 1
  %exitcond746.not = icmp eq i64 %601, %554
  br i1 %exitcond746.not, label %._crit_edge683, label %.lr.ph.us685, !llvm.loop !130

._crit_edge683:                                   ; preds = %._crit_edge.us686, %._crit_edge674
  %602 = load ptr, ptr %476, align 8, !tbaa !69
  %603 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %602, ptr noundef %13, ptr noundef %7, i64 noundef %554, i64 noundef %5, i64 noundef %5, ptr noundef %603) #4
  %604 = load ptr, ptr %161, align 8, !tbaa !27
  tail call void @mat_add(ptr noundef %604, ptr noundef %7, ptr noundef %604, i64 noundef %5, i64 noundef %5) #4
  %605 = getelementptr inbounds i8, ptr %0, i64 152
  %606 = load ptr, ptr %605, align 8, !tbaa !71
  %607 = load i64, ptr %21, align 8, !tbaa !21
  %608 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %606, ptr noundef %13, ptr noundef %7, i64 noundef %607, i64 noundef %5, i64 noundef %5, ptr noundef %608) #4
  %609 = load ptr, ptr %167, align 8, !tbaa !29
  tail call void @mat_add(ptr noundef %609, ptr noundef %7, ptr noundef %609, i64 noundef %5, i64 noundef %5) #4
  %610 = getelementptr inbounds i8, ptr %0, i64 184
  %611 = load ptr, ptr %610, align 8, !tbaa !72
  %612 = load i64, ptr %21, align 8, !tbaa !21
  %613 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %611, ptr noundef %13, ptr noundef %7, i64 noundef %612, i64 noundef %5, i64 noundef %5, ptr noundef %613) #4
  %614 = load ptr, ptr %173, align 8, !tbaa !31
  tail call void @mat_add(ptr noundef %614, ptr noundef %7, ptr noundef %614, i64 noundef %5, i64 noundef %5) #4
  %615 = load i64, ptr %21, align 8, !tbaa !21
  %.not724 = icmp eq i64 %615, 0
  %.not725 = icmp eq i64 %5, 0
  %or.cond758 = select i1 %.not724, i1 true, i1 %.not725
  br i1 %or.cond758, label %._crit_edge692, label %.lr.ph691.split.us

.lr.ph691.split.us:                               ; preds = %._crit_edge683
  %616 = load ptr, ptr %476, align 8, !tbaa !69
  %617 = ptrtoint ptr %616 to i64
  %618 = load ptr, ptr %395, align 8, !tbaa !115
  %619 = ptrtoint ptr %618 to i64
  %620 = load ptr, ptr %605, align 8, !tbaa !71
  %621 = ptrtoint ptr %620 to i64
  %622 = load ptr, ptr %401, align 8, !tbaa !116
  %623 = ptrtoint ptr %622 to i64
  %624 = load ptr, ptr %610, align 8, !tbaa !72
  %625 = ptrtoint ptr %624 to i64
  %626 = load ptr, ptr %407, align 8, !tbaa !75
  %627 = sub i64 %623, %619
  %628 = ptrtoint ptr %626 to i64
  %629 = sub i64 %628, %619
  %630 = sub i64 %619, %617
  %631 = sub i64 %621, %619
  %632 = sub i64 %625, %619
  %633 = sub i64 %628, %623
  %634 = sub i64 %623, %617
  %635 = sub i64 %623, %621
  %636 = sub i64 %625, %623
  %637 = sub i64 %628, %617
  %638 = sub i64 %628, %621
  %639 = sub i64 %628, %625
  %min.iters.check1218 = icmp ult i64 %5, 8
  %diff.check1193 = icmp ult i64 %627, 16
  %diff.check1194 = icmp ult i64 %629, 16
  %conflict.rdx1195 = or i1 %diff.check1193, %diff.check1194
  %diff.check1196 = icmp ult i64 %630, 16
  %conflict.rdx1197 = or i1 %conflict.rdx1195, %diff.check1196
  %diff.check1198 = icmp ult i64 %631, 16
  %conflict.rdx1199 = or i1 %conflict.rdx1197, %diff.check1198
  %diff.check1200 = icmp ult i64 %632, 16
  %conflict.rdx1201 = or i1 %conflict.rdx1199, %diff.check1200
  %diff.check1202 = icmp ult i64 %633, 16
  %conflict.rdx1203 = or i1 %conflict.rdx1201, %diff.check1202
  %diff.check1204 = icmp ult i64 %634, 16
  %conflict.rdx1205 = or i1 %conflict.rdx1203, %diff.check1204
  %diff.check1206 = icmp ult i64 %635, 16
  %conflict.rdx1207 = or i1 %conflict.rdx1205, %diff.check1206
  %diff.check1208 = icmp ult i64 %636, 16
  %conflict.rdx1209 = or i1 %conflict.rdx1207, %diff.check1208
  %diff.check1210 = icmp ult i64 %637, 16
  %conflict.rdx1211 = or i1 %conflict.rdx1209, %diff.check1210
  %diff.check1212 = icmp ult i64 %638, 16
  %conflict.rdx1213 = or i1 %conflict.rdx1211, %diff.check1212
  %diff.check1214 = icmp ult i64 %639, 16
  %conflict.rdx1215 = or i1 %conflict.rdx1213, %diff.check1214
  %n.vec1221 = and i64 %5, -2
  %cmp.n1231 = icmp eq i64 %5, %n.vec1221
  br label %.lr.ph.us694

.lr.ph.us694:                                     ; preds = %._crit_edge.us695, %.lr.ph691.split.us
  %.0626689.us = phi i64 [ 0, %.lr.ph691.split.us ], [ %668, %._crit_edge.us695 ]
  %640 = getelementptr inbounds double, ptr %16, i64 %.0626689.us
  %641 = load double, ptr %640, align 8, !tbaa !40
  %642 = mul i64 %.0626689.us, %5
  %brmerge1346 = select i1 %min.iters.check1218, i1 true, i1 %conflict.rdx1215
  br i1 %brmerge1346, label %scalar.ph1217.preheader, label %vector.ph1219

vector.ph1219:                                    ; preds = %.lr.ph.us694
  %broadcast.splatinsert1226 = insertelement <2 x double> poison, double %641, i64 0
  %broadcast.splat1227 = shufflevector <2 x double> %broadcast.splatinsert1226, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body1223

vector.body1223:                                  ; preds = %vector.body1223, %vector.ph1219
  %index1224 = phi i64 [ 0, %vector.ph1219 ], [ %index.next1230, %vector.body1223 ]
  %643 = add i64 %index1224, %642
  %644 = getelementptr inbounds double, ptr %616, i64 %643
  %wide.load1225 = load <2 x double>, ptr %644, align 8, !tbaa !40
  %645 = fmul <2 x double> %broadcast.splat1227, %wide.load1225
  %646 = getelementptr inbounds double, ptr %618, i64 %643
  store <2 x double> %645, ptr %646, align 8, !tbaa !40
  %647 = getelementptr inbounds double, ptr %620, i64 %643
  %wide.load1228 = load <2 x double>, ptr %647, align 8, !tbaa !40
  %648 = fmul <2 x double> %broadcast.splat1227, %wide.load1228
  %649 = getelementptr inbounds double, ptr %622, i64 %643
  store <2 x double> %648, ptr %649, align 8, !tbaa !40
  %650 = getelementptr inbounds double, ptr %624, i64 %643
  %wide.load1229 = load <2 x double>, ptr %650, align 8, !tbaa !40
  %651 = fmul <2 x double> %broadcast.splat1227, %wide.load1229
  %652 = getelementptr inbounds double, ptr %626, i64 %643
  store <2 x double> %651, ptr %652, align 8, !tbaa !40
  %index.next1230 = add nuw i64 %index1224, 2
  %653 = icmp eq i64 %index.next1230, %n.vec1221
  br i1 %653, label %middle.block1216, label %vector.body1223, !llvm.loop !131

middle.block1216:                                 ; preds = %vector.body1223
  br i1 %cmp.n1231, label %._crit_edge.us695, label %scalar.ph1217.preheader

scalar.ph1217.preheader:                          ; preds = %.lr.ph.us694, %middle.block1216
  %.0623688.us.ph = phi i64 [ 0, %.lr.ph.us694 ], [ %n.vec1221, %middle.block1216 ]
  br label %scalar.ph1217

scalar.ph1217:                                    ; preds = %scalar.ph1217.preheader, %scalar.ph1217
  %.0623688.us = phi i64 [ %667, %scalar.ph1217 ], [ %.0623688.us.ph, %scalar.ph1217.preheader ]
  %654 = add i64 %.0623688.us, %642
  %655 = getelementptr inbounds double, ptr %616, i64 %654
  %656 = load double, ptr %655, align 8, !tbaa !40
  %657 = fmul double %641, %656
  %658 = getelementptr inbounds double, ptr %618, i64 %654
  store double %657, ptr %658, align 8, !tbaa !40
  %659 = getelementptr inbounds double, ptr %620, i64 %654
  %660 = load double, ptr %659, align 8, !tbaa !40
  %661 = fmul double %641, %660
  %662 = getelementptr inbounds double, ptr %622, i64 %654
  store double %661, ptr %662, align 8, !tbaa !40
  %663 = getelementptr inbounds double, ptr %624, i64 %654
  %664 = load double, ptr %663, align 8, !tbaa !40
  %665 = fmul double %641, %664
  %666 = getelementptr inbounds double, ptr %626, i64 %654
  store double %665, ptr %666, align 8, !tbaa !40
  %667 = add nuw i64 %.0623688.us, 1
  %exitcond747.not = icmp eq i64 %667, %5
  br i1 %exitcond747.not, label %._crit_edge.us695, label %scalar.ph1217, !llvm.loop !132

._crit_edge.us695:                                ; preds = %scalar.ph1217, %middle.block1216
  %668 = add nuw i64 %.0626689.us, 1
  %exitcond748.not = icmp eq i64 %668, %615
  br i1 %exitcond748.not, label %._crit_edge692, label %.lr.ph.us694, !llvm.loop !133

._crit_edge692:                                   ; preds = %._crit_edge.us695, %._crit_edge683
  %669 = load ptr, ptr %395, align 8, !tbaa !115
  %670 = load ptr, ptr %165, align 8, !tbaa !28
  %671 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %669, ptr noundef %670, ptr noundef %7, i64 noundef %615, i64 noundef %5, i64 noundef %5, ptr noundef %671) #4
  %672 = load ptr, ptr %161, align 8, !tbaa !27
  tail call void @mat_add(ptr noundef %672, ptr noundef %7, ptr noundef %672, i64 noundef %5, i64 noundef %5) #4
  %673 = load ptr, ptr %401, align 8, !tbaa !116
  %674 = load ptr, ptr %165, align 8, !tbaa !28
  %675 = load i64, ptr %21, align 8, !tbaa !21
  %676 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %673, ptr noundef %674, ptr noundef %7, i64 noundef %675, i64 noundef %5, i64 noundef %5, ptr noundef %676) #4
  %677 = load ptr, ptr %167, align 8, !tbaa !29
  tail call void @mat_add(ptr noundef %677, ptr noundef %7, ptr noundef %677, i64 noundef %5, i64 noundef %5) #4
  %678 = load ptr, ptr %407, align 8, !tbaa !75
  %679 = load ptr, ptr %165, align 8, !tbaa !28
  %680 = load i64, ptr %21, align 8, !tbaa !21
  %681 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %678, ptr noundef %679, ptr noundef %7, i64 noundef %680, i64 noundef %5, i64 noundef %5, ptr noundef %681) #4
  %682 = load ptr, ptr %173, align 8, !tbaa !31
  tail call void @mat_add(ptr noundef %682, ptr noundef %7, ptr noundef %682, i64 noundef %5, i64 noundef %5) #4
  %683 = load i64, ptr %21, align 8, !tbaa !21
  %.not726 = icmp eq i64 %683, 0
  %.not727 = icmp eq i64 %5, 0
  %or.cond759 = select i1 %.not726, i1 true, i1 %.not727
  br i1 %or.cond759, label %._crit_edge701, label %.lr.ph700.split.us

.lr.ph700.split.us:                               ; preds = %._crit_edge692
  %684 = load ptr, ptr %171, align 8, !tbaa !30
  %685 = ptrtoint ptr %684 to i64
  %686 = sub i64 %14, %685
  %min.iters.check1236 = icmp ult i64 %5, 4
  %diff.check1233 = icmp ult i64 %686, 32
  %or.cond1291 = select i1 %min.iters.check1236, i1 true, i1 %diff.check1233
  %n.vec1239 = and i64 %5, -4
  %cmp.n1248 = icmp eq i64 %5, %n.vec1239
  %xtraiter1339 = and i64 %5, 3
  %lcmp.mod1340.not = icmp eq i64 %xtraiter1339, 0
  br label %.lr.ph.us703

.lr.ph.us703:                                     ; preds = %._crit_edge.us704, %.lr.ph700.split.us
  %.0621698.us = phi i64 [ 0, %.lr.ph700.split.us ], [ %730, %._crit_edge.us704 ]
  %687 = getelementptr inbounds double, ptr %16, i64 %.0621698.us
  %688 = load double, ptr %687, align 8, !tbaa !40
  %689 = mul i64 %.0621698.us, %5
  br i1 %or.cond1291, label %scalar.ph1235.preheader, label %vector.ph1237

vector.ph1237:                                    ; preds = %.lr.ph.us703
  %broadcast.splatinsert1245 = insertelement <2 x double> poison, double %688, i64 0
  %broadcast.splat1246 = shufflevector <2 x double> %broadcast.splatinsert1245, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body1241

vector.body1241:                                  ; preds = %vector.body1241, %vector.ph1237
  %index1242 = phi i64 [ 0, %vector.ph1237 ], [ %index.next1247, %vector.body1241 ]
  %690 = add i64 %index1242, %689
  %691 = getelementptr inbounds double, ptr %684, i64 %690
  %692 = getelementptr inbounds i8, ptr %691, i64 16
  %wide.load1243 = load <2 x double>, ptr %691, align 8, !tbaa !40
  %wide.load1244 = load <2 x double>, ptr %692, align 8, !tbaa !40
  %693 = fmul <2 x double> %broadcast.splat1246, %wide.load1243
  %694 = fmul <2 x double> %broadcast.splat1246, %wide.load1244
  %695 = getelementptr inbounds double, ptr %13, i64 %690
  %696 = getelementptr inbounds i8, ptr %695, i64 16
  store <2 x double> %693, ptr %695, align 8, !tbaa !40
  store <2 x double> %694, ptr %696, align 8, !tbaa !40
  %index.next1247 = add nuw i64 %index1242, 4
  %697 = icmp eq i64 %index.next1247, %n.vec1239
  br i1 %697, label %middle.block1234, label %vector.body1241, !llvm.loop !134

middle.block1234:                                 ; preds = %vector.body1241
  br i1 %cmp.n1248, label %._crit_edge.us704, label %scalar.ph1235.preheader

scalar.ph1235.preheader:                          ; preds = %middle.block1234, %.lr.ph.us703
  %.0618697.us.ph = phi i64 [ 0, %.lr.ph.us703 ], [ %n.vec1239, %middle.block1234 ]
  br i1 %lcmp.mod1340.not, label %scalar.ph1235.prol.loopexit, label %scalar.ph1235.prol

scalar.ph1235.prol:                               ; preds = %scalar.ph1235.preheader, %scalar.ph1235.prol
  %.0618697.us.prol = phi i64 [ %703, %scalar.ph1235.prol ], [ %.0618697.us.ph, %scalar.ph1235.preheader ]
  %prol.iter1341 = phi i64 [ %prol.iter1341.next, %scalar.ph1235.prol ], [ 0, %scalar.ph1235.preheader ]
  %698 = add i64 %.0618697.us.prol, %689
  %699 = getelementptr inbounds double, ptr %684, i64 %698
  %700 = load double, ptr %699, align 8, !tbaa !40
  %701 = fmul double %688, %700
  %702 = getelementptr inbounds double, ptr %13, i64 %698
  store double %701, ptr %702, align 8, !tbaa !40
  %703 = add nuw i64 %.0618697.us.prol, 1
  %prol.iter1341.next = add i64 %prol.iter1341, 1
  %prol.iter1341.cmp.not = icmp eq i64 %prol.iter1341.next, %xtraiter1339
  br i1 %prol.iter1341.cmp.not, label %scalar.ph1235.prol.loopexit, label %scalar.ph1235.prol, !llvm.loop !135

scalar.ph1235.prol.loopexit:                      ; preds = %scalar.ph1235.prol, %scalar.ph1235.preheader
  %.0618697.us.unr = phi i64 [ %.0618697.us.ph, %scalar.ph1235.preheader ], [ %703, %scalar.ph1235.prol ]
  %704 = sub i64 %.0618697.us.ph, %5
  %705 = icmp ugt i64 %704, -4
  br i1 %705, label %._crit_edge.us704, label %scalar.ph1235

scalar.ph1235:                                    ; preds = %scalar.ph1235.prol.loopexit, %scalar.ph1235
  %.0618697.us = phi i64 [ %729, %scalar.ph1235 ], [ %.0618697.us.unr, %scalar.ph1235.prol.loopexit ]
  %706 = add i64 %.0618697.us, %689
  %707 = getelementptr inbounds double, ptr %684, i64 %706
  %708 = load double, ptr %707, align 8, !tbaa !40
  %709 = fmul double %688, %708
  %710 = getelementptr inbounds double, ptr %13, i64 %706
  store double %709, ptr %710, align 8, !tbaa !40
  %711 = add nuw i64 %.0618697.us, 1
  %712 = add i64 %711, %689
  %713 = getelementptr inbounds double, ptr %684, i64 %712
  %714 = load double, ptr %713, align 8, !tbaa !40
  %715 = fmul double %688, %714
  %716 = getelementptr inbounds double, ptr %13, i64 %712
  store double %715, ptr %716, align 8, !tbaa !40
  %717 = add nuw i64 %.0618697.us, 2
  %718 = add i64 %717, %689
  %719 = getelementptr inbounds double, ptr %684, i64 %718
  %720 = load double, ptr %719, align 8, !tbaa !40
  %721 = fmul double %688, %720
  %722 = getelementptr inbounds double, ptr %13, i64 %718
  store double %721, ptr %722, align 8, !tbaa !40
  %723 = add nuw i64 %.0618697.us, 3
  %724 = add i64 %723, %689
  %725 = getelementptr inbounds double, ptr %684, i64 %724
  %726 = load double, ptr %725, align 8, !tbaa !40
  %727 = fmul double %688, %726
  %728 = getelementptr inbounds double, ptr %13, i64 %724
  store double %727, ptr %728, align 8, !tbaa !40
  %729 = add nuw i64 %.0618697.us, 4
  %exitcond749.not.3 = icmp eq i64 %729, %5
  br i1 %exitcond749.not.3, label %._crit_edge.us704, label %scalar.ph1235, !llvm.loop !136

._crit_edge.us704:                                ; preds = %scalar.ph1235.prol.loopexit, %scalar.ph1235, %middle.block1234
  %730 = add nuw i64 %.0621698.us, 1
  %exitcond750.not = icmp eq i64 %730, %683
  br i1 %exitcond750.not, label %._crit_edge701, label %.lr.ph.us703, !llvm.loop !137

._crit_edge701:                                   ; preds = %._crit_edge.us704, %._crit_edge692
  %731 = load ptr, ptr %481, align 8, !tbaa !70
  %732 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %731, ptr noundef %13, ptr noundef %7, i64 noundef %683, i64 noundef %5, i64 noundef %5, ptr noundef %732) #4
  %733 = load ptr, ptr %161, align 8, !tbaa !27
  tail call void @mat_add(ptr noundef %733, ptr noundef %7, ptr noundef %733, i64 noundef %5, i64 noundef %5) #4
  %734 = load ptr, ptr %610, align 8, !tbaa !72
  %735 = load i64, ptr %21, align 8, !tbaa !21
  %736 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %734, ptr noundef %13, ptr noundef %7, i64 noundef %735, i64 noundef %5, i64 noundef %5, ptr noundef %736) #4
  %737 = load ptr, ptr %167, align 8, !tbaa !29
  tail call void @mat_add(ptr noundef %737, ptr noundef %7, ptr noundef %737, i64 noundef %5, i64 noundef %5) #4
  %738 = getelementptr inbounds i8, ptr %0, i64 160
  %739 = load ptr, ptr %738, align 8, !tbaa !74
  %740 = load i64, ptr %21, align 8, !tbaa !21
  %741 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %739, ptr noundef %13, ptr noundef %7, i64 noundef %740, i64 noundef %5, i64 noundef %5, ptr noundef %741) #4
  %742 = load ptr, ptr %173, align 8, !tbaa !31
  tail call void @mat_add(ptr noundef %742, ptr noundef %7, ptr noundef %742, i64 noundef %5, i64 noundef %5) #4
  %743 = load i64, ptr %21, align 8, !tbaa !21
  %.not728 = icmp eq i64 %743, 0
  %.not729 = icmp eq i64 %5, 0
  %or.cond760 = select i1 %.not728, i1 true, i1 %.not729
  br i1 %or.cond760, label %._crit_edge710, label %.lr.ph709.split.us

.lr.ph709.split.us:                               ; preds = %._crit_edge701
  %744 = load ptr, ptr %481, align 8, !tbaa !70
  %745 = ptrtoint ptr %744 to i64
  %746 = load ptr, ptr %395, align 8, !tbaa !115
  %747 = ptrtoint ptr %746 to i64
  %748 = load ptr, ptr %610, align 8, !tbaa !72
  %749 = ptrtoint ptr %748 to i64
  %750 = load ptr, ptr %401, align 8, !tbaa !116
  %751 = ptrtoint ptr %750 to i64
  %752 = load ptr, ptr %738, align 8, !tbaa !74
  %753 = ptrtoint ptr %752 to i64
  %754 = load ptr, ptr %407, align 8, !tbaa !75
  %755 = sub i64 %751, %747
  %756 = ptrtoint ptr %754 to i64
  %757 = sub i64 %756, %747
  %758 = sub i64 %747, %745
  %759 = sub i64 %749, %747
  %760 = sub i64 %753, %747
  %761 = sub i64 %756, %751
  %762 = sub i64 %751, %745
  %763 = sub i64 %751, %749
  %764 = sub i64 %753, %751
  %765 = sub i64 %756, %745
  %766 = sub i64 %756, %749
  %767 = sub i64 %756, %753
  %min.iters.check1275 = icmp ult i64 %5, 8
  %diff.check1250 = icmp ult i64 %755, 16
  %diff.check1251 = icmp ult i64 %757, 16
  %conflict.rdx1252 = or i1 %diff.check1250, %diff.check1251
  %diff.check1253 = icmp ult i64 %758, 16
  %conflict.rdx1254 = or i1 %conflict.rdx1252, %diff.check1253
  %diff.check1255 = icmp ult i64 %759, 16
  %conflict.rdx1256 = or i1 %conflict.rdx1254, %diff.check1255
  %diff.check1257 = icmp ult i64 %760, 16
  %conflict.rdx1258 = or i1 %conflict.rdx1256, %diff.check1257
  %diff.check1259 = icmp ult i64 %761, 16
  %conflict.rdx1260 = or i1 %conflict.rdx1258, %diff.check1259
  %diff.check1261 = icmp ult i64 %762, 16
  %conflict.rdx1262 = or i1 %conflict.rdx1260, %diff.check1261
  %diff.check1263 = icmp ult i64 %763, 16
  %conflict.rdx1264 = or i1 %conflict.rdx1262, %diff.check1263
  %diff.check1265 = icmp ult i64 %764, 16
  %conflict.rdx1266 = or i1 %conflict.rdx1264, %diff.check1265
  %diff.check1267 = icmp ult i64 %765, 16
  %conflict.rdx1268 = or i1 %conflict.rdx1266, %diff.check1267
  %diff.check1269 = icmp ult i64 %766, 16
  %conflict.rdx1270 = or i1 %conflict.rdx1268, %diff.check1269
  %diff.check1271 = icmp ult i64 %767, 16
  %conflict.rdx1272 = or i1 %conflict.rdx1270, %diff.check1271
  %n.vec1278 = and i64 %5, -2
  %cmp.n1288 = icmp eq i64 %5, %n.vec1278
  br label %.lr.ph.us712

.lr.ph.us712:                                     ; preds = %._crit_edge.us713, %.lr.ph709.split.us
  %.0617707.us = phi i64 [ 0, %.lr.ph709.split.us ], [ %796, %._crit_edge.us713 ]
  %768 = getelementptr inbounds double, ptr %16, i64 %.0617707.us
  %769 = load double, ptr %768, align 8, !tbaa !40
  %770 = mul i64 %.0617707.us, %5
  %brmerge1347 = select i1 %min.iters.check1275, i1 true, i1 %conflict.rdx1272
  br i1 %brmerge1347, label %scalar.ph1274.preheader, label %vector.ph1276

vector.ph1276:                                    ; preds = %.lr.ph.us712
  %broadcast.splatinsert1283 = insertelement <2 x double> poison, double %769, i64 0
  %broadcast.splat1284 = shufflevector <2 x double> %broadcast.splatinsert1283, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body1280

vector.body1280:                                  ; preds = %vector.body1280, %vector.ph1276
  %index1281 = phi i64 [ 0, %vector.ph1276 ], [ %index.next1287, %vector.body1280 ]
  %771 = add i64 %index1281, %770
  %772 = getelementptr inbounds double, ptr %744, i64 %771
  %wide.load1282 = load <2 x double>, ptr %772, align 8, !tbaa !40
  %773 = fmul <2 x double> %broadcast.splat1284, %wide.load1282
  %774 = getelementptr inbounds double, ptr %746, i64 %771
  store <2 x double> %773, ptr %774, align 8, !tbaa !40
  %775 = getelementptr inbounds double, ptr %748, i64 %771
  %wide.load1285 = load <2 x double>, ptr %775, align 8, !tbaa !40
  %776 = fmul <2 x double> %broadcast.splat1284, %wide.load1285
  %777 = getelementptr inbounds double, ptr %750, i64 %771
  store <2 x double> %776, ptr %777, align 8, !tbaa !40
  %778 = getelementptr inbounds double, ptr %752, i64 %771
  %wide.load1286 = load <2 x double>, ptr %778, align 8, !tbaa !40
  %779 = fmul <2 x double> %broadcast.splat1284, %wide.load1286
  %780 = getelementptr inbounds double, ptr %754, i64 %771
  store <2 x double> %779, ptr %780, align 8, !tbaa !40
  %index.next1287 = add nuw i64 %index1281, 2
  %781 = icmp eq i64 %index.next1287, %n.vec1278
  br i1 %781, label %middle.block1273, label %vector.body1280, !llvm.loop !138

middle.block1273:                                 ; preds = %vector.body1280
  br i1 %cmp.n1288, label %._crit_edge.us713, label %scalar.ph1274.preheader

scalar.ph1274.preheader:                          ; preds = %.lr.ph.us712, %middle.block1273
  %.0615706.us.ph = phi i64 [ 0, %.lr.ph.us712 ], [ %n.vec1278, %middle.block1273 ]
  br label %scalar.ph1274

scalar.ph1274:                                    ; preds = %scalar.ph1274.preheader, %scalar.ph1274
  %.0615706.us = phi i64 [ %795, %scalar.ph1274 ], [ %.0615706.us.ph, %scalar.ph1274.preheader ]
  %782 = add i64 %.0615706.us, %770
  %783 = getelementptr inbounds double, ptr %744, i64 %782
  %784 = load double, ptr %783, align 8, !tbaa !40
  %785 = fmul double %769, %784
  %786 = getelementptr inbounds double, ptr %746, i64 %782
  store double %785, ptr %786, align 8, !tbaa !40
  %787 = getelementptr inbounds double, ptr %748, i64 %782
  %788 = load double, ptr %787, align 8, !tbaa !40
  %789 = fmul double %769, %788
  %790 = getelementptr inbounds double, ptr %750, i64 %782
  store double %789, ptr %790, align 8, !tbaa !40
  %791 = getelementptr inbounds double, ptr %752, i64 %782
  %792 = load double, ptr %791, align 8, !tbaa !40
  %793 = fmul double %769, %792
  %794 = getelementptr inbounds double, ptr %754, i64 %782
  store double %793, ptr %794, align 8, !tbaa !40
  %795 = add nuw i64 %.0615706.us, 1
  %exitcond751.not = icmp eq i64 %795, %5
  br i1 %exitcond751.not, label %._crit_edge.us713, label %scalar.ph1274, !llvm.loop !139

._crit_edge.us713:                                ; preds = %scalar.ph1274, %middle.block1273
  %796 = add nuw i64 %.0617707.us, 1
  %exitcond752.not = icmp eq i64 %796, %743
  br i1 %exitcond752.not, label %._crit_edge710, label %.lr.ph.us712, !llvm.loop !140

._crit_edge710:                                   ; preds = %._crit_edge.us713, %._crit_edge701
  %797 = load ptr, ptr %395, align 8, !tbaa !115
  %798 = load ptr, ptr %171, align 8, !tbaa !30
  %799 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %797, ptr noundef %798, ptr noundef %7, i64 noundef %743, i64 noundef %5, i64 noundef %5, ptr noundef %799) #4
  %800 = load ptr, ptr %161, align 8, !tbaa !27
  tail call void @mat_add(ptr noundef %800, ptr noundef %7, ptr noundef %800, i64 noundef %5, i64 noundef %5) #4
  %801 = load ptr, ptr %401, align 8, !tbaa !116
  %802 = load ptr, ptr %171, align 8, !tbaa !30
  %803 = load i64, ptr %21, align 8, !tbaa !21
  %804 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %801, ptr noundef %802, ptr noundef %7, i64 noundef %803, i64 noundef %5, i64 noundef %5, ptr noundef %804) #4
  %805 = load ptr, ptr %167, align 8, !tbaa !29
  tail call void @mat_add(ptr noundef %805, ptr noundef %7, ptr noundef %805, i64 noundef %5, i64 noundef %5) #4
  %806 = load ptr, ptr %407, align 8, !tbaa !75
  %807 = load ptr, ptr %171, align 8, !tbaa !30
  %808 = load i64, ptr %21, align 8, !tbaa !21
  %809 = load ptr, ptr %163, align 8, !tbaa !67
  tail call void @einsum_mn_mp__np_parallel(ptr noundef %806, ptr noundef %807, ptr noundef %7, i64 noundef %808, i64 noundef %5, i64 noundef %5, ptr noundef %809) #4
  %810 = load ptr, ptr %173, align 8, !tbaa !31
  tail call void @mat_add(ptr noundef %810, ptr noundef %7, ptr noundef %810, i64 noundef %5, i64 noundef %5) #4
  br label %811

811:                                              ; preds = %._crit_edge656, %._crit_edge710, %54
  %812 = getelementptr inbounds i8, ptr %0, i64 256
  %813 = load ptr, ptr %812, align 8, !tbaa !27
  tail call void @mat_scalar_multiply(ptr noundef %813, ptr noundef %813, i64 noundef %5, i64 noundef %5, double noundef -1.000000e+00) #4
  %814 = getelementptr inbounds i8, ptr %0, i64 264
  %815 = load ptr, ptr %814, align 8, !tbaa !29
  tail call void @mat_scalar_multiply(ptr noundef %815, ptr noundef %815, i64 noundef %5, i64 noundef %5, double noundef -1.000000e+00) #4
  %816 = getelementptr inbounds i8, ptr %0, i64 272
  %817 = load ptr, ptr %816, align 8, !tbaa !31
  tail call void @mat_scalar_multiply(ptr noundef %817, ptr noundef %817, i64 noundef %5, i64 noundef %5, double noundef -1.000000e+00) #4
  ret void
}

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !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 576}
!15 = !{!6, !7, i64 496}
!16 = !{!6, !7, i64 504}
!17 = !{!6, !7, i64 584}
!18 = !{!6, !7, i64 600}
!19 = !{!6, !7, i64 352}
!20 = !{!6, !7, i64 392}
!21 = !{!6, !10, i64 64}
!22 = !{!6, !7, i64 88}
!23 = !{!6, !10, i64 280}
!24 = !{!10, !10, i64 0}
!25 = !{!6, !7, i64 112}
!26 = !{!6, !7, i64 104}
!27 = !{!6, !7, i64 256}
!28 = !{!6, !7, i64 120}
!29 = !{!6, !7, i64 264}
!30 = !{!6, !7, i64 128}
!31 = !{!6, !7, i64 272}
!32 = !{!6, !7, i64 512}
!33 = !{!6, !7, i64 520}
!34 = !{!6, !7, i64 528}
!35 = !{!6, !7, i64 360}
!36 = !{!6, !7, i64 400}
!37 = !{!6, !7, i64 296}
!38 = !{!6, !7, i64 304}
!39 = !{!6, !7, i64 312}
!40 = !{!11, !11, i64 0}
!41 = !{!42}
!42 = distinct !{!42, !43}
!43 = distinct !{!43, !"LVerDomain"}
!44 = !{!45}
!45 = distinct !{!45, !43}
!46 = !{!47}
!47 = distinct !{!47, !43}
!48 = !{!49}
!49 = distinct !{!49, !43}
!50 = !{!51}
!51 = distinct !{!51, !43}
!52 = !{!53}
!53 = distinct !{!53, !43}
!54 = !{!55}
!55 = distinct !{!55, !43}
!56 = !{!57}
!57 = distinct !{!57, !43}
!58 = !{!59}
!59 = distinct !{!59, !43}
!60 = !{!51, !42, !53, !45, !55, !47, !57, !49}
!61 = distinct !{!61, !62, !63, !64}
!62 = !{!"llvm.loop.mustprogress"}
!63 = !{!"llvm.loop.isvectorized", i32 1}
!64 = !{!"llvm.loop.unroll.runtime.disable"}
!65 = distinct !{!65, !62, !63}
!66 = distinct !{!66, !62}
!67 = !{!13, !7, i64 288}
!68 = !{!6, !7, i64 144}
!69 = !{!6, !7, i64 168}
!70 = !{!6, !7, i64 176}
!71 = !{!6, !7, i64 152}
!72 = !{!6, !7, i64 184}
!73 = !{!7, !7, i64 0}
!74 = !{!6, !7, i64 160}
!75 = !{!6, !7, i64 552}
!76 = !{!77}
!77 = distinct !{!77, !78}
!78 = distinct !{!78, !"LVerDomain"}
!79 = !{!80}
!80 = distinct !{!80, !78}
!81 = !{!82}
!82 = distinct !{!82, !78}
!83 = !{!84}
!84 = distinct !{!84, !78}
!85 = !{!86}
!86 = distinct !{!86, !78}
!87 = !{!88}
!88 = distinct !{!88, !78}
!89 = !{!90}
!90 = distinct !{!90, !78}
!91 = !{!92}
!92 = distinct !{!92, !78}
!93 = !{!94}
!94 = distinct !{!94, !78}
!95 = !{!96, !97, !86, !77, !88, !80, !90, !82, !92, !84, !98, !99, !100, !101, !102}
!96 = distinct !{!96, !78}
!97 = distinct !{!97, !78}
!98 = distinct !{!98, !78}
!99 = distinct !{!99, !78}
!100 = distinct !{!100, !78}
!101 = distinct !{!101, !78}
!102 = distinct !{!102, !78}
!103 = !{!98}
!104 = !{!99}
!105 = !{!100}
!106 = !{!96}
!107 = !{!97, !86, !77, !88, !80, !90, !82, !92, !84, !98, !99, !100, !101, !102}
!108 = !{!101}
!109 = !{!102}
!110 = !{!97}
!111 = !{!86, !77, !88, !80, !90, !82, !92, !84, !98, !99, !100, !101, !102}
!112 = distinct !{!112, !62, !63, !64}
!113 = distinct !{!113, !62, !63}
!114 = distinct !{!114, !62}
!115 = !{!6, !7, i64 536}
!116 = !{!6, !7, i64 544}
!117 = !{!6, !7, i64 376}
!118 = !{!6, !7, i64 416}
!119 = distinct !{!119, !62, !63, !64}
!120 = distinct !{!120, !121}
!121 = !{!"llvm.loop.unroll.disable"}
!122 = distinct !{!122, !62, !63}
!123 = distinct !{!123, !62}
!124 = distinct !{!124, !62, !63, !64}
!125 = distinct !{!125, !62, !63}
!126 = distinct !{!126, !62}
!127 = distinct !{!127, !62, !63, !64}
!128 = distinct !{!128, !121}
!129 = distinct !{!129, !62, !63}
!130 = distinct !{!130, !62}
!131 = distinct !{!131, !62, !63, !64}
!132 = distinct !{!132, !62, !63}
!133 = distinct !{!133, !62}
!134 = distinct !{!134, !62, !63, !64}
!135 = distinct !{!135, !121}
!136 = distinct !{!136, !62, !63}
!137 = distinct !{!137, !62}
!138 = distinct !{!138, !62, !63, !64}
!139 = distinct !{!139, !62, !63}
!140 = distinct !{!140, !62}


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