; LLVM IR from gaoshanlee193/riscv-vector4wireless-extension :: toolchain/benchmark/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 }

@static_memblk = external dso_local global [2000 x i8], align 16
@.str.3 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.8 = 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.9 = external hidden unnamed_addr constant [47 x i8], align 1
@matrix_known_crc = external hidden global [5 x i16], align 2
@.str.10 = external hidden unnamed_addr constant [49 x i8], align 1
@state_known_crc = external hidden global [5 x i16], align 2
@.str.11 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [96 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.33 = 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 i32, align 4
  %11 = alloca [1 x %struct.RESULTS_S], align 16
  %12 = alloca i32, align 4
  %13 = alloca double, align 8
  %14 = 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 4, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 112, ptr %11) #3
  %15 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %16 = getelementptr inbounds %struct.RESULTS_S, ptr %15, i32 0, i32 14
  %17 = getelementptr inbounds [1 x ptr], ptr %3, i64 0, i64 0
  call void @portable_init(ptr noundef %16, ptr noundef %2, ptr noundef %17)
  %18 = call i32 @get_seed_32(i32 noundef 1)
  %19 = trunc i32 %18 to i16
  %20 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %21 = getelementptr inbounds %struct.RESULTS_S, ptr %20, i32 0, i32 0
  store i16 %19, ptr %21, align 16, !tbaa !11
  %22 = call i32 @get_seed_32(i32 noundef 2)
  %23 = trunc i32 %22 to i16
  %24 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %25 = getelementptr inbounds %struct.RESULTS_S, ptr %24, i32 0, i32 1
  store i16 %23, ptr %25, align 2, !tbaa !16
  %26 = call i32 @get_seed_32(i32 noundef 3)
  %27 = trunc i32 %26 to i16
  %28 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %29 = getelementptr inbounds %struct.RESULTS_S, ptr %28, i32 0, i32 2
  store i16 %27, ptr %29, align 4, !tbaa !17
  %30 = call i32 @get_seed_32(i32 noundef 4)
  %31 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %32 = getelementptr inbounds %struct.RESULTS_S, ptr %31, i32 0, i32 5
  store i32 %30, ptr %32, align 4, !tbaa !18
  %33 = call i32 @get_seed_32(i32 noundef 5)
  %34 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %35 = getelementptr inbounds %struct.RESULTS_S, ptr %34, i32 0, i32 6
  store i32 %33, ptr %35, align 16, !tbaa !19
  %36 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %37 = getelementptr inbounds %struct.RESULTS_S, ptr %36, i32 0, i32 6
  %38 = load i32, ptr %37, align 16, !tbaa !19
  %39 = icmp eq i32 %38, 0
  br i1 %39, label %40, label %43

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

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

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

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

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

68:                                               ; preds = %61, %55, %49, %43
  %69 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %70 = getelementptr inbounds %struct.RESULTS_S, ptr %69, i32 0, i32 0
  %71 = load i16, ptr %70, align 16, !tbaa !11
  %72 = sext i16 %71 to i32
  %73 = icmp eq i32 %72, 1
  br i1 %73, label %74, label %93

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

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

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

93:                                               ; preds = %86, %80, %74, %68
  %94 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %95 = getelementptr inbounds %struct.RESULTS_S, ptr %94, i32 0, i32 3
  %96 = getelementptr inbounds [4 x ptr], ptr %95, i64 0, i64 0
  store ptr @static_memblk, ptr %96, align 8, !tbaa !20
  %97 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %98 = getelementptr inbounds %struct.RESULTS_S, ptr %97, i32 0, i32 4
  store i32 2000, ptr %98, align 8, !tbaa !21
  %99 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %100 = getelementptr inbounds %struct.RESULTS_S, ptr %99, i32 0, i32 13
  store i16 0, ptr %100, align 8, !tbaa !22
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %101

101:                                              ; preds = %118, %93
  %102 = load i16, ptr %4, align 2, !tbaa !9
  %103 = zext i16 %102 to i32
  %104 = icmp slt i32 %103, 3
  br i1 %104, label %105, label %121

105:                                              ; preds = %101
  %106 = load i16, ptr %4, align 2, !tbaa !9
  %107 = zext i16 %106 to i32
  %108 = shl i32 1, %107
  %109 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %110 = getelementptr inbounds %struct.RESULTS_S, ptr %109, i32 0, i32 6
  %111 = load i32, ptr %110, align 16, !tbaa !19
  %112 = and i32 %108, %111
  %113 = icmp ne i32 %112, 0
  br i1 %113, label %114, label %117

114:                                              ; preds = %105
  %115 = load i16, ptr %6, align 2, !tbaa !9
  %116 = add i16 %115, 1
  store i16 %116, ptr %6, align 2, !tbaa !9
  br label %117

117:                                              ; preds = %114, %105
  br label %118

118:                                              ; preds = %117
  %119 = load i16, ptr %4, align 2, !tbaa !9
  %120 = add i16 %119, 1
  store i16 %120, ptr %4, align 2, !tbaa !9
  br label %101, !llvm.loop !23

121:                                              ; preds = %101
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %122

122:                                              ; preds = %139, %121
  %123 = load i16, ptr %4, align 2, !tbaa !9
  %124 = zext i16 %123 to i32
  %125 = icmp slt i32 %124, 1
  br i1 %125, label %126, label %142

126:                                              ; preds = %122
  %127 = load i16, ptr %4, align 2, !tbaa !9
  %128 = zext i16 %127 to i64
  %129 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %128
  %130 = getelementptr inbounds %struct.RESULTS_S, ptr %129, i32 0, i32 4
  %131 = load i32, ptr %130, align 8, !tbaa !21
  %132 = load i16, ptr %6, align 2, !tbaa !9
  %133 = zext i16 %132 to i32
  %134 = udiv i32 %131, %133
  %135 = load i16, ptr %4, align 2, !tbaa !9
  %136 = zext i16 %135 to i64
  %137 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %136
  %138 = getelementptr inbounds %struct.RESULTS_S, ptr %137, i32 0, i32 4
  store i32 %134, ptr %138, align 8, !tbaa !21
  br label %139

139:                                              ; preds = %126
  %140 = load i16, ptr %4, align 2, !tbaa !9
  %141 = add i16 %140, 1
  store i16 %141, ptr %4, align 2, !tbaa !9
  br label %122, !llvm.loop !25

142:                                              ; preds = %122
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %143

143:                                              ; preds = %191, %142
  %144 = load i16, ptr %4, align 2, !tbaa !9
  %145 = zext i16 %144 to i32
  %146 = icmp slt i32 %145, 3
  br i1 %146, label %147, label %194

147:                                              ; preds = %143
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  %148 = load i16, ptr %4, align 2, !tbaa !9
  %149 = zext i16 %148 to i32
  %150 = shl i32 1, %149
  %151 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %152 = getelementptr inbounds %struct.RESULTS_S, ptr %151, i32 0, i32 6
  %153 = load i32, ptr %152, align 16, !tbaa !19
  %154 = and i32 %150, %153
  %155 = icmp ne i32 %154, 0
  br i1 %155, label %156, label %190

156:                                              ; preds = %147
  store i32 0, ptr %12, align 4, !tbaa !5
  br label %157

157:                                              ; preds = %184, %156
  %158 = load i32, ptr %12, align 4, !tbaa !5
  %159 = icmp ult i32 %158, 1
  br i1 %159, label %160, label %187

