; LLVM IR from bjourne/fast_snn_fpga :: src (sim_params)

; 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.sim_config = type { i32, ptr, i8, ptr, i32, i32, i8, i32, i32, i8, double, double, double, double, double, double, double, i8, i32, ptr, i32, ptr, ptr, i32, ptr, ptr }
%struct.npy_arr = type { i32, i32, i8, i32, [10 x i32], i32, ptr, i32 }
%struct.synapse = type { i32, float }

@.str.16 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [72 x i8], align 1
@__PRETTY_FUNCTION__.sim_config_init = external hidden unnamed_addr constant [42 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [16 x i8], align 1

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

; Function Attrs: nounwind uwtable
define dso_local ptr @sim_config_init(i32 noundef %0, ptr noundef %1) #1 {
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %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 i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca double, align 8
  %16 = alloca i8, align 1
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca ptr, align 8
  %23 = alloca i32, align 4
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca i32, align 4
  store i32 %0, ptr %4, align 4, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #9
  store ptr null, ptr %6, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #9
  store ptr null, ptr %7, align 8, !tbaa !9
  %29 = load i32, ptr %4, align 4, !tbaa !5
  %30 = icmp slt i32 %29, 5
  br i1 %30, label %31, label %32

31:                                               ; preds = %2
  br label %630

32:                                               ; preds = %2
  store ptr null, ptr %8, align 8, !tbaa !9
  %33 = call noalias ptr @calloc(i64 noundef 1, i64 noundef 176) #10
  store ptr %33, ptr %6, align 8, !tbaa !9
  %34 = load ptr, ptr %5, align 8, !tbaa !9
  %35 = getelementptr inbounds ptr, ptr %34, i64 1
  %36 = load ptr, ptr %35, align 8, !tbaa !9
  %37 = load ptr, ptr %6, align 8, !tbaa !9
  %38 = getelementptr inbounds %struct.sim_config, ptr %37, i32 0, i32 1
  store ptr %36, ptr %38, align 8, !tbaa !11
  %39 = load ptr, ptr %5, align 8, !tbaa !9
  %40 = getelementptr inbounds ptr, ptr %39, i64 2
  %41 = load ptr, ptr %40, align 8, !tbaa !9
  %42 = call i64 @strtol(ptr noundef %41, ptr noundef %8, i32 noundef 10) #9
  %43 = trunc i64 %42 to i32
  %44 = load ptr, ptr %6, align 8, !tbaa !9
  %45 = getelementptr inbounds %struct.sim_config, ptr %44, i32 0, i32 0
  store i32 %43, ptr %45, align 8, !tbaa !15
  %46 = load ptr, ptr %5, align 8, !tbaa !9
  %47 = getelementptr inbounds ptr, ptr %46, i64 2
  %48 = load ptr, ptr %47, align 8, !tbaa !9
  %49 = load ptr, ptr %8, align 8, !tbaa !9
  %50 = icmp eq ptr %48, %49
  br i1 %50, label %51, label %52

51:                                               ; preds = %32
  br label %630

52:                                               ; preds = %32
  %53 = load ptr, ptr %5, align 8, !tbaa !9
  %54 = getelementptr inbounds ptr, ptr %53, i64 3
  %55 = load ptr, ptr %54, align 8, !tbaa !9
  %56 = call i32 @strcmp(ptr noundef %55, ptr noundef @.str.29) #11
  %57 = icmp ne i32 %56, 0
  %58 = xor i1 %57, true
  %59 = load ptr, ptr %6, align 8, !tbaa !9
  %60 = getelementptr inbounds %struct.sim_config, ptr %59, i32 0, i32 2
  %61 = zext i1 %58 to i8
  store i8 %61, ptr %60, align 8, !tbaa !16
  %62 = load ptr, ptr %6, align 8, !tbaa !9
  %63 = getelementptr inbounds %struct.sim_config, ptr %62, i32 0, i32 2
  %64 = load i8, ptr %63, align 8, !tbaa !16, !range !17, !noundef !18
  %65 = trunc i8 %64 to i1
  br i1 %65, label %66, label %71

66:                                               ; preds = %52
  %67 = load i32, ptr %4, align 4, !tbaa !5
  %68 = icmp ne i32 %67, 5
  br i1 %68, label %69, label %70

69:                                               ; preds = %66
  br label %630

70:                                               ; preds = %66
  br label %109

71:                                               ; preds = %52
  %72 = load i32, ptr %4, align 4, !tbaa !5
  %73 = icmp ne i32 %72, 8
  br i1 %73, label %74, label %75

74:                                               ; preds = %71
  br label %630

75:                                               ; preds = %71
  %76 = load ptr, ptr %5, align 8, !tbaa !9
  %77 = getelementptr inbounds ptr, ptr %76, i64 7
  %78 = load ptr, ptr %77, align 8, !tbaa !9
  %79 = load ptr, ptr %6, align 8, !tbaa !9
  %80 = getelementptr inbounds %struct.sim_config, ptr %79, i32 0, i32 3
  store ptr %78, ptr %80, align 8, !tbaa !19
  %81 = load ptr, ptr %5, align 8, !tbaa !9
  %82 = getelementptr inbounds ptr, ptr %81, i64 5
  %83 = load ptr, ptr %82, align 8, !tbaa !9
  %84 = call i64 @strtol(ptr noundef %83, ptr noundef %8, i32 noundef 10) #9
  %85 = trunc i64 %84 to i32
  %86 = load ptr, ptr %6, align 8, !tbaa !9
  %87 = getelementptr inbounds %struct.sim_config, ptr %86, i32 0, i32 4
  store i32 %85, ptr %87, align 8, !tbaa !20
  %88 = load ptr, ptr %5, align 8, !tbaa !9
  %89 = getelementptr inbounds ptr, ptr %88, i64 6
  %90 = load ptr, ptr %89, align 8, !tbaa !9
  %91 = load ptr, ptr %8, align 8, !tbaa !9
  %92 = icmp eq ptr %90, %91
  br i1 %92, label %93, label %94

93:                                               ; preds = %75
  br label %630

94:                                               ; preds = %75
  %95 = load ptr, ptr %5, align 8, !tbaa !9
  %96 = getelementptr inbounds ptr, ptr %95, i64 6
  %97 = load ptr, ptr %96, align 8, !tbaa !9
  %98 = call i64 @strtol(ptr noundef %97, ptr noundef %8, i32 noundef 10) #9
  %99 = trunc i64 %98 to i32
  %100 = load ptr, ptr %6, align 8, !tbaa !9
  %101 = getelementptr inbounds %struct.sim_config, ptr %100, i32 0, i32 5
  store i32 %99, ptr %101, align 4, !tbaa !21
  %102 = load ptr, ptr %5, align 8, !tbaa !9
  %103 = getelementptr inbounds ptr, ptr %102, i64 7
  %104 = load ptr, ptr %103, align 8, !tbaa !9
  %105 = load ptr, ptr %8, align 8, !tbaa !9
  %106 = icmp eq ptr %104, %105
  br i1 %106, label %107, label %108

107:                                              ; preds = %94
  br label %630

108:                                              ; preds = %94
  br label %109

109:                                              ; preds = %108, %70
  %110 = load ptr, ptr %5, align 8, !tbaa !9
  %111 = getelementptr inbounds ptr, ptr %110, i64 4
  %112 = load ptr, ptr %111, align 8, !tbaa !9
  %113 = call noalias ptr @strdup(ptr noundef %112) #9
  store ptr %113, ptr %9, align 8, !tbaa !9
  %114 = load ptr, ptr %9, align 8, !tbaa !9
  %115 = call ptr @strtok(ptr noundef %114, ptr noundef @.str.30) #9
  store ptr %115, ptr %10, align 8, !tbaa !9
  br label %116

116:                                              ; preds = %202, %109
  %117 = load ptr, ptr %10, align 8, !tbaa !9
  %118 = icmp ne ptr %117, null
  br i1 %118, label %119, label %204

119:                                              ; preds = %116
  %120 = load ptr, ptr %10, align 8, !tbaa !9
  %121 = call i32 @strcmp(ptr noundef %120, ptr noundef @.str.31) #11
  %122 = icmp ne i32 %121, 0
  br i1 %122, label %126, label %123

123:                                              ; preds = %119
  %124 = load ptr, ptr %6, align 8, !tbaa !9
  %125 = getelementptr inbounds %struct.sim_config, ptr %124, i32 0, i32 8
  store i32 0, ptr %125, align 8, !tbaa !22
  br label %202

126:                                              ; preds = %119
  %127 = load ptr, ptr %10, align 8, !tbaa !9
  %128 = call i32 @strcmp(ptr noundef %127, ptr noundef @.str.32) #11
  %129 = icmp ne i32 %128, 0
  br i1 %129, label %133, label %130

130:                                              ; preds = %126
  %131 = load ptr, ptr %6, align 8, !tbaa !9
  %132 = getelementptr inbounds %struct.sim_config, ptr %131, i32 0, i32 8
  store i32 1, ptr %132, align 8, !tbaa !22
  br label %201

133:                                              ; preds = %126
  %134 = load ptr, ptr %10, align 8, !tbaa !9
  %135 = call i32 @strcmp(ptr noundef %134, ptr noundef @.str.33) #11
  %136 = icmp ne i32 %135, 0
  br i1 %136, label %140, label %137

137:                                              ; preds = %133
  %138 = load ptr, ptr %6, align 8, !tbaa !9
  %139 = getelementptr inbounds %struct.sim_config, ptr %138, i32 0, i32 8
  store i32 2, ptr %139, align 8, !tbaa !22
  br label %200

140:                                              ; preds = %133
  %141 = load ptr, ptr %10, align 8, !tbaa !9
  %142 = call i32 @strcmp(ptr noundef %141, ptr noundef @.str.34) #11
  %143 = icmp ne i32 %142, 0
  br i1 %143, label %147, label %144

144:                                              ; preds = %140
  %145 = load ptr, ptr %6, align 8, !tbaa !9
  %146 = getelementptr inbounds %struct.sim_config, ptr %145, i32 0, i32 6
  store i8 1, ptr %146, align 8, !tbaa !23
  br label %199

147:                                              ; preds = %140
  %148 = load ptr, ptr %10, align 8, !tbaa !9
  %149 = call i32 @strcmp(ptr noundef %148, ptr noundef @.str.35) #11
  %150 = icmp ne i32 %149, 0
  br i1 %150, label %154, label %151

151:                                              ; preds = %147
  %152 = load ptr, ptr %6, align 8, !tbaa !9
  %153 = getelementptr inbounds %struct.sim_config, ptr %152, i32 0, i32 6
  store i8 0, ptr %153, align 8, !tbaa !23
  br label %198

154:                                              ; preds = %147
  %155 = load ptr, ptr %10, align 8, !tbaa !9
  %156 = call i32 @strcmp(ptr noundef %155, ptr noundef @.str.36) #11
  %157 = icmp ne i32 %156, 0
  br i1 %157, label %161, label %158

158:                                              ; preds = %154
  %159 = load ptr, ptr %6, align 8, !tbaa !9
  %160 = getelementptr inbounds %struct.sim_config, ptr %159, i32 0, i32 9
  store i8 1, ptr %160, align 4, !tbaa !24
  br label %197

161:                                              ; preds = %154
  %162 = load ptr, ptr %10, align 8, !tbaa !9
  %163 = call i32 @strcmp(ptr noundef %162, ptr noundef @.str.37) #11
  %164 = icmp ne i32 %163, 0
  br i1 %164, label %168, label %165

165:                                              ; preds = %161
  %166 = load ptr, ptr %6, align 8, !tbaa !9
  %167 = getelementptr inbounds %struct.sim_config, ptr %166, i32 0, i32 9
  store i8 0, ptr %167, align 4, !tbaa !24
  br label %196

168:                                              ; preds = %161
  %169 = load ptr, ptr %10, align 8, !tbaa !9
  %170 = call i32 @strcmp(ptr noundef %169, ptr noundef @.str.29) #11
  %171 = icmp ne i32 %170, 0
  br i1 %171, label %175, label %172

172:                                              ; preds = %168
  %173 = load ptr, ptr %6, align 8, !tbaa !9
  %174 = getelementptr inbounds %struct.sim_config, ptr %173, i32 0, i32 7
  store i32 0, ptr %174, align 4, !tbaa !25
  br label %195

175:                                              ; preds = %168
  %176 = load ptr, ptr %10, align 8, !tbaa !9
  %177 = call i32 @strcmp(ptr noundef %176, ptr noundef @.str.38) #11
  %178 = icmp ne i32 %177, 0
  br i1 %178, label %182, label %179

179:                                              ; preds = %175
  %180 = load ptr, ptr %6, align 8, !tbaa !9
  %181 = getelementptr inbounds %struct.sim_config, ptr %180, i32 0, i32 7
  store i32 2, ptr %181, align 4, !tbaa !25
  br label %194

182:                                              ; preds = %175
  %183 = load ptr, ptr %10, align 8, !tbaa !9
  %184 = call i32 @strcmp(ptr noundef %183, ptr noundef @.str.39) #11
  %185 = icmp ne i32 %184, 0
  br i1 %185, label %189, label %186

186:                                              ; preds = %182
  %187 = load ptr, ptr %6, align 8, !tbaa !9
  %188 = getelementptr inbounds %struct.sim_config, ptr %187, i32 0, i32 7
  store i32 1, ptr %188, align 4, !tbaa !25
  br label %193

189:                                              ; preds = %182
  %190 = load ptr, ptr %10, align 8, !tbaa !9
  %191 = call i32 (ptr, ...) @printf(ptr noundef @.str.40, ptr noundef %190)
  %192 = load ptr, ptr %9, align 8, !tbaa !9
  call void @free(ptr noundef %192) #9
  store ptr null, ptr %3, align 8
  store i32 1, ptr %11, align 4
  br label %644

193:                                              ; preds = %186
  br label %194

194:                                              ; preds = %193, %179
  br label %195

195:                                              ; preds = %194, %172
  br label %196

196:                                              ; preds = %195, %165
  br label %197

197:                                              ; preds = %196, %158
  br label %198

198:                                              ; preds = %197, %151
  br label %199

199:                                              ; preds = %198, %144
  br label %200

200:                                              ; preds = %199, %137
  br label %201

201:                                              ; preds = %200, %130
  br label %202

202:                                              ; preds = %201, %123
  %203 = call ptr @strtok(ptr noundef null, ptr noundef @.str.30) #9
  store ptr %203, ptr %10, align 8, !tbaa !9
  br label %116, !llvm.loop !26

204:                                              ; preds = %116
  %205 = load ptr, ptr %9, align 8, !tbaa !9
  call void @free(ptr noundef %205) #9
  %206 = load ptr, ptr %6, align 8, !tbaa !9
  %207 = getelementptr inbounds %struct.sim_config, ptr %206, i32 0, i32 1
  %208 = load ptr, ptr %207, align 8, !tbaa !11
  %209 = call ptr @load_arr(ptr noundef %208, ptr noundef @.str.41)
  store ptr %209, ptr %7, align 8, !tbaa !9
  %210 = load ptr, ptr %7, align 8, !tbaa !9
  %211 = icmp ne ptr %210, null
  br i1 %211, label %213, label %212

212:                                              ; preds = %204
  br label %630

213:                                              ; preds = %204
  %214 = load ptr, ptr %7, align 8, !tbaa !9
  %215 = getelementptr inbounds %struct.npy_arr, ptr %214, i32 0, i32 3
  %216 = load i32, ptr %215, align 4, !tbaa !28
  store i32 %216, ptr %12, align 4, !tbaa !5
  %217 = load ptr, ptr %6, align 8, !tbaa !9
  %218 = getelementptr inbounds %struct.sim_config, ptr %217, i32 0, i32 10
  store double -1.000000e+00, ptr %218, align 8, !tbaa !30
  %219 = load ptr, ptr %6, align 8, !tbaa !9
  %220 = getelementptr inbounds %struct.sim_config, ptr %219, i32 0, i32 14
  store double -1.000000e+00, ptr %220, align 8, !tbaa !31
  %221 = load ptr, ptr %6, align 8, !tbaa !9
  %222 = getelementptr inbounds %struct.sim_config, ptr %221, i32 0, i32 13
  store double -1.000000e+00, ptr %222, align 8, !tbaa !32
  %223 = load ptr, ptr %6, align 8, !tbaa !9
  %224 = getelementptr inbounds %struct.sim_config, ptr %223, i32 0, i32 12
  store double -1.000000e+00, ptr %224, align 8, !tbaa !33
  %225 = load ptr, ptr %6, align 8, !tbaa !9
  %226 = getelementptr inbounds %struct.sim_config, ptr %225, i32 0, i32 11
  store double -1.000000e+00, ptr %226, align 8, !tbaa !34
  %227 = load ptr, ptr %6, align 8, !tbaa !9
  %228 = getelementptr inbounds %struct.sim_config, ptr %227, i32 0, i32 15
  store double -1.000000e+00, ptr %228, align 8, !tbaa !35
  %229 = load ptr, ptr %6, align 8, !tbaa !9
  %230 = getelementptr inbounds %struct.sim_config, ptr %229, i32 0, i32 16
  store double -1.000000e+00, ptr %230, align 8, !tbaa !36
  %231 = load ptr, ptr %6, align 8, !tbaa !9
  %232 = getelementptr inbounds %struct.sim_config, ptr %231, i32 0, i32 17
  store i8 0, ptr %232, align 8, !tbaa !37
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #9
  store i32 0, ptr %13, align 4, !tbaa !5
  br label %233

233:                                              ; preds = %328, %213
  %234 = load i32, ptr %13, align 4, !tbaa !5
  %235 = load ptr, ptr %7, align 8, !tbaa !9
  %236 = getelementptr inbounds %struct.npy_arr, ptr %235, i32 0, i32 4
  %237 = getelementptr inbounds [10 x i32], ptr %236, i64 0, i64 0
  %238 = load i32, ptr %237, align 8, !tbaa !5
  %239 = icmp slt i32 %234, %238
  br i1 %239, label %241, label %240

240:                                              ; preds = %233
  store i32 5, ptr %11, align 4
  br label %331

241:                                              ; preds = %233
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #9
  %242 = load ptr, ptr %7, align 8, !tbaa !9
  %243 = getelementptr inbounds %struct.npy_arr, ptr %242, i32 0, i32 6
  %244 = load ptr, ptr %243, align 8, !tbaa !38
  %245 = load i32, ptr %12, align 4, !tbaa !5
  %246 = mul nsw i32 2, %245
  %247 = load i32, ptr %13, align 4, !tbaa !5
  %248 = mul nsw i32 %246, %247
  %249 = sext i32 %248 to i64
  %250 = getelementptr inbounds i8, ptr %244, i64 %249
  store ptr %250, ptr %14, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #9
  %251 = load ptr, ptr %14, align 8, !tbaa !9
  %252 = load i32, ptr %12, align 4, !tbaa !5
  %253 = sext i32 %252 to i64
  %254 = getelementptr inbounds i8, ptr %251, i64 %253
  %255 = call double @strtod(ptr noundef %254, ptr noundef null) #9
  store double %255, ptr %15, align 8, !tbaa !39
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #9
  store i8 0, ptr %16, align 1, !tbaa !40
  %256 = load ptr, ptr %14, align 8, !tbaa !9
  %257 = call i32 @strcmp(ptr noundef %256, ptr noundef @.str.16) #11
  %258 = icmp ne i32 %257, 0
  br i1 %258, label %263, label %259

259:                                              ; preds = %241
  %260 = load double, ptr %15, align 8, !tbaa !39
  %261 = load ptr, ptr %6, align 8, !tbaa !9
  %262 = getelementptr inbounds %struct.sim_config, ptr %261, i32 0, i32 16
  store double %260, ptr %262, align 8, !tbaa !36
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %263

263:                                              ; preds = %259, %241
  %264 = load ptr, ptr %14, align 8, !tbaa !9
  %265 = call i32 @strcmp(ptr noundef %264, ptr noundef @.str.17) #11
  %266 = icmp ne i32 %265, 0
  br i1 %266, label %271, label %267

267:                                              ; preds = %263
  %268 = load double, ptr %15, align 8, !tbaa !39
  %269 = load ptr, ptr %6, align 8, !tbaa !9
  %270 = getelementptr inbounds %struct.sim_config, ptr %269, i32 0, i32 15
  store double %268, ptr %270, align 8, !tbaa !35
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %271

271:                                              ; preds = %267, %263
  %272 = load ptr, ptr %14, align 8, !tbaa !9
  %273 = call i32 @strcmp(ptr noundef %272, ptr noundef @.str.18) #11
  %274 = icmp ne i32 %273, 0
  br i1 %274, label %279, label %275

275:                                              ; preds = %271
  %276 = load double, ptr %15, align 8, !tbaa !39
  %277 = load ptr, ptr %6, align 8, !tbaa !9
  %278 = getelementptr inbounds %struct.sim_config, ptr %277, i32 0, i32 11
  store double %276, ptr %278, align 8, !tbaa !34
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %279

279:                                              ; preds = %275, %271
  %280 = load ptr, ptr %14, align 8, !tbaa !9
  %281 = call i32 @strcmp(ptr noundef %280, ptr noundef @.str.19) #11
  %282 = icmp ne i32 %281, 0
  br i1 %282, label %287, label %283

283:                                              ; preds = %279
  %284 = load double, ptr %15, align 8, !tbaa !39
  %285 = load ptr, ptr %6, align 8, !tbaa !9
  %286 = getelementptr inbounds %struct.sim_config, ptr %285, i32 0, i32 12
  store double %284, ptr %286, align 8, !tbaa !33
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %287

287:                                              ; preds = %283, %279
  %288 = load ptr, ptr %14, align 8, !tbaa !9
  %289 = call i32 @strcmp(ptr noundef %288, ptr noundef @.str.20) #11
  %290 = icmp ne i32 %289, 0
  br i1 %290, label %295, label %291

291:                                              ; preds = %287
  %292 = load double, ptr %15, align 8, !tbaa !39
  %293 = load ptr, ptr %6, align 8, !tbaa !9
  %294 = getelementptr inbounds %struct.sim_config, ptr %293, i32 0, i32 13
  store double %292, ptr %294, align 8, !tbaa !32
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %295

295:                                              ; preds = %291, %287
  %296 = load ptr, ptr %14, align 8, !tbaa !9
  %297 = call i32 @strcmp(ptr noundef %296, ptr noundef @.str.21) #11
  %298 = icmp ne i32 %297, 0
  br i1 %298, label %303, label %299

299:                                              ; preds = %295
  %300 = load double, ptr %15, align 8, !tbaa !39
  %301 = load ptr, ptr %6, align 8, !tbaa !9
  %302 = getelementptr inbounds %struct.sim_config, ptr %301, i32 0, i32 14
  store double %300, ptr %302, align 8, !tbaa !31
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %303

303:                                              ; preds = %299, %295
  %304 = load ptr, ptr %14, align 8, !tbaa !9
  %305 = call i32 @strcmp(ptr noundef %304, ptr noundef @.str.42) #11
  %306 = icmp ne i32 %305, 0
  br i1 %306, label %311, label %307

307:                                              ; preds = %303
  %308 = load double, ptr %15, align 8, !tbaa !39
  %309 = load ptr, ptr %6, align 8, !tbaa !9
  %310 = getelementptr inbounds %struct.sim_config, ptr %309, i32 0, i32 10
  store double %308, ptr %310, align 8, !tbaa !30
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %311

311:                                              ; preds = %307, %303
  %312 = load ptr, ptr %14, align 8, !tbaa !9
  %313 = call i32 @strcmp(ptr noundef %312, ptr noundef @.str.22) #11
  %314 = icmp ne i32 %313, 0
  br i1 %314, label %320, label %315

315:                                              ; preds = %311
  %316 = load double, ptr %15, align 8, !tbaa !39
  %317 = fptoui double %316 to i8
  %318 = load ptr, ptr %6, align 8, !tbaa !9
  %319 = getelementptr inbounds %struct.sim_config, ptr %318, i32 0, i32 17
  store i8 %317, ptr %319, align 8, !tbaa !37
  store i8 1, ptr %16, align 1, !tbaa !40
  br label %320

320:                                              ; preds = %315, %311
  %321 = load i8, ptr %16, align 1, !tbaa !40, !range !17, !noundef !18
  %322 = trunc i8 %321 to i1
  br i1 %322, label %324, label %323

323:                                              ; preds = %320
  store i32 2, ptr %11, align 4
  br label %325

324:                                              ; preds = %320
  store i32 0, ptr %11, align 4
  br label %325

325:                                              ; preds = %324, %323
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #9
  %326 = load i32, ptr %11, align 4
  switch i32 %326, label %331 [
    i32 0, label %327
  ]

327:                                              ; preds = %325
  br label %328

328:                                              ; preds = %327
  %329 = load i32, ptr %13, align 4, !tbaa !5
  %330 = add nsw i32 %329, 1
  store i32 %330, ptr %13, align 4, !tbaa !5
  br label %233, !llvm.loop !41

331:                                              ; preds = %325, %240
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #9
  %332 = load i32, ptr %11, align 4
  switch i32 %332, label %644 [
    i32 5, label %333
    i32 2, label %630
  ]

333:                                              ; preds = %331
  %334 = load ptr, ptr %6, align 8, !tbaa !9
  %335 = getelementptr inbounds %struct.sim_config, ptr %334, i32 0, i32 16
  %336 = load double, ptr %335, align 8, !tbaa !36
  %337 = fcmp oeq double %336, -1.000000e+00
  br i1 %337, label %374, label %338

338:                                              ; preds = %333
  %339 = load ptr, ptr %6, align 8, !tbaa !9
  %340 = getelementptr inbounds %struct.sim_config, ptr %339, i32 0, i32 15
  %341 = load double, ptr %340, align 8, !tbaa !35
  %342 = fcmp oeq double %341, -1.000000e+00
  br i1 %342, label %374, label %343

343:                                              ; preds = %338
  %344 = load ptr, ptr %6, align 8, !tbaa !9
  %345 = getelementptr inbounds %struct.sim_config, ptr %344, i32 0, i32 11
  %346 = load double, ptr %345, align 8, !tbaa !34
  %347 = fcmp oeq double %346, -1.000000e+00
  br i1 %347, label %374, label %348

348:                                              ; preds = %343
  %349 = load ptr, ptr %6, align 8, !tbaa !9
  %350 = getelementptr inbounds %struct.sim_config, ptr %349, i32 0, i32 12
  %351 = load double, ptr %350, align 8, !tbaa !33
  %352 = fcmp oeq double %351, -1.000000e+00
  br i1 %352, label %374, label %353

353:                                              ; preds = %348
  %354 = load ptr, ptr %6, align 8, !tbaa !9
  %355 = getelementptr inbounds %struct.sim_config, ptr %354, i32 0, i32 13
  %356 = load double, ptr %355, align 8, !tbaa !32
  %357 = fcmp oeq double %356, -1.000000e+00
  br i1 %357, label %374, label %358

358:                                              ; preds = %353
  %359 = load ptr, ptr %6, align 8, !tbaa !9
  %360 = getelementptr inbounds %struct.sim_config, ptr %359, i32 0, i32 14
  %361 = load double, ptr %360, align 8, !tbaa !31
  %362 = fcmp oeq double %361, -1.000000e+00
  br i1 %362, label %374, label %363

363:                                              ; preds = %358
  %364 = load ptr, ptr %6, align 8, !tbaa !9
  %365 = getelementptr inbounds %struct.sim_config, ptr %364, i32 0, i32 10
  %366 = load double, ptr %365, align 8, !tbaa !30
  %367 = fcmp oeq double %366, -1.000000e+00
  br i1 %367, label %374, label %368

368:                                              ; preds = %363
  %369 = load ptr, ptr %6, align 8, !tbaa !9
  %370 = getelementptr inbounds %struct.sim_config, ptr %369, i32 0, i32 17
  %371 = load i8, ptr %370, align 8, !tbaa !37
  %372 = zext i8 %371 to i32
  %373 = icmp eq i32 %372, 0
  br i1 %373, label %374, label %375

374:                                              ; preds = %368, %363, %358, %353, %348, %343, %338, %333
  br label %630

375:                                              ; preds = %368
  %376 = load ptr, ptr %7, align 8, !tbaa !9
  call void @npy_free(ptr noundef %376)
  %377 = load ptr, ptr %6, align 8, !tbaa !9
  %378 = getelementptr inbounds %struct.sim_config, ptr %377, i32 0, i32 1
  %379 = load ptr, ptr %378, align 8, !tbaa !11
  %380 = call ptr @load_arr(ptr noundef %379, ptr noundef @.str.43)
  store ptr %380, ptr %7, align 8, !tbaa !9
  %381 = load ptr, ptr %7, align 8, !tbaa !9
  %382 = icmp ne ptr %381, null
  br i1 %382, label %384, label %383

383:                                              ; preds = %375
  br label %630

384:                                              ; preds = %375
  %385 = load ptr, ptr %7, align 8, !tbaa !9
  %386 = getelementptr inbounds %struct.npy_arr, ptr %385, i32 0, i32 4
  %387 = getelementptr inbounds [10 x i32], ptr %386, i64 0, i64 0
  %388 = load i32, ptr %387, align 8, !tbaa !5
  store i32 %388, ptr %17, align 4, !tbaa !5
  %389 = load i32, ptr %17, align 4, !tbaa !5
  %390 = add i32 %389, 64
  %391 = add i32 %390, 64
  %392 = sub i32 %391, 1
  %393 = udiv i32 %392, 64
  %394 = mul i32 %393, 64
  %395 = load ptr, ptr %6, align 8, !tbaa !9
  %396 = getelementptr inbounds %struct.sim_config, ptr %395, i32 0, i32 18
  store i32 %394, ptr %396, align 4, !tbaa !42
  %397 = load ptr, ptr %7, align 8, !tbaa !9
  %398 = call ptr @extract_data(ptr noundef %397)
  %399 = load ptr, ptr %6, align 8, !tbaa !9
  %400 = getelementptr inbounds %struct.sim_config, ptr %399, i32 0, i32 19
  store ptr %398, ptr %400, align 8, !tbaa !43
  %401 = load ptr, ptr %6, align 8, !tbaa !9
  %402 = getelementptr inbounds %struct.sim_config, ptr %401, i32 0, i32 1
  %403 = load ptr, ptr %402, align 8, !tbaa !11
  %404 = call ptr @load_arr(ptr noundef %403, ptr noundef @.str.44)
  store ptr %404, ptr %7, align 8, !tbaa !9
  %405 = load ptr, ptr %7, align 8, !tbaa !9
  %406 = icmp ne ptr %405, null
  br i1 %406, label %408, label %407

407:                                              ; preds = %384
  br label %630

408:                                              ; preds = %384
  %409 = load ptr, ptr %7, align 8, !tbaa !9
  %410 = getelementptr inbounds %struct.npy_arr, ptr %409, i32 0, i32 4
  %411 = getelementptr inbounds [10 x i32], ptr %410, i64 0, i64 1
  %412 = load i32, ptr %411, align 4, !tbaa !5
  %413 = load ptr, ptr %6, align 8, !tbaa !9
  %414 = getelementptr inbounds %struct.sim_config, ptr %413, i32 0, i32 20
  store i32 %412, ptr %414, align 8, !tbaa !44
  %415 = load ptr, ptr %6, align 8, !tbaa !9
  %416 = getelementptr inbounds %struct.sim_config, ptr %415, i32 0, i32 20
  %417 = load i32, ptr %416, align 8, !tbaa !44
  %418 = zext i32 %417 to i64
  %419 = mul i64 %418, 8
  %420 = call noalias ptr @malloc(i64 noundef %419) #12
  %421 = load ptr, ptr %6, align 8, !tbaa !9
  %422 = getelementptr inbounds %struct.sim_config, ptr %421, i32 0, i32 21
  store ptr %420, ptr %422, align 8, !tbaa !45
  %423 = load ptr, ptr %6, align 8, !tbaa !9
  %424 = getelementptr inbounds %struct.sim_config, ptr %423, i32 0, i32 20
  %425 = load i32, ptr %424, align 8, !tbaa !44
  %426 = zext i32 %425 to i64
  %427 = mul i64 %426, 4
  %428 = call noalias ptr @malloc(i64 noundef %427) #12
  %429 = load ptr, ptr %6, align 8, !tbaa !9
  %430 = getelementptr inbounds %struct.sim_config, ptr %429, i32 0, i32 22
  store ptr %428, ptr %430, align 8, !tbaa !46
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #9
  store i32 0, ptr %18, align 4, !tbaa !5
  br label %431

431:                                              ; preds = %464, %408
  %432 = load i32, ptr %18, align 4, !tbaa !5
  %433 = load ptr, ptr %6, align 8, !tbaa !9
  %434 = getelementptr inbounds %struct.sim_config, ptr %433, i32 0, i32 20
  %435 = load i32, ptr %434, align 8, !tbaa !44
  %436 = icmp ult i32 %432, %435
  br i1 %436, label %438, label %437

437:                                              ; preds = %431
  store i32 8, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #9
  br label %467

438:                                              ; preds = %431
  %439 = load ptr, ptr %7, align 8, !tbaa !9
  %440 = load i32, ptr %18, align 4, !tbaa !5
  %441 = zext i32 %440 to i64
  %442 = call double @npy_value_at_as_double(ptr noundef %439, i64 noundef %441)
  %443 = fptoui double %442 to i32
  %444 = load ptr, ptr %6, align 8, !tbaa !9
  %445 = getelementptr inbounds %struct.sim_config, ptr %444, i32 0, i32 22
  %446 = load ptr, ptr %445, align 8, !tbaa !46
  %447 = load i32, ptr %18, align 4, !tbaa !5
  %448 = zext i32 %447 to i64
  %449 = getelementptr inbounds i32, ptr %446, i64 %448
  store i32 %443, ptr %449, align 4, !tbaa !5
  %450 = load ptr, ptr %7, align 8, !tbaa !9
  %451 = load ptr, ptr %6, align 8, !tbaa !9
  %452 = getelementptr inbounds %struct.sim_config, ptr %451, i32 0, i32 20
  %453 = load i32, ptr %452, align 8, !tbaa !44
  %454 = load i32, ptr %18, align 4, !tbaa !5
  %455 = add i32 %453, %454
  %456 = zext i32 %455 to i64
  %457 = call double @npy_value_at_as_double(ptr noundef %450, i64 noundef %456)
  %458 = load ptr, ptr %6, align 8, !tbaa !9
  %459 = getelementptr inbounds %struct.sim_config, ptr %458, i32 0, i32 21
  %460 = load ptr, ptr %459, align 8, !tbaa !45
  %461 = load i32, ptr %18, align 4, !tbaa !5
  %462 = zext i32 %461 to i64
  %463 = getelementptr inbounds double, ptr %460, i64 %462
  store double %457, ptr %463, align 8, !tbaa !39
  br label %464

464:                                              ; preds = %438
  %465 = load i32, ptr %18, align 4, !tbaa !5
  %466 = add i32 %465, 1
  store i32 %466, ptr %18, align 4, !tbaa !5
  br label %431, !llvm.loop !47

467:                                              ; preds = %437
  %468 = load ptr, ptr %7, align 8, !tbaa !9
  call void @npy_free(ptr noundef %468)
  %469 = load ptr, ptr %6, align 8, !tbaa !9
  %470 = getelementptr inbounds %struct.sim_config, ptr %469, i32 0, i32 1
  %471 = load ptr, ptr %470, align 8, !tbaa !11
  %472 = call ptr @load_arr(ptr noundef %471, ptr noundef @.str.45)
  store ptr %472, ptr %7, align 8, !tbaa !9
  %473 = load ptr, ptr %7, align 8, !tbaa !9
  %474 = icmp ne ptr %473, null
  br i1 %474, label %476, label %475

475:                                              ; preds = %467
  br label %630

476:                                              ; preds = %467
  %477 = load ptr, ptr %7, align 8, !tbaa !9
  %478 = getelementptr inbounds %struct.npy_arr, ptr %477, i32 0, i32 4
  %479 = getelementptr inbounds [10 x i32], ptr %478, i64 0, i64 0
  %480 = load i32, ptr %479, align 8, !tbaa !5
  %481 = load ptr, ptr %6, align 8, !tbaa !9
  %482 = getelementptr inbounds %struct.sim_config, ptr %481, i32 0, i32 23
  store i32 %480, ptr %482, align 8, !tbaa !48
  %483 = load ptr, ptr %7, align 8, !tbaa !9
  %484 = getelementptr inbounds %struct.npy_arr, ptr %483, i32 0, i32 4
  %485 = getelementptr inbounds [10 x i32], ptr %484, i64 0, i64 1
  %486 = load i32, ptr %485, align 4, !tbaa !5
  %487 = load i32, ptr %17, align 4, !tbaa !5
  %488 = icmp eq i32 %486, %487
  br i1 %488, label %489, label %490

489:                                              ; preds = %476
  br label %491

490:                                              ; preds = %476
  call void @__assert_fail(ptr noundef @.str.46, ptr noundef @.str.47, i32 noundef 269, ptr noundef @__PRETTY_FUNCTION__.sim_config_init) #13
  unreachable

491:                                              ; preds = %489
  %492 = load ptr, ptr %7, align 8, !tbaa !9
  %493 = call ptr @extract_data(ptr noundef %492)
  store ptr %493, ptr %19, align 8, !tbaa !9
  %494 = load ptr, ptr %6, align 8, !tbaa !9
  %495 = getelementptr inbounds %struct.sim_config, ptr %494, i32 0, i32 18
  %496 = load i32, ptr %495, align 4, !tbaa !42
  %497 = load ptr, ptr %6, align 8, !tbaa !9
  %498 = getelementptr inbounds %struct.sim_config, ptr %497, i32 0, i32 23
  %499 = load i32, ptr %498, align 8, !tbaa !48
  %500 = mul i32 %496, %499
  %501 = zext i32 %500 to i64
  %502 = call ptr @aligned_calloc(i64 noundef %501, i64 noundef 1)
  store ptr %502, ptr %20, align 8, !tbaa !9
  %503 = load ptr, ptr %20, align 8, !tbaa !9
  %504 = icmp ne ptr %503, null
  br i1 %504, label %505, label %506

505:                                              ; preds = %491
  br label %507

506:                                              ; preds = %491
  call void @__assert_fail(ptr noundef @.str.48, ptr noundef @.str.47, i32 noundef 274, ptr noundef @__PRETTY_FUNCTION__.sim_config_init) #13
  unreachable

507:                                              ; preds = %505
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #9
  store i32 0, ptr %21, align 4, !tbaa !5
  br label %508

508:                                              ; preds = %532, %507
  %509 = load i32, ptr %21, align 4, !tbaa !5
  %510 = load ptr, ptr %6, align 8, !tbaa !9
  %511 = getelementptr inbounds %struct.sim_config, ptr %510, i32 0, i32 23
  %512 = load i32, ptr %511, align 8, !tbaa !48
  %513 = icmp ult i32 %509, %512
  br i1 %513, label %515, label %514

514:                                              ; preds = %508
  store i32 11, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #9
  br label %535

515:                                              ; preds = %508
  %516 = load ptr, ptr %20, align 8, !tbaa !9
  %517 = load i32, ptr %21, align 4, !tbaa !5
  %518 = load ptr, ptr %6, align 8, !tbaa !9
  %519 = getelementptr inbounds %struct.sim_config, ptr %518, i32 0, i32 18
  %520 = load i32, ptr %519, align 4, !tbaa !42
  %521 = mul i32 %517, %520
  %522 = zext i32 %521 to i64
  %523 = getelementptr inbounds i8, ptr %516, i64 %522
  %524 = load ptr, ptr %19, align 8, !tbaa !9
  %525 = load i32, ptr %21, align 4, !tbaa !5
  %526 = load i32, ptr %17, align 4, !tbaa !5
  %527 = mul i32 %525, %526
  %528 = zext i32 %527 to i64
  %529 = getelementptr inbounds i8, ptr %524, i64 %528
  %530 = load i32, ptr %17, align 4, !tbaa !5
  %531 = zext i32 %530 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %523, ptr align 1 %529, i64 %531, i1 false)
  br label %532

