; LLVM IR from BrunoLevy/learn-fpga :: FemtoRV/TUTORIALS/FROM_BLINKER_TO_RISCV/FIRMWARE/COREMARK (core_main)

; 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.RESULTS_S = type { i16, i16, i16, [4 x ptr], i32, i32, i32, ptr, %struct.MAT_PARAMS_S, i16, i16, i16, i16, i16, %struct.CORE_PORTABLE_S }
%struct.MAT_PARAMS_S = type { i32, ptr, ptr, ptr }
%struct.CORE_PORTABLE_S = type { i8 }

@.str.3 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [44 x i8], align 1
@default_num_contexts = external global i32, align 4
@list_known_crc = external hidden global [5 x i16], align 2
@.str.8 = external hidden unnamed_addr constant [47 x i8], align 1
@matrix_known_crc = external hidden global [5 x i16], align 2
@.str.9 = external hidden unnamed_addr constant [49 x i8], align 1
@state_known_crc = external hidden global [5 x i16], align 2
@.str.10 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [99 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local ptr @iterate(ptr noundef) #0

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca [1 x ptr], align 8
  %4 = alloca i16, align 2
  %5 = alloca i16, align 2
  %6 = alloca i16, align 2
  %7 = alloca i16, align 2
  %8 = alloca i16, align 2
  %9 = alloca i16, align 2
  %10 = alloca i64, align 8
  %11 = alloca [1 x %struct.RESULTS_S], align 16
  %12 = alloca [2000 x i8], align 16
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  store i32 0, ptr %1, align 4
  call void @llvm.lifetime.start.p0(i64 4, ptr %2) #3
  store i32 0, ptr %2, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #3
  call void @llvm.lifetime.start.p0(i64 2, ptr %4) #3
  call void @llvm.lifetime.start.p0(i64 2, ptr %5) #3
  store i16 0, ptr %5, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %6) #3
  store i16 0, ptr %6, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %7) #3
  store i16 -1, ptr %7, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %8) #3
  store i16 0, ptr %8, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %9) #3
  store i16 0, ptr %9, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 112, ptr %11) #3
  call void @llvm.lifetime.start.p0(i64 2000, ptr %12) #3
  %16 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %17 = getelementptr inbounds %struct.RESULTS_S, ptr %16, i32 0, i32 14
  %18 = getelementptr inbounds [1 x ptr], ptr %3, i64 0, i64 0
  call void @portable_init(ptr noundef %17, ptr noundef %2, ptr noundef %18)
  %19 = call i32 @get_seed_32(i32 noundef 1)
  %20 = trunc i32 %19 to i16
  %21 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %22 = getelementptr inbounds %struct.RESULTS_S, ptr %21, i32 0, i32 0
  store i16 %20, ptr %22, align 16, !tbaa !11
  %23 = call i32 @get_seed_32(i32 noundef 2)
  %24 = trunc i32 %23 to i16
  %25 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %26 = getelementptr inbounds %struct.RESULTS_S, ptr %25, i32 0, i32 1
  store i16 %24, ptr %26, align 2, !tbaa !16
  %27 = call i32 @get_seed_32(i32 noundef 3)
  %28 = trunc i32 %27 to i16
  %29 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %30 = getelementptr inbounds %struct.RESULTS_S, ptr %29, i32 0, i32 2
  store i16 %28, ptr %30, align 4, !tbaa !17
  %31 = call i32 @get_seed_32(i32 noundef 4)
  %32 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %33 = getelementptr inbounds %struct.RESULTS_S, ptr %32, i32 0, i32 5
  store i32 %31, ptr %33, align 4, !tbaa !18
  %34 = call i32 @get_seed_32(i32 noundef 5)
  %35 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %36 = getelementptr inbounds %struct.RESULTS_S, ptr %35, i32 0, i32 6
  store i32 %34, ptr %36, align 16, !tbaa !19
  %37 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %38 = getelementptr inbounds %struct.RESULTS_S, ptr %37, i32 0, i32 6
  %39 = load i32, ptr %38, align 16, !tbaa !19
  %40 = icmp eq i32 %39, 0
  br i1 %40, label %41, label %44

41:                                               ; preds = %0
  %42 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %43 = getelementptr inbounds %struct.RESULTS_S, ptr %42, i32 0, i32 6
  store i32 7, ptr %43, align 16, !tbaa !19
  br label %44

44:                                               ; preds = %41, %0
  %45 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %46 = getelementptr inbounds %struct.RESULTS_S, ptr %45, i32 0, i32 0
  %47 = load i16, ptr %46, align 16, !tbaa !11
  %48 = sext i16 %47 to i32
  %49 = icmp eq i32 %48, 0
  br i1 %49, label %50, label %69

50:                                               ; preds = %44
  %51 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %52 = getelementptr inbounds %struct.RESULTS_S, ptr %51, i32 0, i32 1
  %53 = load i16, ptr %52, align 2, !tbaa !16
  %54 = sext i16 %53 to i32
  %55 = icmp eq i32 %54, 0
  br i1 %55, label %56, label %69

56:                                               ; preds = %50
  %57 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %58 = getelementptr inbounds %struct.RESULTS_S, ptr %57, i32 0, i32 2
  %59 = load i16, ptr %58, align 4, !tbaa !17
  %60 = sext i16 %59 to i32
  %61 = icmp eq i32 %60, 0
  br i1 %61, label %62, label %69

62:                                               ; preds = %56
  %63 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %64 = getelementptr inbounds %struct.RESULTS_S, ptr %63, i32 0, i32 0
  store i16 0, ptr %64, align 16, !tbaa !11
  %65 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %66 = getelementptr inbounds %struct.RESULTS_S, ptr %65, i32 0, i32 1
  store i16 0, ptr %66, align 2, !tbaa !16
  %67 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %68 = getelementptr inbounds %struct.RESULTS_S, ptr %67, i32 0, i32 2
  store i16 102, ptr %68, align 4, !tbaa !17
  br label %69

69:                                               ; preds = %62, %56, %50, %44
  %70 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %71 = getelementptr inbounds %struct.RESULTS_S, ptr %70, i32 0, i32 0
  %72 = load i16, ptr %71, align 16, !tbaa !11
  %73 = sext i16 %72 to i32
  %74 = icmp eq i32 %73, 1
  br i1 %74, label %75, label %94

75:                                               ; preds = %69
  %76 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %77 = getelementptr inbounds %struct.RESULTS_S, ptr %76, i32 0, i32 1
  %78 = load i16, ptr %77, align 2, !tbaa !16
  %79 = sext i16 %78 to i32
  %80 = icmp eq i32 %79, 0
  br i1 %80, label %81, label %94

81:                                               ; preds = %75
  %82 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %83 = getelementptr inbounds %struct.RESULTS_S, ptr %82, i32 0, i32 2
  %84 = load i16, ptr %83, align 4, !tbaa !17
  %85 = sext i16 %84 to i32
  %86 = icmp eq i32 %85, 0
  br i1 %86, label %87, label %94

87:                                               ; preds = %81
  %88 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %89 = getelementptr inbounds %struct.RESULTS_S, ptr %88, i32 0, i32 0
  store i16 13333, ptr %89, align 16, !tbaa !11
  %90 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %91 = getelementptr inbounds %struct.RESULTS_S, ptr %90, i32 0, i32 1
  store i16 13333, ptr %91, align 2, !tbaa !16
  %92 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %93 = getelementptr inbounds %struct.RESULTS_S, ptr %92, i32 0, i32 2
  store i16 102, ptr %93, align 4, !tbaa !17
  br label %94

94:                                               ; preds = %87, %81, %75, %69
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %95

95:                                               ; preds = %148, %94
  %96 = load i16, ptr %4, align 2, !tbaa !9
  %97 = zext i16 %96 to i32
  %98 = icmp slt i32 %97, 1
  br i1 %98, label %99, label %151

99:                                               ; preds = %95
  %100 = getelementptr inbounds [2000 x i8], ptr %12, i64 0, i64 0
  %101 = load i16, ptr %4, align 2, !tbaa !9
  %102 = zext i16 %101 to i32
  %103 = mul nsw i32 %102, 2
  %104 = mul nsw i32 %103, 1000
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds i8, ptr %100, i64 %105
  %107 = load i16, ptr %4, align 2, !tbaa !9
  %108 = zext i16 %107 to i64
  %109 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %108
  %110 = getelementptr inbounds %struct.RESULTS_S, ptr %109, i32 0, i32 3
  %111 = getelementptr inbounds [4 x ptr], ptr %110, i64 0, i64 0
  store ptr %106, ptr %111, align 8, !tbaa !20
  %112 = load i16, ptr %4, align 2, !tbaa !9
  %113 = zext i16 %112 to i64
  %114 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %113
  %115 = getelementptr inbounds %struct.RESULTS_S, ptr %114, i32 0, i32 4
  store i32 2000, ptr %115, align 8, !tbaa !21
  %116 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %117 = getelementptr inbounds %struct.RESULTS_S, ptr %116, i32 0, i32 0
  %118 = load i16, ptr %117, align 16, !tbaa !11
  %119 = load i16, ptr %4, align 2, !tbaa !9
  %120 = zext i16 %119 to i64
  %121 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %120
  %122 = getelementptr inbounds %struct.RESULTS_S, ptr %121, i32 0, i32 0
  store i16 %118, ptr %122, align 16, !tbaa !11
  %123 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %124 = getelementptr inbounds %struct.RESULTS_S, ptr %123, i32 0, i32 1
  %125 = load i16, ptr %124, align 2, !tbaa !16
  %126 = load i16, ptr %4, align 2, !tbaa !9
  %127 = zext i16 %126 to i64
  %128 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %127
  %129 = getelementptr inbounds %struct.RESULTS_S, ptr %128, i32 0, i32 1
  store i16 %125, ptr %129, align 2, !tbaa !16
  %130 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %131 = getelementptr inbounds %struct.RESULTS_S, ptr %130, i32 0, i32 2
  %132 = load i16, ptr %131, align 4, !tbaa !17
  %133 = load i16, ptr %4, align 2, !tbaa !9
  %134 = zext i16 %133 to i64
  %135 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %134
  %136 = getelementptr inbounds %struct.RESULTS_S, ptr %135, i32 0, i32 2
  store i16 %132, ptr %136, align 4, !tbaa !17
  %137 = load i16, ptr %4, align 2, !tbaa !9
  %138 = zext i16 %137 to i64
  %139 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %138
  %140 = getelementptr inbounds %struct.RESULTS_S, ptr %139, i32 0, i32 13
  store i16 0, ptr %140, align 8, !tbaa !22
  %141 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %142 = getelementptr inbounds %struct.RESULTS_S, ptr %141, i32 0, i32 6
  %143 = load i32, ptr %142, align 16, !tbaa !19
  %144 = load i16, ptr %4, align 2, !tbaa !9
  %145 = zext i16 %144 to i64
  %146 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %145
  %147 = getelementptr inbounds %struct.RESULTS_S, ptr %146, i32 0, i32 6
  store i32 %143, ptr %147, align 16, !tbaa !19
  br label %148