160:                                              ; preds = %157
  %161 = load i32, ptr %12, align 4, !tbaa !5
  %162 = zext i32 %161 to i64
  %163 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %162
  %164 = getelementptr inbounds %struct.RESULTS_S, ptr %163, i32 0, i32 3
  %165 = getelementptr inbounds [4 x ptr], ptr %164, i64 0, i64 0
  %166 = load ptr, ptr %165, align 8, !tbaa !20
  %167 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %168 = getelementptr inbounds %struct.RESULTS_S, ptr %167, i32 0, i32 4
  %169 = load i32, ptr %168, align 8, !tbaa !21
  %170 = load i16, ptr %5, align 2, !tbaa !9
  %171 = zext i16 %170 to i32
  %172 = mul i32 %169, %171
  %173 = zext i32 %172 to i64
  %174 = getelementptr inbounds i8, ptr %166, i64 %173
  %175 = load i32, ptr %12, align 4, !tbaa !5
  %176 = zext i32 %175 to i64
  %177 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %176
  %178 = getelementptr inbounds %struct.RESULTS_S, ptr %177, i32 0, i32 3
  %179 = load i16, ptr %4, align 2, !tbaa !9
  %180 = zext i16 %179 to i32
  %181 = add nsw i32 %180, 1
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds [4 x ptr], ptr %178, i64 0, i64 %182
  store ptr %174, ptr %183, align 8, !tbaa !20
  br label %184

184:                                              ; preds = %160
  %185 = load i32, ptr %12, align 4, !tbaa !5
  %186 = add i32 %185, 1
  store i32 %186, ptr %12, align 4, !tbaa !5
  br label %157, !llvm.loop !26

187:                                              ; preds = %157
  %188 = load i16, ptr %5, align 2, !tbaa !9
  %189 = add i16 %188, 1
  store i16 %189, ptr %5, align 2, !tbaa !9
  br label %190

190:                                              ; preds = %187, %147
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  br label %191

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

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

195:                                              ; preds = %288, %194
  %196 = load i16, ptr %4, align 2, !tbaa !9
  %197 = zext i16 %196 to i32
  %198 = icmp slt i32 %197, 1
  br i1 %198, label %199, label %291

199:                                              ; preds = %195
  %200 = load i16, ptr %4, align 2, !tbaa !9
  %201 = zext i16 %200 to i64
  %202 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %201
  %203 = getelementptr inbounds %struct.RESULTS_S, ptr %202, i32 0, i32 6
  %204 = load i32, ptr %203, align 16, !tbaa !19
  %205 = and i32 %204, 1
  %206 = icmp ne i32 %205, 0
  br i1 %206, label %207, label %227

207:                                              ; preds = %199
  %208 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %209 = getelementptr inbounds %struct.RESULTS_S, ptr %208, i32 0, i32 4
  %210 = load i32, ptr %209, align 8, !tbaa !21
  %211 = load i16, ptr %4, align 2, !tbaa !9
  %212 = zext i16 %211 to i64
  %213 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %212
  %214 = getelementptr inbounds %struct.RESULTS_S, ptr %213, i32 0, i32 3
  %215 = getelementptr inbounds [4 x ptr], ptr %214, i64 0, i64 1
  %216 = load ptr, ptr %215, align 8, !tbaa !20
  %217 = load i16, ptr %4, align 2, !tbaa !9
  %218 = zext i16 %217 to i64
  %219 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %218
  %220 = getelementptr inbounds %struct.RESULTS_S, ptr %219, i32 0, i32 0
  %221 = load i16, ptr %220, align 16, !tbaa !11
  %222 = call ptr @core_list_init(i32 noundef %210, ptr noundef %216, i16 noundef signext %221)
  %223 = load i16, ptr %4, align 2, !tbaa !9
  %224 = zext i16 %223 to i64
  %225 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %224
  %226 = getelementptr inbounds %struct.RESULTS_S, ptr %225, i32 0, i32 7
  store ptr %222, ptr %226, align 8, !tbaa !28
  br label %227

227:                                              ; preds = %207, %199
  %228 = load i16, ptr %4, align 2, !tbaa !9
  %229 = zext i16 %228 to i64
  %230 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %229
  %231 = getelementptr inbounds %struct.RESULTS_S, ptr %230, i32 0, i32 6
  %232 = load i32, ptr %231, align 16, !tbaa !19
  %233 = and i32 %232, 2
  %234 = icmp ne i32 %233, 0
  br i1 %234, label %235, label %264

235:                                              ; preds = %227
  %236 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %237 = getelementptr inbounds %struct.RESULTS_S, ptr %236, i32 0, i32 4
  %238 = load i32, ptr %237, align 8, !tbaa !21
  %239 = load i16, ptr %4, align 2, !tbaa !9
  %240 = zext i16 %239 to i64
  %241 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %240
  %242 = getelementptr inbounds %struct.RESULTS_S, ptr %241, i32 0, i32 3
  %243 = getelementptr inbounds [4 x ptr], ptr %242, i64 0, i64 2
  %244 = load ptr, ptr %243, align 8, !tbaa !20
  %245 = load i16, ptr %4, align 2, !tbaa !9
  %246 = zext i16 %245 to i64
  %247 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %246
  %248 = getelementptr inbounds %struct.RESULTS_S, ptr %247, i32 0, i32 0
  %249 = load i16, ptr %248, align 16, !tbaa !11
  %250 = sext i16 %249 to i32
  %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 1
  %255 = load i16, ptr %254, align 2, !tbaa !16
  %256 = sext i16 %255 to i32
  %257 = shl i32 %256, 16
  %258 = or i32 %250, %257
  %259 = load i16, ptr %4, align 2, !tbaa !9
  %260 = zext i16 %259 to i64
  %261 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %260
  %262 = getelementptr inbounds %struct.RESULTS_S, ptr %261, i32 0, i32 8
  %263 = call i32 @core_init_matrix(i32 noundef %238, ptr noundef %244, i32 noundef %258, ptr noundef %262)
  br label %264

264:                                              ; preds = %235, %227
  %265 = load i16, ptr %4, align 2, !tbaa !9
  %266 = zext i16 %265 to i64
  %267 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %266
  %268 = getelementptr inbounds %struct.RESULTS_S, ptr %267, i32 0, i32 6
  %269 = load i32, ptr %268, align 16, !tbaa !19
  %270 = and i32 %269, 4
  %271 = icmp ne i32 %270, 0
  br i1 %271, label %272, label %287

272:                                              ; preds = %264
  %273 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %274 = getelementptr inbounds %struct.RESULTS_S, ptr %273, i32 0, i32 4
  %275 = load i32, ptr %274, align 8, !tbaa !21
  %276 = load i16, ptr %4, align 2, !tbaa !9
  %277 = zext i16 %276 to i64
  %278 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %277
  %279 = getelementptr inbounds %struct.RESULTS_S, ptr %278, i32 0, i32 0
  %280 = load i16, ptr %279, align 16, !tbaa !11
  %281 = load i16, ptr %4, align 2, !tbaa !9
  %282 = zext i16 %281 to i64
  %283 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %282
  %284 = getelementptr inbounds %struct.RESULTS_S, ptr %283, i32 0, i32 3
  %285 = getelementptr inbounds [4 x ptr], ptr %284, i64 0, i64 3
  %286 = load ptr, ptr %285, align 8, !tbaa !20
  call void @core_init_state(i32 noundef %275, i16 noundef signext %280, ptr noundef %286)
  br label %287

287:                                              ; preds = %272, %264
  br label %288

288:                                              ; preds = %287
  %289 = load i16, ptr %4, align 2, !tbaa !9
  %290 = add i16 %289, 1
  store i16 %290, ptr %4, align 2, !tbaa !9
  br label %195, !llvm.loop !29

291:                                              ; preds = %195
  %292 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %293 = getelementptr inbounds %struct.RESULTS_S, ptr %292, i32 0, i32 5
  %294 = load i32, ptr %293, align 4, !tbaa !18
  %295 = icmp eq i32 %294, 0
  br i1 %295, label %296, label %325

296:                                              ; preds = %291
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  store double 0.000000e+00, ptr %13, align 8, !tbaa !30
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  %297 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %298 = getelementptr inbounds %struct.RESULTS_S, ptr %297, i32 0, i32 5
  store i32 1, ptr %298, align 4, !tbaa !18
  br label %299