532:                                              ; preds = %515
  %533 = load i32, ptr %21, align 4, !tbaa !5
  %534 = add i32 %533, 1
  store i32 %534, ptr %21, align 4, !tbaa !5
  br label %508, !llvm.loop !49

535:                                              ; preds = %514
  %536 = load ptr, ptr %20, align 8, !tbaa !9
  %537 = load ptr, ptr %6, align 8, !tbaa !9
  %538 = getelementptr inbounds %struct.sim_config, ptr %537, i32 0, i32 24
  store ptr %536, ptr %538, align 8, !tbaa !50
  %539 = load ptr, ptr %19, align 8, !tbaa !9
  call void @free(ptr noundef %539) #9
  %540 = load ptr, ptr %6, align 8, !tbaa !9
  %541 = getelementptr inbounds %struct.sim_config, ptr %540, i32 0, i32 1
  %542 = load ptr, ptr %541, align 8, !tbaa !11
  %543 = call ptr @load_arr(ptr noundef %542, ptr noundef @.str.49)
  store ptr %543, ptr %7, align 8, !tbaa !9
  %544 = load ptr, ptr %7, align 8, !tbaa !9
  %545 = icmp ne ptr %544, null
  br i1 %545, label %547, label %546

546:                                              ; preds = %535
  br label %630