148:                                              ; preds = %99
  %149 = load i16, ptr %4, align 2, !tbaa !9
  %150 = add i16 %149, 1
  store i16 %150, ptr %4, align 2, !tbaa !9
  br label %95, !llvm.loop !23

151:                                              ; preds = %95
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %152

152:                                              ; preds = %169, %151
  %153 = load i16, ptr %4, align 2, !tbaa !9
  %154 = zext i16 %153 to i32
  %155 = icmp slt i32 %154, 3
  br i1 %155, label %156, label %172

156:                                              ; preds = %152
  %157 = load i16, ptr %4, align 2, !tbaa !9
  %158 = zext i16 %157 to i32
  %159 = shl i32 1, %158
  %160 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %161 = getelementptr inbounds %struct.RESULTS_S, ptr %160, i32 0, i32 6
  %162 = load i32, ptr %161, align 16, !tbaa !19
  %163 = and i32 %159, %162
  %164 = icmp ne i32 %163, 0
  br i1 %164, label %165, label %168

165:                                              ; preds = %156
  %166 = load i16, ptr %6, align 2, !tbaa !9
  %167 = add i16 %166, 1
  store i16 %167, ptr %6, align 2, !tbaa !9
  br label %168

168:                                              ; preds = %165, %156
  br label %169

169:                                              ; preds = %168
  %170 = load i16, ptr %4, align 2, !tbaa !9
  %171 = add i16 %170, 1
  store i16 %171, ptr %4, align 2, !tbaa !9
  br label %152, !llvm.loop !25

172:                                              ; preds = %152
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %173

173:                                              ; preds = %190, %172
  %174 = load i16, ptr %4, align 2, !tbaa !9
  %175 = zext i16 %174 to i32
  %176 = icmp slt i32 %175, 1
  br i1 %176, label %177, label %193

177:                                              ; preds = %173
  %178 = load i16, ptr %4, align 2, !tbaa !9
  %179 = zext i16 %178 to i64
  %180 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %179
  %181 = getelementptr inbounds %struct.RESULTS_S, ptr %180, i32 0, i32 4
  %182 = load i32, ptr %181, align 8, !tbaa !21
  %183 = load i16, ptr %6, align 2, !tbaa !9
  %184 = zext i16 %183 to i32
  %185 = udiv i32 %182, %184
  %186 = load i16, ptr %4, align 2, !tbaa !9
  %187 = zext i16 %186 to i64
  %188 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %187
  %189 = getelementptr inbounds %struct.RESULTS_S, ptr %188, i32 0, i32 4
  store i32 %185, ptr %189, align 8, !tbaa !21
  br label %190

190:                                              ; preds = %177
  %191 = load i16, ptr %4, align 2, !tbaa !9
  %192 = add i16 %191, 1
  store i16 %192, ptr %4, align 2, !tbaa !9
  br label %173, !llvm.loop !26

193:                                              ; preds = %173
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %194

194:                                              ; preds = %242, %193
  %195 = load i16, ptr %4, align 2, !tbaa !9
  %196 = zext i16 %195 to i32
  %197 = icmp slt i32 %196, 3
  br i1 %197, label %198, label %245

198:                                              ; preds = %194
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  %199 = load i16, ptr %4, align 2, !tbaa !9
  %200 = zext i16 %199 to i32
  %201 = shl i32 1, %200
  %202 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %203 = getelementptr inbounds %struct.RESULTS_S, ptr %202, i32 0, i32 6
  %204 = load i32, ptr %203, align 16, !tbaa !19
  %205 = and i32 %201, %204
  %206 = icmp ne i32 %205, 0
  br i1 %206, label %207, label %241

207:                                              ; preds = %198
  store i32 0, ptr %13, align 4, !tbaa !5
  br label %208

208:                                              ; preds = %235, %207
  %209 = load i32, ptr %13, align 4, !tbaa !5
  %210 = icmp ult i32 %209, 1
  br i1 %210, label %211, label %238

211:                                              ; preds = %208
  %212 = load i32, ptr %13, align 4, !tbaa !5
  %213 = zext i32 %212 to i64
  %214 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %213
  %215 = getelementptr inbounds %struct.RESULTS_S, ptr %214, i32 0, i32 3
  %216 = getelementptr inbounds [4 x ptr], ptr %215, i64 0, i64 0
  %217 = load ptr, ptr %216, align 8, !tbaa !20
  %218 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %219 = getelementptr inbounds %struct.RESULTS_S, ptr %218, i32 0, i32 4
  %220 = load i32, ptr %219, align 8, !tbaa !21
  %221 = load i16, ptr %5, align 2, !tbaa !9
  %222 = zext i16 %221 to i32
  %223 = mul i32 %220, %222
  %224 = zext i32 %223 to i64
  %225 = getelementptr inbounds i8, ptr %217, i64 %224
  %226 = load i32, ptr %13, align 4, !tbaa !5
  %227 = zext i32 %226 to i64
  %228 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %227
  %229 = getelementptr inbounds %struct.RESULTS_S, ptr %228, i32 0, i32 3
  %230 = load i16, ptr %4, align 2, !tbaa !9
  %231 = zext i16 %230 to i32
  %232 = add nsw i32 %231, 1
  %233 = sext i32 %232 to i64
  %234 = getelementptr inbounds [4 x ptr], ptr %229, i64 0, i64 %233
  store ptr %225, ptr %234, align 8, !tbaa !20
  br label %235

235:                                              ; preds = %211
  %236 = load i32, ptr %13, align 4, !tbaa !5
  %237 = add i32 %236, 1
  store i32 %237, ptr %13, align 4, !tbaa !5
  br label %208, !llvm.loop !27

238:                                              ; preds = %208
  %239 = load i16, ptr %5, align 2, !tbaa !9
  %240 = add i16 %239, 1
  store i16 %240, ptr %5, align 2, !tbaa !9
  br label %241

241:                                              ; preds = %238, %198
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  br label %242

242:                                              ; preds = %241
  %243 = load i16, ptr %4, align 2, !tbaa !9
  %244 = add i16 %243, 1
  store i16 %244, ptr %4, align 2, !tbaa !9
  br label %194, !llvm.loop !28

245:                                              ; preds = %194
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %246

246:                                              ; preds = %339, %245
  %247 = load i16, ptr %4, align 2, !tbaa !9
  %248 = zext i16 %247 to i32
  %249 = icmp slt i32 %248, 1
  br i1 %249, label %250, label %342

250:                                              ; preds = %246
  %251 = load i16, ptr %4, align 2, !tbaa !9
  %252 = zext i16 %251 to i64
  %253 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %252
  %254 = getelementptr inbounds %struct.RESULTS_S, ptr %253, i32 0, i32 6
  %255 = load i32, ptr %254, align 16, !tbaa !19
  %256 = and i32 %255, 1
  %257 = icmp ne i32 %256, 0
  br i1 %257, label %258, label %278

258:                                              ; preds = %250
  %259 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %260 = getelementptr inbounds %struct.RESULTS_S, ptr %259, i32 0, i32 4
  %261 = load i32, ptr %260, align 8, !tbaa !21
  %262 = load i16, ptr %4, align 2, !tbaa !9
  %263 = zext i16 %262 to i64
  %264 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %263
  %265 = getelementptr inbounds %struct.RESULTS_S, ptr %264, i32 0, i32 3
  %266 = getelementptr inbounds [4 x ptr], ptr %265, i64 0, i64 1
  %267 = load ptr, ptr %266, align 8, !tbaa !20
  %268 = load i16, ptr %4, align 2, !tbaa !9
  %269 = zext i16 %268 to i64
  %270 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %269
  %271 = getelementptr inbounds %struct.RESULTS_S, ptr %270, i32 0, i32 0
  %272 = load i16, ptr %271, align 16, !tbaa !11
  %273 = call ptr @core_list_init(i32 noundef %261, ptr noundef %267, i16 noundef signext %272)
  %274 = load i16, ptr %4, align 2, !tbaa !9
  %275 = zext i16 %274 to i64
  %276 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %275
  %277 = getelementptr inbounds %struct.RESULTS_S, ptr %276, i32 0, i32 7
  store ptr %273, ptr %277, align 8, !tbaa !29
  br label %278