299:                                              ; preds = %302, %296
  %300 = load double, ptr %13, align 8, !tbaa !30
  %301 = fcmp olt double %300, 1.000000e+00
  br i1 %301, label %302, label %311

302:                                              ; preds = %299
  %303 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %304 = getelementptr inbounds %struct.RESULTS_S, ptr %303, i32 0, i32 5
  %305 = load i32, ptr %304, align 4, !tbaa !18
  %306 = mul i32 %305, 10
  store i32 %306, ptr %304, align 4, !tbaa !18
  call void @start_time()
  %307 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %308 = call ptr @iterate(ptr noundef %307)
  call void @stop_time()
  %309 = call i32 @get_time()
  %310 = call double @time_in_secs(i32 noundef %309)
  store double %310, ptr %13, align 8, !tbaa !30
  br label %299, !llvm.loop !32

311:                                              ; preds = %299
  %312 = load double, ptr %13, align 8, !tbaa !30
  %313 = fptoui double %312 to i32
  store i32 %313, ptr %14, align 4, !tbaa !5
  %314 = load i32, ptr %14, align 4, !tbaa !5
  %315 = icmp eq i32 %314, 0
  br i1 %315, label %316, label %317

316:                                              ; preds = %311
  store i32 1, ptr %14, align 4, !tbaa !5
  br label %317

317:                                              ; preds = %316, %311
  %318 = load i32, ptr %14, align 4, !tbaa !5
  %319 = udiv i32 10, %318
  %320 = add i32 1, %319
  %321 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %322 = getelementptr inbounds %struct.RESULTS_S, ptr %321, i32 0, i32 5
  %323 = load i32, ptr %322, align 4, !tbaa !18
  %324 = mul i32 %323, %320
  store i32 %324, ptr %322, align 4, !tbaa !18
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  br label %325

325:                                              ; preds = %317, %291
  call void @start_time()
  %326 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %327 = call ptr @iterate(ptr noundef %326)
  call void @stop_time()
  %328 = call i32 @get_time()
  store i32 %328, ptr %10, align 4, !tbaa !5
  %329 = call i32 @get_start_time()
  %330 = call i32 @get_stop_time()
  %331 = call i32 (ptr, ...) @printf(ptr noundef @.str.3, i32 noundef %329, i32 noundef %330)
  %332 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %333 = getelementptr inbounds %struct.RESULTS_S, ptr %332, i32 0, i32 0
  %334 = load i16, ptr %333, align 16, !tbaa !11
  %335 = load i16, ptr %9, align 2, !tbaa !9
  %336 = call zeroext i16 @crc16(i16 noundef signext %334, i16 noundef zeroext %335)
  store i16 %336, ptr %9, align 2, !tbaa !9
  %337 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %338 = getelementptr inbounds %struct.RESULTS_S, ptr %337, i32 0, i32 1
  %339 = load i16, ptr %338, align 2, !tbaa !16
  %340 = load i16, ptr %9, align 2, !tbaa !9
  %341 = call zeroext i16 @crc16(i16 noundef signext %339, i16 noundef zeroext %340)
  store i16 %341, ptr %9, align 2, !tbaa !9
  %342 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %343 = getelementptr inbounds %struct.RESULTS_S, ptr %342, i32 0, i32 2
  %344 = load i16, ptr %343, align 4, !tbaa !17
  %345 = load i16, ptr %9, align 2, !tbaa !9
  %346 = call zeroext i16 @crc16(i16 noundef signext %344, i16 noundef zeroext %345)
  store i16 %346, ptr %9, align 2, !tbaa !9
  %347 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %348 = getelementptr inbounds %struct.RESULTS_S, ptr %347, i32 0, i32 4
  %349 = load i32, ptr %348, align 8, !tbaa !21
  %350 = trunc i32 %349 to i16
  %351 = load i16, ptr %9, align 2, !tbaa !9
  %352 = call zeroext i16 @crc16(i16 noundef signext %350, i16 noundef zeroext %351)
  store i16 %352, ptr %9, align 2, !tbaa !9
  %353 = load i16, ptr %9, align 2, !tbaa !9
  %354 = zext i16 %353 to i32
  switch i32 %354, label %365 [
    i32 35330, label %355
    i32 31493, label %357
    i32 20143, label %359
    i32 59893, label %361
    i32 6386, label %363
  ]

355:                                              ; preds = %325
  store i16 0, ptr %7, align 2, !tbaa !9
  %356 = call i32 (ptr, ...) @printf(ptr noundef @.str.4)
  br label %366

357:                                              ; preds = %325
  store i16 1, ptr %7, align 2, !tbaa !9
  %358 = call i32 (ptr, ...) @printf(ptr noundef @.str.5)
  br label %366

359:                                              ; preds = %325
  store i16 2, ptr %7, align 2, !tbaa !9
  %360 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  br label %366

361:                                              ; preds = %325
  store i16 3, ptr %7, align 2, !tbaa !9
  %362 = call i32 (ptr, ...) @printf(ptr noundef @.str.7)
  br label %366

363:                                              ; preds = %325
  store i16 4, ptr %7, align 2, !tbaa !9
  %364 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  br label %366

365:                                              ; preds = %325
  store i16 -1, ptr %8, align 2, !tbaa !9
  br label %366

366:                                              ; preds = %365, %363, %361, %359, %357, %355
  %367 = load i16, ptr %7, align 2, !tbaa !9
  %368 = sext i16 %367 to i32
  %369 = icmp sge i32 %368, 0
  br i1 %369, label %370, label %521

370:                                              ; preds = %366
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %371

371:                                              ; preds = %517, %370
  %372 = load i16, ptr %4, align 2, !tbaa !9
  %373 = zext i16 %372 to i32
  %374 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %375 = icmp ult i32 %373, %374
  br i1 %375, label %376, label %520

376:                                              ; preds = %371
  %377 = load i16, ptr %4, align 2, !tbaa !9
  %378 = zext i16 %377 to i64
  %379 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %378
  %380 = getelementptr inbounds %struct.RESULTS_S, ptr %379, i32 0, i32 13
  store i16 0, ptr %380, align 8, !tbaa !22
  %381 = load i16, ptr %4, align 2, !tbaa !9
  %382 = zext i16 %381 to i64
  %383 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %382
  %384 = getelementptr inbounds %struct.RESULTS_S, ptr %383, i32 0, i32 6
  %385 = load i32, ptr %384, align 16, !tbaa !19
  %386 = and i32 %385, 1
  %387 = icmp ne i32 %386, 0
  br i1 %387, label %388, label %422

388:                                              ; preds = %376
  %389 = load i16, ptr %4, align 2, !tbaa !9
  %390 = zext i16 %389 to i64
  %391 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %390
  %392 = getelementptr inbounds %struct.RESULTS_S, ptr %391, i32 0, i32 10
  %393 = load i16, ptr %392, align 2, !tbaa !33
  %394 = zext i16 %393 to i32
  %395 = load i16, ptr %7, align 2, !tbaa !9
  %396 = sext i16 %395 to i64
  %397 = getelementptr inbounds [5 x i16], ptr @list_known_crc, i64 0, i64 %396
  %398 = load i16, ptr %397, align 2, !tbaa !9
  %399 = zext i16 %398 to i32
  %400 = icmp ne i32 %394, %399
  br i1 %400, label %401, label %422