547:                                              ; preds = %535
  %548 = load ptr, ptr %7, align 8, !tbaa !9
  %549 = call ptr @extract_data(ptr noundef %548)
  store ptr %549, ptr %22, align 8, !tbaa !9
  %550 = load ptr, ptr %22, align 8, !tbaa !9
  %551 = load i32, ptr %17, align 4, !tbaa !5
  %552 = mul i32 64, %551
  %553 = sub i32 %552, 1
  %554 = zext i32 %553 to i64
  %555 = getelementptr inbounds i32, ptr %550, i64 %554
  %556 = load i32, ptr %555, align 4, !tbaa !5
  store i32 %556, ptr %23, align 4, !tbaa !5
  %557 = load ptr, ptr %6, align 8, !tbaa !9
  %558 = getelementptr inbounds %struct.sim_config, ptr %557, i32 0, i32 1
  %559 = load ptr, ptr %558, align 8, !tbaa !11
  %560 = call ptr @load_arr(ptr noundef %559, ptr noundef @.str.50)
  store ptr %560, ptr %7, align 8, !tbaa !9
  %561 = load ptr, ptr %7, align 8, !tbaa !9
  %562 = icmp ne ptr %561, null
  br i1 %562, label %564, label %563

563:                                              ; preds = %547
  br label %630