278:                                              ; preds = %258, %250
  %279 = load i16, ptr %4, align 2, !tbaa !9
  %280 = zext i16 %279 to i64
  %281 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %280
  %282 = getelementptr inbounds %struct.RESULTS_S, ptr %281, i32 0, i32 6
  %283 = load i32, ptr %282, align 16, !tbaa !19
  %284 = and i32 %283, 2
  %285 = icmp ne i32 %284, 0
  br i1 %285, label %286, label %315

286:                                              ; preds = %278
  %287 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %288 = getelementptr inbounds %struct.RESULTS_S, ptr %287, i32 0, i32 4
  %289 = load i32, ptr %288, align 8, !tbaa !21
  %290 = load i16, ptr %4, align 2, !tbaa !9
  %291 = zext i16 %290 to i64
  %292 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %291
  %293 = getelementptr inbounds %struct.RESULTS_S, ptr %292, i32 0, i32 3
  %294 = getelementptr inbounds [4 x ptr], ptr %293, i64 0, i64 2
  %295 = load ptr, ptr %294, align 8, !tbaa !20
  %296 = load i16, ptr %4, align 2, !tbaa !9
  %297 = zext i16 %296 to i64
  %298 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %297
  %299 = getelementptr inbounds %struct.RESULTS_S, ptr %298, i32 0, i32 0
  %300 = load i16, ptr %299, align 16, !tbaa !11
  %301 = sext i16 %300 to i32
  %302 = load i16, ptr %4, align 2, !tbaa !9
  %303 = zext i16 %302 to i64
  %304 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %303
  %305 = getelementptr inbounds %struct.RESULTS_S, ptr %304, i32 0, i32 1
  %306 = load i16, ptr %305, align 2, !tbaa !16
  %307 = sext i16 %306 to i32
  %308 = shl i32 %307, 16
  %309 = or i32 %301, %308
  %310 = load i16, ptr %4, align 2, !tbaa !9
  %311 = zext i16 %310 to i64
  %312 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %311
  %313 = getelementptr inbounds %struct.RESULTS_S, ptr %312, i32 0, i32 8
  %314 = call i32 @core_init_matrix(i32 noundef %289, ptr noundef %295, i32 noundef %309, ptr noundef %313)
  br label %315

315:                                              ; preds = %286, %278
  %316 = load i16, ptr %4, align 2, !tbaa !9
  %317 = zext i16 %316 to i64
  %318 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %317
  %319 = getelementptr inbounds %struct.RESULTS_S, ptr %318, i32 0, i32 6
  %320 = load i32, ptr %319, align 16, !tbaa !19
  %321 = and i32 %320, 4
  %322 = icmp ne i32 %321, 0
  br i1 %322, label %323, label %338

323:                                              ; preds = %315
  %324 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %325 = getelementptr inbounds %struct.RESULTS_S, ptr %324, i32 0, i32 4
  %326 = load i32, ptr %325, align 8, !tbaa !21
  %327 = load i16, ptr %4, align 2, !tbaa !9
  %328 = zext i16 %327 to i64
  %329 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %328
  %330 = getelementptr inbounds %struct.RESULTS_S, ptr %329, i32 0, i32 0
  %331 = load i16, ptr %330, align 16, !tbaa !11
  %332 = load i16, ptr %4, align 2, !tbaa !9
  %333 = zext i16 %332 to i64
  %334 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %333
  %335 = getelementptr inbounds %struct.RESULTS_S, ptr %334, i32 0, i32 3
  %336 = getelementptr inbounds [4 x ptr], ptr %335, i64 0, i64 3
  %337 = load ptr, ptr %336, align 8, !tbaa !20
  call void @core_init_state(i32 noundef %326, i16 noundef signext %331, ptr noundef %337)
  br label %338

338:                                              ; preds = %323, %315
  br label %339

339:                                              ; preds = %338
  %340 = load i16, ptr %4, align 2, !tbaa !9
  %341 = add i16 %340, 1
  store i16 %341, ptr %4, align 2, !tbaa !9
  br label %246, !llvm.loop !30

342:                                              ; preds = %246
  %343 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %344 = getelementptr inbounds %struct.RESULTS_S, ptr %343, i32 0, i32 5
  %345 = load i32, ptr %344, align 4, !tbaa !18
  %346 = icmp eq i32 %345, 0
  br i1 %346, label %347, label %375

347:                                              ; preds = %342
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  store i32 0, ptr %14, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  %348 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %349 = getelementptr inbounds %struct.RESULTS_S, ptr %348, i32 0, i32 5
  store i32 1, ptr %349, align 4, !tbaa !18
  br label %350

350:                                              ; preds = %353, %347
  %351 = load i32, ptr %14, align 4, !tbaa !5
  %352 = icmp ult i32 %351, 1
  br i1 %352, label %353, label %362

353:                                              ; preds = %350
  %354 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %355 = getelementptr inbounds %struct.RESULTS_S, ptr %354, i32 0, i32 5
  %356 = load i32, ptr %355, align 4, !tbaa !18
  %357 = mul i32 %356, 10
  store i32 %357, ptr %355, align 4, !tbaa !18
  call void @start_time()
  %358 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %359 = call ptr @iterate(ptr noundef %358)
  call void @stop_time()
  %360 = call i64 @get_time()
  %361 = call i32 @time_in_secs(i64 noundef %360)
  store i32 %361, ptr %14, align 4, !tbaa !5
  br label %350, !llvm.loop !31

362:                                              ; preds = %350
  %363 = load i32, ptr %14, align 4, !tbaa !5
  store i32 %363, ptr %15, align 4, !tbaa !5
  %364 = load i32, ptr %15, align 4, !tbaa !5
  %365 = icmp eq i32 %364, 0
  br i1 %365, label %366, label %367

366:                                              ; preds = %362
  store i32 1, ptr %15, align 4, !tbaa !5
  br label %367

367:                                              ; preds = %366, %362
  %368 = load i32, ptr %15, align 4, !tbaa !5
  %369 = udiv i32 10, %368
  %370 = add i32 1, %369
  %371 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %372 = getelementptr inbounds %struct.RESULTS_S, ptr %371, i32 0, i32 5
  %373 = load i32, ptr %372, align 4, !tbaa !18
  %374 = mul i32 %373, %370
  store i32 %374, ptr %372, align 4, !tbaa !18
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  br label %375

375:                                              ; preds = %367, %342
  call void @start_time()
  %376 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %377 = call ptr @iterate(ptr noundef %376)
  call void @stop_time()
  %378 = call i64 @get_time()
  store i64 %378, ptr %10, align 8, !tbaa !32
  %379 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %380 = getelementptr inbounds %struct.RESULTS_S, ptr %379, i32 0, i32 0
  %381 = load i16, ptr %380, align 16, !tbaa !11
  %382 = load i16, ptr %9, align 2, !tbaa !9
  %383 = call zeroext i16 @crc16(i16 noundef signext %381, i16 noundef zeroext %382)
  store i16 %383, ptr %9, align 2, !tbaa !9
  %384 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %385 = getelementptr inbounds %struct.RESULTS_S, ptr %384, i32 0, i32 1
  %386 = load i16, ptr %385, align 2, !tbaa !16
  %387 = load i16, ptr %9, align 2, !tbaa !9
  %388 = call zeroext i16 @crc16(i16 noundef signext %386, i16 noundef zeroext %387)
  store i16 %388, ptr %9, align 2, !tbaa !9
  %389 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %390 = getelementptr inbounds %struct.RESULTS_S, ptr %389, i32 0, i32 2
  %391 = load i16, ptr %390, align 4, !tbaa !17
  %392 = load i16, ptr %9, align 2, !tbaa !9
  %393 = call zeroext i16 @crc16(i16 noundef signext %391, i16 noundef zeroext %392)
  store i16 %393, ptr %9, align 2, !tbaa !9
  %394 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %395 = getelementptr inbounds %struct.RESULTS_S, ptr %394, i32 0, i32 4
  %396 = load i32, ptr %395, align 8, !tbaa !21
  %397 = trunc i32 %396 to i16
  %398 = load i16, ptr %9, align 2, !tbaa !9
  %399 = call zeroext i16 @crc16(i16 noundef signext %397, i16 noundef zeroext %398)
  store i16 %399, ptr %9, align 2, !tbaa !9
  %400 = load i16, ptr %9, align 2, !tbaa !9
  %401 = zext i16 %400 to i32
  switch i32 %401, label %412 [
    i32 35330, label %402
    i32 31493, label %404
    i32 20143, label %406
    i32 59893, label %408
    i32 6386, label %410
  ]

402:                                              ; preds = %375
  store i16 0, ptr %7, align 2, !tbaa !9
  %403 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.3)
  br label %413

404:                                              ; preds = %375
  store i16 1, ptr %7, align 2, !tbaa !9
  %405 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.4)
  br label %413

406:                                              ; preds = %375
  store i16 2, ptr %7, align 2, !tbaa !9
  %407 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.5)
  br label %413

408:                                              ; preds = %375
  store i16 3, ptr %7, align 2, !tbaa !9
  %409 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.6)
  br label %413

410:                                              ; preds = %375
  store i16 4, ptr %7, align 2, !tbaa !9
  %411 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.7)
  br label %413