401:                                              ; preds = %388
  %402 = load i16, ptr %4, align 2, !tbaa !9
  %403 = zext i16 %402 to i32
  %404 = load i16, ptr %4, align 2, !tbaa !9
  %405 = zext i16 %404 to i64
  %406 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %405
  %407 = getelementptr inbounds %struct.RESULTS_S, ptr %406, i32 0, i32 10
  %408 = load i16, ptr %407, align 2, !tbaa !33
  %409 = zext i16 %408 to i32
  %410 = load i16, ptr %7, align 2, !tbaa !9
  %411 = sext i16 %410 to i64
  %412 = getelementptr inbounds [5 x i16], ptr @list_known_crc, i64 0, i64 %411
  %413 = load i16, ptr %412, align 2, !tbaa !9
  %414 = zext i16 %413 to i32
  %415 = call i32 (ptr, ...) @printf(ptr noundef @.str.9, i32 noundef %403, i32 noundef %409, i32 noundef %414)
  %416 = load i16, ptr %4, align 2, !tbaa !9
  %417 = zext i16 %416 to i64
  %418 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %417
  %419 = getelementptr inbounds %struct.RESULTS_S, ptr %418, i32 0, i32 13
  %420 = load i16, ptr %419, align 8, !tbaa !22
  %421 = add i16 %420, 1
  store i16 %421, ptr %419, align 8, !tbaa !22
  br label %422

422:                                              ; preds = %401, %388, %376
  %423 = load i16, ptr %4, align 2, !tbaa !9
  %424 = zext i16 %423 to i64
  %425 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %424
  %426 = getelementptr inbounds %struct.RESULTS_S, ptr %425, i32 0, i32 6
  %427 = load i32, ptr %426, align 16, !tbaa !19
  %428 = and i32 %427, 2
  %429 = icmp ne i32 %428, 0
  br i1 %429, label %430, label %464

430:                                              ; preds = %422
  %431 = load i16, ptr %4, align 2, !tbaa !9
  %432 = zext i16 %431 to i64
  %433 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %432
  %434 = getelementptr inbounds %struct.RESULTS_S, ptr %433, i32 0, i32 11
  %435 = load i16, ptr %434, align 4, !tbaa !34
  %436 = zext i16 %435 to i32
  %437 = load i16, ptr %7, align 2, !tbaa !9
  %438 = sext i16 %437 to i64
  %439 = getelementptr inbounds [5 x i16], ptr @matrix_known_crc, i64 0, i64 %438
  %440 = load i16, ptr %439, align 2, !tbaa !9
  %441 = zext i16 %440 to i32
  %442 = icmp ne i32 %436, %441
  br i1 %442, label %443, label %464

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

464:                                              ; preds = %443, %430, %422
  %465 = load i16, ptr %4, align 2, !tbaa !9
  %466 = zext i16 %465 to i64
  %467 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %466
  %468 = getelementptr inbounds %struct.RESULTS_S, ptr %467, i32 0, i32 6
  %469 = load i32, ptr %468, align 16, !tbaa !19
  %470 = and i32 %469, 4
  %471 = icmp ne i32 %470, 0
  br i1 %471, label %472, label %506

472:                                              ; preds = %464
  %473 = load i16, ptr %4, align 2, !tbaa !9
  %474 = zext i16 %473 to i64
  %475 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %474
  %476 = getelementptr inbounds %struct.RESULTS_S, ptr %475, i32 0, i32 12
  %477 = load i16, ptr %476, align 2, !tbaa !35
  %478 = zext i16 %477 to i32
  %479 = load i16, ptr %7, align 2, !tbaa !9
  %480 = sext i16 %479 to i64
  %481 = getelementptr inbounds [5 x i16], ptr @state_known_crc, i64 0, i64 %480
  %482 = load i16, ptr %481, align 2, !tbaa !9
  %483 = zext i16 %482 to i32
  %484 = icmp ne i32 %478, %483
  br i1 %484, label %485, label %506

485:                                              ; preds = %472
  %486 = load i16, ptr %4, align 2, !tbaa !9
  %487 = zext i16 %486 to i32
  %488 = load i16, ptr %4, align 2, !tbaa !9
  %489 = zext i16 %488 to i64
  %490 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %489
  %491 = getelementptr inbounds %struct.RESULTS_S, ptr %490, i32 0, i32 12
  %492 = load i16, ptr %491, align 2, !tbaa !35
  %493 = zext i16 %492 to i32
  %494 = load i16, ptr %7, align 2, !tbaa !9
  %495 = sext i16 %494 to i64
  %496 = getelementptr inbounds [5 x i16], ptr @state_known_crc, i64 0, i64 %495
  %497 = load i16, ptr %496, align 2, !tbaa !9
  %498 = zext i16 %497 to i32
  %499 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, i32 noundef %487, i32 noundef %493, i32 noundef %498)
  %500 = load i16, ptr %4, align 2, !tbaa !9
  %501 = zext i16 %500 to i64
  %502 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %501
  %503 = getelementptr inbounds %struct.RESULTS_S, ptr %502, i32 0, i32 13
  %504 = load i16, ptr %503, align 8, !tbaa !22
  %505 = add i16 %504, 1
  store i16 %505, ptr %503, align 8, !tbaa !22
  br label %506

506:                                              ; preds = %485, %472, %464
  %507 = load i16, ptr %4, align 2, !tbaa !9
  %508 = zext i16 %507 to i64
  %509 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %508
  %510 = getelementptr inbounds %struct.RESULTS_S, ptr %509, i32 0, i32 13
  %511 = load i16, ptr %510, align 8, !tbaa !22
  %512 = sext i16 %511 to i32
  %513 = load i16, ptr %8, align 2, !tbaa !9
  %514 = sext i16 %513 to i32
  %515 = add nsw i32 %514, %512
  %516 = trunc i32 %515 to i16
  store i16 %516, ptr %8, align 2, !tbaa !9
  br label %517

517:                                              ; preds = %506
  %518 = load i16, ptr %4, align 2, !tbaa !9
  %519 = add i16 %518, 1
  store i16 %519, ptr %4, align 2, !tbaa !9
  br label %371, !llvm.loop !36

520:                                              ; preds = %371
  br label %521

521:                                              ; preds = %520, %366
  %522 = call zeroext i8 @check_data_types()
  %523 = zext i8 %522 to i32
  %524 = load i16, ptr %8, align 2, !tbaa !9
  %525 = sext i16 %524 to i32
  %526 = add nsw i32 %525, %523
  %527 = trunc i32 %526 to i16
  store i16 %527, ptr %8, align 2, !tbaa !9
  %528 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %529 = getelementptr inbounds %struct.RESULTS_S, ptr %528, i32 0, i32 4
  %530 = load i32, ptr %529, align 8, !tbaa !21
  %531 = zext i32 %530 to i64
  %532 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, i64 noundef %531)
  %533 = load i32, ptr %10, align 4, !tbaa !5
  %534 = zext i32 %533 to i64
  %535 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, i64 noundef %534)
  %536 = load i32, ptr %10, align 4, !tbaa !5
  %537 = call double @time_in_secs(i32 noundef %536)
  %538 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %537)
  %539 = load i32, ptr %10, align 4, !tbaa !5
  %540 = call double @time_in_secs(i32 noundef %539)
  %541 = fcmp ogt double %540, 0.000000e+00
  br i1 %541, label %542, label %553

542:                                              ; preds = %521
  %543 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %544 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %545 = getelementptr inbounds %struct.RESULTS_S, ptr %544, i32 0, i32 5
  %546 = load i32, ptr %545, align 4, !tbaa !18
  %547 = mul i32 %543, %546
  %548 = uitofp i32 %547 to double
  %549 = load i32, ptr %10, align 4, !tbaa !5
  %550 = call double @time_in_secs(i32 noundef %549)
  %551 = fdiv double %548, %550
  %552 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, double noundef %551)
  br label %553