564:                                              ; preds = %547
  %565 = load ptr, ptr %7, align 8, !tbaa !9
  %566 = call ptr @extract_data(ptr noundef %565)
  store ptr %566, ptr %24, align 8, !tbaa !9
  %567 = load ptr, ptr %6, align 8, !tbaa !9
  %568 = getelementptr inbounds %struct.sim_config, ptr %567, i32 0, i32 1
  %569 = load ptr, ptr %568, align 8, !tbaa !11
  %570 = call ptr @load_arr(ptr noundef %569, ptr noundef @.str.51)
  store ptr %570, ptr %7, align 8, !tbaa !9
  %571 = load ptr, ptr %7, align 8, !tbaa !9
  %572 = icmp ne ptr %571, null
  br i1 %572, label %574, label %573

573:                                              ; preds = %564
  br label %630

574:                                              ; preds = %564
  %575 = load ptr, ptr %7, align 8, !tbaa !9
  %576 = call ptr @extract_data(ptr noundef %575)
  store ptr %576, ptr %25, align 8, !tbaa !9
  %577 = load ptr, ptr %6, align 8, !tbaa !9
  %578 = getelementptr inbounds %struct.sim_config, ptr %577, i32 0, i32 1
  %579 = load ptr, ptr %578, align 8, !tbaa !11
  %580 = call ptr @load_arr(ptr noundef %579, ptr noundef @.str.52)
  store ptr %580, ptr %7, align 8, !tbaa !9
  %581 = load ptr, ptr %7, align 8, !tbaa !9
  %582 = icmp ne ptr %581, null
  br i1 %582, label %584, label %583

583:                                              ; preds = %574
  br label %630

584:                                              ; preds = %574
  %585 = load ptr, ptr %7, align 8, !tbaa !9
  %586 = call ptr @extract_data(ptr noundef %585)
  store ptr %586, ptr %26, align 8, !tbaa !9
  %587 = load i32, ptr %23, align 4, !tbaa !5
  %588 = zext i32 %587 to i64
  %589 = call ptr @aligned_calloc(i64 noundef %588, i64 noundef 8)
  store ptr %589, ptr %27, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #9
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %590

590:                                              ; preds = %616, %584
  %591 = load i32, ptr %28, align 4, !tbaa !5
  %592 = load i32, ptr %23, align 4, !tbaa !5
  %593 = icmp ult i32 %591, %592
  br i1 %593, label %595, label %594

594:                                              ; preds = %590
  store i32 14, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #9
  br label %619

595:                                              ; preds = %590
  %596 = load ptr, ptr %26, align 8, !tbaa !9
  %597 = load i32, ptr %28, align 4, !tbaa !5
  %598 = zext i32 %597 to i64
  %599 = getelementptr inbounds i32, ptr %596, i64 %598
  %600 = load i32, ptr %599, align 4, !tbaa !5
  %601 = load ptr, ptr %27, align 8, !tbaa !9
  %602 = load i32, ptr %28, align 4, !tbaa !5
  %603 = zext i32 %602 to i64
  %604 = getelementptr inbounds %struct.synapse, ptr %601, i64 %603
  %605 = getelementptr inbounds %struct.synapse, ptr %604, i32 0, i32 0
  store i32 %600, ptr %605, align 4, !tbaa !51
  %606 = load ptr, ptr %24, align 8, !tbaa !9
  %607 = load i32, ptr %28, align 4, !tbaa !5
  %608 = zext i32 %607 to i64
  %609 = getelementptr inbounds float, ptr %606, i64 %608
  %610 = load float, ptr %609, align 4, !tbaa !54
  %611 = load ptr, ptr %27, align 8, !tbaa !9
  %612 = load i32, ptr %28, align 4, !tbaa !5
  %613 = zext i32 %612 to i64
  %614 = getelementptr inbounds %struct.synapse, ptr %611, i64 %613
  %615 = getelementptr inbounds %struct.synapse, ptr %614, i32 0, i32 1
  store float %610, ptr %615, align 4, !tbaa !55
  br label %616

616:                                              ; preds = %595
  %617 = load i32, ptr %28, align 4, !tbaa !5
  %618 = add i32 %617, 1
  store i32 %618, ptr %28, align 4, !tbaa !5
  br label %590, !llvm.loop !56