412:                                              ; preds = %375
  store i16 -1, ptr %8, align 2, !tbaa !9
  br label %413

413:                                              ; preds = %412, %410, %408, %406, %404, %402
  %414 = load i16, ptr %7, align 2, !tbaa !9
  %415 = sext i16 %414 to i32
  %416 = icmp sge i32 %415, 0
  br i1 %416, label %417, label %568

417:                                              ; preds = %413
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %418

418:                                              ; preds = %564, %417
  %419 = load i16, ptr %4, align 2, !tbaa !9
  %420 = zext i16 %419 to i32
  %421 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %422 = icmp ult i32 %420, %421
  br i1 %422, label %423, label %567

423:                                              ; preds = %418
  %424 = load i16, ptr %4, align 2, !tbaa !9
  %425 = zext i16 %424 to i64
  %426 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %425
  %427 = getelementptr inbounds %struct.RESULTS_S, ptr %426, i32 0, i32 13
  store i16 0, ptr %427, align 8, !tbaa !22
  %428 = load i16, ptr %4, align 2, !tbaa !9
  %429 = zext i16 %428 to i64
  %430 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %429
  %431 = getelementptr inbounds %struct.RESULTS_S, ptr %430, i32 0, i32 6
  %432 = load i32, ptr %431, align 16, !tbaa !19
  %433 = and i32 %432, 1
  %434 = icmp ne i32 %433, 0
  br i1 %434, label %435, label %469

435:                                              ; preds = %423
  %436 = load i16, ptr %4, align 2, !tbaa !9
  %437 = zext i16 %436 to i64
  %438 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %437
  %439 = getelementptr inbounds %struct.RESULTS_S, ptr %438, i32 0, i32 10
  %440 = load i16, ptr %439, align 2, !tbaa !34
  %441 = zext i16 %440 to i32
  %442 = load i16, ptr %7, align 2, !tbaa !9
  %443 = sext i16 %442 to i64
  %444 = getelementptr inbounds [5 x i16], ptr @list_known_crc, i64 0, i64 %443
  %445 = load i16, ptr %444, align 2, !tbaa !9
  %446 = zext i16 %445 to i32
  %447 = icmp ne i32 %441, %446
  br i1 %447, label %448, label %469

448:                                              ; preds = %435
  %449 = load i16, ptr %4, align 2, !tbaa !9
  %450 = zext i16 %449 to i32
  %451 = load i16, ptr %4, align 2, !tbaa !9
  %452 = zext i16 %451 to i64
  %453 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %452
  %454 = getelementptr inbounds %struct.RESULTS_S, ptr %453, i32 0, i32 10
  %455 = load i16, ptr %454, align 2, !tbaa !34
  %456 = zext i16 %455 to i32
  %457 = load i16, ptr %7, align 2, !tbaa !9
  %458 = sext i16 %457 to i64
  %459 = getelementptr inbounds [5 x i16], ptr @list_known_crc, i64 0, i64 %458
  %460 = load i16, ptr %459, align 2, !tbaa !9
  %461 = zext i16 %460 to i32
  %462 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.8, i32 noundef %450, i32 noundef %456, i32 noundef %461)
  %463 = load i16, ptr %4, align 2, !tbaa !9
  %464 = zext i16 %463 to i64
  %465 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %464
  %466 = getelementptr inbounds %struct.RESULTS_S, ptr %465, i32 0, i32 13
  %467 = load i16, ptr %466, align 8, !tbaa !22
  %468 = add i16 %467, 1
  store i16 %468, ptr %466, align 8, !tbaa !22
  br label %469

469:                                              ; preds = %448, %435, %423
  %470 = load i16, ptr %4, align 2, !tbaa !9
  %471 = zext i16 %470 to i64
  %472 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %471
  %473 = getelementptr inbounds %struct.RESULTS_S, ptr %472, i32 0, i32 6
  %474 = load i32, ptr %473, align 16, !tbaa !19
  %475 = and i32 %474, 2
  %476 = icmp ne i32 %475, 0
  br i1 %476, label %477, label %511

477:                                              ; preds = %469
  %478 = load i16, ptr %4, align 2, !tbaa !9
  %479 = zext i16 %478 to i64
  %480 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %479
  %481 = getelementptr inbounds %struct.RESULTS_S, ptr %480, i32 0, i32 11
  %482 = load i16, ptr %481, align 4, !tbaa !35
  %483 = zext i16 %482 to i32
  %484 = load i16, ptr %7, align 2, !tbaa !9
  %485 = sext i16 %484 to i64
  %486 = getelementptr inbounds [5 x i16], ptr @matrix_known_crc, i64 0, i64 %485
  %487 = load i16, ptr %486, align 2, !tbaa !9
  %488 = zext i16 %487 to i32
  %489 = icmp ne i32 %483, %488
  br i1 %489, label %490, label %511

490:                                              ; preds = %477
  %491 = load i16, ptr %4, align 2, !tbaa !9
  %492 = zext i16 %491 to i32
  %493 = load i16, ptr %4, align 2, !tbaa !9
  %494 = zext i16 %493 to i64
  %495 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %494
  %496 = getelementptr inbounds %struct.RESULTS_S, ptr %495, i32 0, i32 11
  %497 = load i16, ptr %496, align 4, !tbaa !35
  %498 = zext i16 %497 to i32
  %499 = load i16, ptr %7, align 2, !tbaa !9
  %500 = sext i16 %499 to i64
  %501 = getelementptr inbounds [5 x i16], ptr @matrix_known_crc, i64 0, i64 %500
  %502 = load i16, ptr %501, align 2, !tbaa !9
  %503 = zext i16 %502 to i32
  %504 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.9, i32 noundef %492, i32 noundef %498, i32 noundef %503)
  %505 = load i16, ptr %4, align 2, !tbaa !9
  %506 = zext i16 %505 to i64
  %507 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %506
  %508 = getelementptr inbounds %struct.RESULTS_S, ptr %507, i32 0, i32 13
  %509 = load i16, ptr %508, align 8, !tbaa !22
  %510 = add i16 %509, 1
  store i16 %510, ptr %508, align 8, !tbaa !22
  br label %511

511:                                              ; preds = %490, %477, %469
  %512 = load i16, ptr %4, align 2, !tbaa !9
  %513 = zext i16 %512 to i64
  %514 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %513
  %515 = getelementptr inbounds %struct.RESULTS_S, ptr %514, i32 0, i32 6
  %516 = load i32, ptr %515, align 16, !tbaa !19
  %517 = and i32 %516, 4
  %518 = icmp ne i32 %517, 0
  br i1 %518, label %519, label %553

519:                                              ; preds = %511
  %520 = load i16, ptr %4, align 2, !tbaa !9
  %521 = zext i16 %520 to i64
  %522 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %521
  %523 = getelementptr inbounds %struct.RESULTS_S, ptr %522, i32 0, i32 12
  %524 = load i16, ptr %523, align 2, !tbaa !36
  %525 = zext i16 %524 to i32
  %526 = load i16, ptr %7, align 2, !tbaa !9
  %527 = sext i16 %526 to i64
  %528 = getelementptr inbounds [5 x i16], ptr @state_known_crc, i64 0, i64 %527
  %529 = load i16, ptr %528, align 2, !tbaa !9
  %530 = zext i16 %529 to i32
  %531 = icmp ne i32 %525, %530
  br i1 %531, label %532, label %553

532:                                              ; preds = %519
  %533 = load i16, ptr %4, align 2, !tbaa !9
  %534 = zext i16 %533 to i32
  %535 = load i16, ptr %4, align 2, !tbaa !9
  %536 = zext i16 %535 to i64
  %537 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %536
  %538 = getelementptr inbounds %struct.RESULTS_S, ptr %537, i32 0, i32 12
  %539 = load i16, ptr %538, align 2, !tbaa !36
  %540 = zext i16 %539 to i32
  %541 = load i16, ptr %7, align 2, !tbaa !9
  %542 = sext i16 %541 to i64
  %543 = getelementptr inbounds [5 x i16], ptr @state_known_crc, i64 0, i64 %542
  %544 = load i16, ptr %543, align 2, !tbaa !9
  %545 = zext i16 %544 to i32
  %546 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.10, i32 noundef %534, i32 noundef %540, i32 noundef %545)
  %547 = load i16, ptr %4, align 2, !tbaa !9
  %548 = zext i16 %547 to i64
  %549 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %548
  %550 = getelementptr inbounds %struct.RESULTS_S, ptr %549, i32 0, i32 13
  %551 = load i16, ptr %550, align 8, !tbaa !22
  %552 = add i16 %551, 1
  store i16 %552, ptr %550, align 8, !tbaa !22
  br label %553

553:                                              ; preds = %532, %519, %511
  %554 = load i16, ptr %4, align 2, !tbaa !9
  %555 = zext i16 %554 to i64
  %556 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %555
  %557 = getelementptr inbounds %struct.RESULTS_S, ptr %556, i32 0, i32 13
  %558 = load i16, ptr %557, align 8, !tbaa !22
  %559 = sext i16 %558 to i32
  %560 = load i16, ptr %8, align 2, !tbaa !9
  %561 = sext i16 %560 to i32
  %562 = add nsw i32 %561, %559
  %563 = trunc i32 %562 to i16
  store i16 %563, ptr %8, align 2, !tbaa !9
  br label %564

564:                                              ; preds = %553
  %565 = load i16, ptr %4, align 2, !tbaa !9
  %566 = add i16 %565, 1
  store i16 %566, ptr %4, align 2, !tbaa !9
  br label %418, !llvm.loop !37