553:                                              ; preds = %542, %521
  %554 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %555 = zext i32 %554 to i64
  %556 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %557 = getelementptr inbounds %struct.RESULTS_S, ptr %556, i32 0, i32 5
  %558 = load i32, ptr %557, align 4, !tbaa !18
  %559 = zext i32 %558 to i64
  %560 = mul i64 %555, %559
  %561 = call i32 (ptr, ...) @printf(ptr noundef @.str.16, i64 noundef %560)
  %562 = call i32 (ptr, ...) @printf(ptr noundef @.str.17, ptr noundef @.str.18)
  %563 = call i32 (ptr, ...) @printf(ptr noundef @.str.19, ptr noundef @.str.20)
  %564 = call i32 (ptr, ...) @printf(ptr noundef @.str.21, ptr noundef @.str.22)
  %565 = load i16, ptr %9, align 2, !tbaa !9
  %566 = zext i16 %565 to i32
  %567 = call i32 (ptr, ...) @printf(ptr noundef @.str.23, i32 noundef %566)
  %568 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %569 = getelementptr inbounds %struct.RESULTS_S, ptr %568, i32 0, i32 6
  %570 = load i32, ptr %569, align 16, !tbaa !19
  %571 = and i32 %570, 1
  %572 = icmp ne i32 %571, 0
  br i1 %572, label %573, label %593

573:                                              ; preds = %553
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %574

574:                                              ; preds = %589, %573
  %575 = load i16, ptr %4, align 2, !tbaa !9
  %576 = zext i16 %575 to i32
  %577 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %578 = icmp ult i32 %576, %577
  br i1 %578, label %579, label %592

579:                                              ; preds = %574
  %580 = load i16, ptr %4, align 2, !tbaa !9
  %581 = zext i16 %580 to i32
  %582 = load i16, ptr %4, align 2, !tbaa !9
  %583 = zext i16 %582 to i64
  %584 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %583
  %585 = getelementptr inbounds %struct.RESULTS_S, ptr %584, i32 0, i32 10
  %586 = load i16, ptr %585, align 2, !tbaa !33
  %587 = zext i16 %586 to i32
  %588 = call i32 (ptr, ...) @printf(ptr noundef @.str.24, i32 noundef %581, i32 noundef %587)
  br label %589

589:                                              ; preds = %579
  %590 = load i16, ptr %4, align 2, !tbaa !9
  %591 = add i16 %590, 1
  store i16 %591, ptr %4, align 2, !tbaa !9
  br label %574, !llvm.loop !37

592:                                              ; preds = %574
  br label %593

593:                                              ; preds = %592, %553
  %594 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %595 = getelementptr inbounds %struct.RESULTS_S, ptr %594, i32 0, i32 6
  %596 = load i32, ptr %595, align 16, !tbaa !19
  %597 = and i32 %596, 2
  %598 = icmp ne i32 %597, 0
  br i1 %598, label %599, label %619

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

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

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

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

618:                                              ; preds = %600
  br label %619

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

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

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

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

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

644:                                              ; preds = %626
  br label %645

645:                                              ; preds = %644, %619
  store i16 0, ptr %4, align 2, !tbaa !9
  br label %646

646:                                              ; preds = %661, %645
  %647 = load i16, ptr %4, align 2, !tbaa !9
  %648 = zext i16 %647 to i32
  %649 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %650 = icmp ult i32 %648, %649
  br i1 %650, label %651, label %664

651:                                              ; preds = %646
  %652 = load i16, ptr %4, align 2, !tbaa !9
  %653 = zext i16 %652 to i32
  %654 = load i16, ptr %4, align 2, !tbaa !9
  %655 = zext i16 %654 to i64
  %656 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 %655
  %657 = getelementptr inbounds %struct.RESULTS_S, ptr %656, i32 0, i32 9
  %658 = load i16, ptr %657, align 16, !tbaa !40
  %659 = zext i16 %658 to i32
  %660 = call i32 (ptr, ...) @printf(ptr noundef @.str.27, i32 noundef %653, i32 noundef %659)
  br label %661

661:                                              ; preds = %651
  %662 = load i16, ptr %4, align 2, !tbaa !9
  %663 = add i16 %662, 1
  store i16 %663, ptr %4, align 2, !tbaa !9
  br label %646, !llvm.loop !41

664:                                              ; preds = %646
  %665 = load i16, ptr %8, align 2, !tbaa !9
  %666 = sext i16 %665 to i32
  %667 = icmp eq i32 %666, 0
  br i1 %667, label %668, label %687

668:                                              ; preds = %664
  %669 = call i32 (ptr, ...) @printf(ptr noundef @.str.28)
  %670 = load i16, ptr %7, align 2, !tbaa !9
  %671 = sext i16 %670 to i32
  %672 = icmp eq i32 %671, 3
  br i1 %672, label %673, label %686

673:                                              ; preds = %668
  %674 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %675 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %676 = getelementptr inbounds %struct.RESULTS_S, ptr %675, i32 0, i32 5
  %677 = load i32, ptr %676, align 4, !tbaa !18
  %678 = mul i32 %674, %677
  %679 = uitofp i32 %678 to double
  %680 = load i32, ptr %10, align 4, !tbaa !5
  %681 = call double @time_in_secs(i32 noundef %680)
  %682 = fdiv double %679, %681
  %683 = call i32 (ptr, ...) @printf(ptr noundef @.str.29, double noundef %682, ptr noundef @.str.18, ptr noundef @.str.20)
  %684 = call i32 (ptr, ...) @printf(ptr noundef @.str.30, ptr noundef @.str.22)
  %685 = call i32 (ptr, ...) @printf(ptr noundef @.str.31)
  br label %686

686:                                              ; preds = %673, %668
  br label %687

687:                                              ; preds = %686, %664
  %688 = load i16, ptr %8, align 2, !tbaa !9
  %689 = sext i16 %688 to i32
  %690 = icmp sgt i32 %689, 0
  br i1 %690, label %691, label %693

691:                                              ; preds = %687
  %692 = call i32 (ptr, ...) @printf(ptr noundef @.str.32)
  br label %693

693:                                              ; preds = %691, %687
  %694 = load i16, ptr %8, align 2, !tbaa !9
  %695 = sext i16 %694 to i32
  %696 = icmp slt i32 %695, 0
  br i1 %696, label %697, label %699

697:                                              ; preds = %693
  %698 = call i32 (ptr, ...) @printf(ptr noundef @.str.33)
  br label %699

699:                                              ; preds = %697, %693
  %700 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %11, i64 0, i64 0
  %701 = getelementptr inbounds %struct.RESULTS_S, ptr %700, i32 0, i32 14
  call void @portable_fini(ptr noundef %701)
  call void @llvm.lifetime.end.p0(i64 112, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, 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 double @time_in_secs(i32 noundef) #2

declare i32 @get_time() #2

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

declare i32 @get_start_time() #2

declare i32 @get_stop_time() #2

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

declare zeroext i8 @check_data_types() #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 = !{!12, !13, i64 56}
!29 = distinct !{!29, !24}
!30 = !{!31, !31, i64 0}
!31 = !{!"double", !7, i64 0}
!32 = distinct !{!32, !24}
!33 = !{!12, !10, i64 98}
!34 = !{!12, !10, i64 100}
!35 = !{!12, !10, i64 102}
!36 = distinct !{!36, !24}
!37 = distinct !{!37, !24}
!38 = distinct !{!38, !24}
!39 = distinct !{!39, !24}
!40 = !{!12, !10, i64 96}
!41 = distinct !{!41, !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 }

@static_memblk = external dso_local global [2000 x i8], align 16
@.str.3 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.8 = 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.9 = 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.10 = 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.11 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [96 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.33 = 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
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %1) #5
  store i32 0, ptr %1, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2) #5
  call void @llvm.lifetime.start.p0(i64 112, ptr nonnull %3) #5
  %4 = getelementptr inbounds i8, ptr %3, i64 106
  call void @portable_init(ptr noundef nonnull %4, ptr noundef nonnull %1, ptr noundef nonnull %2) #5
  %5 = call i32 @get_seed_32(i32 noundef 1) #5
  %6 = trunc i32 %5 to i16
  store i16 %6, ptr %3, align 16, !tbaa !9
  %7 = call i32 @get_seed_32(i32 noundef 2) #5
  %8 = trunc i32 %7 to i16
  %9 = getelementptr inbounds i8, ptr %3, i64 2
  store i16 %8, ptr %9, align 2, !tbaa !15
  %10 = call i32 @get_seed_32(i32 noundef 3) #5
  %11 = trunc i32 %10 to i16
  %12 = getelementptr inbounds i8, ptr %3, i64 4
  store i16 %11, ptr %12, align 4, !tbaa !16
  %13 = call i32 @get_seed_32(i32 noundef 4) #5
  %14 = getelementptr inbounds i8, ptr %3, i64 44
  store i32 %13, ptr %14, align 4, !tbaa !17
  %15 = call i32 @get_seed_32(i32 noundef 5) #5
  %16 = getelementptr inbounds i8, ptr %3, i64 48
  %17 = icmp eq i32 %15, 0
  %spec.select = select i1 %17, i32 7, i32 %15
  store i32 %spec.select, ptr %16, align 16, !tbaa !18
  %18 = load i16, ptr %3, align 16, !tbaa !9
  %19 = icmp eq i16 %18, 0
  %20 = load i16, ptr %9, align 2
  %21 = icmp eq i16 %20, 0
  %or.cond = select i1 %19, i1 %21, i1 false
  %22 = load i16, ptr %12, align 4
  %23 = icmp eq i16 %22, 0
  %or.cond9 = select i1 %or.cond, i1 %23, i1 false
  br i1 %or.cond9, label %.critedge.sink.split, label %24