619:                                              ; preds = %594
  %620 = load ptr, ptr %27, align 8, !tbaa !9
  %621 = load ptr, ptr %22, align 8, !tbaa !9
  %622 = load i32, ptr %17, align 4, !tbaa !5
  %623 = load i32, ptr %23, align 4, !tbaa !5
  %624 = call ptr @synapse_index_init(ptr noundef %620, ptr noundef %621, i32 noundef 64, i32 noundef %622, i32 noundef %623)
  %625 = load ptr, ptr %6, align 8, !tbaa !9
  %626 = getelementptr inbounds %struct.sim_config, ptr %625, i32 0, i32 25
  store ptr %624, ptr %626, align 8, !tbaa !57
  %627 = load ptr, ptr %24, align 8, !tbaa !9
  call void @free(ptr noundef %627) #9
  %628 = load ptr, ptr %25, align 8, !tbaa !9
  call void @free(ptr noundef %628) #9
  %629 = load ptr, ptr %6, align 8, !tbaa !9
  store ptr %629, ptr %3, align 8
  store i32 1, ptr %11, align 4
  br label %644

630:                                              ; preds = %583, %573, %563, %546, %475, %407, %383, %374, %331, %212, %107, %93, %74, %69, %51, %31
  %631 = load ptr, ptr %5, align 8, !tbaa !9
  %632 = getelementptr inbounds ptr, ptr %631, i64 0
  %633 = load ptr, ptr %632, align 8, !tbaa !9
  call void @usage(ptr noundef %633)
  %634 = load ptr, ptr %6, align 8, !tbaa !9
  %635 = icmp ne ptr %634, null
  br i1 %635, label %636, label %638

636:                                              ; preds = %630
  %637 = load ptr, ptr %6, align 8, !tbaa !9
  call void @sim_config_free(ptr noundef %637)
  br label %638

638:                                              ; preds = %636, %630
  %639 = load ptr, ptr %7, align 8, !tbaa !9
  %640 = icmp ne ptr %639, null
  br i1 %640, label %641, label %643

641:                                              ; preds = %638
  %642 = load ptr, ptr %7, align 8, !tbaa !9
  call void @free(ptr noundef %642) #9
  br label %643

643:                                              ; preds = %641, %638
  store ptr null, ptr %3, align 8
  store i32 1, ptr %11, align 4
  br label %644

644:                                              ; preds = %643, %619, %331, %189
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #9
  %645 = load ptr, ptr %3, align 8
  ret ptr %645
}

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

; Function Attrs: nounwind allocsize(0,1)
declare noalias ptr @calloc(i64 noundef, i64 noundef) #3

; Function Attrs: nounwind
declare i64 @strtol(ptr noundef, ptr noundef, i32 noundef) #4

; Function Attrs: nounwind willreturn memory(read)
declare i32 @strcmp(ptr noundef, ptr noundef) #5

; Function Attrs: nounwind
declare noalias ptr @strdup(ptr noundef) #4

; Function Attrs: nounwind
declare ptr @strtok(ptr noundef, ptr noundef) #4

; Function Attrs: nounwind
declare void @free(ptr noundef) #4

; Function Attrs: nounwind uwtable
declare hidden ptr @load_arr(ptr noundef, ptr noundef) #1

; Function Attrs: nounwind
declare double @strtod(ptr noundef, ptr noundef) #4

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

declare void @npy_free(ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden ptr @extract_data(ptr noundef) #1

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #6

declare double @npy_value_at_as_double(ptr noundef, i64 noundef) #0

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

declare ptr @aligned_calloc(i64 noundef, i64 noundef) #0

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

declare ptr @synapse_index_init(ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) #0

; Function Attrs: nounwind uwtable
declare hidden void @usage(ptr noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local void @sim_config_free(ptr noundef) #1

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 = { 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 #2 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nounwind allocsize(0,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 #4 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nounwind willreturn memory(read) "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 #6 = { nounwind allocsize(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 #7 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #9 = { nounwind }
attributes #10 = { nounwind allocsize(0,1) }
attributes #11 = { nounwind willreturn memory(read) }
attributes #12 = { nounwind allocsize(0) }
attributes #13 = { noreturn nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !10, i64 8}
!12 = !{!"", !6, i64 0, !10, i64 8, !13, i64 16, !10, i64 24, !6, i64 32, !6, i64 36, !13, i64 40, !6, i64 44, !6, i64 48, !13, i64 52, !14, i64 56, !14, i64 64, !14, i64 72, !14, i64 80, !14, i64 88, !14, i64 96, !14, i64 104, !7, i64 112, !6, i64 116, !10, i64 120, !6, i64 128, !10, i64 136, !10, i64 144, !6, i64 152, !10, i64 160, !10, i64 168}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{!"double", !7, i64 0}
!15 = !{!12, !6, i64 0}
!16 = !{!12, !13, i64 16}
!17 = !{i8 0, i8 2}
!18 = !{}
!19 = !{!12, !10, i64 24}
!20 = !{!12, !6, i64 32}
!21 = !{!12, !6, i64 36}
!22 = !{!12, !6, i64 48}
!23 = !{!12, !13, i64 40}
!24 = !{!12, !13, i64 52}
!25 = !{!12, !6, i64 44}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = !{!29, !6, i64 12}
!29 = !{!"", !6, i64 0, !6, i64 4, !7, i64 8, !6, i64 12, !7, i64 16, !6, i64 56, !10, i64 64, !6, i64 72}
!30 = !{!12, !14, i64 56}
!31 = !{!12, !14, i64 88}
!32 = !{!12, !14, i64 80}
!33 = !{!12, !14, i64 72}
!34 = !{!12, !14, i64 64}
!35 = !{!12, !14, i64 96}
!36 = !{!12, !14, i64 104}
!37 = !{!12, !7, i64 112}
!38 = !{!29, !10, i64 64}
!39 = !{!14, !14, i64 0}
!40 = !{!13, !13, i64 0}
!41 = distinct !{!41, !27}
!42 = !{!12, !6, i64 116}
!43 = !{!12, !10, i64 120}
!44 = !{!12, !6, i64 128}
!45 = !{!12, !10, i64 136}
!46 = !{!12, !10, i64 144}
!47 = distinct !{!47, !27}
!48 = !{!12, !6, i64 152}
!49 = distinct !{!49, !27}
!50 = !{!12, !10, i64 160}
!51 = !{!52, !6, i64 0}
!52 = !{!"", !6, i64 0, !53, i64 4}
!53 = !{!"float", !7, i64 0}
!54 = !{!53, !53, i64 0}
!55 = !{!52, !53, i64 4}
!56 = distinct !{!56, !27}
!57 = !{!12, !10, i64 168}


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

%struct.synapse = type { i32, float }

@.str.16 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [72 x i8], align 1
@__PRETTY_FUNCTION__.sim_config_init = external hidden unnamed_addr constant [42 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [16 x i8], align 1

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

; Function Attrs: nounwind uwtable
define dso_local noundef ptr @sim_config_init(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #1 {
  %3 = alloca ptr, align 8
  %4 = icmp slt i32 %0, 5
  br i1 %4, label %.thread272, label %6

.thread272:                                       ; preds = %2
  %5 = load ptr, ptr %1, align 8, !tbaa !5
  tail call void @usage(ptr noundef %5)
  br label %306

6:                                                ; preds = %2
  store ptr null, ptr %3, align 8, !tbaa !5
  %7 = tail call noalias dereferenceable_or_null(176) ptr @calloc(i64 noundef 1, i64 noundef 176) #11
  %8 = getelementptr inbounds i8, ptr %1, i64 8
  %9 = load ptr, ptr %8, align 8, !tbaa !5
  %10 = getelementptr inbounds i8, ptr %7, i64 8
  store ptr %9, ptr %10, align 8, !tbaa !9
  %11 = getelementptr inbounds i8, ptr %1, i64 16
  %12 = load ptr, ptr %11, align 8, !tbaa !5
  %13 = call i64 @strtol(ptr noundef %12, ptr noundef nonnull %3, i32 noundef 10) #12
  %14 = trunc i64 %13 to i32
  store i32 %14, ptr %7, align 8, !tbaa !14
  %15 = load ptr, ptr %11, align 8, !tbaa !5
  %16 = load ptr, ptr %3, align 8, !tbaa !5
  %17 = icmp eq ptr %15, %16
  br i1 %17, label %._crit_edge289.thread, label %18

18:                                               ; preds = %6
  %19 = getelementptr inbounds i8, ptr %1, i64 24
  %20 = load ptr, ptr %19, align 8, !tbaa !5
  %21 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %20, ptr noundef nonnull dereferenceable(1) @.str.29) #13
  %.not = icmp eq i32 %21, 0
  %22 = getelementptr inbounds i8, ptr %7, i64 16
  %23 = zext i1 %.not to i8
  store i8 %23, ptr %22, align 8, !tbaa !15
  br i1 %.not, label %24, label %25

24:                                               ; preds = %18
  %.not222 = icmp eq i32 %0, 5
  br i1 %.not222, label %46, label %._crit_edge289.thread

25:                                               ; preds = %18
  %.not221 = icmp eq i32 %0, 8
  br i1 %.not221, label %26, label %._crit_edge289.thread

26:                                               ; preds = %25
  %27 = getelementptr inbounds i8, ptr %1, i64 56
  %28 = load ptr, ptr %27, align 8, !tbaa !5
  %29 = getelementptr inbounds i8, ptr %7, i64 24
  store ptr %28, ptr %29, align 8, !tbaa !16
  %30 = getelementptr inbounds i8, ptr %1, i64 40
  %31 = load ptr, ptr %30, align 8, !tbaa !5
  %32 = call i64 @strtol(ptr noundef %31, ptr noundef nonnull %3, i32 noundef 10) #12
  %33 = trunc i64 %32 to i32
  %34 = getelementptr inbounds i8, ptr %7, i64 32
  store i32 %33, ptr %34, align 8, !tbaa !17
  %35 = getelementptr inbounds i8, ptr %1, i64 48
  %36 = load ptr, ptr %35, align 8, !tbaa !5
  %37 = load ptr, ptr %3, align 8, !tbaa !5
  %38 = icmp eq ptr %36, %37
  br i1 %38, label %._crit_edge289.thread, label %39

39:                                               ; preds = %26
  %40 = call i64 @strtol(ptr noundef %36, ptr noundef nonnull %3, i32 noundef 10) #12
  %41 = trunc i64 %40 to i32
  %42 = getelementptr inbounds i8, ptr %7, i64 36
  store i32 %41, ptr %42, align 4, !tbaa !18
  %43 = load ptr, ptr %27, align 8, !tbaa !5
  %44 = load ptr, ptr %3, align 8, !tbaa !5
  %45 = icmp eq ptr %43, %44
  br i1 %45, label %._crit_edge289.thread, label %46

46:                                               ; preds = %39, %24
  %47 = getelementptr inbounds i8, ptr %1, i64 32
  %48 = load ptr, ptr %47, align 8, !tbaa !5
  %49 = tail call noalias ptr @strdup(ptr noundef %48) #12
  %50 = tail call ptr @strtok(ptr noundef %49, ptr noundef nonnull @.str.30) #12
  %.not223284 = icmp eq ptr %50, null
  br i1 %.not223284, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %46
  %51 = getelementptr inbounds i8, ptr %7, i64 44
  %52 = getelementptr inbounds i8, ptr %7, i64 52
  %53 = getelementptr inbounds i8, ptr %7, i64 40
  %54 = getelementptr inbounds i8, ptr %7, i64 48
  br label %55

55:                                               ; preds = %.lr.ph, %87
  %.0193285 = phi ptr [ %50, %.lr.ph ], [ %88, %87 ]
  %56 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.31) #13
  %.not241 = icmp eq i32 %56, 0
  br i1 %.not241, label %57, label %58

57:                                               ; preds = %55
  store i32 0, ptr %54, align 8, !tbaa !19
  br label %87

58:                                               ; preds = %55
  %59 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.32) #13
  %.not242 = icmp eq i32 %59, 0
  br i1 %.not242, label %60, label %61

60:                                               ; preds = %58
  store i32 1, ptr %54, align 8, !tbaa !19
  br label %87

61:                                               ; preds = %58
  %62 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.33) #13
  %.not243 = icmp eq i32 %62, 0
  br i1 %.not243, label %63, label %64

63:                                               ; preds = %61
  store i32 2, ptr %54, align 8, !tbaa !19
  br label %87

64:                                               ; preds = %61
  %65 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.34) #13
  %.not244 = icmp eq i32 %65, 0
  br i1 %.not244, label %66, label %67