567:                                              ; preds = %418
  br label %568

568:                                              ; preds = %567, %413
  %569 = call zeroext i8 @check_data_types()
  %570 = zext i8 %569 to i32
  %571 = load i16, ptr %8, align 2, !tbaa !9
  %572 = sext i16 %571 to i32
  %573 = add nsw i32 %572, %570
  %574 = trunc i32 %573 to i16
  store i16 %574, ptr %8, align 2, !tbaa !9
  %575 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %576 = getelementptr inbounds %struct.RESULTS_S, ptr %575, i32 0, i32 4
  %577 = load i32, ptr %576, align 8, !tbaa !21
  %578 = zext i32 %577 to i64
  %579 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.11, i64 noundef %578)
  %580 = load i64, ptr %10, align 8, !tbaa !32
  %581 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.12, i64 noundef %580)
  %582 = load i64, ptr %10, align 8, !tbaa !32
  call void @print_coremarks(i64 noundef %582)
  %583 = load i64, ptr %10, align 8, !tbaa !32
  %584 = call i32 @time_in_secs(i64 noundef %583)
  %585 = icmp ult i32 %584, 10
  br i1 %585, label %586, label %588

586:                                              ; preds = %568
  %587 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.13)
  br label %588

588:                                              ; preds = %586, %568
  %589 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.14, ptr noundef @.str.15)
  %590 = load i16, ptr %9, align 2, !tbaa !9
  %591 = zext i16 %590 to i32
  %592 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.16, i32 noundef %591)
  %593 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %594 = getelementptr inbounds %struct.RESULTS_S, ptr %593, i32 0, i32 6
  %595 = load i32, ptr %594, align 16, !tbaa !19
  %596 = and i32 %595, 1
  %597 = icmp ne i32 %596, 0
  br i1 %597, label %598, label %618

598:                                              ; preds = %588
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %599

599:                                              ; preds = %614, %598
  %600 = load i16, ptr %4, align 2, !tbaa !9
  %601 = zext i16 %600 to i32
  %602 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %603 = icmp ult i32 %601, %602
  br i1 %603, label %604, label %617

604:                                              ; preds = %599
  %605 = load i16, ptr %4, align 2, !tbaa !9
  %606 = zext i16 %605 to i32
  %607 = load i16, ptr %4, align 2, !tbaa !9
  %608 = zext i16 %607 to i64
  %609 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %608
  %610 = getelementptr inbounds %struct.RESULTS_S, ptr %609, i32 0, i32 10
  %611 = load i16, ptr %610, align 2, !tbaa !34
  %612 = zext i16 %611 to i32
  %613 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.17, i32 noundef %606, i32 noundef %612)
  br label %614

614:                                              ; preds = %604
  %615 = load i16, ptr %4, align 2, !tbaa !9
  %616 = add i16 %615, 1
  store i16 %616, ptr %4, align 2, !tbaa !9
  br label %599, !llvm.loop !38

617:                                              ; preds = %599
  br label %618

618:                                              ; preds = %617, %588
  %619 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %620 = getelementptr inbounds %struct.RESULTS_S, ptr %619, i32 0, i32 6
  %621 = load i32, ptr %620, align 16, !tbaa !19
  %622 = and i32 %621, 2
  %623 = icmp ne i32 %622, 0
  br i1 %623, label %624, label %644

624:                                              ; preds = %618
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %625

625:                                              ; preds = %640, %624
  %626 = load i16, ptr %4, align 2, !tbaa !9
  %627 = zext i16 %626 to i32
  %628 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %629 = icmp ult i32 %627, %628
  br i1 %629, label %630, label %643

630:                                              ; preds = %625
  %631 = load i16, ptr %4, align 2, !tbaa !9
  %632 = zext i16 %631 to i32
  %633 = load i16, ptr %4, align 2, !tbaa !9
  %634 = zext i16 %633 to i64
  %635 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %634
  %636 = getelementptr inbounds %struct.RESULTS_S, ptr %635, i32 0, i32 11
  %637 = load i16, ptr %636, align 4, !tbaa !35
  %638 = zext i16 %637 to i32
  %639 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.18, i32 noundef %632, i32 noundef %638)
  br label %640

640:                                              ; preds = %630
  %641 = load i16, ptr %4, align 2, !tbaa !9
  %642 = add i16 %641, 1
  store i16 %642, ptr %4, align 2, !tbaa !9
  br label %625, !llvm.loop !39

643:                                              ; preds = %625
  br label %644

644:                                              ; preds = %643, %618
  %645 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %646 = getelementptr inbounds %struct.RESULTS_S, ptr %645, i32 0, i32 6
  %647 = load i32, ptr %646, align 16, !tbaa !19
  %648 = and i32 %647, 4
  %649 = icmp ne i32 %648, 0
  br i1 %649, label %650, label %670

650:                                              ; preds = %644
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %651

651:                                              ; preds = %666, %650
  %652 = load i16, ptr %4, align 2, !tbaa !9
  %653 = zext i16 %652 to i32
  %654 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %655 = icmp ult i32 %653, %654
  br i1 %655, label %656, label %669

656:                                              ; preds = %651
  %657 = load i16, ptr %4, align 2, !tbaa !9
  %658 = zext i16 %657 to i32
  %659 = load i16, ptr %4, align 2, !tbaa !9
  %660 = zext i16 %659 to i64
  %661 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %660
  %662 = getelementptr inbounds %struct.RESULTS_S, ptr %661, i32 0, i32 12
  %663 = load i16, ptr %662, align 2, !tbaa !36
  %664 = zext i16 %663 to i32
  %665 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.19, i32 noundef %658, i32 noundef %664)
  br label %666

666:                                              ; preds = %656
  %667 = load i16, ptr %4, align 2, !tbaa !9
  %668 = add i16 %667, 1
  store i16 %668, ptr %4, align 2, !tbaa !9
  br label %651, !llvm.loop !40

669:                                              ; preds = %651
  br label %670

670:                                              ; preds = %669, %644
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %671

671:                                              ; preds = %686, %670
  %672 = load i16, ptr %4, align 2, !tbaa !9
  %673 = zext i16 %672 to i32
  %674 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %675 = icmp ult i32 %673, %674
  br i1 %675, label %676, label %689

676:                                              ; preds = %671
  %677 = load i16, ptr %4, align 2, !tbaa !9
  %678 = zext i16 %677 to i32
  %679 = load i16, ptr %4, align 2, !tbaa !9
  %680 = zext i16 %679 to i64
  %681 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %680
  %682 = getelementptr inbounds %struct.RESULTS_S, ptr %681, i32 0, i32 9
  %683 = load i16, ptr %682, align 16, !tbaa !41
  %684 = zext i16 %683 to i32
  %685 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.20, i32 noundef %678, i32 noundef %684)
  br label %686

686:                                              ; preds = %676
  %687 = load i16, ptr %4, align 2, !tbaa !9
  %688 = add i16 %687, 1
  store i16 %688, ptr %4, align 2, !tbaa !9
  br label %671, !llvm.loop !42

689:                                              ; preds = %671
  %690 = load i16, ptr %8, align 2, !tbaa !9
  %691 = sext i16 %690 to i32
  %692 = icmp eq i32 %691, 0
  br i1 %692, label %693, label %695

693:                                              ; preds = %689
  %694 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.21)
  br label %695

695:                                              ; preds = %693, %689
  %696 = load i16, ptr %8, align 2, !tbaa !9
  %697 = sext i16 %696 to i32
  %698 = icmp sgt i32 %697, 0
  br i1 %698, label %699, label %701

699:                                              ; preds = %695
  %700 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.22)
  br label %701

701:                                              ; preds = %699, %695
  %702 = load i16, ptr %8, align 2, !tbaa !9
  %703 = sext i16 %702 to i32
  %704 = icmp slt i32 %703, 0
  br i1 %704, label %705, label %707

705:                                              ; preds = %701
  %706 = call i32 (ptr, ...) @ee_printf(ptr noundef @.str.23)
  br label %707

707:                                              ; preds = %705, %701
  %708 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %709 = getelementptr inbounds %struct.RESULTS_S, ptr %708, i32 0, i32 14
  call void @portable_fini(ptr noundef %709)
  call void @llvm.lifetime.end.p0(i64 2000, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 112, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %4) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %2) #3
  ret i32 0
}