24:                                               ; preds = %0
  %25 = icmp eq i16 %18, 1
  %26 = icmp eq i16 %20, 0
  %or.cond14 = select i1 %25, i1 %26, i1 false
  %27 = icmp eq i16 %22, 0
  %or.cond19 = select i1 %or.cond14, i1 %27, i1 false
  br i1 %or.cond19, label %.critedge.sink.split, label %.critedge

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

.critedge:                                        ; preds = %.critedge.sink.split, %24
  %28 = phi i16 [ %18, %24 ], [ %storemerge, %.critedge.sink.split ]
  %29 = getelementptr inbounds i8, ptr %3, i64 8
  store ptr @static_memblk, ptr %29, align 8, !tbaa !19
  %30 = getelementptr inbounds i8, ptr %3, i64 40
  %31 = getelementptr inbounds i8, ptr %3, i64 104
  store i16 0, ptr %31, align 8, !tbaa !20
  %32 = and i32 %spec.select, 1
  %33 = trunc nuw nsw i32 %32 to i16
  %34 = and i32 %spec.select, 2
  %.lobit = lshr exact i32 %34, 1
  %35 = trunc nuw nsw i32 %.lobit to i16
  %spec.select150.1 = add nuw nsw i16 %33, %35
  %36 = and i32 %spec.select, 4
  %.lobit197 = lshr exact i32 %36, 2
  %37 = trunc nuw nsw i32 %.lobit197 to i16
  %spec.select150.2 = add nuw nsw i16 %spec.select150.1, %37
  %38 = udiv i16 2000, %spec.select150.2
  %.zext = zext nneg i16 %38 to i32
  store i32 %.zext, ptr %30, align 8, !tbaa !21
  %.not148 = icmp eq i32 %32, 0
  br i1 %.not148, label %40, label %.critedge152

.critedge152:                                     ; preds = %.critedge
  %39 = getelementptr inbounds i8, ptr %3, i64 16
  store ptr @static_memblk, ptr %39, align 16, !tbaa !19
  br label %40

40:                                               ; preds = %.critedge152, %.critedge
  %.1117 = phi i16 [ 1, %.critedge152 ], [ 0, %.critedge ]
  %.not148.1 = icmp eq i32 %34, 0
  br i1 %.not148.1, label %45, label %.critedge152.1

.critedge152.1:                                   ; preds = %40
  %narrow = mul nuw nsw i16 %.1117, %38
  %41 = zext nneg i16 %narrow to i64
  %42 = getelementptr inbounds i8, ptr @static_memblk, i64 %41
  %43 = getelementptr inbounds i8, ptr %3, i64 24
  store ptr %42, ptr %43, align 8, !tbaa !19
  %44 = add nuw nsw i16 %.1117, 1
  br label %45

45:                                               ; preds = %.critedge152.1, %40
  %.1117.1 = phi i16 [ %44, %.critedge152.1 ], [ %.1117, %40 ]
  %.not148.2 = icmp eq i32 %36, 0
  br i1 %.not148.2, label %.preheader162, label %.critedge152.2

.critedge152.2:                                   ; preds = %45
  %46 = zext nneg i16 %.1117.1 to i32
  %47 = mul nuw nsw i32 %46, %.zext
  %48 = zext nneg i32 %47 to i64
  %49 = getelementptr inbounds i8, ptr @static_memblk, i64 %48
  %50 = getelementptr inbounds i8, ptr %3, i64 32
  store ptr %49, ptr %50, align 16, !tbaa !19
  br label %.preheader162

.preheader162:                                    ; preds = %.critedge152.2, %45
  br i1 %.not148, label %56, label %51

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

56:                                               ; preds = %51, %.preheader162
  %.pre-phi = phi i32 [ %.pre196, %51 ], [ %34, %.preheader162 ]
  %57 = phi i32 [ %.pre, %51 ], [ %spec.select, %.preheader162 ]
  %.not146 = icmp eq i32 %.pre-phi, 0
  br i1 %.not146, label %70, label %58

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

70:                                               ; preds = %58, %56
  %71 = phi i32 [ %.pre191, %58 ], [ %57, %56 ]
  %72 = and i32 %71, 4
  %.not147 = icmp eq i32 %72, 0
  br i1 %.not147, label %78, label %73

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

78:                                               ; preds = %73, %70
  %79 = load i32, ptr %14, align 4, !tbaa !17
  %80 = icmp eq i32 %79, 0
  br i1 %80, label %81, label %95

81:                                               ; preds = %78
  store i32 1, ptr %14, align 4, !tbaa !17
  br label %82

82:                                               ; preds = %81, %82
  %83 = load i32, ptr %14, align 4, !tbaa !17
  %84 = mul i32 %83, 10
  store i32 %84, ptr %14, align 4, !tbaa !17
  call void @start_time() #5
  %85 = call ptr @iterate(ptr noundef nonnull %3)
  call void @stop_time() #5
  %86 = call i32 @get_time() #5
  %87 = call double @time_in_secs(i32 noundef %86) #5
  %88 = fcmp olt double %87, 1.000000e+00
  br i1 %88, label %82, label %89, !llvm.loop !23

89:                                               ; preds = %82
  %90 = fptoui double %87 to i32
  %spec.store.select = call i32 @llvm.umax.i32(i32 %90, i32 1)
  %91 = udiv i32 10, %spec.store.select
  %92 = add nuw nsw i32 %91, 1
  %93 = load i32, ptr %14, align 4, !tbaa !17
  %94 = mul i32 %93, %92
  store i32 %94, ptr %14, align 4, !tbaa !17
  br label %95