66:                                               ; preds = %64
  store i8 1, ptr %53, align 8, !tbaa !20
  br label %87

67:                                               ; preds = %64
  %68 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.35) #13
  %.not245 = icmp eq i32 %68, 0
  br i1 %.not245, label %69, label %70

69:                                               ; preds = %67
  store i8 0, ptr %53, align 8, !tbaa !20
  br label %87

70:                                               ; preds = %67
  %71 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.36) #13
  %.not246 = icmp eq i32 %71, 0
  br i1 %.not246, label %72, label %73

72:                                               ; preds = %70
  store i8 1, ptr %52, align 4, !tbaa !21
  br label %87

73:                                               ; preds = %70
  %74 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.37) #13
  %.not247 = icmp eq i32 %74, 0
  br i1 %.not247, label %75, label %76

75:                                               ; preds = %73
  store i8 0, ptr %52, align 4, !tbaa !21
  br label %87

76:                                               ; preds = %73
  %77 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.29) #13
  %.not248 = icmp eq i32 %77, 0
  br i1 %.not248, label %78, label %79

78:                                               ; preds = %76
  store i32 0, ptr %51, align 4, !tbaa !22
  br label %87

79:                                               ; preds = %76
  %80 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.38) #13
  %.not249 = icmp eq i32 %80, 0
  br i1 %.not249, label %81, label %82

81:                                               ; preds = %79
  store i32 2, ptr %51, align 4, !tbaa !22
  br label %87

82:                                               ; preds = %79
  %83 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0193285, ptr noundef nonnull dereferenceable(1) @.str.39) #13
  %.not250 = icmp eq i32 %83, 0
  br i1 %.not250, label %84, label %85

84:                                               ; preds = %82
  store i32 1, ptr %51, align 4, !tbaa !22
  br label %87

85:                                               ; preds = %82
  %86 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.40, ptr noundef nonnull %.0193285)
  tail call void @free(ptr noundef %49) #12
  br label %306

87:                                               ; preds = %60, %66, %72, %78, %84, %81, %75, %69, %63, %57
  %88 = tail call ptr @strtok(ptr noundef null, ptr noundef nonnull @.str.30) #12
  %.not223 = icmp eq ptr %88, null
  br i1 %.not223, label %._crit_edge, label %55, !llvm.loop !23

._crit_edge:                                      ; preds = %87, %46
  tail call void @free(ptr noundef %49) #12
  %89 = load ptr, ptr %10, align 8, !tbaa !9
  %90 = tail call ptr @load_arr(ptr noundef %89, ptr noundef nonnull @.str.41)
  %.not224 = icmp eq ptr %90, null
  br i1 %.not224, label %._crit_edge289.thread, label %91

91:                                               ; preds = %._crit_edge
  %92 = getelementptr inbounds i8, ptr %90, i64 12
  %93 = load i32, ptr %92, align 4, !tbaa !25
  %94 = getelementptr inbounds i8, ptr %7, i64 56
  %95 = getelementptr inbounds i8, ptr %7, i64 88
  %96 = getelementptr inbounds i8, ptr %7, i64 80
  %97 = getelementptr inbounds i8, ptr %7, i64 72
  store <2 x double> <double -1.000000e+00, double -1.000000e+00>, ptr %97, align 8, !tbaa !27
  %98 = getelementptr inbounds i8, ptr %7, i64 64
  store <2 x double> <double -1.000000e+00, double -1.000000e+00>, ptr %94, align 8, !tbaa !27
  %99 = getelementptr inbounds i8, ptr %7, i64 96
  store <2 x double> <double -1.000000e+00, double -1.000000e+00>, ptr %95, align 8, !tbaa !27
  %100 = getelementptr inbounds i8, ptr %7, i64 104
  store double -1.000000e+00, ptr %100, align 8, !tbaa !28
  %101 = getelementptr inbounds i8, ptr %7, i64 112
  store i8 0, ptr %101, align 8, !tbaa !29
  %102 = getelementptr inbounds i8, ptr %90, i64 16
  %103 = load i32, ptr %102, align 8, !tbaa !30
  %104 = icmp sgt i32 %103, 0
  br i1 %104, label %.lr.ph288, label %._crit_edge289.thread

.lr.ph288:                                        ; preds = %91
  %105 = getelementptr inbounds i8, ptr %90, i64 64
  %106 = shl nsw i32 %93, 1
  %107 = sext i32 %93 to i64
  %108 = sext i32 %106 to i64
  br label %109

109:                                              ; preds = %.lr.ph288, %.thread319
  %indvars.iv = phi i64 [ 0, %.lr.ph288 ], [ %indvars.iv.next, %.thread319 ]
  %110 = load ptr, ptr %105, align 8, !tbaa !31
  %111 = mul nsw i64 %indvars.iv, %108
  %112 = getelementptr inbounds i8, ptr %110, i64 %111
  %113 = getelementptr inbounds i8, ptr %112, i64 %107
  %114 = tail call double @strtod(ptr nocapture noundef %113, ptr noundef null) #12
  %115 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.16) #13
  %.not225 = icmp eq i32 %115, 0
  br i1 %.not225, label %116, label %117

116:                                              ; preds = %109
  store double %114, ptr %100, align 8, !tbaa !28
  br label %117

117:                                              ; preds = %116, %109
  %118 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.17) #13
  %.not226 = icmp eq i32 %118, 0
  br i1 %.not226, label %119, label %120

119:                                              ; preds = %117
  store double %114, ptr %99, align 8, !tbaa !32
  br label %120

120:                                              ; preds = %119, %117
  %.1198 = phi i1 [ %.not225, %117 ], [ true, %119 ]
  %121 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.18) #13
  %.not227 = icmp eq i32 %121, 0
  br i1 %.not227, label %122, label %123

122:                                              ; preds = %120
  store double %114, ptr %98, align 8, !tbaa !33
  br label %123

123:                                              ; preds = %122, %120
  %.2 = phi i1 [ %.1198, %120 ], [ true, %122 ]
  %124 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.19) #13
  %.not228 = icmp eq i32 %124, 0
  br i1 %.not228, label %125, label %126

125:                                              ; preds = %123
  store double %114, ptr %97, align 8, !tbaa !34
  br label %126

126:                                              ; preds = %125, %123
  %.3 = phi i1 [ %.2, %123 ], [ true, %125 ]
  %127 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.20) #13
  %.not229 = icmp eq i32 %127, 0
  br i1 %.not229, label %128, label %129

128:                                              ; preds = %126
  store double %114, ptr %96, align 8, !tbaa !35
  br label %129

129:                                              ; preds = %128, %126
  %.4 = phi i1 [ %.3, %126 ], [ true, %128 ]
  %130 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.21) #13
  %.not230 = icmp eq i32 %130, 0
  br i1 %.not230, label %131, label %132

131:                                              ; preds = %129
  store double %114, ptr %95, align 8, !tbaa !36
  br label %132

132:                                              ; preds = %131, %129
  %.5 = phi i1 [ %.4, %129 ], [ true, %131 ]
  %133 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.42) #13
  %.not231 = icmp eq i32 %133, 0
  br i1 %.not231, label %.thread315, label %134

134:                                              ; preds = %132
  %135 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.22) #13
  %.not232 = icmp eq i32 %135, 0
  br i1 %.not232, label %.thread, label %138

.thread315:                                       ; preds = %132
  store double %114, ptr %94, align 8, !tbaa !37
  %136 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %112, ptr noundef nonnull dereferenceable(1) @.str.22) #13
  %.not232317 = icmp eq i32 %136, 0
  br i1 %.not232317, label %.thread, label %.thread319

.thread:                                          ; preds = %.thread315, %134
  %137 = fptoui double %114 to i8
  store i8 %137, ptr %101, align 8, !tbaa !29
  br label %.thread319

138:                                              ; preds = %134
  br i1 %.5, label %.thread319, label %303

.thread319:                                       ; preds = %.thread315, %138, %.thread
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %139 = load i32, ptr %102, align 8, !tbaa !30
  %140 = sext i32 %139 to i64
  %141 = icmp slt i64 %indvars.iv.next, %140
  br i1 %141, label %109, label %._crit_edge289, !llvm.loop !38

._crit_edge289:                                   ; preds = %.thread319
  %.pre = load double, ptr %100, align 8, !tbaa !28
  %142 = fcmp oeq double %.pre, -1.000000e+00
  br i1 %142, label %._crit_edge289.thread, label %143

143:                                              ; preds = %._crit_edge289
  %144 = load double, ptr %99, align 8, !tbaa !32
  %145 = fcmp oeq double %144, -1.000000e+00
  br i1 %145, label %._crit_edge289.thread, label %146

146:                                              ; preds = %143
  %147 = load double, ptr %98, align 8, !tbaa !33
  %148 = fcmp oeq double %147, -1.000000e+00
  br i1 %148, label %._crit_edge289.thread, label %149

149:                                              ; preds = %146
  %150 = load double, ptr %97, align 8, !tbaa !34
  %151 = fcmp oeq double %150, -1.000000e+00
  br i1 %151, label %._crit_edge289.thread, label %152

152:                                              ; preds = %149
  %153 = load double, ptr %96, align 8, !tbaa !35
  %154 = fcmp oeq double %153, -1.000000e+00
  br i1 %154, label %._crit_edge289.thread, label %155

155:                                              ; preds = %152
  %156 = load double, ptr %95, align 8, !tbaa !36
  %157 = fcmp oeq double %156, -1.000000e+00
  br i1 %157, label %._crit_edge289.thread, label %158

158:                                              ; preds = %155
  %159 = load double, ptr %94, align 8, !tbaa !37
  %160 = fcmp oeq double %159, -1.000000e+00
  br i1 %160, label %._crit_edge289.thread, label %161

161:                                              ; preds = %158
  %162 = load i8, ptr %101, align 8, !tbaa !29
  %163 = icmp eq i8 %162, 0
  br i1 %163, label %._crit_edge289.thread, label %164

164:                                              ; preds = %161
  tail call void @npy_free(ptr noundef nonnull %90) #12
  %165 = load ptr, ptr %10, align 8, !tbaa !9
  %166 = tail call ptr @load_arr(ptr noundef %165, ptr noundef nonnull @.str.43)
  %.not233 = icmp eq ptr %166, null
  br i1 %.not233, label %._crit_edge289.thread, label %167

167:                                              ; preds = %164
  %168 = getelementptr inbounds i8, ptr %166, i64 16
  %169 = load i32, ptr %168, align 8, !tbaa !30
  %170 = add i32 %169, 127
  %171 = and i32 %170, -64
  %172 = getelementptr inbounds i8, ptr %7, i64 116
  store i32 %171, ptr %172, align 4, !tbaa !39
  %173 = tail call ptr @extract_data(ptr noundef nonnull %166)
  %174 = getelementptr inbounds i8, ptr %7, i64 120
  store ptr %173, ptr %174, align 8, !tbaa !40
  %175 = load ptr, ptr %10, align 8, !tbaa !9
  %176 = tail call ptr @load_arr(ptr noundef %175, ptr noundef nonnull @.str.44)
  %.not234 = icmp eq ptr %176, null
  br i1 %.not234, label %._crit_edge289.thread, label %177