declare void @portable_init(ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @get_seed_32(i32 noundef) #2

declare ptr @core_list_init(i32 noundef, ptr noundef, i16 noundef signext) #2

declare i32 @core_init_matrix(i32 noundef, ptr noundef, i32 noundef, ptr noundef) #2

declare void @core_init_state(i32 noundef, i16 noundef signext, ptr noundef) #2

declare void @start_time() #2

declare void @stop_time() #2

declare i32 @time_in_secs(i64 noundef) #2

declare i64 @get_time() #2

declare zeroext i16 @crc16(i16 noundef signext, i16 noundef zeroext) #2

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

declare zeroext i8 @check_data_types() #2

declare void @print_coremarks(i64 noundef) #2

declare void @portable_fini(ptr noundef) #2

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

!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 = !{!"short", !7, i64 0}
!11 = !{!12, !10, i64 0}
!12 = !{!"RESULTS_S", !10, i64 0, !10, i64 2, !10, i64 4, !7, i64 8, !6, i64 40, !6, i64 44, !6, i64 48, !13, i64 56, !14, i64 64, !10, i64 96, !10, i64 98, !10, i64 100, !10, i64 102, !10, i64 104, !15, i64 106}
!13 = !{!"any pointer", !7, i64 0}
!14 = !{!"MAT_PARAMS_S", !6, i64 0, !13, i64 8, !13, i64 16, !13, i64 24}
!15 = !{!"CORE_PORTABLE_S", !7, i64 0}
!16 = !{!12, !10, i64 2}
!17 = !{!12, !10, i64 4}
!18 = !{!12, !6, i64 44}
!19 = !{!12, !6, i64 48}
!20 = !{!13, !13, i64 0}
!21 = !{!12, !6, i64 40}
!22 = !{!12, !10, i64 104}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = distinct !{!25, !24}
!26 = distinct !{!26, !24}
!27 = distinct !{!27, !24}
!28 = distinct !{!28, !24}
!29 = !{!12, !13, i64 56}
!30 = distinct !{!30, !24}
!31 = distinct !{!31, !24}
!32 = !{!33, !33, i64 0}
!33 = !{!"long", !7, i64 0}
!34 = !{!12, !10, i64 98}
!35 = !{!12, !10, i64 100}
!36 = !{!12, !10, i64 102}
!37 = distinct !{!37, !24}
!38 = distinct !{!38, !24}
!39 = distinct !{!39, !24}
!40 = distinct !{!40, !24}
!41 = !{!12, !10, i64 96}
!42 = distinct !{!42, !24}


; 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.RESULTS_S = type { i16, i16, i16, [4 x ptr], i32, i32, i32, ptr, %struct.MAT_PARAMS_S, i16, i16, i16, i16, i16, %struct.CORE_PORTABLE_S }
%struct.MAT_PARAMS_S = type { i32, ptr, ptr, ptr }
%struct.CORE_PORTABLE_S = type { i8 }

@.str.3 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [44 x i8], align 1
@default_num_contexts = external local_unnamed_addr global i32, align 4
@list_known_crc = external hidden local_unnamed_addr global [5 x i16], align 2
@.str.8 = external hidden unnamed_addr constant [47 x i8], align 1
@matrix_known_crc = external hidden local_unnamed_addr global [5 x i16], align 2
@.str.9 = external hidden unnamed_addr constant [49 x i8], align 1
@state_known_crc = external hidden local_unnamed_addr global [5 x i16], align 2
@.str.10 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [99 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local ptr @iterate(ptr noundef) local_unnamed_addr #0

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

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

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @main() local_unnamed_addr #0 {
  %1 = alloca i32, align 4
  %2 = alloca [1 x ptr], align 8
  %3 = alloca [1 x %struct.RESULTS_S], align 16
  %4 = alloca [2000 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %1) #3
  store i32 0, ptr %1, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2) #3
  call void @llvm.lifetime.start.p0(i64 112, ptr nonnull %3) #3
  call void @llvm.lifetime.start.p0(i64 2000, ptr nonnull %4) #3
  %5 = getelementptr inbounds i8, ptr %3, i64 106
  call void @portable_init(ptr noundef nonnull %5, ptr noundef nonnull %1, ptr noundef nonnull %2) #3
  %6 = call i32 @get_seed_32(i32 noundef 1) #3
  %7 = trunc i32 %6 to i16
  store i16 %7, ptr %3, align 16, !tbaa !9
  %8 = call i32 @get_seed_32(i32 noundef 2) #3
  %9 = trunc i32 %8 to i16
  %10 = getelementptr inbounds i8, ptr %3, i64 2
  store i16 %9, ptr %10, align 2, !tbaa !15
  %11 = call i32 @get_seed_32(i32 noundef 3) #3
  %12 = trunc i32 %11 to i16
  %13 = getelementptr inbounds i8, ptr %3, i64 4
  store i16 %12, ptr %13, align 4, !tbaa !16
  %14 = call i32 @get_seed_32(i32 noundef 4) #3
  %15 = getelementptr inbounds i8, ptr %3, i64 44
  store i32 %14, ptr %15, align 4, !tbaa !17
  %16 = call i32 @get_seed_32(i32 noundef 5) #3
  %17 = getelementptr inbounds i8, ptr %3, i64 48
  %18 = icmp eq i32 %16, 0
  %spec.select = select i1 %18, i32 7, i32 %16
  store i32 %spec.select, ptr %17, align 16, !tbaa !18
  %19 = load i16, ptr %3, align 16, !tbaa !9
  %20 = icmp eq i16 %19, 0
  %21 = load i16, ptr %10, align 2
  %22 = icmp eq i16 %21, 0
  %or.cond = select i1 %20, i1 %22, i1 false
  %23 = load i16, ptr %13, align 4
  %24 = icmp eq i16 %23, 0
  %or.cond9 = select i1 %or.cond, i1 %24, i1 false
  br i1 %or.cond9, label %.preheader171.sink.split, label %25

25:                                               ; preds = %0
  %26 = icmp eq i16 %19, 1
  %27 = icmp eq i16 %21, 0
  %or.cond14 = select i1 %26, i1 %27, i1 false
  %28 = icmp eq i16 %23, 0
  %or.cond19 = select i1 %or.cond14, i1 %28, i1 false
  br i1 %or.cond19, label %.preheader171.sink.split, label %.preheader171

.preheader171.sink.split:                         ; preds = %25, %0
  %storemerge = phi i16 [ 0, %0 ], [ 13333, %25 ]
  store i16 %storemerge, ptr %3, align 16, !tbaa !9
  store i16 %storemerge, ptr %10, align 2, !tbaa !15
  store i16 102, ptr %13, align 4, !tbaa !16
  br label %.preheader171

.preheader171:                                    ; preds = %.preheader171.sink.split, %25
  %29 = phi i16 [ %19, %25 ], [ %storemerge, %.preheader171.sink.split ]
  %30 = getelementptr inbounds i8, ptr %3, i64 8
  store ptr %4, ptr %30, align 8, !tbaa !19
  %31 = getelementptr inbounds i8, ptr %3, i64 40
  %32 = getelementptr inbounds i8, ptr %3, i64 104
  store i16 0, ptr %32, align 8, !tbaa !20
  %33 = and i32 %spec.select, 1
  %34 = and i32 %spec.select, 2
  %.lobit = lshr exact i32 %34, 1
  %spec.select159.1 = add nuw nsw i32 %33, %.lobit
  %35 = and i32 %spec.select, 4
  %.lobit207 = lshr exact i32 %35, 2
  %spec.select159.2 = add nuw nsw i32 %spec.select159.1, %.lobit207
  %.rhs.trunc = trunc nuw nsw i32 %spec.select159.2 to i16
  %36 = udiv i16 2000, %.rhs.trunc
  %.zext = zext nneg i16 %36 to i32
  store i32 %.zext, ptr %31, align 8, !tbaa !21
  %.not157 = icmp eq i32 %33, 0
  br i1 %.not157, label %38, label %.critedge161

.critedge161:                                     ; preds = %.preheader171
  %37 = getelementptr inbounds i8, ptr %3, i64 16
  store ptr %4, ptr %37, align 16, !tbaa !19
  br label %38

38:                                               ; preds = %.critedge161, %.preheader171
  %.1125 = phi i16 [ 1, %.critedge161 ], [ 0, %.preheader171 ]
  %.not157.1 = icmp eq i32 %34, 0
  br i1 %.not157.1, label %43, label %.critedge161.1

.critedge161.1:                                   ; preds = %38
  %narrow = mul nuw nsw i16 %36, %.1125
  %39 = zext nneg i16 %narrow to i64
  %40 = getelementptr inbounds i8, ptr %4, i64 %39
  %41 = getelementptr inbounds i8, ptr %3, i64 24
  store ptr %40, ptr %41, align 8, !tbaa !19
  %42 = add nuw nsw i16 %.1125, 1
  br label %43

43:                                               ; preds = %.critedge161.1, %38
  %.1125.1 = phi i16 [ %42, %.critedge161.1 ], [ %.1125, %38 ]
  %.not157.2 = icmp eq i32 %35, 0
  br i1 %.not157.2, label %.preheader170, label %.critedge161.2

.critedge161.2:                                   ; preds = %43
  %44 = zext nneg i16 %.1125.1 to i32
  %45 = mul nuw nsw i32 %.zext, %44
  %46 = zext nneg i32 %45 to i64
  %47 = getelementptr inbounds i8, ptr %4, i64 %46
  %48 = getelementptr inbounds i8, ptr %3, i64 32
  store ptr %47, ptr %48, align 16, !tbaa !19
  br label %.preheader170

.preheader170:                                    ; preds = %.critedge161.2, %43
  br i1 %.not157, label %54, label %49

49:                                               ; preds = %.preheader170
  %50 = getelementptr inbounds i8, ptr %3, i64 16
  %51 = load ptr, ptr %50, align 16, !tbaa !19
  %52 = call ptr @core_list_init(i32 noundef %.zext, ptr noundef %51, i16 noundef signext %29) #3
  %53 = getelementptr inbounds i8, ptr %3, i64 56
  store ptr %52, ptr %53, align 8, !tbaa !22
  %.pre = load i32, ptr %17, align 16, !tbaa !18
  %.pre206 = and i32 %.pre, 2
  br label %54

54:                                               ; preds = %49, %.preheader170
  %.pre-phi = phi i32 [ %.pre206, %49 ], [ %34, %.preheader170 ]
  %55 = phi i32 [ %.pre, %49 ], [ %spec.select, %.preheader170 ]
  %.not155 = icmp eq i32 %.pre-phi, 0
  br i1 %.not155, label %68, label %56

56:                                               ; preds = %54
  %57 = load i32, ptr %31, align 8, !tbaa !21
  %58 = getelementptr inbounds i8, ptr %3, i64 24
  %59 = load ptr, ptr %58, align 8, !tbaa !19
  %60 = load i16, ptr %3, align 16, !tbaa !9
  %61 = sext i16 %60 to i32
  %62 = load i16, ptr %10, align 2, !tbaa !15
  %63 = sext i16 %62 to i32
  %64 = shl nsw i32 %63, 16
  %65 = or i32 %64, %61
  %66 = getelementptr inbounds i8, ptr %3, i64 64
  %67 = call i32 @core_init_matrix(i32 noundef %57, ptr noundef %59, i32 noundef %65, ptr noundef nonnull %66) #3
  %.pre201 = load i32, ptr %17, align 16, !tbaa !18
  br label %68

68:                                               ; preds = %56, %54
  %69 = phi i32 [ %.pre201, %56 ], [ %55, %54 ]
  %70 = and i32 %69, 4
  %.not156 = icmp eq i32 %70, 0
  br i1 %.not156, label %76, label %71

71:                                               ; preds = %68
  %72 = load i32, ptr %31, align 8, !tbaa !21
  %73 = load i16, ptr %3, align 16, !tbaa !9
  %74 = getelementptr inbounds i8, ptr %3, i64 32
  %75 = load ptr, ptr %74, align 16, !tbaa !19
  call void @core_init_state(i32 noundef %72, i16 noundef signext %73, ptr noundef %75) #3
  br label %76

76:                                               ; preds = %71, %68
  %77 = load i32, ptr %15, align 4, !tbaa !17
  %78 = icmp eq i32 %77, 0
  br i1 %78, label %79, label %92

79:                                               ; preds = %76
  store i32 1, ptr %15, align 4, !tbaa !17
  br label %80

80:                                               ; preds = %79, %80
  %81 = load i32, ptr %15, align 4, !tbaa !17
  %82 = mul i32 %81, 10
  store i32 %82, ptr %15, align 4, !tbaa !17
  call void @start_time() #3
  %83 = call ptr @iterate(ptr noundef nonnull %3)
  call void @stop_time() #3
  %84 = call i64 @get_time() #3
  %85 = call i32 @time_in_secs(i64 noundef %84) #3
  %86 = icmp eq i32 %85, 0
  br i1 %86, label %80, label %87, !llvm.loop !23

87:                                               ; preds = %80
  %88 = udiv i32 10, %85
  %89 = add nuw nsw i32 %88, 1
  %90 = load i32, ptr %15, align 4, !tbaa !17
  %91 = mul i32 %90, %89
  store i32 %91, ptr %15, align 4, !tbaa !17
  br label %92

92:                                               ; preds = %87, %76
  call void @start_time() #3
  %93 = call ptr @iterate(ptr noundef nonnull %3)
  call void @stop_time() #3
  %94 = call i64 @get_time() #3
  %95 = load i16, ptr %3, align 16, !tbaa !9
  %96 = call zeroext i16 @crc16(i16 noundef signext %95, i16 noundef zeroext 0) #3
  %97 = load i16, ptr %10, align 2, !tbaa !15
  %98 = call zeroext i16 @crc16(i16 noundef signext %97, i16 noundef zeroext %96) #3
  %99 = load i16, ptr %13, align 4, !tbaa !16
  %100 = call zeroext i16 @crc16(i16 noundef signext %99, i16 noundef zeroext %98) #3
  %101 = load i32, ptr %31, align 8, !tbaa !21
  %102 = trunc i32 %101 to i16
  %103 = call zeroext i16 @crc16(i16 noundef signext %102, i16 noundef zeroext %100) #3
  %104 = zext i16 %103 to i32
  switch i16 %103, label %.thread [
    i16 -30206, label %109
    i16 31493, label %105
    i16 20143, label %106
    i16 -5643, label %107
    i16 6386, label %108
  ]

105:                                              ; preds = %92
  br label %109

106:                                              ; preds = %92
  br label %109

107:                                              ; preds = %92
  br label %109

108:                                              ; preds = %92
  br label %109

109:                                              ; preds = %92, %108, %107, %106, %105
  %.str.7.sink = phi ptr [ @.str.7, %108 ], [ @.str.6, %107 ], [ @.str.5, %106 ], [ @.str.4, %105 ], [ @.str.3, %92 ]
  %.0129 = phi i64 [ 4, %108 ], [ 3, %107 ], [ 2, %106 ], [ 1, %105 ], [ 0, %92 ]
  %110 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull %.str.7.sink) #3
  %111 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %.not194 = icmp eq i32 %111, 0
  br i1 %.not194, label %.thread, label %.lr.ph