95:                                               ; preds = %89, %78
  call void @start_time() #5
  %96 = call ptr @iterate(ptr noundef nonnull %3)
  call void @stop_time() #5
  %97 = call i32 @get_time() #5
  %98 = call i32 @get_start_time() #5
  %99 = call i32 @get_stop_time() #5
  %100 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3, i32 noundef %98, i32 noundef %99)
  %101 = load i16, ptr %3, align 16, !tbaa !9
  %102 = call zeroext i16 @crc16(i16 noundef signext %101, i16 noundef zeroext 0) #5
  %103 = load i16, ptr %9, align 2, !tbaa !15
  %104 = call zeroext i16 @crc16(i16 noundef signext %103, i16 noundef zeroext %102) #5
  %105 = load i16, ptr %12, align 4, !tbaa !16
  %106 = call zeroext i16 @crc16(i16 noundef signext %105, i16 noundef zeroext %104) #5
  %107 = load i32, ptr %30, align 8, !tbaa !21
  %108 = trunc i32 %107 to i16
  %109 = call zeroext i16 @crc16(i16 noundef signext %108, i16 noundef zeroext %106) #5
  %110 = zext i16 %109 to i32
  switch i16 %109, label %.thread [
    i16 -30206, label %115
    i16 31493, label %111
    i16 20143, label %112
    i16 -5643, label %113
    i16 6386, label %114
  ]

111:                                              ; preds = %95
  br label %115

112:                                              ; preds = %95
  br label %115

113:                                              ; preds = %95
  br label %115

114:                                              ; preds = %95
  br label %115

115:                                              ; preds = %95, %114, %113, %112, %111
  %.str.8.sink = phi ptr [ @.str.8, %114 ], [ @.str.7, %113 ], [ @.str.6, %112 ], [ @.str.5, %111 ], [ @.str.4, %95 ]
  %116 = phi i1 [ false, %114 ], [ true, %113 ], [ false, %112 ], [ false, %111 ], [ false, %95 ]
  %.0121 = phi i64 [ 4, %114 ], [ 3, %113 ], [ 2, %112 ], [ 1, %111 ], [ 0, %95 ]
  %117 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.8.sink)
  %118 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %.not184 = icmp eq i32 %118, 0
  br i1 %.not184, label %.thread, label %.lr.ph

.lr.ph:                                           ; preds = %115
  %119 = getelementptr inbounds [5 x i16], ptr @list_known_crc, i64 0, i64 %.0121
  %120 = getelementptr inbounds [5 x i16], ptr @matrix_known_crc, i64 0, i64 %.0121
  %121 = getelementptr inbounds [5 x i16], ptr @state_known_crc, i64 0, i64 %.0121
  br label %122

122:                                              ; preds = %.lr.ph, %168
  %123 = phi i32 [ 0, %.lr.ph ], [ %172, %168 ]
  %.4169 = phi i16 [ 0, %.lr.ph ], [ %171, %168 ]
  %.1119168 = phi i16 [ 0, %.lr.ph ], [ %170, %168 ]
  %124 = zext i16 %.4169 to i64
  %125 = getelementptr inbounds [1 x %struct.RESULTS_S], ptr %3, i64 0, i64 %124
  %126 = getelementptr inbounds i8, ptr %125, i64 104
  store i16 0, ptr %126, align 8, !tbaa !20
  %127 = getelementptr inbounds i8, ptr %125, i64 48
  %128 = load i32, ptr %127, align 16, !tbaa !18
  %129 = and i32 %128, 1
  %.not139 = icmp eq i32 %129, 0
  br i1 %.not139, label %140, label %130

130:                                              ; preds = %122
  %131 = getelementptr inbounds i8, ptr %125, i64 98
  %132 = load i16, ptr %131, align 2, !tbaa !25
  %133 = load i16, ptr %119, align 2, !tbaa !26
  %.not140 = icmp eq i16 %132, %133
  br i1 %.not140, label %140, label %134

134:                                              ; preds = %130
  %135 = zext i16 %133 to i32
  %136 = zext i16 %132 to i32
  %137 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.9, i32 noundef %123, i32 noundef %136, i32 noundef %135)
  %138 = load i16, ptr %126, align 8, !tbaa !20
  %139 = add i16 %138, 1
  store i16 %139, ptr %126, align 8, !tbaa !20
  %.pre192 = load i32, ptr %127, align 16, !tbaa !18
  br label %140

140:                                              ; preds = %134, %130, %122
  %141 = phi i16 [ %139, %134 ], [ 0, %130 ], [ 0, %122 ]
  %142 = phi i32 [ %.pre192, %134 ], [ %128, %130 ], [ %128, %122 ]
  %143 = and i32 %142, 2
  %.not141 = icmp eq i32 %143, 0
  br i1 %.not141, label %154, label %144

144:                                              ; preds = %140
  %145 = getelementptr inbounds i8, ptr %125, i64 100
  %146 = load i16, ptr %145, align 4, !tbaa !27
  %147 = load i16, ptr %120, align 2, !tbaa !26
  %.not142 = icmp eq i16 %146, %147
  br i1 %.not142, label %154, label %148

148:                                              ; preds = %144
  %149 = zext i16 %147 to i32
  %150 = zext i16 %146 to i32
  %151 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.10, i32 noundef %123, i32 noundef %150, i32 noundef %149)
  %152 = load i16, ptr %126, align 8, !tbaa !20
  %153 = add i16 %152, 1
  store i16 %153, ptr %126, align 8, !tbaa !20
  %.pre193 = load i32, ptr %127, align 16, !tbaa !18
  br label %154

154:                                              ; preds = %148, %144, %140
  %155 = phi i16 [ %153, %148 ], [ %141, %144 ], [ %141, %140 ]
  %156 = phi i32 [ %.pre193, %148 ], [ %142, %144 ], [ %142, %140 ]
  %157 = and i32 %156, 4
  %.not143 = icmp eq i32 %157, 0
  br i1 %.not143, label %168, label %158

158:                                              ; preds = %154
  %159 = getelementptr inbounds i8, ptr %125, i64 102
  %160 = load i16, ptr %159, align 2, !tbaa !28
  %161 = load i16, ptr %121, align 2, !tbaa !26
  %.not144 = icmp eq i16 %160, %161
  br i1 %.not144, label %168, label %162

162:                                              ; preds = %158
  %163 = zext i16 %161 to i32
  %164 = zext i16 %160 to i32
  %165 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, i32 noundef %123, i32 noundef %164, i32 noundef %163)
  %166 = load i16, ptr %126, align 8, !tbaa !20
  %167 = add i16 %166, 1
  store i16 %167, ptr %126, align 8, !tbaa !20
  br label %168

168:                                              ; preds = %162, %158, %154
  %169 = phi i16 [ %167, %162 ], [ %155, %158 ], [ %155, %154 ]
  %170 = add i16 %169, %.1119168
  %171 = add i16 %.4169, 1
  %172 = zext i16 %171 to i32
  %173 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %174 = icmp ugt i32 %173, %172
  br i1 %174, label %122, label %.thread, !llvm.loop !29

.thread:                                          ; preds = %168, %115, %95
  %175 = phi i1 [ false, %95 ], [ %116, %115 ], [ %116, %168 ]
  %.2120 = phi i16 [ -1, %95 ], [ 0, %115 ], [ %170, %168 ]
  %176 = call zeroext i8 @check_data_types() #5
  %177 = zext i8 %176 to i16
  %178 = add i16 %.2120, %177
  %179 = load i32, ptr %30, align 8, !tbaa !21
  %180 = zext i32 %179 to i64
  %181 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, i64 noundef %180)
  %182 = zext i32 %97 to i64
  %183 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, i64 noundef %182)
  %184 = call double @time_in_secs(i32 noundef %97) #5
  %185 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14, double noundef %184)
  %186 = call double @time_in_secs(i32 noundef %97) #5
  %187 = fcmp ogt double %186, 0.000000e+00
  br i1 %187, label %188, label %196

188:                                              ; preds = %.thread
  %189 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %190 = load i32, ptr %14, align 4, !tbaa !17
  %191 = mul i32 %190, %189
  %192 = uitofp i32 %191 to double
  %193 = call double @time_in_secs(i32 noundef %97) #5
  %194 = fdiv double %192, %193
  %195 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, double noundef %194)
  br label %196