177:                                              ; preds = %167
  %178 = getelementptr inbounds i8, ptr %176, i64 20
  %179 = load i32, ptr %178, align 4, !tbaa !30
  %180 = getelementptr inbounds i8, ptr %7, i64 128
  store i32 %179, ptr %180, align 8, !tbaa !41
  %181 = zext i32 %179 to i64
  %182 = shl nuw nsw i64 %181, 3
  %183 = tail call noalias ptr @malloc(i64 noundef %182) #14
  %184 = getelementptr inbounds i8, ptr %7, i64 136
  store ptr %183, ptr %184, align 8, !tbaa !42
  %185 = shl nuw nsw i64 %181, 2
  %186 = tail call noalias ptr @malloc(i64 noundef %185) #14
  %187 = getelementptr inbounds i8, ptr %7, i64 144
  store ptr %186, ptr %187, align 8, !tbaa !43
  %.not301 = icmp eq i32 %179, 0
  br i1 %.not301, label %._crit_edge293, label %.lr.ph292

._crit_edge293:                                   ; preds = %.lr.ph292, %177
  tail call void @npy_free(ptr noundef nonnull %176) #12
  %188 = load ptr, ptr %10, align 8, !tbaa !9
  %189 = tail call ptr @load_arr(ptr noundef %188, ptr noundef nonnull @.str.45)
  %.not235 = icmp eq ptr %189, null
  br i1 %.not235, label %._crit_edge289.thread, label %204

.lr.ph292:                                        ; preds = %177, %.lr.ph292
  %indvars.iv306 = phi i64 [ %indvars.iv.next307, %.lr.ph292 ], [ 0, %177 ]
  %190 = tail call double @npy_value_at_as_double(ptr noundef nonnull %176, i64 noundef %indvars.iv306) #12
  %191 = fptoui double %190 to i32
  %192 = load ptr, ptr %187, align 8, !tbaa !43
  %193 = getelementptr inbounds i32, ptr %192, i64 %indvars.iv306
  store i32 %191, ptr %193, align 4, !tbaa !30
  %194 = load i32, ptr %180, align 8, !tbaa !41
  %195 = trunc nuw i64 %indvars.iv306 to i32
  %196 = add i32 %194, %195
  %197 = zext i32 %196 to i64
  %198 = tail call double @npy_value_at_as_double(ptr noundef nonnull %176, i64 noundef %197) #12
  %199 = load ptr, ptr %184, align 8, !tbaa !42
  %200 = getelementptr inbounds double, ptr %199, i64 %indvars.iv306
  store double %198, ptr %200, align 8, !tbaa !27
  %indvars.iv.next307 = add nuw nsw i64 %indvars.iv306, 1
  %201 = load i32, ptr %180, align 8, !tbaa !41
  %202 = zext i32 %201 to i64
  %203 = icmp ult i64 %indvars.iv.next307, %202
  br i1 %203, label %.lr.ph292, label %._crit_edge293, !llvm.loop !44

204:                                              ; preds = %._crit_edge293
  %205 = getelementptr inbounds i8, ptr %189, i64 16
  %206 = load i32, ptr %205, align 8, !tbaa !30
  %207 = getelementptr inbounds i8, ptr %7, i64 152
  store i32 %206, ptr %207, align 8, !tbaa !45
  %208 = getelementptr inbounds i8, ptr %189, i64 20
  %209 = load i32, ptr %208, align 4, !tbaa !30
  %210 = icmp eq i32 %209, %169
  br i1 %210, label %212, label %211

211:                                              ; preds = %204
  tail call void @__assert_fail(ptr noundef nonnull @.str.46, ptr noundef nonnull @.str.47, i32 noundef 269, ptr noundef nonnull @__PRETTY_FUNCTION__.sim_config_init) #15
  unreachable

212:                                              ; preds = %204
  %213 = tail call ptr @extract_data(ptr noundef nonnull %189)
  %214 = load i32, ptr %172, align 4, !tbaa !39
  %215 = load i32, ptr %207, align 8, !tbaa !45
  %216 = mul i32 %215, %214
  %217 = zext i32 %216 to i64
  %218 = tail call ptr @aligned_calloc(i64 noundef %217, i64 noundef 1) #12
  %.not236 = icmp eq ptr %218, null
  br i1 %.not236, label %221, label %.preheader

.preheader:                                       ; preds = %212
  %219 = load i32, ptr %207, align 8, !tbaa !45
  %.not302 = icmp eq i32 %219, 0
  br i1 %.not302, label %._crit_edge296, label %.lr.ph295

.lr.ph295:                                        ; preds = %.preheader
  %220 = zext i32 %169 to i64
  br label %225

221:                                              ; preds = %212
  tail call void @__assert_fail(ptr noundef nonnull @.str.48, ptr noundef nonnull @.str.47, i32 noundef 274, ptr noundef nonnull @__PRETTY_FUNCTION__.sim_config_init) #15
  unreachable

._crit_edge296:                                   ; preds = %225, %.preheader
  %222 = getelementptr inbounds i8, ptr %7, i64 160
  store ptr %218, ptr %222, align 8, !tbaa !46
  tail call void @free(ptr noundef %213) #12
  %223 = load ptr, ptr %10, align 8, !tbaa !9
  %224 = tail call ptr @load_arr(ptr noundef %223, ptr noundef nonnull @.str.49)
  %.not237 = icmp eq ptr %224, null
  br i1 %.not237, label %._crit_edge289.thread, label %237

225:                                              ; preds = %.lr.ph295, %225
  %indvars.iv309 = phi i64 [ 0, %.lr.ph295 ], [ %indvars.iv.next310, %225 ]
  %226 = load i32, ptr %172, align 4, !tbaa !39
  %227 = trunc nuw i64 %indvars.iv309 to i32
  %228 = mul i32 %226, %227
  %229 = zext i32 %228 to i64
  %230 = getelementptr inbounds i8, ptr %218, i64 %229
  %231 = mul i32 %169, %227
  %232 = zext i32 %231 to i64
  %233 = getelementptr inbounds i8, ptr %213, i64 %232
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %230, ptr align 1 %233, i64 %220, i1 false)
  %indvars.iv.next310 = add nuw nsw i64 %indvars.iv309, 1
  %234 = load i32, ptr %207, align 8, !tbaa !45
  %235 = zext i32 %234 to i64
  %236 = icmp ult i64 %indvars.iv.next310, %235
  br i1 %236, label %225, label %._crit_edge296, !llvm.loop !47

237:                                              ; preds = %._crit_edge296
  %238 = tail call ptr @extract_data(ptr noundef nonnull %224)
  %239 = shl i32 %169, 6
  %240 = add i32 %239, -1
  %241 = zext i32 %240 to i64
  %242 = getelementptr inbounds i32, ptr %238, i64 %241
  %243 = load i32, ptr %242, align 4, !tbaa !30
  %244 = load ptr, ptr %10, align 8, !tbaa !9
  %245 = tail call ptr @load_arr(ptr noundef %244, ptr noundef nonnull @.str.50)
  %.not238 = icmp eq ptr %245, null
  br i1 %.not238, label %._crit_edge289.thread, label %246

246:                                              ; preds = %237
  %247 = tail call ptr @extract_data(ptr noundef nonnull %245)
  %248 = load ptr, ptr %10, align 8, !tbaa !9
  %249 = tail call ptr @load_arr(ptr noundef %248, ptr noundef nonnull @.str.51)
  %.not239 = icmp eq ptr %249, null
  br i1 %.not239, label %._crit_edge289.thread, label %250

250:                                              ; preds = %246
  %251 = tail call ptr @extract_data(ptr noundef nonnull %249)
  %252 = load ptr, ptr %10, align 8, !tbaa !9
  %253 = tail call ptr @load_arr(ptr noundef %252, ptr noundef nonnull @.str.52)
  %.not240 = icmp eq ptr %253, null
  br i1 %.not240, label %._crit_edge289.thread, label %254

254:                                              ; preds = %250
  %255 = tail call ptr @extract_data(ptr noundef nonnull %253)
  %256 = zext i32 %243 to i64
  %257 = tail call ptr @aligned_calloc(i64 noundef %256, i64 noundef 8) #12
  %.not303 = icmp eq i32 %243, 0
  br i1 %.not303, label %._crit_edge300, label %.lr.ph299.preheader

.lr.ph299.preheader:                              ; preds = %254
  %min.iters.check = icmp ult i32 %243, 18
  br i1 %min.iters.check, label %.lr.ph299.preheader336, label %vector.memcheck

.lr.ph299.preheader336:                           ; preds = %middle.block, %vector.memcheck, %.lr.ph299.preheader
  %indvars.iv312.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph299.preheader ], [ %n.vec, %middle.block ]
  %xtraiter = and i64 %256, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph299.prol.loopexit, label %.lr.ph299.prol

.lr.ph299.prol:                                   ; preds = %.lr.ph299.preheader336, %.lr.ph299.prol
  %indvars.iv312.prol = phi i64 [ %indvars.iv.next313.prol, %.lr.ph299.prol ], [ %indvars.iv312.ph, %.lr.ph299.preheader336 ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph299.prol ], [ 0, %.lr.ph299.preheader336 ]
  %258 = getelementptr inbounds i32, ptr %255, i64 %indvars.iv312.prol
  %259 = load i32, ptr %258, align 4, !tbaa !30
  %260 = getelementptr inbounds %struct.synapse, ptr %257, i64 %indvars.iv312.prol
  store i32 %259, ptr %260, align 4, !tbaa !48
  %261 = getelementptr inbounds float, ptr %247, i64 %indvars.iv312.prol
  %262 = load float, ptr %261, align 4, !tbaa !51
  %263 = getelementptr inbounds i8, ptr %260, i64 4
  store float %262, ptr %263, align 4, !tbaa !52
  %indvars.iv.next313.prol = add nuw nsw i64 %indvars.iv312.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph299.prol.loopexit, label %.lr.ph299.prol, !llvm.loop !53

.lr.ph299.prol.loopexit:                          ; preds = %.lr.ph299.prol, %.lr.ph299.preheader336
  %indvars.iv312.unr = phi i64 [ %indvars.iv312.ph, %.lr.ph299.preheader336 ], [ %indvars.iv.next313.prol, %.lr.ph299.prol ]
  %264 = sub nsw i64 %indvars.iv312.ph, %256
  %265 = icmp ugt i64 %264, -4
  br i1 %265, label %._crit_edge300, label %.lr.ph299

vector.memcheck:                                  ; preds = %.lr.ph299.preheader
  %266 = shl nuw nsw i64 %256, 3
  %267 = getelementptr i8, ptr %257, i64 %266
  %scevgep = getelementptr i8, ptr %267, i64 -4
  %268 = shl nuw nsw i64 %256, 2
  %scevgep323 = getelementptr i8, ptr %255, i64 %268
  %scevgep324 = getelementptr i8, ptr %257, i64 4
  %scevgep325 = getelementptr i8, ptr %257, i64 %266
  %scevgep326 = getelementptr i8, ptr %247, i64 %268
  %bound0 = icmp ult ptr %257, %scevgep323
  %bound1 = icmp ult ptr %255, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  %bound0327 = icmp ult ptr %scevgep324, %scevgep326
  %bound1328 = icmp ult ptr %247, %scevgep325
  %found.conflict329 = and i1 %bound0327, %bound1328
  %conflict.rdx = or i1 %found.conflict, %found.conflict329
  br i1 %conflict.rdx, label %.lr.ph299.preheader336, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %256, 4294967292
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %269 = or disjoint i64 %index, 2
  %270 = getelementptr inbounds i32, ptr %255, i64 %index
  %271 = getelementptr inbounds i8, ptr %270, i64 8
  %wide.load334 = load <2 x float>, ptr %270, align 4, !tbaa !30, !alias.scope !55
  %wide.load330335 = load <2 x float>, ptr %271, align 4, !tbaa !30, !alias.scope !55
  %272 = getelementptr inbounds float, ptr %247, i64 %index
  %273 = getelementptr inbounds i8, ptr %272, i64 8
  %wide.load331 = load <2 x float>, ptr %272, align 4, !tbaa !51, !alias.scope !58
  %wide.load332 = load <2 x float>, ptr %273, align 4, !tbaa !51, !alias.scope !58
  %274 = getelementptr inbounds %struct.synapse, ptr %257, i64 %index
  %275 = getelementptr inbounds %struct.synapse, ptr %257, i64 %269
  %interleaved.vec = shufflevector <2 x float> %wide.load334, <2 x float> %wide.load331, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  store <4 x float> %interleaved.vec, ptr %274, align 4, !tbaa !60
  %interleaved.vec333 = shufflevector <2 x float> %wide.load330335, <2 x float> %wide.load332, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
  store <4 x float> %interleaved.vec333, ptr %275, align 4, !tbaa !60
  %index.next = add nuw i64 %index, 4
  %276 = icmp eq i64 %index.next, %n.vec
  br i1 %276, label %middle.block, label %vector.body, !llvm.loop !61

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %256
  br i1 %cmp.n, label %._crit_edge300, label %.lr.ph299.preheader336