.lr.ph:                                           ; preds = %109
  %112 = getelementptr inbounds [5 x i16], ptr @list_known_crc, i64 0, i64 %.0129
  %113 = getelementptr inbounds [5 x i16], ptr @matrix_known_crc, i64 0, i64 %.0129
  %114 = getelementptr inbounds [5 x i16], ptr @state_known_crc, i64 0, i64 %.0129
  br label %115

115:                                              ; preds = %.lr.ph, %161
  %116 = phi i32 [ 0, %.lr.ph ], [ %165, %161 ]
  %.5179 = phi i16 [ 0, %.lr.ph ], [ %164, %161 ]
  %.1127178 = phi i16 [ 0, %.lr.ph ], [ %163, %161 ]
  %117 = zext i16 %.5179 to i64
  %118 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %3, i64 0, i64 %117
  %119 = getelementptr inbounds i8, ptr %118, i64 104
  store i16 0, ptr %119, align 8, !tbaa !20
  %120 = getelementptr inbounds i8, ptr %118, i64 48
  %121 = load i32, ptr %120, align 16, !tbaa !18
  %122 = and i32 %121, 1
  %.not148 = icmp eq i32 %122, 0
  br i1 %.not148, label %133, label %123

123:                                              ; preds = %115
  %124 = getelementptr inbounds i8, ptr %118, i64 98
  %125 = load i16, ptr %124, align 2, !tbaa !25
  %126 = load i16, ptr %112, align 2, !tbaa !26
  %.not149 = icmp eq i16 %125, %126
  br i1 %.not149, label %133, label %127

127:                                              ; preds = %123
  %128 = zext i16 %126 to i32
  %129 = zext i16 %125 to i32
  %130 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.8, i32 noundef %116, i32 noundef %129, i32 noundef %128) #3
  %131 = load i16, ptr %119, align 8, !tbaa !20
  %132 = add i16 %131, 1
  store i16 %132, ptr %119, align 8, !tbaa !20
  %.pre202 = load i32, ptr %120, align 16, !tbaa !18
  br label %133

133:                                              ; preds = %127, %123, %115
  %134 = phi i16 [ %132, %127 ], [ 0, %123 ], [ 0, %115 ]
  %135 = phi i32 [ %.pre202, %127 ], [ %121, %123 ], [ %121, %115 ]
  %136 = and i32 %135, 2
  %.not150 = icmp eq i32 %136, 0
  br i1 %.not150, label %147, label %137

137:                                              ; preds = %133
  %138 = getelementptr inbounds i8, ptr %118, i64 100
  %139 = load i16, ptr %138, align 4, !tbaa !27
  %140 = load i16, ptr %113, align 2, !tbaa !26
  %.not151 = icmp eq i16 %139, %140
  br i1 %.not151, label %147, label %141

141:                                              ; preds = %137
  %142 = zext i16 %140 to i32
  %143 = zext i16 %139 to i32
  %144 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.9, i32 noundef %116, i32 noundef %143, i32 noundef %142) #3
  %145 = load i16, ptr %119, align 8, !tbaa !20
  %146 = add i16 %145, 1
  store i16 %146, ptr %119, align 8, !tbaa !20
  %.pre203 = load i32, ptr %120, align 16, !tbaa !18
  br label %147

147:                                              ; preds = %141, %137, %133
  %148 = phi i16 [ %146, %141 ], [ %134, %137 ], [ %134, %133 ]
  %149 = phi i32 [ %.pre203, %141 ], [ %135, %137 ], [ %135, %133 ]
  %150 = and i32 %149, 4
  %.not152 = icmp eq i32 %150, 0
  br i1 %.not152, label %161, label %151

151:                                              ; preds = %147
  %152 = getelementptr inbounds i8, ptr %118, i64 102
  %153 = load i16, ptr %152, align 2, !tbaa !28
  %154 = load i16, ptr %114, align 2, !tbaa !26
  %.not153 = icmp eq i16 %153, %154
  br i1 %.not153, label %161, label %155

155:                                              ; preds = %151
  %156 = zext i16 %154 to i32
  %157 = zext i16 %153 to i32
  %158 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.10, i32 noundef %116, i32 noundef %157, i32 noundef %156) #3
  %159 = load i16, ptr %119, align 8, !tbaa !20
  %160 = add i16 %159, 1
  store i16 %160, ptr %119, align 8, !tbaa !20
  br label %161

161:                                              ; preds = %155, %151, %147
  %162 = phi i16 [ %160, %155 ], [ %148, %151 ], [ %148, %147 ]
  %163 = add i16 %162, %.1127178
  %164 = add i16 %.5179, 1
  %165 = zext i16 %164 to i32
  %166 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %167 = icmp ugt i32 %166, %165
  br i1 %167, label %115, label %.thread, !llvm.loop !29