196:                                              ; preds = %188, %.thread
  %197 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %198 = zext i32 %197 to i64
  %199 = load i32, ptr %14, align 4, !tbaa !17
  %200 = zext i32 %199 to i64
  %201 = mul nuw i64 %200, %198
  %202 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, i64 noundef %201)
  %203 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17, ptr noundef nonnull @.str.18)
  %204 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19, ptr noundef nonnull @.str.20)
  %205 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.21, ptr noundef nonnull @.str.22)
  %206 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.23, i32 noundef %110)
  %207 = load i32, ptr %16, align 16, !tbaa !18
  %208 = and i32 %207, 1
  %.not = icmp ne i32 %208, 0
  %209 = load i32, ptr @default_num_contexts, align 4
  %210 = icmp ne i32 %209, 0
  %or.cond179 = select i1 %.not, i1 %210, i1 false
  br i1 %or.cond179, label %.lr.ph171, label %.loopexit161

.lr.ph171:                                        ; preds = %196
  %211 = getelementptr inbounds i8, ptr %3, i64 98
  br label %212

212:                                              ; preds = %.lr.ph171, %212
  %213 = phi i32 [ 0, %.lr.ph171 ], [ %218, %212 ]
  %.5170 = phi i16 [ 0, %.lr.ph171 ], [ %217, %212 ]
  %214 = load i16, ptr %211, align 2, !tbaa !25
  %215 = zext i16 %214 to i32
  %216 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.24, i32 noundef %213, i32 noundef %215)
  %217 = add i16 %.5170, 1
  %218 = zext i16 %217 to i32
  %219 = load i32, ptr @default_num_contexts, align 4
  %220 = icmp ugt i32 %219, %218
  br i1 %220, label %212, label %.loopexit161.loopexit, !llvm.loop !30

.loopexit161.loopexit:                            ; preds = %212
  %.pre194 = load i32, ptr %16, align 16, !tbaa !18
  br label %.loopexit161

.loopexit161:                                     ; preds = %.loopexit161.loopexit, %196
  %221 = phi i32 [ %219, %.loopexit161.loopexit ], [ %209, %196 ]
  %222 = phi i32 [ %.pre194, %.loopexit161.loopexit ], [ %207, %196 ]
  %223 = and i32 %222, 2
  %.not137 = icmp ne i32 %223, 0
  %224 = icmp ne i32 %221, 0
  %or.cond181 = select i1 %.not137, i1 %224, i1 false
  br i1 %or.cond181, label %.lr.ph173, label %.loopexit159

.lr.ph173:                                        ; preds = %.loopexit161
  %225 = getelementptr inbounds i8, ptr %3, i64 100
  br label %226

226:                                              ; preds = %.lr.ph173, %226
  %227 = phi i32 [ 0, %.lr.ph173 ], [ %232, %226 ]
  %.6172 = phi i16 [ 0, %.lr.ph173 ], [ %231, %226 ]
  %228 = load i16, ptr %225, align 4, !tbaa !27
  %229 = zext i16 %228 to i32
  %230 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.25, i32 noundef %227, i32 noundef %229)
  %231 = add i16 %.6172, 1
  %232 = zext i16 %231 to i32
  %233 = load i32, ptr @default_num_contexts, align 4
  %234 = icmp ugt i32 %233, %232
  br i1 %234, label %226, label %.loopexit159.loopexit, !llvm.loop !31

.loopexit159.loopexit:                            ; preds = %226
  %.pre195 = load i32, ptr %16, align 16, !tbaa !18
  br label %.loopexit159

.loopexit159:                                     ; preds = %.loopexit159.loopexit, %.loopexit161
  %235 = phi i32 [ %233, %.loopexit159.loopexit ], [ %221, %.loopexit161 ]
  %236 = phi i32 [ %.pre195, %.loopexit159.loopexit ], [ %222, %.loopexit161 ]
  %237 = and i32 %236, 4
  %.not138 = icmp ne i32 %237, 0
  %238 = icmp ne i32 %235, 0
  %or.cond183 = select i1 %.not138, i1 %238, i1 false
  br i1 %or.cond183, label %.lr.ph175, label %.loopexit

.lr.ph175:                                        ; preds = %.loopexit159
  %239 = getelementptr inbounds i8, ptr %3, i64 102
  br label %240

240:                                              ; preds = %.lr.ph175, %240
  %241 = phi i32 [ 0, %.lr.ph175 ], [ %246, %240 ]
  %.7174 = phi i16 [ 0, %.lr.ph175 ], [ %245, %240 ]
  %242 = load i16, ptr %239, align 2, !tbaa !28
  %243 = zext i16 %242 to i32
  %244 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.26, i32 noundef %241, i32 noundef %243)
  %245 = add i16 %.7174, 1
  %246 = zext i16 %245 to i32
  %247 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %248 = icmp ugt i32 %247, %246
  br i1 %248, label %240, label %.loopexit, !llvm.loop !32

.loopexit:                                        ; preds = %240, %.loopexit159
  %249 = phi i32 [ %235, %.loopexit159 ], [ %247, %240 ]
  %.not185 = icmp eq i32 %249, 0
  br i1 %.not185, label %._crit_edge, label %.lr.ph177

.lr.ph177:                                        ; preds = %.loopexit
  %250 = getelementptr inbounds i8, ptr %3, i64 96
  br label %251

251:                                              ; preds = %.lr.ph177, %251
  %252 = phi i32 [ 0, %.lr.ph177 ], [ %257, %251 ]
  %.8176 = phi i16 [ 0, %.lr.ph177 ], [ %256, %251 ]
  %253 = load i16, ptr %250, align 16, !tbaa !33
  %254 = zext i16 %253 to i32
  %255 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.27, i32 noundef %252, i32 noundef %254)
  %256 = add i16 %.8176, 1
  %257 = zext i16 %256 to i32
  %258 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %259 = icmp ugt i32 %258, %257
  br i1 %259, label %251, label %._crit_edge, !llvm.loop !34

._crit_edge:                                      ; preds = %251, %.loopexit
  %260 = icmp eq i16 %178, 0
  br i1 %260, label %261, label %272

261:                                              ; preds = %._crit_edge
  %262 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.28)
  br i1 %175, label %263, label %.thread157

263:                                              ; preds = %261
  %264 = load i32, ptr @default_num_contexts, align 4, !tbaa !5
  %265 = load i32, ptr %14, align 4, !tbaa !17
  %266 = mul i32 %265, %264
  %267 = uitofp i32 %266 to double
  %268 = call double @time_in_secs(i32 noundef %97) #5
  %269 = fdiv double %267, %268
  %270 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.29, double noundef %269, ptr noundef nonnull @.str.18, ptr noundef nonnull @.str.20)
  %271 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.30, ptr noundef nonnull @.str.22)
  br label %.thread157.sink.split

272:                                              ; preds = %._crit_edge
  %273 = icmp sgt i16 %178, 0
  %.str.32..str.33 = select i1 %273, ptr @.str.32, ptr @.str.33
  br label %.thread157.sink.split

.thread157.sink.split:                            ; preds = %272, %263
  %.str.31.sink = phi ptr [ @.str.31, %263 ], [ %.str.32..str.33, %272 ]
  %274 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.31.sink)
  br label %.thread157

.thread157:                                       ; preds = %.thread157.sink.split, %261
  call void @portable_fini(ptr noundef nonnull %4) #5
  call void @llvm.lifetime.end.p0(i64 112, ptr nonnull %3) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %1) #5
  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 double @time_in_secs(i32 noundef) local_unnamed_addr #2

declare i32 @get_time() local_unnamed_addr #2

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

declare i32 @get_start_time() local_unnamed_addr #2

declare i32 @get_stop_time() local_unnamed_addr #2

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

declare zeroext i8 @check_data_types() local_unnamed_addr #2

declare void @portable_fini(ptr noundef) local_unnamed_addr #2

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

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 = { 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 #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { 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