._crit_edge300:                                   ; preds = %.lr.ph299.prol.loopexit, %.lr.ph299, %middle.block, %254
  %277 = tail call ptr @synapse_index_init(ptr noundef %257, ptr noundef %238, i32 noundef 64, i32 noundef %169, i32 noundef %243) #12
  %278 = getelementptr inbounds i8, ptr %7, i64 168
  store ptr %277, ptr %278, align 8, !tbaa !64
  tail call void @free(ptr noundef %247) #12
  tail call void @free(ptr noundef %251) #12
  br label %306

.lr.ph299:                                        ; preds = %.lr.ph299.prol.loopexit, %.lr.ph299
  %indvars.iv312 = phi i64 [ %indvars.iv.next313.3, %.lr.ph299 ], [ %indvars.iv312.unr, %.lr.ph299.prol.loopexit ]
  %279 = getelementptr inbounds i32, ptr %255, i64 %indvars.iv312
  %280 = load i32, ptr %279, align 4, !tbaa !30
  %281 = getelementptr inbounds %struct.synapse, ptr %257, i64 %indvars.iv312
  store i32 %280, ptr %281, align 4, !tbaa !48
  %282 = getelementptr inbounds float, ptr %247, i64 %indvars.iv312
  %283 = load float, ptr %282, align 4, !tbaa !51
  %284 = getelementptr inbounds i8, ptr %281, i64 4
  store float %283, ptr %284, align 4, !tbaa !52
  %indvars.iv.next313 = add nuw nsw i64 %indvars.iv312, 1
  %285 = getelementptr inbounds i32, ptr %255, i64 %indvars.iv.next313
  %286 = load i32, ptr %285, align 4, !tbaa !30
  %287 = getelementptr inbounds %struct.synapse, ptr %257, i64 %indvars.iv.next313
  store i32 %286, ptr %287, align 4, !tbaa !48
  %288 = getelementptr inbounds float, ptr %247, i64 %indvars.iv.next313
  %289 = load float, ptr %288, align 4, !tbaa !51
  %290 = getelementptr inbounds i8, ptr %287, i64 4
  store float %289, ptr %290, align 4, !tbaa !52
  %indvars.iv.next313.1 = add nuw nsw i64 %indvars.iv312, 2
  %291 = getelementptr inbounds i32, ptr %255, i64 %indvars.iv.next313.1
  %292 = load i32, ptr %291, align 4, !tbaa !30
  %293 = getelementptr inbounds %struct.synapse, ptr %257, i64 %indvars.iv.next313.1
  store i32 %292, ptr %293, align 4, !tbaa !48
  %294 = getelementptr inbounds float, ptr %247, i64 %indvars.iv.next313.1
  %295 = load float, ptr %294, align 4, !tbaa !51
  %296 = getelementptr inbounds i8, ptr %293, i64 4
  store float %295, ptr %296, align 4, !tbaa !52
  %indvars.iv.next313.2 = add nuw nsw i64 %indvars.iv312, 3
  %297 = getelementptr inbounds i32, ptr %255, i64 %indvars.iv.next313.2
  %298 = load i32, ptr %297, align 4, !tbaa !30
  %299 = getelementptr inbounds %struct.synapse, ptr %257, i64 %indvars.iv.next313.2
  store i32 %298, ptr %299, align 4, !tbaa !48
  %300 = getelementptr inbounds float, ptr %247, i64 %indvars.iv.next313.2
  %301 = load float, ptr %300, align 4, !tbaa !51
  %302 = getelementptr inbounds i8, ptr %299, i64 4
  store float %301, ptr %302, align 4, !tbaa !52
  %indvars.iv.next313.3 = add nuw nsw i64 %indvars.iv312, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next313.3, %256
  br i1 %exitcond.not.3, label %._crit_edge300, label %.lr.ph299, !llvm.loop !65

303:                                              ; preds = %138
  %304 = load ptr, ptr %1, align 8, !tbaa !5
  tail call void @usage(ptr noundef %304)
  %.not251 = icmp eq ptr %7, null
  br i1 %.not251, label %.thread275, label %.thread279

.thread279:                                       ; preds = %303
  tail call void @sim_config_free(ptr noundef nonnull %7)
  br label %.thread275

._crit_edge289.thread:                            ; preds = %91, %6, %24, %._crit_edge289, %143, %146, %149, %152, %155, %158, %161, %250, %246, %237, %._crit_edge296, %._crit_edge293, %167, %164, %._crit_edge, %25, %26, %39
  %.0192.ph = phi ptr [ null, %39 ], [ null, %26 ], [ null, %25 ], [ null, %._crit_edge ], [ null, %164 ], [ null, %167 ], [ null, %._crit_edge293 ], [ null, %._crit_edge296 ], [ null, %237 ], [ null, %246 ], [ null, %250 ], [ %90, %161 ], [ %90, %158 ], [ %90, %155 ], [ %90, %152 ], [ %90, %149 ], [ %90, %146 ], [ %90, %143 ], [ %90, %._crit_edge289 ], [ null, %24 ], [ null, %6 ], [ %90, %91 ]
  %305 = load ptr, ptr %1, align 8, !tbaa !5
  tail call void @usage(ptr noundef %305)
  tail call void @sim_config_free(ptr noundef nonnull %7)
  %.not252 = icmp eq ptr %.0192.ph, null
  br i1 %.not252, label %306, label %.thread275

.thread275:                                       ; preds = %303, %.thread279, %._crit_edge289.thread
  %.0192266278 = phi ptr [ %.0192.ph, %._crit_edge289.thread ], [ %90, %.thread279 ], [ %90, %303 ]
  tail call void @free(ptr noundef nonnull %.0192266278) #12
  br label %306

306:                                              ; preds = %.thread272, %._crit_edge289.thread, %.thread275, %._crit_edge300, %85
  %.0190 = phi ptr [ null, %85 ], [ %7, %._crit_edge300 ], [ null, %.thread275 ], [ null, %._crit_edge289.thread ], [ null, %.thread272 ]
  ret ptr %.0190
}

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @calloc(i64 noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nofree nounwind willreturn
declare i64 @strtol(ptr noundef readonly, ptr nocapture noundef, i32 noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i32 @strcmp(ptr nocapture noundef, ptr nocapture noundef) local_unnamed_addr #4

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare noalias ptr @strdup(ptr nocapture noundef readonly) local_unnamed_addr #5

; Function Attrs: mustprogress nofree nounwind willreturn
declare ptr @strtok(ptr noundef, ptr nocapture noundef readonly) local_unnamed_addr #3

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #6

; Function Attrs: nounwind uwtable
declare hidden ptr @load_arr(ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nofree nounwind willreturn
declare double @strtod(ptr noundef readonly, ptr nocapture noundef) local_unnamed_addr #3

declare void @npy_free(ptr noundef) local_unnamed_addr #7

; Function Attrs: nounwind uwtable
declare hidden ptr @extract_data(ptr noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #8

declare double @npy_value_at_as_double(ptr noundef, i64 noundef) local_unnamed_addr #7

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

declare ptr @aligned_calloc(i64 noundef, i64 noundef) local_unnamed_addr #7

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

declare ptr @synapse_index_init(ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #7

; Function Attrs: nounwind uwtable
declare hidden void @usage(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @sim_config_free(ptr noundef) local_unnamed_addr #1

attributes #0 = { nofree nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { 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 #2 = { mustprogress nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nofree nounwind willreturn "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 = { mustprogress nofree nounwind willreturn memory(argmem: read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { mustprogress nofree nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #6 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #7 = { "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 #8 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #9 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #10 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #11 = { nounwind allocsize(0,1) }
attributes #12 = { nounwind }
attributes #13 = { nounwind willreturn memory(read) }
attributes #14 = { nounwind allocsize(0) }
attributes #15 = { noreturn nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 8}
!10 = !{!"", !11, i64 0, !6, i64 8, !12, i64 16, !6, i64 24, !11, i64 32, !11, i64 36, !12, i64 40, !11, i64 44, !11, i64 48, !12, i64 52, !13, i64 56, !13, i64 64, !13, i64 72, !13, i64 80, !13, i64 88, !13, i64 96, !13, i64 104, !7, i64 112, !11, i64 116, !6, i64 120, !11, i64 128, !6, i64 136, !6, i64 144, !11, i64 152, !6, i64 160, !6, i64 168}
!11 = !{!"int", !7, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!"double", !7, i64 0}
!14 = !{!10, !11, i64 0}
!15 = !{!10, !12, i64 16}
!16 = !{!10, !6, i64 24}
!17 = !{!10, !11, i64 32}
!18 = !{!10, !11, i64 36}
!19 = !{!10, !11, i64 48}
!20 = !{!10, !12, i64 40}
!21 = !{!10, !12, i64 52}
!22 = !{!10, !11, i64 44}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!26, !11, i64 12}
!26 = !{!"", !11, i64 0, !11, i64 4, !7, i64 8, !11, i64 12, !7, i64 16, !11, i64 56, !6, i64 64, !11, i64 72}
!27 = !{!13, !13, i64 0}
!28 = !{!10, !13, i64 104}
!29 = !{!10, !7, i64 112}
!30 = !{!11, !11, i64 0}
!31 = !{!26, !6, i64 64}
!32 = !{!10, !13, i64 96}
!33 = !{!10, !13, i64 64}
!34 = !{!10, !13, i64 72}
!35 = !{!10, !13, i64 80}
!36 = !{!10, !13, i64 88}
!37 = !{!10, !13, i64 56}
!38 = distinct !{!38, !24}
!39 = !{!10, !11, i64 116}
!40 = !{!10, !6, i64 120}
!41 = !{!10, !11, i64 128}
!42 = !{!10, !6, i64 136}
!43 = !{!10, !6, i64 144}
!44 = distinct !{!44, !24}
!45 = !{!10, !11, i64 152}
!46 = !{!10, !6, i64 160}
!47 = distinct !{!47, !24}
!48 = !{!49, !11, i64 0}
!49 = !{!"", !11, i64 0, !50, i64 4}
!50 = !{!"float", !7, i64 0}
!51 = !{!50, !50, i64 0}
!52 = !{!49, !50, i64 4}
!53 = distinct !{!53, !54}
!54 = !{!"llvm.loop.unroll.disable"}
!55 = !{!56}
!56 = distinct !{!56, !57}
!57 = distinct !{!57, !"LVerDomain"}
!58 = !{!59}
!59 = distinct !{!59, !57}
!60 = !{!7, !7, i64 0}
!61 = distinct !{!61, !24, !62, !63}
!62 = !{!"llvm.loop.isvectorized", i32 1}
!63 = !{!"llvm.loop.unroll.runtime.disable"}
!64 = !{!10, !6, i64 168}
!65 = distinct !{!65, !24, !62}


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