.thread:                                          ; preds = %161, %109, %92
  %.2128 = phi i16 [ -1, %92 ], [ 0, %109 ], [ %163, %161 ]
  %168 = call zeroext i8 @check_data_types() #3
  %169 = load i32, ptr %31, align 8, !tbaa !21
  %170 = zext i32 %169 to i64
  %171 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.11, i64 noundef %170) #3
  %172 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.12, i64 noundef %94) #3
  call void @print_coremarks(i64 noundef %94) #3
  %173 = call i32 @time_in_secs(i64 noundef %94) #3
  %174 = icmp ult i32 %173, 10
  br i1 %174, label %175, label %177

175:                                              ; preds = %.thread
  %176 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.13) #3
  br label %177

177:                                              ; preds = %175, %.thread
  %178 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.14, ptr noundef nonnull @.str.15) #3
  %179 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.16, i32 noundef %104) #3
  %180 = load i32, ptr %17, align 16, !tbaa !18
  %181 = and i32 %180, 1
  %.not = icmp ne i32 %181, 0
  %182 = load i32, ptr @default_num_contexts, align 4
  %183 = icmp ne i32 %182, 0
  %or.cond189 = select i1 %.not, i1 %183, i1 false
  br i1 %or.cond189, label %.lr.ph181, label %.loopexit169

.lr.ph181:                                        ; preds = %177
  %184 = getelementptr inbounds i8, ptr %3, i64 98
  br label %185

185:                                              ; preds = %.lr.ph181, %185
  %186 = phi i32 [ 0, %.lr.ph181 ], [ %191, %185 ]
  %.6180 = phi i16 [ 0, %.lr.ph181 ], [ %190, %185 ]
  %187 = load i16, ptr %184, align 2, !tbaa !25
  %188 = zext i16 %187 to i32
  %189 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.17, i32 noundef %186, i32 noundef %188) #3
  %190 = add i16 %.6180, 1
  %191 = zext i16 %190 to i32
  %192 = load i32, ptr @default_num_contexts, align 4
  %193 = icmp ugt i32 %192, %191
  br i1 %193, label %185, label %.loopexit169.loopexit, !llvm.loop !30

.loopexit169.loopexit:                            ; preds = %185
  %.pre204 = load i32, ptr %17, align 16, !tbaa !18
  br label %.loopexit169

.loopexit169:                                     ; preds = %.loopexit169.loopexit, %177
  %194 = phi i32 [ %192, %.loopexit169.loopexit ], [ %182, %177 ]
  %195 = phi i32 [ %.pre204, %.loopexit169.loopexit ], [ %180, %177 ]
  %196 = and i32 %195, 2
  %.not146 = icmp ne i32 %196, 0
  %197 = icmp ne i32 %194, 0
  %or.cond191 = select i1 %.not146, i1 %197, i1 false
  br i1 %or.cond191, label %.lr.ph183, label %.loopexit167

.lr.ph183:                                        ; preds = %.loopexit169
  %198 = getelementptr inbounds i8, ptr %3, i64 100
  br label %199

199:                                              ; preds = %.lr.ph183, %199
  %200 = phi i32 [ 0, %.lr.ph183 ], [ %205, %199 ]
  %.7182 = phi i16 [ 0, %.lr.ph183 ], [ %204, %199 ]
  %201 = load i16, ptr %198, align 4, !tbaa !27
  %202 = zext i16 %201 to i32
  %203 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.18, i32 noundef %200, i32 noundef %202) #3
  %204 = add i16 %.7182, 1
  %205 = zext i16 %204 to i32
  %206 = load i32, ptr @default_num_contexts, align 4
  %207 = icmp ugt i32 %206, %205
  br i1 %207, label %199, label %.loopexit167.loopexit, !llvm.loop !31

.loopexit167.loopexit:                            ; preds = %199
  %.pre205 = load i32, ptr %17, align 16, !tbaa !18
  br label %.loopexit167

.loopexit167:                                     ; preds = %.loopexit167.loopexit, %.loopexit169
  %208 = phi i32 [ %206, %.loopexit167.loopexit ], [ %194, %.loopexit169 ]
  %209 = phi i32 [ %.pre205, %.loopexit167.loopexit ], [ %195, %.loopexit169 ]
  %210 = and i32 %209, 4
  %.not147 = icmp ne i32 %210, 0
  %211 = icmp ne i32 %208, 0
  %or.cond193 = select i1 %.not147, i1 %211, i1 false
  br i1 %or.cond193, label %.lr.ph185, label %.loopexit

.lr.ph185:                                        ; preds = %.loopexit167
  %212 = getelementptr inbounds i8, ptr %3, i64 102
  br label %213

213:                                              ; preds = %.lr.ph185, %213
  %214 = phi i32 [ 0, %.lr.ph185 ], [ %219, %213 ]
  %.8184 = phi i16 [ 0, %.lr.ph185 ], [ %218, %213 ]
  %215 = load i16, ptr %212, align 2, !tbaa !28
  %216 = zext i16 %215 to i32
  %217 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.19, i32 noundef %214, i32 noundef %216) #3
  %218 = add i16 %.8184, 1
  %219 = zext i16 %218 to i32
  %220 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %221 = icmp ugt i32 %220, %219
  br i1 %221, label %213, label %.loopexit, !llvm.loop !32

.loopexit:                                        ; preds = %213, %.loopexit167
  %222 = phi i32 [ %208, %.loopexit167 ], [ %220, %213 ]
  %.not195 = icmp eq i32 %222, 0
  br i1 %.not195, label %._crit_edge, label %.lr.ph187

.lr.ph187:                                        ; preds = %.loopexit
  %223 = getelementptr inbounds i8, ptr %3, i64 96
  br label %224

224:                                              ; preds = %.lr.ph187, %224
  %225 = phi i32 [ 0, %.lr.ph187 ], [ %230, %224 ]
  %.9186 = phi i16 [ 0, %.lr.ph187 ], [ %229, %224 ]
  %226 = load i16, ptr %223, align 16, !tbaa !33
  %227 = zext i16 %226 to i32
  %228 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull @.str.20, i32 noundef %225, i32 noundef %227) #3
  %229 = add i16 %.9186, 1
  %230 = zext i16 %229 to i32
  %231 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %232 = icmp ugt i32 %231, %230
  br i1 %232, label %224, label %._crit_edge, !llvm.loop !34

._crit_edge:                                      ; preds = %224, %.loopexit
  %233 = zext i8 %168 to i16
  %234 = add i16 %.2128, %233
  %235 = icmp eq i16 %234, 0
  %236 = icmp sgt i16 %234, 0
  %.str.22..str.23 = select i1 %236, ptr @.str.22, ptr @.str.23
  %.str.22.sink = select i1 %235, ptr @.str.21, ptr %.str.22..str.23
  %237 = call i32 (ptr, ...) @ee_printf(ptr noundef nonnull %.str.22.sink) #3
  call void @portable_fini(ptr noundef nonnull %5) #3
  call void @llvm.lifetime.end.p0(i64 2000, ptr nonnull %4) #3
  call void @llvm.lifetime.end.p0(i64 112, ptr nonnull %3) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %1) #3
  ret i32 0
}

declare void @portable_init(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @get_seed_32(i32 noundef) local_unnamed_addr #2

declare ptr @core_list_init(i32 noundef, ptr noundef, i16 noundef signext) local_unnamed_addr #2

declare i32 @core_init_matrix(i32 noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

declare void @core_init_state(i32 noundef, i16 noundef signext, ptr noundef) local_unnamed_addr #2

declare void @start_time() local_unnamed_addr #2

declare void @stop_time() local_unnamed_addr #2

declare i32 @time_in_secs(i64 noundef) local_unnamed_addr #2

declare i64 @get_time() local_unnamed_addr #2

declare zeroext i16 @crc16(i16 noundef signext, i16 noundef zeroext) local_unnamed_addr #2

declare i32 @ee_printf(ptr noundef, ...) local_unnamed_addr #2

declare zeroext i8 @check_data_types() local_unnamed_addr #2

declare void @print_coremarks(i64 noundef) local_unnamed_addr #2

declare void @portable_fini(ptr noundef) local_unnamed_addr #2

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

!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, !11, i64 0}
!10 = !{!"RESULTS_S", !11, i64 0, !11, i64 2, !11, i64 4, !7, i64 8, !6, i64 40, !6, i64 44, !6, i64 48, !12, i64 56, !13, i64 64, !11, i64 96, !11, i64 98, !11, i64 100, !11, i64 102, !11, i64 104, !14, i64 106}
!11 = !{!"short", !7, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!"MAT_PARAMS_S", !6, i64 0, !12, i64 8, !12, i64 16, !12, i64 24}
!14 = !{!"CORE_PORTABLE_S", !7, i64 0}
!15 = !{!10, !11, i64 2}
!16 = !{!10, !11, i64 4}
!17 = !{!10, !6, i64 44}
!18 = !{!10, !6, i64 48}
!19 = !{!12, !12, i64 0}
!20 = !{!10, !11, i64 104}
!21 = !{!10, !6, i64 40}
!22 = !{!10, !12, i64 56}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!10, !11, i64 98}
!26 = !{!11, !11, i64 0}
!27 = !{!10, !11, i64 100}
!28 = !{!10, !11, i64 102}
!29 = distinct !{!29, !24}
!30 = distinct !{!30, !24}
!31 = distinct !{!31, !24}
!32 = distinct !{!32, !24}
!33 = !{!10, !11, i64 96}
!34 = distinct !{!34, !24}


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