; LLVM IR from libxsmm/libxsmm :: samples/spmm (spmm_kernel)

; 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.spmm_def = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

@.str = external hidden unnamed_addr constant [27 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [55 x i8], align 1
@stderr = external global ptr, align 8
@.str.6 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [65 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [76 x i8], align 1
@__PRETTY_FUNCTION__.main = external hidden unnamed_addr constant [23 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [11 x i8], align 1

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

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

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

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

declare i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef) #2

declare noalias ptr @libxsmm_aligned_malloc(i64 noundef, i64 noundef) #2

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

; Function Attrs: nounwind uwtable
define dso_local i32 @main(i32 noundef %0, ptr noundef %1) #1 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca double, align 8
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca i32, align 4
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca i32, align 4
  %32 = alloca double, align 8
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca %struct.spmm_def, align 8
  %37 = alloca i32, align 4
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca ptr, align 8
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca double, align 8
  %44 = alloca [512 x i8], align 16
  %45 = alloca ptr, align 8
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca i32, align 4
  store i32 0, ptr %3, align 4
  store i32 %0, ptr %4, align 4, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #7
  store ptr null, ptr %6, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  store ptr null, ptr %7, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  store ptr null, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #7
  store ptr null, ptr %9, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  store i32 0, ptr %14, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #7
  store i32 0, ptr %15, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  store i32 0, ptr %16, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #7
  store i32 1, ptr %17, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #7
  store i32 1, ptr %18, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #7
  store i32 1, ptr %19, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #7
  store double 5.000000e-01, ptr %20, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  store i32 0, ptr %21, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #7
  store i32 0, ptr %22, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  store i32 1, ptr %23, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #7
  store i32 0, ptr %24, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #7
  store i32 0, ptr %25, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #7
  store double 0.000000e+00, ptr %26, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #7
  store double 0.000000e+00, ptr %27, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  store i32 0, ptr %28, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #7
  store ptr null, ptr %29, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #7
  store ptr null, ptr %30, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #7
  store i32 0, ptr %31, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #7
  store double 0.000000e+00, ptr %32, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #7
  store i32 0, ptr %33, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #7
  store i32 0, ptr %35, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 88, ptr %36) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #7
  store i32 1, ptr %37, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #7
  store i32 0, ptr %38, align 4, !tbaa !5
  %55 = load i32, ptr %4, align 4, !tbaa !5
  %56 = icmp eq i32 %55, 19
  br i1 %56, label %60, label %57

57:                                               ; preds = %2
  %58 = load i32, ptr %4, align 4, !tbaa !5
  %59 = icmp eq i32 %58, 20
  br i1 %59, label %60, label %146

60:                                               ; preds = %57, %2
  %61 = load ptr, ptr %5, align 8, !tbaa !9
  %62 = getelementptr inbounds ptr, ptr %61, i64 1
  %63 = load ptr, ptr %62, align 8, !tbaa !9
  store ptr %63, ptr %6, align 8, !tbaa !9
  %64 = load ptr, ptr %5, align 8, !tbaa !9
  %65 = getelementptr inbounds ptr, ptr %64, i64 2
  %66 = load ptr, ptr %65, align 8, !tbaa !9
  store ptr %66, ptr %7, align 8, !tbaa !9
  %67 = load ptr, ptr %5, align 8, !tbaa !9
  %68 = getelementptr inbounds ptr, ptr %67, i64 3
  %69 = load ptr, ptr %68, align 8, !tbaa !9
  store ptr %69, ptr %8, align 8, !tbaa !9
  %70 = load ptr, ptr %5, align 8, !tbaa !9
  %71 = getelementptr inbounds ptr, ptr %70, i64 4
  %72 = load ptr, ptr %71, align 8, !tbaa !9
  store ptr %72, ptr %9, align 8, !tbaa !9
  %73 = load ptr, ptr %6, align 8, !tbaa !9
  %74 = call i32 @char_to_libxsmm_datatype(ptr noundef %73)
  store i32 %74, ptr %10, align 4, !tbaa !5
  %75 = load ptr, ptr %7, align 8, !tbaa !9
  %76 = call i32 @char_to_libxsmm_datatype(ptr noundef %75)
  store i32 %76, ptr %11, align 4, !tbaa !5
  %77 = load ptr, ptr %8, align 8, !tbaa !9
  %78 = call i32 @char_to_libxsmm_datatype(ptr noundef %77)
  store i32 %78, ptr %12, align 4, !tbaa !5
  %79 = load ptr, ptr %9, align 8, !tbaa !9
  %80 = call i32 @char_to_libxsmm_datatype(ptr noundef %79)
  store i32 %80, ptr %13, align 4, !tbaa !5
  %81 = load ptr, ptr %5, align 8, !tbaa !9
  %82 = getelementptr inbounds ptr, ptr %81, i64 5
  %83 = load ptr, ptr %82, align 8, !tbaa !9
  %84 = call i32 @atoi(ptr noundef %83) #8
  store i32 %84, ptr %14, align 4, !tbaa !5
  %85 = load ptr, ptr %5, align 8, !tbaa !9
  %86 = getelementptr inbounds ptr, ptr %85, i64 6
  %87 = load ptr, ptr %86, align 8, !tbaa !9
  %88 = call i32 @atoi(ptr noundef %87) #8
  store i32 %88, ptr %15, align 4, !tbaa !5
  %89 = load ptr, ptr %5, align 8, !tbaa !9
  %90 = getelementptr inbounds ptr, ptr %89, i64 7
  %91 = load ptr, ptr %90, align 8, !tbaa !9
  %92 = call i32 @atoi(ptr noundef %91) #8
  store i32 %92, ptr %16, align 4, !tbaa !5
  %93 = load ptr, ptr %5, align 8, !tbaa !9
  %94 = getelementptr inbounds ptr, ptr %93, i64 8
  %95 = load ptr, ptr %94, align 8, !tbaa !9
  %96 = call i32 @atoi(ptr noundef %95) #8
  store i32 %96, ptr %17, align 4, !tbaa !5
  %97 = load ptr, ptr %5, align 8, !tbaa !9
  %98 = getelementptr inbounds ptr, ptr %97, i64 9
  %99 = load ptr, ptr %98, align 8, !tbaa !9
  %100 = call double @atof(ptr noundef %99) #8
  store double %100, ptr %20, align 8, !tbaa !11
  %101 = load ptr, ptr %5, align 8, !tbaa !9
  %102 = getelementptr inbounds ptr, ptr %101, i64 10
  %103 = load ptr, ptr %102, align 8, !tbaa !9
  %104 = call i32 @atoi(ptr noundef %103) #8
  store i32 %104, ptr %18, align 4, !tbaa !5
  %105 = load ptr, ptr %5, align 8, !tbaa !9
  %106 = getelementptr inbounds ptr, ptr %105, i64 11
  %107 = load ptr, ptr %106, align 8, !tbaa !9
  %108 = call i32 @atoi(ptr noundef %107) #8
  store i32 %108, ptr %19, align 4, !tbaa !5
  %109 = load ptr, ptr %5, align 8, !tbaa !9
  %110 = getelementptr inbounds ptr, ptr %109, i64 12
  %111 = load ptr, ptr %110, align 8, !tbaa !9
  %112 = call double @atof(ptr noundef %111) #8
  store double %112, ptr %26, align 8, !tbaa !11
  %113 = load ptr, ptr %5, align 8, !tbaa !9
  %114 = getelementptr inbounds ptr, ptr %113, i64 13
  %115 = load ptr, ptr %114, align 8, !tbaa !9
  %116 = call i32 @atoi(ptr noundef %115) #8
  store i32 %116, ptr %21, align 4, !tbaa !5
  %117 = load ptr, ptr %5, align 8, !tbaa !9
  %118 = getelementptr inbounds ptr, ptr %117, i64 14
  %119 = load ptr, ptr %118, align 8, !tbaa !9
  %120 = call i32 @atoi(ptr noundef %119) #8
  store i32 %120, ptr %22, align 4, !tbaa !5
  %121 = load ptr, ptr %5, align 8, !tbaa !9
  %122 = getelementptr inbounds ptr, ptr %121, i64 15
  %123 = load ptr, ptr %122, align 8, !tbaa !9
  %124 = call i32 @atoi(ptr noundef %123) #8
  store i32 %124, ptr %23, align 4, !tbaa !5
  %125 = load ptr, ptr %5, align 8, !tbaa !9
  %126 = getelementptr inbounds ptr, ptr %125, i64 16
  %127 = load ptr, ptr %126, align 8, !tbaa !9
  %128 = call i32 @atoi(ptr noundef %127) #8
  store i32 %128, ptr %24, align 4, !tbaa !5
  %129 = load ptr, ptr %5, align 8, !tbaa !9
  %130 = getelementptr inbounds ptr, ptr %129, i64 17
  %131 = load ptr, ptr %130, align 8, !tbaa !9
  %132 = call i32 @atoi(ptr noundef %131) #8
  store i32 %132, ptr %25, align 4, !tbaa !5
  %133 = load ptr, ptr %5, align 8, !tbaa !9
  %134 = getelementptr inbounds ptr, ptr %133, i64 18
  %135 = load ptr, ptr %134, align 8, !tbaa !9
  %136 = call i32 @atoi(ptr noundef %135) #8
  store i32 %136, ptr %34, align 4, !tbaa !5
  %137 = load i32, ptr %4, align 4, !tbaa !5
  %138 = icmp sge i32 %137, 20
  br i1 %138, label %139, label %144

139:                                              ; preds = %60
  %140 = load ptr, ptr %5, align 8, !tbaa !9
  %141 = getelementptr inbounds ptr, ptr %140, i64 19
  %142 = load ptr, ptr %141, align 8, !tbaa !9
  %143 = call i32 @atoi(ptr noundef %142) #8
  store i32 %143, ptr %33, align 4, !tbaa !5
  br label %145

144:                                              ; preds = %60
  store i32 0, ptr %33, align 4, !tbaa !5
  br label %145

145:                                              ; preds = %144, %139
  store i32 0, ptr %28, align 4, !tbaa !5
  store i32 1, ptr %31, align 4, !tbaa !5
  br label %223

146:                                              ; preds = %57
  %147 = load i32, ptr %4, align 4, !tbaa !5
  %148 = icmp eq i32 %147, 15
  br i1 %148, label %152, label %149

149:                                              ; preds = %146
  %150 = load i32, ptr %4, align 4, !tbaa !5
  %151 = icmp eq i32 %150, 16
  br i1 %151, label %152, label %221

152:                                              ; preds = %149, %146
  store i32 1, ptr %28, align 4, !tbaa !5
  %153 = load ptr, ptr %5, align 8, !tbaa !9
  %154 = getelementptr inbounds ptr, ptr %153, i64 1
  %155 = load ptr, ptr %154, align 8, !tbaa !9
  store ptr %155, ptr %6, align 8, !tbaa !9
  %156 = load ptr, ptr %5, align 8, !tbaa !9
  %157 = getelementptr inbounds ptr, ptr %156, i64 2
  %158 = load ptr, ptr %157, align 8, !tbaa !9
  store ptr %158, ptr %7, align 8, !tbaa !9
  %159 = load ptr, ptr %5, align 8, !tbaa !9
  %160 = getelementptr inbounds ptr, ptr %159, i64 3
  %161 = load ptr, ptr %160, align 8, !tbaa !9
  store ptr %161, ptr %8, align 8, !tbaa !9
  %162 = load ptr, ptr %5, align 8, !tbaa !9
  %163 = getelementptr inbounds ptr, ptr %162, i64 4
  %164 = load ptr, ptr %163, align 8, !tbaa !9
  store ptr %164, ptr %9, align 8, !tbaa !9
  %165 = load ptr, ptr %6, align 8, !tbaa !9
  %166 = call i32 @char_to_libxsmm_datatype(ptr noundef %165)
  store i32 %166, ptr %10, align 4, !tbaa !5
  %167 = load ptr, ptr %7, align 8, !tbaa !9
  %168 = call i32 @char_to_libxsmm_datatype(ptr noundef %167)
  store i32 %168, ptr %11, align 4, !tbaa !5
  %169 = load ptr, ptr %8, align 8, !tbaa !9
  %170 = call i32 @char_to_libxsmm_datatype(ptr noundef %169)
  store i32 %170, ptr %12, align 4, !tbaa !5
  %171 = load ptr, ptr %9, align 8, !tbaa !9
  %172 = call i32 @char_to_libxsmm_datatype(ptr noundef %171)
  store i32 %172, ptr %13, align 4, !tbaa !5
  %173 = load ptr, ptr %5, align 8, !tbaa !9
  %174 = getelementptr inbounds ptr, ptr %173, i64 5
  %175 = load ptr, ptr %174, align 8, !tbaa !9
  store ptr %175, ptr %29, align 8, !tbaa !9
  %176 = load ptr, ptr %5, align 8, !tbaa !9
  %177 = getelementptr inbounds ptr, ptr %176, i64 6
  %178 = load ptr, ptr %177, align 8, !tbaa !9
  %179 = call double @atof(ptr noundef %178) #8
  store double %179, ptr %20, align 8, !tbaa !11
  %180 = load ptr, ptr %5, align 8, !tbaa !9
  %181 = getelementptr inbounds ptr, ptr %180, i64 7
  %182 = load ptr, ptr %181, align 8, !tbaa !9
  %183 = call double @atof(ptr noundef %182) #8
  store double %183, ptr %26, align 8, !tbaa !11
  %184 = load ptr, ptr %5, align 8, !tbaa !9
  %185 = getelementptr inbounds ptr, ptr %184, i64 8
  %186 = load ptr, ptr %185, align 8, !tbaa !9
  %187 = call i32 @atoi(ptr noundef %186) #8
  store i32 %187, ptr %21, align 4, !tbaa !5
  %188 = load ptr, ptr %5, align 8, !tbaa !9
  %189 = getelementptr inbounds ptr, ptr %188, i64 9
  %190 = load ptr, ptr %189, align 8, !tbaa !9
  %191 = call i32 @atoi(ptr noundef %190) #8
  store i32 %191, ptr %22, align 4, !tbaa !5
  %192 = load ptr, ptr %5, align 8, !tbaa !9
  %193 = getelementptr inbounds ptr, ptr %192, i64 10
  %194 = load ptr, ptr %193, align 8, !tbaa !9
  %195 = call i32 @atoi(ptr noundef %194) #8
  store i32 %195, ptr %23, align 4, !tbaa !5
  %196 = load ptr, ptr %5, align 8, !tbaa !9
  %197 = getelementptr inbounds ptr, ptr %196, i64 11
  %198 = load ptr, ptr %197, align 8, !tbaa !9
  %199 = call i32 @atoi(ptr noundef %198) #8
  store i32 %199, ptr %24, align 4, !tbaa !5
  %200 = load ptr, ptr %5, align 8, !tbaa !9
  %201 = getelementptr inbounds ptr, ptr %200, i64 12
  %202 = load ptr, ptr %201, align 8, !tbaa !9
  %203 = call i32 @atoi(ptr noundef %202) #8
  store i32 %203, ptr %25, align 4, !tbaa !5
  %204 = load ptr, ptr %5, align 8, !tbaa !9
  %205 = getelementptr inbounds ptr, ptr %204, i64 13
  %206 = load ptr, ptr %205, align 8, !tbaa !9
  %207 = call i32 @atoi(ptr noundef %206) #8
  store i32 %207, ptr %34, align 4, !tbaa !5
  %208 = load ptr, ptr %5, align 8, !tbaa !9
  %209 = getelementptr inbounds ptr, ptr %208, i64 14
  %210 = load ptr, ptr %209, align 8, !tbaa !9
  %211 = call i32 @atoi(ptr noundef %210) #8
  store i32 %211, ptr %31, align 4, !tbaa !5
  %212 = load i32, ptr %4, align 4, !tbaa !5
  %213 = icmp sge i32 %212, 16
  br i1 %213, label %214, label %219

214:                                              ; preds = %152
  %215 = load ptr, ptr %5, align 8, !tbaa !9
  %216 = getelementptr inbounds ptr, ptr %215, i64 15
  %217 = load ptr, ptr %216, align 8, !tbaa !9
  %218 = call i32 @atoi(ptr noundef %217) #8
  store i32 %218, ptr %33, align 4, !tbaa !5
  br label %220

219:                                              ; preds = %152
  store i32 0, ptr %33, align 4, !tbaa !5
  br label %220

220:                                              ; preds = %219, %214
  br label %222

221:                                              ; preds = %149
  store i32 1, ptr %3, align 4
  store i32 1, ptr %39, align 4
  br label %1275

222:                                              ; preds = %220
  br label %223

223:                                              ; preds = %222, %145
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #7
  %224 = call ptr @getenv(ptr noundef @.str.2) #7
  store ptr %224, ptr %40, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #7
  %225 = load ptr, ptr %40, align 8, !tbaa !9
  %226 = load ptr, ptr %40, align 8, !tbaa !9
  %227 = call ptr @libxsmm_stristr(ptr noundef %226, ptr noundef @.str.3)
  %228 = icmp eq ptr %225, %227
  br i1 %228, label %234, label %229

229:                                              ; preds = %223
  %230 = load ptr, ptr %40, align 8, !tbaa !9
  %231 = load ptr, ptr %40, align 8, !tbaa !9
  %232 = call ptr @libxsmm_stristr(ptr noundef %231, ptr noundef @.str.4)
  %233 = icmp eq ptr %230, %232
  br label %234

234:                                              ; preds = %229, %223
  %235 = phi i1 [ true, %223 ], [ %233, %229 ]
  %236 = zext i1 %235 to i32
  store i32 %236, ptr %41, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #7
  %237 = call i32 @libxsmm_cpuid(ptr noundef null)
  store i32 %237, ptr %42, align 4, !tbaa !5
  %238 = load i32, ptr %41, align 4, !tbaa !5
  %239 = icmp ne i32 %238, 0
  br i1 %239, label %248, label %240

240:                                              ; preds = %234
  %241 = load i32, ptr %42, align 4, !tbaa !5
  %242 = icmp slt i32 %241, 1104
  br i1 %242, label %243, label %248

243:                                              ; preds = %240
  %244 = load i32, ptr %33, align 4, !tbaa !5
  %245 = icmp ne i32 %244, 0
  br i1 %245, label %246, label %248

246:                                              ; preds = %243
  %247 = call i32 (ptr, ...) @printf(ptr noundef @.str.5)
  store i32 0, ptr %33, align 4, !tbaa !5
  br label %248

248:                                              ; preds = %246, %243, %240, %234
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #7
  %249 = load double, ptr %26, align 8, !tbaa !11
  %250 = fcmp une double %249, 0.000000e+00
  br i1 %250, label %251, label %257

251:                                              ; preds = %248
  %252 = load double, ptr %26, align 8, !tbaa !11
  %253 = fcmp une double %252, 1.000000e+00
  br i1 %253, label %254, label %257

254:                                              ; preds = %251
  %255 = load ptr, ptr @stderr, align 8, !tbaa !9
  %256 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %255, ptr noundef @.str.6) #7
  call void @exit(i32 noundef 1) #9
  unreachable

257:                                              ; preds = %251, %248
  %258 = load i32, ptr %10, align 4, !tbaa !5
  %259 = icmp eq i32 %258, 1
  br i1 %259, label %260, label %269

260:                                              ; preds = %257
  %261 = load i32, ptr %11, align 4, !tbaa !5
  %262 = icmp eq i32 %261, 1
  br i1 %262, label %263, label %269

263:                                              ; preds = %260
  %264 = load i32, ptr %12, align 4, !tbaa !5
  %265 = icmp eq i32 %264, 1
  br i1 %265, label %266, label %269

266:                                              ; preds = %263
  %267 = load i32, ptr %13, align 4, !tbaa !5
  %268 = icmp eq i32 %267, 1
  br i1 %268, label %312, label %269

269:                                              ; preds = %266, %263, %260, %257
  %270 = load i32, ptr %10, align 4, !tbaa !5
  %271 = icmp eq i32 %270, 13
  br i1 %271, label %272, label %281

272:                                              ; preds = %269
  %273 = load i32, ptr %11, align 4, !tbaa !5
  %274 = icmp eq i32 %273, 12
  br i1 %274, label %275, label %281

275:                                              ; preds = %272
  %276 = load i32, ptr %12, align 4, !tbaa !5
  %277 = icmp eq i32 %276, 8
  br i1 %277, label %278, label %281

278:                                              ; preds = %275
  %279 = load i32, ptr %13, align 4, !tbaa !5
  %280 = icmp eq i32 %279, 8
  br i1 %280, label %312, label %281

281:                                              ; preds = %278, %275, %272, %269
  %282 = load i32, ptr %10, align 4, !tbaa !5
  %283 = icmp eq i32 %282, 12
  br i1 %283, label %284, label %293

284:                                              ; preds = %281
  %285 = load i32, ptr %11, align 4, !tbaa !5
  %286 = icmp eq i32 %285, 13
  br i1 %286, label %287, label %293

287:                                              ; preds = %284
  %288 = load i32, ptr %12, align 4, !tbaa !5
  %289 = icmp eq i32 %288, 8
  br i1 %289, label %290, label %293

290:                                              ; preds = %287
  %291 = load i32, ptr %13, align 4, !tbaa !5
  %292 = icmp eq i32 %291, 8
  br i1 %292, label %312, label %293

293:                                              ; preds = %290, %287, %284, %281
  %294 = load i32, ptr %10, align 4, !tbaa !5
  %295 = icmp eq i32 %294, 2
  br i1 %295, label %296, label %305

296:                                              ; preds = %293
  %297 = load i32, ptr %11, align 4, !tbaa !5
  %298 = icmp eq i32 %297, 2
  br i1 %298, label %299, label %305

299:                                              ; preds = %296
  %300 = load i32, ptr %12, align 4, !tbaa !5
  %301 = icmp eq i32 %300, 1
  br i1 %301, label %302, label %305

302:                                              ; preds = %299
  %303 = load i32, ptr %13, align 4, !tbaa !5
  %304 = icmp eq i32 %303, 2
  br i1 %304, label %312, label %305

305:                                              ; preds = %302, %299, %296, %293
  %306 = load ptr, ptr @stderr, align 8, !tbaa !9
  %307 = load ptr, ptr %6, align 8, !tbaa !9
  %308 = load ptr, ptr %7, align 8, !tbaa !9
  %309 = load ptr, ptr %8, align 8, !tbaa !9
  %310 = load ptr, ptr %9, align 8, !tbaa !9
  %311 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %306, ptr noundef @.str.7, ptr noundef %307, ptr noundef %308, ptr noundef %309, ptr noundef %310) #7
  call void @exit(i32 noundef 1) #9
  unreachable

312:                                              ; preds = %302, %290, %278, %266
  %313 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 16
  store i32 0, ptr %313, align 4, !tbaa !13
  %314 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 17
  store i32 0, ptr %314, align 8, !tbaa !15
  %315 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 18
  store i32 0, ptr %315, align 4, !tbaa !16
  %316 = load i32, ptr %10, align 4, !tbaa !5
  %317 = icmp eq i32 %316, 13
  br i1 %317, label %318, label %320

318:                                              ; preds = %312
  store i32 12, ptr %10, align 4, !tbaa !5
  %319 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 16
  store i32 1, ptr %319, align 4, !tbaa !13
  br label %320

320:                                              ; preds = %318, %312
  %321 = load i32, ptr %11, align 4, !tbaa !5
  %322 = icmp eq i32 %321, 13
  br i1 %322, label %323, label %325

323:                                              ; preds = %320
  store i32 12, ptr %11, align 4, !tbaa !5
  %324 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 17
  store i32 1, ptr %324, align 8, !tbaa !15
  br label %325

325:                                              ; preds = %323, %320
  %326 = load i32, ptr %10, align 4, !tbaa !5
  %327 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  store i32 %326, ptr %327, align 8, !tbaa !17
  %328 = load i32, ptr %11, align 4, !tbaa !5
  %329 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  store i32 %328, ptr %329, align 4, !tbaa !18
  %330 = load i32, ptr %12, align 4, !tbaa !5
  %331 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 3
  store i32 %330, ptr %331, align 4, !tbaa !19
  %332 = load i32, ptr %13, align 4, !tbaa !5
  %333 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  store i32 %332, ptr %333, align 8, !tbaa !20
  %334 = load double, ptr %26, align 8, !tbaa !11
  %335 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 10
  store double %334, ptr %335, align 8, !tbaa !21
  %336 = load i32, ptr %23, align 4, !tbaa !5
  %337 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 13
  store i32 %336, ptr %337, align 8, !tbaa !22
  %338 = load i32, ptr %24, align 4, !tbaa !5
  %339 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 14
  store i32 %338, ptr %339, align 4, !tbaa !23
  %340 = load i32, ptr %25, align 4, !tbaa !5
  %341 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 15
  store i32 %340, ptr %341, align 8, !tbaa !24
  %342 = load i32, ptr %21, align 4, !tbaa !5
  %343 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 11
  store i32 %342, ptr %343, align 8, !tbaa !25
  %344 = load i32, ptr %22, align 4, !tbaa !5
  %345 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 12
  store i32 %344, ptr %345, align 4, !tbaa !26
  %346 = load i32, ptr %35, align 4, !tbaa !5
  %347 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 19
  store i32 %346, ptr %347, align 8, !tbaa !27
  %348 = load i32, ptr %33, align 4, !tbaa !5
  %349 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 20
  store i32 %348, ptr %349, align 4, !tbaa !28
  %350 = load i32, ptr %28, align 4, !tbaa !5
  %351 = icmp ne i32 %350, 0
  br i1 %351, label %352, label %355

352:                                              ; preds = %325
  %353 = load ptr, ptr %29, align 8, !tbaa !9
  %354 = call noalias ptr @fopen(ptr noundef %353, ptr noundef @.str.8)
  store ptr %354, ptr %30, align 8, !tbaa !9
  br label %369

355:                                              ; preds = %325
  %356 = call i32 (ptr, ...) @printf(ptr noundef @.str.9)
  %357 = load i32, ptr %14, align 4, !tbaa !5
  %358 = load i32, ptr %16, align 4, !tbaa !5
  %359 = load i32, ptr %16, align 4, !tbaa !5
  %360 = load i32, ptr %15, align 4, !tbaa !5
  %361 = load i32, ptr %14, align 4, !tbaa !5
  %362 = load i32, ptr %15, align 4, !tbaa !5
  %363 = load ptr, ptr %6, align 8, !tbaa !9
  %364 = load ptr, ptr %7, align 8, !tbaa !9
  %365 = load ptr, ptr %8, align 8, !tbaa !9
  %366 = load ptr, ptr %9, align 8, !tbaa !9
  %367 = call i32 (ptr, ...) @printf(ptr noundef @.str.10, i32 noundef %357, i32 noundef %358, i32 noundef %359, i32 noundef %360, i32 noundef %361, i32 noundef %362, ptr noundef %363, ptr noundef %364, ptr noundef %365, ptr noundef %366)
  %368 = call i32 (ptr, ...) @printf(ptr noundef @.str.9)
  br label %369

369:                                              ; preds = %355, %352
  br label %370

370:                                              ; preds = %1271, %369
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #7
  store double 0.000000e+00, ptr %43, align 8, !tbaa !11
  %371 = load i32, ptr %28, align 4, !tbaa !5
  %372 = icmp ne i32 %371, 0
  br i1 %372, label %373, label %416

373:                                              ; preds = %370
  call void @llvm.lifetime.start.p0(i64 512, ptr %44) #7
  %374 = getelementptr inbounds [512 x i8], ptr %44, i64 0, i64 0
  %375 = load ptr, ptr %30, align 8, !tbaa !9
  %376 = call ptr @fgets(ptr noundef %374, i32 noundef 512, ptr noundef %375)
  %377 = icmp eq ptr %376, null
  br i1 %377, label %378, label %379

378:                                              ; preds = %373
  store i32 0, ptr %38, align 4, !tbaa !5
  store i32 2, ptr %39, align 4
  br label %413

379:                                              ; preds = %373
  store i32 1, ptr %38, align 4, !tbaa !5
  br label %380

380:                                              ; preds = %379
  %381 = getelementptr inbounds [512 x i8], ptr %44, i64 0, i64 0
  %382 = call i32 (ptr, ptr, ...) @__isoc99_sscanf(ptr noundef %381, ptr noundef @.str.11, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %18, ptr noundef %19, ptr noundef %17) #7
  %383 = icmp ne i32 6, %382
  br i1 %383, label %384, label %385

384:                                              ; preds = %380
  call void @exit(i32 noundef 1) #9
  unreachable

385:                                              ; preds = %380
  %386 = load ptr, ptr %5, align 8, !tbaa !9
  %387 = getelementptr inbounds ptr, ptr %386, i64 0
  %388 = load ptr, ptr %387, align 8, !tbaa !9
  %389 = load ptr, ptr %6, align 8, !tbaa !9
  %390 = load ptr, ptr %7, align 8, !tbaa !9
  %391 = load ptr, ptr %8, align 8, !tbaa !9
  %392 = load ptr, ptr %9, align 8, !tbaa !9
  %393 = load i32, ptr %14, align 4, !tbaa !5
  %394 = load i32, ptr %15, align 4, !tbaa !5
  %395 = load i32, ptr %16, align 4, !tbaa !5
  %396 = load i32, ptr %17, align 4, !tbaa !5
  %397 = load double, ptr %20, align 8, !tbaa !11
  %398 = load i32, ptr %18, align 4, !tbaa !5
  %399 = load i32, ptr %19, align 4, !tbaa !5
  %400 = load double, ptr %26, align 8, !tbaa !11
  %401 = load i32, ptr %21, align 4, !tbaa !5
  %402 = load i32, ptr %22, align 4, !tbaa !5
  %403 = load i32, ptr %23, align 4, !tbaa !5
  %404 = load i32, ptr %24, align 4, !tbaa !5
  %405 = load i32, ptr %25, align 4, !tbaa !5
  %406 = load i32, ptr %34, align 4, !tbaa !5
  %407 = load i32, ptr %33, align 4, !tbaa !5
  %408 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, ptr noundef %388, ptr noundef %389, ptr noundef %390, ptr noundef %391, ptr noundef %392, i32 noundef %393, i32 noundef %394, i32 noundef %395, i32 noundef %396, double noundef %397, i32 noundef %398, i32 noundef %399, double noundef %400, i32 noundef %401, i32 noundef %402, i32 noundef %403, i32 noundef %404, i32 noundef %405, i32 noundef %406, i32 noundef %407)
  %409 = load i32, ptr %38, align 4, !tbaa !5
  %410 = icmp eq i32 %409, 0
  br i1 %410, label %411, label %412

411:                                              ; preds = %385
  store i32 2, ptr %39, align 4
  br label %413

412:                                              ; preds = %385
  store i32 0, ptr %39, align 4
  br label %413

413:                                              ; preds = %412, %411, %378
  call void @llvm.lifetime.end.p0(i64 512, ptr %44) #7
  %414 = load i32, ptr %39, align 4
  switch i32 %414, label %1268 [
    i32 0, label %415
  ]

415:                                              ; preds = %413
  br label %416

416:                                              ; preds = %415, %370
  %417 = load i32, ptr %14, align 4, !tbaa !5
  %418 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 4
  store i32 %417, ptr %418, align 8, !tbaa !29
  %419 = load i32, ptr %17, align 4, !tbaa !5
  %420 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 9
  store i32 %419, ptr %420, align 4, !tbaa !30
  %421 = load i32, ptr %15, align 4, !tbaa !5
  %422 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 5
  store i32 %421, ptr %422, align 4, !tbaa !31
  %423 = load i32, ptr %16, align 4, !tbaa !5
  %424 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 6
  store i32 %423, ptr %424, align 8, !tbaa !32
  %425 = load i32, ptr %18, align 4, !tbaa !5
  %426 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 7
  store i32 %425, ptr %426, align 4, !tbaa !33
  %427 = load i32, ptr %19, align 4, !tbaa !5
  %428 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 8
  store i32 %427, ptr %428, align 8, !tbaa !34
  call void @libxsmm_rng_set_seed(i32 noundef 555)
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #7
  %429 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %430 = load i32, ptr %429, align 8, !tbaa !17
  %431 = call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %430)
  store i32 %431, ptr %54, align 4, !tbaa !5
  %432 = load i32, ptr %14, align 4, !tbaa !5
  %433 = sext i32 %432 to i64
  %434 = load i32, ptr %17, align 4, !tbaa !5
  %435 = sext i32 %434 to i64
  %436 = mul i64 %433, %435
  %437 = load i32, ptr %16, align 4, !tbaa !5
  %438 = sext i32 %437 to i64
  %439 = mul i64 %436, %438
  %440 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %441 = load i32, ptr %440, align 8, !tbaa !17
  %442 = icmp eq i32 0, %441
  br i1 %442, label %443, label %444

443:                                              ; preds = %416
  br label %537

444:                                              ; preds = %416
  %445 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %446 = load i32, ptr %445, align 8, !tbaa !17
  %447 = icmp eq i32 1, %446
  br i1 %447, label %448, label %449

448:                                              ; preds = %444
  br label %535

449:                                              ; preds = %444
  %450 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %451 = load i32, ptr %450, align 8, !tbaa !17
  %452 = icmp eq i32 2, %451
  br i1 %452, label %453, label %454

453:                                              ; preds = %449
  br label %533

454:                                              ; preds = %449
  %455 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %456 = load i32, ptr %455, align 8, !tbaa !17
  %457 = icmp eq i32 3, %456
  br i1 %457, label %458, label %459

458:                                              ; preds = %454
  br label %531

459:                                              ; preds = %454
  %460 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %461 = load i32, ptr %460, align 8, !tbaa !17
  %462 = icmp eq i32 4, %461
  br i1 %462, label %463, label %464

463:                                              ; preds = %459
  br label %529

464:                                              ; preds = %459
  %465 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %466 = load i32, ptr %465, align 8, !tbaa !17
  %467 = icmp eq i32 5, %466
  br i1 %467, label %468, label %469

468:                                              ; preds = %464
  br label %527

469:                                              ; preds = %464
  %470 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %471 = load i32, ptr %470, align 8, !tbaa !17
  %472 = icmp eq i32 6, %471
  br i1 %472, label %473, label %474

473:                                              ; preds = %469
  br label %525

474:                                              ; preds = %469
  %475 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %476 = load i32, ptr %475, align 8, !tbaa !17
  %477 = icmp eq i32 7, %476
  br i1 %477, label %478, label %479

478:                                              ; preds = %474
  br label %523

479:                                              ; preds = %474
  %480 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %481 = load i32, ptr %480, align 8, !tbaa !17
  %482 = icmp eq i32 8, %481
  br i1 %482, label %483, label %484

483:                                              ; preds = %479
  br label %521

484:                                              ; preds = %479
  %485 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %486 = load i32, ptr %485, align 8, !tbaa !17
  %487 = icmp eq i32 9, %486
  br i1 %487, label %488, label %489

488:                                              ; preds = %484
  br label %519

489:                                              ; preds = %484
  %490 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %491 = load i32, ptr %490, align 8, !tbaa !17
  %492 = icmp eq i32 10, %491
  br i1 %492, label %493, label %494

493:                                              ; preds = %489
  br label %517

494:                                              ; preds = %489
  %495 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %496 = load i32, ptr %495, align 8, !tbaa !17
  %497 = icmp eq i32 11, %496
  br i1 %497, label %498, label %499

498:                                              ; preds = %494
  br label %515

499:                                              ; preds = %494
  %500 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %501 = load i32, ptr %500, align 8, !tbaa !17
  %502 = icmp eq i32 12, %501
  br i1 %502, label %503, label %504

503:                                              ; preds = %499
  br label %513

504:                                              ; preds = %499
  %505 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %506 = load i32, ptr %505, align 8, !tbaa !17
  %507 = icmp eq i32 13, %506
  br i1 %507, label %508, label %509

508:                                              ; preds = %504
  br label %511

509:                                              ; preds = %504
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 931, ptr noundef @__PRETTY_FUNCTION__.main) #9
  unreachable

510:                                              ; No predecessors!
  br label %511

511:                                              ; preds = %510, %508
  %512 = phi i32 [ 1, %508 ], [ 0, %510 ]
  br label %513

513:                                              ; preds = %511, %503
  %514 = phi i32 [ 1, %503 ], [ %512, %511 ]
  br label %515

515:                                              ; preds = %513, %498
  %516 = phi i32 [ 2, %498 ], [ %514, %513 ]
  br label %517

517:                                              ; preds = %515, %493
  %518 = phi i32 [ 2, %493 ], [ %516, %515 ]
  br label %519

519:                                              ; preds = %517, %488
  %520 = phi i32 [ 4, %488 ], [ %518, %517 ]
  br label %521

521:                                              ; preds = %519, %483
  %522 = phi i32 [ 4, %483 ], [ %520, %519 ]
  br label %523

523:                                              ; preds = %521, %478
  %524 = phi i32 [ 8, %478 ], [ %522, %521 ]
  br label %525

525:                                              ; preds = %523, %473
  %526 = phi i32 [ 8, %473 ], [ %524, %523 ]
  br label %527

527:                                              ; preds = %525, %468
  %528 = phi i32 [ 1, %468 ], [ %526, %525 ]
  br label %529

529:                                              ; preds = %527, %463
  %530 = phi i32 [ 1, %463 ], [ %528, %527 ]
  br label %531

531:                                              ; preds = %529, %458
  %532 = phi i32 [ 2, %458 ], [ %530, %529 ]
  br label %533

533:                                              ; preds = %531, %453
  %534 = phi i32 [ 2, %453 ], [ %532, %531 ]
  br label %535

535:                                              ; preds = %533, %448
  %536 = phi i32 [ 4, %448 ], [ %534, %533 ]
  br label %537

537:                                              ; preds = %535, %443
  %538 = phi i32 [ 8, %443 ], [ %536, %535 ]
  %539 = sext i32 %538 to i64
  %540 = mul i64 %439, %539
  %541 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %540, i64 noundef 64)
  store ptr %541, ptr %45, align 8, !tbaa !9
  %542 = load i32, ptr %54, align 4, !tbaa !5
  %543 = icmp eq i32 %542, 1
  br i1 %543, label %544, label %546

544:                                              ; preds = %537
  %545 = load ptr, ptr %45, align 8, !tbaa !9
  store ptr %545, ptr %50, align 8, !tbaa !9
  br label %657

546:                                              ; preds = %537
  %547 = load i32, ptr %14, align 4, !tbaa !5
  %548 = sext i32 %547 to i64
  %549 = load i32, ptr %17, align 4, !tbaa !5
  %550 = sext i32 %549 to i64
  %551 = mul i64 %548, %550
  %552 = load i32, ptr %16, align 4, !tbaa !5
  %553 = sext i32 %552 to i64
  %554 = mul i64 %551, %553
  %555 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %556 = load i32, ptr %555, align 8, !tbaa !17
  %557 = icmp eq i32 0, %556
  br i1 %557, label %558, label %559

558:                                              ; preds = %546
  br label %652

559:                                              ; preds = %546
  %560 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %561 = load i32, ptr %560, align 8, !tbaa !17
  %562 = icmp eq i32 1, %561
  br i1 %562, label %563, label %564

563:                                              ; preds = %559
  br label %650

564:                                              ; preds = %559
  %565 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %566 = load i32, ptr %565, align 8, !tbaa !17
  %567 = icmp eq i32 2, %566
  br i1 %567, label %568, label %569

568:                                              ; preds = %564
  br label %648

569:                                              ; preds = %564
  %570 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %571 = load i32, ptr %570, align 8, !tbaa !17
  %572 = icmp eq i32 3, %571
  br i1 %572, label %573, label %574

573:                                              ; preds = %569
  br label %646

574:                                              ; preds = %569
  %575 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %576 = load i32, ptr %575, align 8, !tbaa !17
  %577 = icmp eq i32 4, %576
  br i1 %577, label %578, label %579

578:                                              ; preds = %574
  br label %644

579:                                              ; preds = %574
  %580 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %581 = load i32, ptr %580, align 8, !tbaa !17
  %582 = icmp eq i32 5, %581
  br i1 %582, label %583, label %584

583:                                              ; preds = %579
  br label %642

584:                                              ; preds = %579
  %585 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %586 = load i32, ptr %585, align 8, !tbaa !17
  %587 = icmp eq i32 6, %586
  br i1 %587, label %588, label %589

588:                                              ; preds = %584
  br label %640

589:                                              ; preds = %584
  %590 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %591 = load i32, ptr %590, align 8, !tbaa !17
  %592 = icmp eq i32 7, %591
  br i1 %592, label %593, label %594

593:                                              ; preds = %589
  br label %638

594:                                              ; preds = %589
  %595 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %596 = load i32, ptr %595, align 8, !tbaa !17
  %597 = icmp eq i32 8, %596
  br i1 %597, label %598, label %599

598:                                              ; preds = %594
  br label %636

599:                                              ; preds = %594
  %600 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %601 = load i32, ptr %600, align 8, !tbaa !17
  %602 = icmp eq i32 9, %601
  br i1 %602, label %603, label %604

603:                                              ; preds = %599
  br label %634

604:                                              ; preds = %599
  %605 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %606 = load i32, ptr %605, align 8, !tbaa !17
  %607 = icmp eq i32 10, %606
  br i1 %607, label %608, label %609

608:                                              ; preds = %604
  br label %632

609:                                              ; preds = %604
  %610 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %611 = load i32, ptr %610, align 8, !tbaa !17
  %612 = icmp eq i32 11, %611
  br i1 %612, label %613, label %614

613:                                              ; preds = %609
  br label %630

614:                                              ; preds = %609
  %615 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %616 = load i32, ptr %615, align 8, !tbaa !17
  %617 = icmp eq i32 12, %616
  br i1 %617, label %618, label %619

618:                                              ; preds = %614
  br label %628

619:                                              ; preds = %614
  %620 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %621 = load i32, ptr %620, align 8, !tbaa !17
  %622 = icmp eq i32 13, %621
  br i1 %622, label %623, label %624

623:                                              ; preds = %619
  br label %626

624:                                              ; preds = %619
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 935, ptr noundef @__PRETTY_FUNCTION__.main) #9
  unreachable

625:                                              ; No predecessors!
  br label %626

626:                                              ; preds = %625, %623
  %627 = phi i32 [ 1, %623 ], [ 0, %625 ]
  br label %628

628:                                              ; preds = %626, %618
  %629 = phi i32 [ 1, %618 ], [ %627, %626 ]
  br label %630

630:                                              ; preds = %628, %613
  %631 = phi i32 [ 2, %613 ], [ %629, %628 ]
  br label %632

632:                                              ; preds = %630, %608
  %633 = phi i32 [ 2, %608 ], [ %631, %630 ]
  br label %634

634:                                              ; preds = %632, %603
  %635 = phi i32 [ 4, %603 ], [ %633, %632 ]
  br label %636

636:                                              ; preds = %634, %598
  %637 = phi i32 [ 4, %598 ], [ %635, %634 ]
  br label %638

638:                                              ; preds = %636, %593
  %639 = phi i32 [ 8, %593 ], [ %637, %636 ]
  br label %640

640:                                              ; preds = %638, %588
  %641 = phi i32 [ 8, %588 ], [ %639, %638 ]
  br label %642

642:                                              ; preds = %640, %583
  %643 = phi i32 [ 1, %583 ], [ %641, %640 ]
  br label %644

644:                                              ; preds = %642, %578
  %645 = phi i32 [ 1, %578 ], [ %643, %642 ]
  br label %646

646:                                              ; preds = %644, %573
  %647 = phi i32 [ 2, %573 ], [ %645, %644 ]
  br label %648

648:                                              ; preds = %646, %568
  %649 = phi i32 [ 2, %568 ], [ %647, %646 ]
  br label %650

650:                                              ; preds = %648, %563
  %651 = phi i32 [ 4, %563 ], [ %649, %648 ]
  br label %652

652:                                              ; preds = %650, %558
  %653 = phi i32 [ 8, %558 ], [ %651, %650 ]
  %654 = sext i32 %653 to i64
  %655 = mul i64 %554, %654
  %656 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %655, i64 noundef 64)
  store ptr %656, ptr %50, align 8, !tbaa !9
  br label %657

657:                                              ; preds = %652, %544
  %658 = load i32, ptr %16, align 4, !tbaa !5
  %659 = sext i32 %658 to i64
  %660 = load i32, ptr %15, align 4, !tbaa !5
  %661 = sext i32 %660 to i64
  %662 = mul i64 %659, %661
  %663 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %664 = load i32, ptr %663, align 4, !tbaa !18
  %665 = icmp eq i32 0, %664
  br i1 %665, label %666, label %667

666:                                              ; preds = %657
  br label %760

667:                                              ; preds = %657
  %668 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %669 = load i32, ptr %668, align 4, !tbaa !18
  %670 = icmp eq i32 1, %669
  br i1 %670, label %671, label %672

671:                                              ; preds = %667
  br label %758

672:                                              ; preds = %667
  %673 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %674 = load i32, ptr %673, align 4, !tbaa !18
  %675 = icmp eq i32 2, %674
  br i1 %675, label %676, label %677

676:                                              ; preds = %672
  br label %756

677:                                              ; preds = %672
  %678 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %679 = load i32, ptr %678, align 4, !tbaa !18
  %680 = icmp eq i32 3, %679
  br i1 %680, label %681, label %682

681:                                              ; preds = %677
  br label %754

682:                                              ; preds = %677
  %683 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %684 = load i32, ptr %683, align 4, !tbaa !18
  %685 = icmp eq i32 4, %684
  br i1 %685, label %686, label %687

686:                                              ; preds = %682
  br label %752

687:                                              ; preds = %682
  %688 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %689 = load i32, ptr %688, align 4, !tbaa !18
  %690 = icmp eq i32 5, %689
  br i1 %690, label %691, label %692

691:                                              ; preds = %687
  br label %750

692:                                              ; preds = %687
  %693 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %694 = load i32, ptr %693, align 4, !tbaa !18
  %695 = icmp eq i32 6, %694
  br i1 %695, label %696, label %697

696:                                              ; preds = %692
  br label %748

697:                                              ; preds = %692
  %698 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %699 = load i32, ptr %698, align 4, !tbaa !18
  %700 = icmp eq i32 7, %699
  br i1 %700, label %701, label %702

701:                                              ; preds = %697
  br label %746

702:                                              ; preds = %697
  %703 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %704 = load i32, ptr %703, align 4, !tbaa !18
  %705 = icmp eq i32 8, %704
  br i1 %705, label %706, label %707

706:                                              ; preds = %702
  br label %744

707:                                              ; preds = %702
  %708 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %709 = load i32, ptr %708, align 4, !tbaa !18
  %710 = icmp eq i32 9, %709
  br i1 %710, label %711, label %712

711:                                              ; preds = %707
  br label %742

712:                                              ; preds = %707
  %713 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %714 = load i32, ptr %713, align 4, !tbaa !18
  %715 = icmp eq i32 10, %714
  br i1 %715, label %716, label %717

716:                                              ; preds = %712
  br label %740

717:                                              ; preds = %712
  %718 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %719 = load i32, ptr %718, align 4, !tbaa !18
  %720 = icmp eq i32 11, %719
  br i1 %720, label %721, label %722

721:                                              ; preds = %717
  br label %738

722:                                              ; preds = %717
  %723 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %724 = load i32, ptr %723, align 4, !tbaa !18
  %725 = icmp eq i32 12, %724
  br i1 %725, label %726, label %727

726:                                              ; preds = %722
  br label %736

727:                                              ; preds = %722
  %728 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %729 = load i32, ptr %728, align 4, !tbaa !18
  %730 = icmp eq i32 13, %729
  br i1 %730, label %731, label %732

731:                                              ; preds = %727
  br label %734

732:                                              ; preds = %727
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 937, ptr noundef @__PRETTY_FUNCTION__.main) #9
  unreachable

733:                                              ; No predecessors!
  br label %734

734:                                              ; preds = %733, %731
  %735 = phi i32 [ 1, %731 ], [ 0, %733 ]
  br label %736

736:                                              ; preds = %734, %726
  %737 = phi i32 [ 1, %726 ], [ %735, %734 ]
  br label %738

738:                                              ; preds = %736, %721
  %739 = phi i32 [ 2, %721 ], [ %737, %736 ]
  br label %740

740:                                              ; preds = %738, %716
  %741 = phi i32 [ 2, %716 ], [ %739, %738 ]
  br label %742

742:                                              ; preds = %740, %711
  %743 = phi i32 [ 4, %711 ], [ %741, %740 ]
  br label %744

744:                                              ; preds = %742, %706
  %745 = phi i32 [ 4, %706 ], [ %743, %742 ]
  br label %746

746:                                              ; preds = %744, %701
  %747 = phi i32 [ 8, %701 ], [ %745, %744 ]
  br label %748

748:                                              ; preds = %746, %696
  %749 = phi i32 [ 8, %696 ], [ %747, %746 ]
  br label %750

750:                                              ; preds = %748, %691
  %751 = phi i32 [ 1, %691 ], [ %749, %748 ]
  br label %752

752:                                              ; preds = %750, %686
  %753 = phi i32 [ 1, %686 ], [ %751, %750 ]
  br label %754

754:                                              ; preds = %752, %681
  %755 = phi i32 [ 2, %681 ], [ %753, %752 ]
  br label %756

756:                                              ; preds = %754, %676
  %757 = phi i32 [ 2, %676 ], [ %755, %754 ]
  br label %758

758:                                              ; preds = %756, %671
  %759 = phi i32 [ 4, %671 ], [ %757, %756 ]
  br label %760

760:                                              ; preds = %758, %666
  %761 = phi i32 [ 8, %666 ], [ %759, %758 ]
  %762 = sext i32 %761 to i64
  %763 = mul i64 %662, %762
  %764 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %763, i64 noundef 64)
  store ptr %764, ptr %46, align 8, !tbaa !9
  %765 = load i32, ptr %14, align 4, !tbaa !5
  %766 = sext i32 %765 to i64
  %767 = load i32, ptr %17, align 4, !tbaa !5
  %768 = sext i32 %767 to i64
  %769 = mul i64 %766, %768
  %770 = load i32, ptr %15, align 4, !tbaa !5
  %771 = sext i32 %770 to i64
  %772 = mul i64 %769, %771
  %773 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %774 = load i32, ptr %773, align 8, !tbaa !20
  %775 = icmp eq i32 0, %774
  br i1 %775, label %776, label %777

776:                                              ; preds = %760
  br label %870

777:                                              ; preds = %760
  %778 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %779 = load i32, ptr %778, align 8, !tbaa !20
  %780 = icmp eq i32 1, %779
  br i1 %780, label %781, label %782

781:                                              ; preds = %777
  br label %868

782:                                              ; preds = %777
  %783 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %784 = load i32, ptr %783, align 8, !tbaa !20
  %785 = icmp eq i32 2, %784
  br i1 %785, label %786, label %787

786:                                              ; preds = %782
  br label %866

787:                                              ; preds = %782
  %788 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %789 = load i32, ptr %788, align 8, !tbaa !20
  %790 = icmp eq i32 3, %789
  br i1 %790, label %791, label %792

791:                                              ; preds = %787
  br label %864

792:                                              ; preds = %787
  %793 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %794 = load i32, ptr %793, align 8, !tbaa !20
  %795 = icmp eq i32 4, %794
  br i1 %795, label %796, label %797

796:                                              ; preds = %792
  br label %862

797:                                              ; preds = %792
  %798 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %799 = load i32, ptr %798, align 8, !tbaa !20
  %800 = icmp eq i32 5, %799
  br i1 %800, label %801, label %802

801:                                              ; preds = %797
  br label %860

802:                                              ; preds = %797
  %803 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %804 = load i32, ptr %803, align 8, !tbaa !20
  %805 = icmp eq i32 6, %804
  br i1 %805, label %806, label %807

806:                                              ; preds = %802
  br label %858

807:                                              ; preds = %802
  %808 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %809 = load i32, ptr %808, align 8, !tbaa !20
  %810 = icmp eq i32 7, %809
  br i1 %810, label %811, label %812

811:                                              ; preds = %807
  br label %856

812:                                              ; preds = %807
  %813 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %814 = load i32, ptr %813, align 8, !tbaa !20
  %815 = icmp eq i32 8, %814
  br i1 %815, label %816, label %817

816:                                              ; preds = %812
  br label %854

817:                                              ; preds = %812
  %818 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %819 = load i32, ptr %818, align 8, !tbaa !20
  %820 = icmp eq i32 9, %819
  br i1 %820, label %821, label %822

821:                                              ; preds = %817
  br label %852

822:                                              ; preds = %817
  %823 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %824 = load i32, ptr %823, align 8, !tbaa !20
  %825 = icmp eq i32 10, %824
  br i1 %825, label %826, label %827

826:                                              ; preds = %822
  br label %850

827:                                              ; preds = %822
  %828 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %829 = load i32, ptr %828, align 8, !tbaa !20
  %830 = icmp eq i32 11, %829
  br i1 %830, label %831, label %832

831:                                              ; preds = %827
  br label %848

832:                                              ; preds = %827
  %833 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %834 = load i32, ptr %833, align 8, !tbaa !20
  %835 = icmp eq i32 12, %834
  br i1 %835, label %836, label %837

836:                                              ; preds = %832
  br label %846

837:                                              ; preds = %832
  %838 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %839 = load i32, ptr %838, align 8, !tbaa !20
  %840 = icmp eq i32 13, %839
  br i1 %840, label %841, label %842

841:                                              ; preds = %837
  br label %844

842:                                              ; preds = %837
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 938, ptr noundef @__PRETTY_FUNCTION__.main) #9
  unreachable

843:                                              ; No predecessors!
  br label %844

844:                                              ; preds = %843, %841
  %845 = phi i32 [ 1, %841 ], [ 0, %843 ]
  br label %846

846:                                              ; preds = %844, %836
  %847 = phi i32 [ 1, %836 ], [ %845, %844 ]
  br label %848

848:                                              ; preds = %846, %831
  %849 = phi i32 [ 2, %831 ], [ %847, %846 ]
  br label %850

850:                                              ; preds = %848, %826
  %851 = phi i32 [ 2, %826 ], [ %849, %848 ]
  br label %852

852:                                              ; preds = %850, %821
  %853 = phi i32 [ 4, %821 ], [ %851, %850 ]
  br label %854

854:                                              ; preds = %852, %816
  %855 = phi i32 [ 4, %816 ], [ %853, %852 ]
  br label %856

856:                                              ; preds = %854, %811
  %857 = phi i32 [ 8, %811 ], [ %855, %854 ]
  br label %858

858:                                              ; preds = %856, %806
  %859 = phi i32 [ 8, %806 ], [ %857, %856 ]
  br label %860

860:                                              ; preds = %858, %801
  %861 = phi i32 [ 1, %801 ], [ %859, %858 ]
  br label %862

862:                                              ; preds = %860, %796
  %863 = phi i32 [ 1, %796 ], [ %861, %860 ]
  br label %864

864:                                              ; preds = %862, %791
  %865 = phi i32 [ 2, %791 ], [ %863, %862 ]
  br label %866

866:                                              ; preds = %864, %786
  %867 = phi i32 [ 2, %786 ], [ %865, %864 ]
  br label %868

868:                                              ; preds = %866, %781
  %869 = phi i32 [ 4, %781 ], [ %867, %866 ]
  br label %870

870:                                              ; preds = %868, %776
  %871 = phi i32 [ 8, %776 ], [ %869, %868 ]
  %872 = sext i32 %871 to i64
  %873 = mul i64 %772, %872
  %874 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %873, i64 noundef 64)
  store ptr %874, ptr %47, align 8, !tbaa !9
  %875 = load i32, ptr %14, align 4, !tbaa !5
  %876 = sext i32 %875 to i64
  %877 = load i32, ptr %17, align 4, !tbaa !5
  %878 = sext i32 %877 to i64
  %879 = mul i64 %876, %878
  %880 = load i32, ptr %15, align 4, !tbaa !5
  %881 = sext i32 %880 to i64
  %882 = mul i64 %879, %881
  %883 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %884 = load i32, ptr %883, align 8, !tbaa !20
  %885 = icmp eq i32 0, %884
  br i1 %885, label %886, label %887

886:                                              ; preds = %870
  br label %980

887:                                              ; preds = %870
  %888 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %889 = load i32, ptr %888, align 8, !tbaa !20
  %890 = icmp eq i32 1, %889
  br i1 %890, label %891, label %892

891:                                              ; preds = %887
  br label %978

892:                                              ; preds = %887
  %893 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %894 = load i32, ptr %893, align 8, !tbaa !20
  %895 = icmp eq i32 2, %894
  br i1 %895, label %896, label %897

896:                                              ; preds = %892
  br label %976

897:                                              ; preds = %892
  %898 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %899 = load i32, ptr %898, align 8, !tbaa !20
  %900 = icmp eq i32 3, %899
  br i1 %900, label %901, label %902

901:                                              ; preds = %897
  br label %974

902:                                              ; preds = %897
  %903 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %904 = load i32, ptr %903, align 8, !tbaa !20
  %905 = icmp eq i32 4, %904
  br i1 %905, label %906, label %907

906:                                              ; preds = %902
  br label %972

907:                                              ; preds = %902
  %908 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %909 = load i32, ptr %908, align 8, !tbaa !20
  %910 = icmp eq i32 5, %909
  br i1 %910, label %911, label %912

911:                                              ; preds = %907
  br label %970

912:                                              ; preds = %907
  %913 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %914 = load i32, ptr %913, align 8, !tbaa !20
  %915 = icmp eq i32 6, %914
  br i1 %915, label %916, label %917

916:                                              ; preds = %912
  br label %968

917:                                              ; preds = %912
  %918 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %919 = load i32, ptr %918, align 8, !tbaa !20
  %920 = icmp eq i32 7, %919
  br i1 %920, label %921, label %922

921:                                              ; preds = %917
  br label %966

922:                                              ; preds = %917
  %923 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %924 = load i32, ptr %923, align 8, !tbaa !20
  %925 = icmp eq i32 8, %924
  br i1 %925, label %926, label %927

926:                                              ; preds = %922
  br label %964

927:                                              ; preds = %922
  %928 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %929 = load i32, ptr %928, align 8, !tbaa !20
  %930 = icmp eq i32 9, %929
  br i1 %930, label %931, label %932

931:                                              ; preds = %927
  br label %962

932:                                              ; preds = %927
  %933 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %934 = load i32, ptr %933, align 8, !tbaa !20
  %935 = icmp eq i32 10, %934
  br i1 %935, label %936, label %937

936:                                              ; preds = %932
  br label %960

937:                                              ; preds = %932
  %938 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %939 = load i32, ptr %938, align 8, !tbaa !20
  %940 = icmp eq i32 11, %939
  br i1 %940, label %941, label %942

941:                                              ; preds = %937
  br label %958

942:                                              ; preds = %937
  %943 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %944 = load i32, ptr %943, align 8, !tbaa !20
  %945 = icmp eq i32 12, %944
  br i1 %945, label %946, label %947

946:                                              ; preds = %942
  br label %956

947:                                              ; preds = %942
  %948 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %949 = load i32, ptr %948, align 8, !tbaa !20
  %950 = icmp eq i32 13, %949
  br i1 %950, label %951, label %952

951:                                              ; preds = %947
  br label %954

952:                                              ; preds = %947
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 939, ptr noundef @__PRETTY_FUNCTION__.main) #9
  unreachable

953:                                              ; No predecessors!
  br label %954

954:                                              ; preds = %953, %951
  %955 = phi i32 [ 1, %951 ], [ 0, %953 ]
  br label %956

956:                                              ; preds = %954, %946
  %957 = phi i32 [ 1, %946 ], [ %955, %954 ]
  br label %958

958:                                              ; preds = %956, %941
  %959 = phi i32 [ 2, %941 ], [ %957, %956 ]
  br label %960

960:                                              ; preds = %958, %936
  %961 = phi i32 [ 2, %936 ], [ %959, %958 ]
  br label %962

962:                                              ; preds = %960, %931
  %963 = phi i32 [ 4, %931 ], [ %961, %960 ]
  br label %964

964:                                              ; preds = %962, %926
  %965 = phi i32 [ 4, %926 ], [ %963, %962 ]
  br label %966

966:                                              ; preds = %964, %921
  %967 = phi i32 [ 8, %921 ], [ %965, %964 ]
  br label %968

968:                                              ; preds = %966, %916
  %969 = phi i32 [ 8, %916 ], [ %967, %966 ]
  br label %970

970:                                              ; preds = %968, %911
  %971 = phi i32 [ 1, %911 ], [ %969, %968 ]
  br label %972

972:                                              ; preds = %970, %906
  %973 = phi i32 [ 1, %906 ], [ %971, %970 ]
  br label %974

974:                                              ; preds = %972, %901
  %975 = phi i32 [ 2, %901 ], [ %973, %972 ]
  br label %976

976:                                              ; preds = %974, %896
  %977 = phi i32 [ 2, %896 ], [ %975, %974 ]
  br label %978

978:                                              ; preds = %976, %891
  %979 = phi i32 [ 4, %891 ], [ %977, %976 ]
  br label %980

980:                                              ; preds = %978, %886
  %981 = phi i32 [ 8, %886 ], [ %979, %978 ]
  %982 = sext i32 %981 to i64
  %983 = mul i64 %882, %982
  %984 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %983, i64 noundef 64)
  store ptr %984, ptr %48, align 8, !tbaa !9
  %985 = load i32, ptr %14, align 4, !tbaa !5
  %986 = sext i32 %985 to i64
  %987 = load i32, ptr %17, align 4, !tbaa !5
  %988 = sext i32 %987 to i64
  %989 = mul i64 %986, %988
  %990 = load i32, ptr %15, align 4, !tbaa !5
  %991 = sext i32 %990 to i64
  %992 = mul i64 %989, %991
  %993 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %994 = load i32, ptr %993, align 8, !tbaa !20
  %995 = icmp eq i32 0, %994
  br i1 %995, label %996, label %997

996:                                              ; preds = %980
  br label %1090

997:                                              ; preds = %980
  %998 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %999 = load i32, ptr %998, align 8, !tbaa !20
  %1000 = icmp eq i32 1, %999
  br i1 %1000, label %1001, label %1002

1001:                                             ; preds = %997
  br label %1088

1002:                                             ; preds = %997
  %1003 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1004 = load i32, ptr %1003, align 8, !tbaa !20
  %1005 = icmp eq i32 2, %1004
  br i1 %1005, label %1006, label %1007

1006:                                             ; preds = %1002
  br label %1086

1007:                                             ; preds = %1002
  %1008 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1009 = load i32, ptr %1008, align 8, !tbaa !20
  %1010 = icmp eq i32 3, %1009
  br i1 %1010, label %1011, label %1012

1011:                                             ; preds = %1007
  br label %1084

1012:                                             ; preds = %1007
  %1013 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1014 = load i32, ptr %1013, align 8, !tbaa !20
  %1015 = icmp eq i32 4, %1014
  br i1 %1015, label %1016, label %1017

1016:                                             ; preds = %1012
  br label %1082

1017:                                             ; preds = %1012
  %1018 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1019 = load i32, ptr %1018, align 8, !tbaa !20
  %1020 = icmp eq i32 5, %1019
  br i1 %1020, label %1021, label %1022

1021:                                             ; preds = %1017
  br label %1080

1022:                                             ; preds = %1017
  %1023 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1024 = load i32, ptr %1023, align 8, !tbaa !20
  %1025 = icmp eq i32 6, %1024
  br i1 %1025, label %1026, label %1027

1026:                                             ; preds = %1022
  br label %1078

1027:                                             ; preds = %1022
  %1028 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1029 = load i32, ptr %1028, align 8, !tbaa !20
  %1030 = icmp eq i32 7, %1029
  br i1 %1030, label %1031, label %1032

1031:                                             ; preds = %1027
  br label %1076

1032:                                             ; preds = %1027
  %1033 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1034 = load i32, ptr %1033, align 8, !tbaa !20
  %1035 = icmp eq i32 8, %1034
  br i1 %1035, label %1036, label %1037

1036:                                             ; preds = %1032
  br label %1074

1037:                                             ; preds = %1032
  %1038 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1039 = load i32, ptr %1038, align 8, !tbaa !20
  %1040 = icmp eq i32 9, %1039
  br i1 %1040, label %1041, label %1042

1041:                                             ; preds = %1037
  br label %1072

1042:                                             ; preds = %1037
  %1043 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1044 = load i32, ptr %1043, align 8, !tbaa !20
  %1045 = icmp eq i32 10, %1044
  br i1 %1045, label %1046, label %1047

1046:                                             ; preds = %1042
  br label %1070

1047:                                             ; preds = %1042
  %1048 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1049 = load i32, ptr %1048, align 8, !tbaa !20
  %1050 = icmp eq i32 11, %1049
  br i1 %1050, label %1051, label %1052

1051:                                             ; preds = %1047
  br label %1068

1052:                                             ; preds = %1047
  %1053 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1054 = load i32, ptr %1053, align 8, !tbaa !20
  %1055 = icmp eq i32 12, %1054
  br i1 %1055, label %1056, label %1057

1056:                                             ; preds = %1052
  br label %1066

1057:                                             ; preds = %1052
  %1058 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1059 = load i32, ptr %1058, align 8, !tbaa !20
  %1060 = icmp eq i32 13, %1059
  br i1 %1060, label %1061, label %1062

1061:                                             ; preds = %1057
  br label %1064

1062:                                             ; preds = %1057
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 940, ptr noundef @__PRETTY_FUNCTION__.main) #9
  unreachable

1063:                                             ; No predecessors!
  br label %1064

1064:                                             ; preds = %1063, %1061
  %1065 = phi i32 [ 1, %1061 ], [ 0, %1063 ]
  br label %1066

1066:                                             ; preds = %1064, %1056
  %1067 = phi i32 [ 1, %1056 ], [ %1065, %1064 ]
  br label %1068

1068:                                             ; preds = %1066, %1051
  %1069 = phi i32 [ 2, %1051 ], [ %1067, %1066 ]
  br label %1070

1070:                                             ; preds = %1068, %1046
  %1071 = phi i32 [ 2, %1046 ], [ %1069, %1068 ]
  br label %1072

1072:                                             ; preds = %1070, %1041
  %1073 = phi i32 [ 4, %1041 ], [ %1071, %1070 ]
  br label %1074

1074:                                             ; preds = %1072, %1036
  %1075 = phi i32 [ 4, %1036 ], [ %1073, %1072 ]
  br label %1076

1076:                                             ; preds = %1074, %1031
  %1077 = phi i32 [ 8, %1031 ], [ %1075, %1074 ]
  br label %1078

1078:                                             ; preds = %1076, %1026
  %1079 = phi i32 [ 8, %1026 ], [ %1077, %1076 ]
  br label %1080

1080:                                             ; preds = %1078, %1021
  %1081 = phi i32 [ 1, %1021 ], [ %1079, %1078 ]
  br label %1082

1082:                                             ; preds = %1080, %1016
  %1083 = phi i32 [ 1, %1016 ], [ %1081, %1080 ]
  br label %1084

1084:                                             ; preds = %1082, %1011
  %1085 = phi i32 [ 2, %1011 ], [ %1083, %1082 ]
  br label %1086

1086:                                             ; preds = %1084, %1006
  %1087 = phi i32 [ 2, %1006 ], [ %1085, %1084 ]
  br label %1088

1088:                                             ; preds = %1086, %1001
  %1089 = phi i32 [ 4, %1001 ], [ %1087, %1086 ]
  br label %1090

1090:                                             ; preds = %1088, %996
  %1091 = phi i32 [ 8, %996 ], [ %1089, %1088 ]
  %1092 = sext i32 %1091 to i64
  %1093 = mul i64 %992, %1092
  %1094 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %1093, i64 noundef 64)
  store ptr %1094, ptr %49, align 8, !tbaa !9
  %1095 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 0
  %1096 = load i32, ptr %1095, align 8, !tbaa !17
  %1097 = load ptr, ptr %45, align 8, !tbaa !9
  %1098 = load i32, ptr %14, align 4, !tbaa !5
  %1099 = load i32, ptr %17, align 4, !tbaa !5
  %1100 = mul nsw i32 %1098, %1099
  %1101 = load i32, ptr %16, align 4, !tbaa !5
  %1102 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 16
  %1103 = load i32, ptr %1102, align 4, !tbaa !13
  call void @init_random_matrix(i32 noundef %1096, ptr noundef %1097, i32 noundef 1, i32 noundef %1100, i32 noundef %1101, i32 noundef %1103)
  %1104 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 1
  %1105 = load i32, ptr %1104, align 4, !tbaa !18
  %1106 = load ptr, ptr %46, align 8, !tbaa !9
  %1107 = load i32, ptr %16, align 4, !tbaa !5
  %1108 = load i32, ptr %15, align 4, !tbaa !5
  %1109 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 17
  %1110 = load i32, ptr %1109, align 8, !tbaa !15
  call void @init_random_matrix(i32 noundef %1105, ptr noundef %1106, i32 noundef 1, i32 noundef %1107, i32 noundef %1108, i32 noundef %1110)
  %1111 = load double, ptr %20, align 8, !tbaa !11
  %1112 = load ptr, ptr %45, align 8, !tbaa !9
  %1113 = load ptr, ptr %46, align 8, !tbaa !9
  %1114 = load ptr, ptr %50, align 8, !tbaa !9
  call void @create_spmm_inputs(ptr noundef %36, double noundef %1111, ptr noundef %1112, ptr noundef %1113, ptr noundef %1114, ptr noundef %53, ptr noundef %51, ptr noundef %52)
  %1115 = load double, ptr %26, align 8, !tbaa !11
  %1116 = fcmp oeq double %1115, 0.000000e+00
  br i1 %1116, label %1117, label %1139

1117:                                             ; preds = %1090
  %1118 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1119 = load i32, ptr %1118, align 8, !tbaa !20
  %1120 = load ptr, ptr %47, align 8, !tbaa !9
  %1121 = load i32, ptr %14, align 4, !tbaa !5
  %1122 = load i32, ptr %17, align 4, !tbaa !5
  %1123 = mul nsw i32 %1121, %1122
  %1124 = load i32, ptr %15, align 4, !tbaa !5
  call void @init_garbage_matrix(i32 noundef %1119, ptr noundef %1120, i32 noundef 1, i32 noundef %1123, i32 noundef %1124)
  %1125 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1126 = load i32, ptr %1125, align 8, !tbaa !20
  %1127 = load ptr, ptr %48, align 8, !tbaa !9
  %1128 = load i32, ptr %14, align 4, !tbaa !5
  %1129 = load i32, ptr %17, align 4, !tbaa !5
  %1130 = mul nsw i32 %1128, %1129
  %1131 = load i32, ptr %15, align 4, !tbaa !5
  call void @init_garbage_matrix(i32 noundef %1126, ptr noundef %1127, i32 noundef 1, i32 noundef %1130, i32 noundef %1131)
  %1132 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1133 = load i32, ptr %1132, align 8, !tbaa !20
  %1134 = load ptr, ptr %49, align 8, !tbaa !9
  %1135 = load i32, ptr %14, align 4, !tbaa !5
  %1136 = load i32, ptr %17, align 4, !tbaa !5
  %1137 = mul nsw i32 %1135, %1136
  %1138 = load i32, ptr %15, align 4, !tbaa !5
  call void @init_garbage_matrix(i32 noundef %1133, ptr noundef %1134, i32 noundef 1, i32 noundef %1137, i32 noundef %1138)
  br label %1161

1139:                                             ; preds = %1090
  %1140 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1141 = load i32, ptr %1140, align 8, !tbaa !20
  %1142 = load ptr, ptr %47, align 8, !tbaa !9
  %1143 = load i32, ptr %14, align 4, !tbaa !5
  %1144 = load i32, ptr %17, align 4, !tbaa !5
  %1145 = mul nsw i32 %1143, %1144
  %1146 = load i32, ptr %15, align 4, !tbaa !5
  call void @init_zero_matrix(i32 noundef %1141, ptr noundef %1142, i32 noundef 1, i32 noundef %1145, i32 noundef %1146)
  %1147 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1148 = load i32, ptr %1147, align 8, !tbaa !20
  %1149 = load ptr, ptr %48, align 8, !tbaa !9
  %1150 = load i32, ptr %14, align 4, !tbaa !5
  %1151 = load i32, ptr %17, align 4, !tbaa !5
  %1152 = mul nsw i32 %1150, %1151
  %1153 = load i32, ptr %15, align 4, !tbaa !5
  call void @init_zero_matrix(i32 noundef %1148, ptr noundef %1149, i32 noundef 1, i32 noundef %1152, i32 noundef %1153)
  %1154 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1155 = load i32, ptr %1154, align 8, !tbaa !20
  %1156 = load ptr, ptr %49, align 8, !tbaa !9
  %1157 = load i32, ptr %14, align 4, !tbaa !5
  %1158 = load i32, ptr %17, align 4, !tbaa !5
  %1159 = mul nsw i32 %1157, %1158
  %1160 = load i32, ptr %15, align 4, !tbaa !5
  call void @init_zero_matrix(i32 noundef %1155, ptr noundef %1156, i32 noundef 1, i32 noundef %1159, i32 noundef %1160)
  br label %1161

1161:                                             ; preds = %1139, %1117
  %1162 = load ptr, ptr %45, align 8, !tbaa !9
  %1163 = load ptr, ptr %46, align 8, !tbaa !9
  %1164 = load ptr, ptr %49, align 8, !tbaa !9
  call void @dense_gemm_ref(ptr noundef %36, ptr noundef %1162, ptr noundef %1163, ptr noundef %1164)
  %1165 = load ptr, ptr %50, align 8, !tbaa !9
  %1166 = load ptr, ptr %53, align 8, !tbaa !9
  %1167 = load ptr, ptr %51, align 8, !tbaa !9
  %1168 = load ptr, ptr %52, align 8, !tbaa !9
  %1169 = load ptr, ptr %47, align 8, !tbaa !9
  %1170 = load ptr, ptr %48, align 8, !tbaa !9
  %1171 = load i32, ptr %34, align 4, !tbaa !5
  %1172 = call double @jit_matmul(ptr noundef %36, ptr noundef %1165, ptr noundef %1166, ptr noundef %1167, ptr noundef %1168, ptr noundef %1169, ptr noundef %1170, i32 noundef %1171)
  store double %1172, ptr %27, align 8, !tbaa !11
  %1173 = getelementptr inbounds %struct.spmm_def, ptr %36, i32 0, i32 2
  %1174 = load i32, ptr %1173, align 8, !tbaa !20
  %1175 = load ptr, ptr %49, align 8, !tbaa !9
  %1176 = load ptr, ptr %47, align 8, !tbaa !9
  %1177 = load i32, ptr %14, align 4, !tbaa !5
  %1178 = load i32, ptr %17, align 4, !tbaa !5
  %1179 = mul nsw i32 %1177, %1178
  %1180 = load i32, ptr %14, align 4, !tbaa !5
  %1181 = load i32, ptr %17, align 4, !tbaa !5
  %1182 = mul nsw i32 %1180, %1181
  %1183 = load i32, ptr %15, align 4, !tbaa !5
  %1184 = call double @check_matrix(i32 noundef %1174, ptr noundef %1175, ptr noundef %1176, i32 noundef %1179, i32 noundef %1182, i32 noundef %1183)
  store double %1184, ptr %43, align 8, !tbaa !11
  %1185 = load ptr, ptr %45, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1185)
  %1186 = load i32, ptr %54, align 4, !tbaa !5
  %1187 = icmp ne i32 %1186, 1
  br i1 %1187, label %1188, label %1190

1188:                                             ; preds = %1161
  %1189 = load ptr, ptr %50, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1189)
  br label %1190

1190:                                             ; preds = %1188, %1161
  %1191 = load ptr, ptr %46, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1191)
  %1192 = load ptr, ptr %47, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1192)
  %1193 = load ptr, ptr %48, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1193)
  %1194 = load ptr, ptr %49, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1194)
  %1195 = load ptr, ptr %51, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1195)
  %1196 = load ptr, ptr %52, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1196)
  %1197 = load ptr, ptr %53, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1197)
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #7
  %1198 = load i32, ptr %28, align 4, !tbaa !5
  %1199 = icmp eq i32 %1198, 0
  br i1 %1199, label %1200, label %1227

1200:                                             ; preds = %1190
  %1201 = load double, ptr %27, align 8, !tbaa !11
  %1202 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, double noundef %1201)
  %1203 = load i32, ptr %34, align 4, !tbaa !5
  %1204 = sitofp i32 %1203 to double
  %1205 = load i32, ptr %14, align 4, !tbaa !5
  %1206 = sitofp i32 %1205 to double
  %1207 = fmul double %1204, %1206
  %1208 = load i32, ptr %17, align 4, !tbaa !5
  %1209 = sitofp i32 %1208 to double
  %1210 = fmul double %1207, %1209
  %1211 = load i32, ptr %15, align 4, !tbaa !5
  %1212 = sitofp i32 %1211 to double
  %1213 = fmul double %1210, %1212
  %1214 = load i32, ptr %16, align 4, !tbaa !5
  %1215 = sitofp i32 %1214 to double
  %1216 = fmul double %1213, %1215
  %1217 = load i32, ptr %37, align 4, !tbaa !5
  %1218 = sitofp i32 %1217 to double
  %1219 = fmul double %1216, %1218
  %1220 = fmul double %1219, 2.000000e+00
  %1221 = load double, ptr %27, align 8, !tbaa !11
  %1222 = fmul double %1221, 1.000000e+09
  %1223 = fdiv double %1220, %1222
  %1224 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %1223)
  %1225 = load double, ptr %43, align 8, !tbaa !11
  %1226 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, double noundef %1225)
  br label %1258

1227:                                             ; preds = %1190
  %1228 = load i32, ptr %37, align 4, !tbaa !5
  %1229 = sitofp i32 %1228 to double
  %1230 = load double, ptr %27, align 8, !tbaa !11
  %1231 = fdiv double %1230, %1229
  store double %1231, ptr %27, align 8, !tbaa !11
  %1232 = load double, ptr %27, align 8, !tbaa !11
  %1233 = call i32 (ptr, ...) @printf(ptr noundef @.str.16, double noundef %1232)
  %1234 = load i32, ptr %34, align 4, !tbaa !5
  %1235 = sitofp i32 %1234 to double
  %1236 = load i32, ptr %14, align 4, !tbaa !5
  %1237 = sitofp i32 %1236 to double
  %1238 = fmul double %1235, %1237
  %1239 = load i32, ptr %17, align 4, !tbaa !5
  %1240 = sitofp i32 %1239 to double
  %1241 = fmul double %1238, %1240
  %1242 = load i32, ptr %15, align 4, !tbaa !5
  %1243 = sitofp i32 %1242 to double
  %1244 = fmul double %1241, %1243
  %1245 = load i32, ptr %16, align 4, !tbaa !5
  %1246 = sitofp i32 %1245 to double
  %1247 = fmul double %1244, %1246
  %1248 = load i32, ptr %37, align 4, !tbaa !5
  %1249 = sitofp i32 %1248 to double
  %1250 = fmul double %1247, %1249
  %1251 = fmul double %1250, 2.000000e+00
  %1252 = load double, ptr %27, align 8, !tbaa !11
  %1253 = fmul double %1252, 1.000000e+09
  %1254 = fdiv double %1251, %1253
  %1255 = call i32 (ptr, ...) @printf(ptr noundef @.str.17, double noundef %1254)
  %1256 = load double, ptr %43, align 8, !tbaa !11
  %1257 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, double noundef %1256)
  br label %1258

1258:                                             ; preds = %1227, %1200
  %1259 = load double, ptr %32, align 8, !tbaa !11
  %1260 = load double, ptr %43, align 8, !tbaa !11
  %1261 = fcmp olt double %1259, %1260
  br i1 %1261, label %1262, label %1267

1262:                                             ; preds = %1258
  %1263 = load i32, ptr %31, align 4, !tbaa !5
  %1264 = icmp eq i32 %1263, 1
  br i1 %1264, label %1265, label %1267

1265:                                             ; preds = %1262
  %1266 = load double, ptr %43, align 8, !tbaa !11
  store double %1266, ptr %32, align 8, !tbaa !11
  br label %1267

1267:                                             ; preds = %1265, %1262, %1258
  store i32 0, ptr %39, align 4
  br label %1268

1268:                                             ; preds = %1267, %413
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #7
  %1269 = load i32, ptr %39, align 4
  switch i32 %1269, label %1277 [
    i32 0, label %1270
    i32 2, label %1274
  ]

1270:                                             ; preds = %1268
  br label %1271

1271:                                             ; preds = %1270
  %1272 = load i32, ptr %38, align 4, !tbaa !5
  %1273 = icmp ne i32 %1272, 0
  br i1 %1273, label %370, label %1274, !llvm.loop !35

1274:                                             ; preds = %1271, %1268
  store i32 0, ptr %3, align 4
  store i32 1, ptr %39, align 4
  br label %1275

1275:                                             ; preds = %1274, %221
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #7
  call void @llvm.lifetime.end.p0(i64 88, ptr %36) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #7
  %1276 = load i32, ptr %3, align 4
  ret i32 %1276

1277:                                             ; preds = %1268
  unreachable
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @char_to_libxsmm_datatype(ptr noundef) #4

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare i32 @atoi(ptr noundef nonnull) #5

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare double @atof(ptr noundef nonnull) #5

; Function Attrs: nounwind
declare ptr @getenv(ptr noundef) #6

declare ptr @libxsmm_stristr(ptr noundef, ptr noundef) #2

declare i32 @libxsmm_cpuid(ptr noundef) #2

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

; Function Attrs: nounwind
declare i32 @fprintf(ptr noundef, ptr noundef, ...) #6

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #3

declare noalias ptr @fopen(ptr noundef, ptr noundef) #2

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

; Function Attrs: nounwind
declare i32 @__isoc99_sscanf(ptr noundef, ptr noundef, ...) #6

declare void @libxsmm_rng_set_seed(i32 noundef) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init_random_matrix(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init_garbage_matrix(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init_zero_matrix(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden double @jit_matmul(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden double @check_matrix(i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) #4

declare void @libxsmm_free(ptr noundef) #2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !6, i64 68}
!14 = !{!"spmm_def", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28, !6, i64 32, !6, i64 36, !12, i64 40, !6, i64 48, !6, i64 52, !6, i64 56, !6, i64 60, !6, i64 64, !6, i64 68, !6, i64 72, !6, i64 76, !6, i64 80, !6, i64 84}
!15 = !{!14, !6, i64 72}
!16 = !{!14, !6, i64 76}
!17 = !{!14, !6, i64 0}
!18 = !{!14, !6, i64 4}
!19 = !{!14, !6, i64 12}
!20 = !{!14, !6, i64 8}
!21 = !{!14, !12, i64 40}
!22 = !{!14, !6, i64 56}
!23 = !{!14, !6, i64 60}
!24 = !{!14, !6, i64 64}
!25 = !{!14, !6, i64 48}
!26 = !{!14, !6, i64 52}
!27 = !{!14, !6, i64 80}
!28 = !{!14, !6, i64 84}
!29 = !{!14, !6, i64 16}
!30 = !{!14, !6, i64 36}
!31 = !{!14, !6, i64 20}
!32 = !{!14, !6, i64 24}
!33 = !{!14, !6, i64 28}
!34 = !{!14, !6, i64 32}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}


; 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.spmm_def = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

@.str = external hidden unnamed_addr constant [27 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [55 x i8], align 1
@stderr = external local_unnamed_addr global ptr, align 8
@.str.6 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [65 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [76 x i8], align 1
@__PRETTY_FUNCTION__.main = external hidden unnamed_addr constant [23 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [11 x i8], align 1
@switch.table.main.5 = private unnamed_addr constant [11 x i64] [i64 2, i64 2, i64 1, i64 2, i64 8, i64 2, i64 4, i64 2, i64 2, i64 2, i64 1], align 8

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

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

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

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

declare i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef) local_unnamed_addr #2

declare noalias ptr @libxsmm_aligned_malloc(i64 noundef, i64 noundef) local_unnamed_addr #2

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @main(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #1 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca %struct.spmm_def, align 8
  %10 = alloca [512 x i8], align 16
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #8
  store i32 0, ptr %3, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #8
  store i32 0, ptr %4, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #8
  store i32 0, ptr %5, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #8
  store i32 1, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %7) #8
  store i32 1, ptr %7, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %8) #8
  store i32 1, ptr %8, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 88, ptr nonnull %9) #8
  %14 = add i32 %0, -19
  %or.cond = icmp ult i32 %14, 2
  br i1 %or.cond, label %15, label %71

15:                                               ; preds = %2
  %16 = getelementptr inbounds i8, ptr %1, i64 8
  %17 = load ptr, ptr %16, align 8, !tbaa !9
  %18 = getelementptr inbounds i8, ptr %1, i64 16
  %19 = load ptr, ptr %18, align 8, !tbaa !9
  %20 = getelementptr inbounds i8, ptr %1, i64 24
  %21 = load ptr, ptr %20, align 8, !tbaa !9
  %22 = getelementptr inbounds i8, ptr %1, i64 32
  %23 = load ptr, ptr %22, align 8, !tbaa !9
  %24 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %17)
  %25 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %19)
  %26 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %21)
  %27 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %23)
  %28 = getelementptr inbounds i8, ptr %1, i64 40
  %29 = load ptr, ptr %28, align 8, !tbaa !9
  %30 = tail call i32 @atoi(ptr nocapture noundef %29) #9
  store i32 %30, ptr %3, align 4, !tbaa !5
  %31 = getelementptr inbounds i8, ptr %1, i64 48
  %32 = load ptr, ptr %31, align 8, !tbaa !9
  %33 = tail call i32 @atoi(ptr nocapture noundef %32) #9
  store i32 %33, ptr %4, align 4, !tbaa !5
  %34 = getelementptr inbounds i8, ptr %1, i64 56
  %35 = load ptr, ptr %34, align 8, !tbaa !9
  %36 = tail call i32 @atoi(ptr nocapture noundef %35) #9
  store i32 %36, ptr %5, align 4, !tbaa !5
  %37 = getelementptr inbounds i8, ptr %1, i64 64
  %38 = load ptr, ptr %37, align 8, !tbaa !9
  %39 = tail call i32 @atoi(ptr nocapture noundef %38) #9
  store i32 %39, ptr %6, align 4, !tbaa !5
  %40 = getelementptr inbounds i8, ptr %1, i64 72
  %41 = load ptr, ptr %40, align 8, !tbaa !9
  %42 = tail call double @atof(ptr noundef %41) #9
  %43 = getelementptr inbounds i8, ptr %1, i64 80
  %44 = load ptr, ptr %43, align 8, !tbaa !9
  %45 = tail call i32 @atoi(ptr nocapture noundef %44) #9
  store i32 %45, ptr %7, align 4, !tbaa !5
  %46 = getelementptr inbounds i8, ptr %1, i64 88
  %47 = load ptr, ptr %46, align 8, !tbaa !9
  %48 = tail call i32 @atoi(ptr nocapture noundef %47) #9
  store i32 %48, ptr %8, align 4, !tbaa !5
  %49 = getelementptr inbounds i8, ptr %1, i64 96
  %50 = load ptr, ptr %49, align 8, !tbaa !9
  %51 = tail call double @atof(ptr noundef %50) #9
  %52 = getelementptr inbounds i8, ptr %1, i64 104
  %53 = load ptr, ptr %52, align 8, !tbaa !9
  %54 = tail call i32 @atoi(ptr nocapture noundef %53) #9
  %55 = getelementptr inbounds i8, ptr %1, i64 112
  %56 = load ptr, ptr %55, align 8, !tbaa !9
  %57 = tail call i32 @atoi(ptr nocapture noundef %56) #9
  %58 = getelementptr inbounds i8, ptr %1, i64 120
  %59 = load ptr, ptr %58, align 8, !tbaa !9
  %60 = tail call i32 @atoi(ptr nocapture noundef %59) #9
  %61 = getelementptr inbounds i8, ptr %1, i64 128
  %62 = load ptr, ptr %61, align 8, !tbaa !9
  %63 = tail call i32 @atoi(ptr nocapture noundef %62) #9
  %64 = getelementptr inbounds i8, ptr %1, i64 136
  %65 = load ptr, ptr %64, align 8, !tbaa !9
  %66 = tail call i32 @atoi(ptr nocapture noundef %65) #9
  %67 = getelementptr inbounds i8, ptr %1, i64 144
  %68 = load ptr, ptr %67, align 8, !tbaa !9
  %69 = tail call i32 @atoi(ptr nocapture noundef %68) #9
  %70 = icmp ugt i32 %0, 19
  br i1 %70, label %.sink.split, label %116

71:                                               ; preds = %2
  %72 = add i32 %0, -15
  %or.cond3 = icmp ult i32 %72, 2
  br i1 %or.cond3, label %73, label %.loopexit

73:                                               ; preds = %71
  %74 = getelementptr inbounds i8, ptr %1, i64 8
  %75 = load ptr, ptr %74, align 8, !tbaa !9
  %76 = getelementptr inbounds i8, ptr %1, i64 16
  %77 = load ptr, ptr %76, align 8, !tbaa !9
  %78 = getelementptr inbounds i8, ptr %1, i64 24
  %79 = load ptr, ptr %78, align 8, !tbaa !9
  %80 = getelementptr inbounds i8, ptr %1, i64 32
  %81 = load ptr, ptr %80, align 8, !tbaa !9
  %82 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %75)
  %83 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %77)
  %84 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %79)
  %85 = tail call i32 @char_to_libxsmm_datatype(ptr noundef %81)
  %86 = getelementptr inbounds i8, ptr %1, i64 40
  %87 = load ptr, ptr %86, align 8, !tbaa !9
  %88 = getelementptr inbounds i8, ptr %1, i64 48
  %89 = load ptr, ptr %88, align 8, !tbaa !9
  %90 = tail call double @atof(ptr noundef %89) #9
  %91 = getelementptr inbounds i8, ptr %1, i64 56
  %92 = load ptr, ptr %91, align 8, !tbaa !9
  %93 = tail call double @atof(ptr noundef %92) #9
  %94 = getelementptr inbounds i8, ptr %1, i64 64
  %95 = load ptr, ptr %94, align 8, !tbaa !9
  %96 = tail call i32 @atoi(ptr nocapture noundef %95) #9
  %97 = getelementptr inbounds i8, ptr %1, i64 72
  %98 = load ptr, ptr %97, align 8, !tbaa !9
  %99 = tail call i32 @atoi(ptr nocapture noundef %98) #9
  %100 = getelementptr inbounds i8, ptr %1, i64 80
  %101 = load ptr, ptr %100, align 8, !tbaa !9
  %102 = tail call i32 @atoi(ptr nocapture noundef %101) #9
  %103 = getelementptr inbounds i8, ptr %1, i64 88
  %104 = load ptr, ptr %103, align 8, !tbaa !9
  %105 = tail call i32 @atoi(ptr nocapture noundef %104) #9
  %106 = getelementptr inbounds i8, ptr %1, i64 96
  %107 = load ptr, ptr %106, align 8, !tbaa !9
  %108 = tail call i32 @atoi(ptr nocapture noundef %107) #9
  %109 = getelementptr inbounds i8, ptr %1, i64 104
  %110 = load ptr, ptr %109, align 8, !tbaa !9
  %111 = tail call i32 @atoi(ptr nocapture noundef %110) #9
  %112 = icmp ugt i32 %0, 15
  br i1 %112, label %.sink.split, label %116

.sink.split:                                      ; preds = %73, %15
  %.sink = phi i64 [ 152, %15 ], [ 120, %73 ]
  %.ph = phi i32 [ %33, %15 ], [ 0, %73 ]
  %.ph397 = phi i32 [ %36, %15 ], [ 0, %73 ]
  %.ph398 = phi i32 [ %30, %15 ], [ 0, %73 ]
  %.0339.ph = phi i32 [ %57, %15 ], [ %99, %73 ]
  %.0338.ph = phi i32 [ %60, %15 ], [ %102, %73 ]
  %.0337.ph = phi i32 [ %63, %15 ], [ %105, %73 ]
  %.0336.ph = phi i32 [ %66, %15 ], [ %108, %73 ]
  %.0335.ph = phi double [ %51, %15 ], [ %93, %73 ]
  %.0333.ph = phi ptr [ null, %15 ], [ %87, %73 ]
  %.0324.ph = phi i32 [ %69, %15 ], [ %111, %73 ]
  %.0323.ph = phi i32 [ %54, %15 ], [ %96, %73 ]
  %.0322.ph = phi double [ %42, %15 ], [ %90, %73 ]
  %.0317.ph = phi i32 [ %27, %15 ], [ %85, %73 ]
  %.0316.ph = phi i32 [ %26, %15 ], [ %84, %73 ]
  %.0314.ph = phi i32 [ %25, %15 ], [ %83, %73 ]
  %.0313.ph = phi i32 [ %24, %15 ], [ %82, %73 ]
  %.0312.ph = phi ptr [ %23, %15 ], [ %81, %73 ]
  %.0311.ph = phi ptr [ %21, %15 ], [ %79, %73 ]
  %.0310.ph = phi ptr [ %19, %15 ], [ %77, %73 ]
  %.0309.ph = phi ptr [ %17, %15 ], [ %75, %73 ]
  %113 = getelementptr inbounds i8, ptr %1, i64 %.sink
  %114 = load ptr, ptr %113, align 8, !tbaa !9
  %115 = tail call i32 @atoi(ptr nocapture noundef %114) #9
  br label %116

116:                                              ; preds = %.sink.split, %73, %15
  %117 = phi i32 [ %33, %15 ], [ 0, %73 ], [ %.ph, %.sink.split ]
  %118 = phi i32 [ %36, %15 ], [ 0, %73 ], [ %.ph397, %.sink.split ]
  %119 = phi i32 [ %30, %15 ], [ 0, %73 ], [ %.ph398, %.sink.split ]
  %.0339 = phi i32 [ %57, %15 ], [ %99, %73 ], [ %.0339.ph, %.sink.split ]
  %.0338 = phi i32 [ %60, %15 ], [ %102, %73 ], [ %.0338.ph, %.sink.split ]
  %.0337 = phi i32 [ %63, %15 ], [ %105, %73 ], [ %.0337.ph, %.sink.split ]
  %.0336 = phi i32 [ %66, %15 ], [ %108, %73 ], [ %.0336.ph, %.sink.split ]
  %.0335 = phi double [ %51, %15 ], [ %93, %73 ], [ %.0335.ph, %.sink.split ]
  %.0333 = phi ptr [ null, %15 ], [ %87, %73 ], [ %.0333.ph, %.sink.split ]
  %.1326 = phi i32 [ 0, %15 ], [ 0, %73 ], [ %115, %.sink.split ]
  %.0324 = phi i32 [ %69, %15 ], [ %111, %73 ], [ %.0324.ph, %.sink.split ]
  %.0323 = phi i32 [ %54, %15 ], [ %96, %73 ], [ %.0323.ph, %.sink.split ]
  %.0322 = phi double [ %42, %15 ], [ %90, %73 ], [ %.0322.ph, %.sink.split ]
  %.0317 = phi i32 [ %27, %15 ], [ %85, %73 ], [ %.0317.ph, %.sink.split ]
  %.0316 = phi i32 [ %26, %15 ], [ %84, %73 ], [ %.0316.ph, %.sink.split ]
  %.0314 = phi i32 [ %25, %15 ], [ %83, %73 ], [ %.0314.ph, %.sink.split ]
  %.0313 = phi i32 [ %24, %15 ], [ %82, %73 ], [ %.0313.ph, %.sink.split ]
  %.0312 = phi ptr [ %23, %15 ], [ %81, %73 ], [ %.0312.ph, %.sink.split ]
  %.0311 = phi ptr [ %21, %15 ], [ %79, %73 ], [ %.0311.ph, %.sink.split ]
  %.0310 = phi ptr [ %19, %15 ], [ %77, %73 ], [ %.0310.ph, %.sink.split ]
  %.0309 = phi ptr [ %17, %15 ], [ %75, %73 ], [ %.0309.ph, %.sink.split ]
  %120 = tail call ptr @getenv(ptr noundef nonnull @.str.2) #8
  %121 = tail call ptr @libxsmm_stristr(ptr noundef %120, ptr noundef nonnull @.str.3) #8
  %122 = icmp eq ptr %120, %121
  br i1 %122, label %126, label %123

123:                                              ; preds = %116
  %124 = tail call ptr @libxsmm_stristr(ptr noundef %120, ptr noundef nonnull @.str.4) #8
  %125 = icmp ne ptr %120, %124
  br label %126

126:                                              ; preds = %123, %116
  %127 = phi i1 [ false, %116 ], [ %125, %123 ]
  %128 = tail call i32 @libxsmm_cpuid(ptr noundef null) #8
  %129 = icmp slt i32 %128, 1104
  %or.cond5 = select i1 %127, i1 %129, i1 false
  %130 = icmp ne i32 %.1326, 0
  %or.cond7 = select i1 %or.cond5, i1 %130, i1 false
  br i1 %or.cond7, label %131, label %133

131:                                              ; preds = %126
  %132 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5)
  br label %133

133:                                              ; preds = %131, %126
  %.2327 = phi i32 [ 0, %131 ], [ %.1326, %126 ]
  %134 = fcmp une double %.0335, 0.000000e+00
  %135 = fcmp une double %.0335, 1.000000e+00
  %or.cond9 = and i1 %134, %135
  br i1 %or.cond9, label %136, label %139

136:                                              ; preds = %133
  %137 = load ptr, ptr @stderr, align 8, !tbaa !9
  %138 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %137, ptr noundef nonnull @.str.6) #10
  tail call void @exit(i32 noundef 1) #11
  unreachable

139:                                              ; preds = %133
  %140 = icmp eq i32 %.0313, 1
  %141 = icmp eq i32 %.0314, 1
  %or.cond11 = select i1 %140, i1 %141, i1 false
  %142 = icmp eq i32 %.0316, 1
  %or.cond13 = select i1 %or.cond11, i1 %142, i1 false
  %143 = icmp eq i32 %.0317, 1
  %or.cond15 = select i1 %or.cond13, i1 %143, i1 false
  br i1 %or.cond15, label %.thread362, label %144

144:                                              ; preds = %139
  %145 = icmp eq i32 %.0313, 13
  %146 = icmp eq i32 %.0314, 12
  %or.cond17 = select i1 %145, i1 %146, i1 false
  %147 = icmp eq i32 %.0316, 8
  %or.cond19 = select i1 %or.cond17, i1 %147, i1 false
  %148 = icmp eq i32 %.0317, 8
  %or.cond21 = select i1 %or.cond19, i1 %148, i1 false
  br i1 %or.cond21, label %.thread358, label %149

149:                                              ; preds = %144
  %150 = icmp eq i32 %.0313, 12
  %151 = icmp eq i32 %.0314, 13
  %or.cond23 = select i1 %150, i1 %151, i1 false
  %or.cond25 = select i1 %or.cond23, i1 %147, i1 false
  %or.cond27 = select i1 %or.cond25, i1 %148, i1 false
  br i1 %or.cond27, label %165, label %152

152:                                              ; preds = %149
  %153 = icmp eq i32 %.0313, 2
  %154 = icmp eq i32 %.0314, 2
  %or.cond29 = select i1 %153, i1 %154, i1 false
  %or.cond31 = select i1 %or.cond29, i1 %142, i1 false
  %155 = icmp eq i32 %.0317, 2
  %or.cond33 = select i1 %or.cond31, i1 %155, i1 false
  br i1 %or.cond33, label %.thread362, label %156

156:                                              ; preds = %152
  %157 = load ptr, ptr @stderr, align 8, !tbaa !9
  %158 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %157, ptr noundef nonnull @.str.7, ptr noundef %.0309, ptr noundef %.0310, ptr noundef %.0311, ptr noundef %.0312) #10
  tail call void @exit(i32 noundef 1) #11
  unreachable

.thread358:                                       ; preds = %144
  %159 = getelementptr inbounds i8, ptr %9, i64 68
  %160 = getelementptr inbounds i8, ptr %9, i64 72
  store i32 0, ptr %160, align 8, !tbaa !11
  %161 = getelementptr inbounds i8, ptr %9, i64 76
  store i32 0, ptr %161, align 4, !tbaa !14
  store i32 1, ptr %159, align 4, !tbaa !15
  br label %169

.thread362:                                       ; preds = %152, %139
  %162 = getelementptr inbounds i8, ptr %9, i64 68
  store i32 0, ptr %162, align 4, !tbaa !15
  %163 = getelementptr inbounds i8, ptr %9, i64 72
  store i32 0, ptr %163, align 8, !tbaa !11
  %164 = getelementptr inbounds i8, ptr %9, i64 76
  store i32 0, ptr %164, align 4, !tbaa !14
  br label %169

165:                                              ; preds = %149
  %166 = getelementptr inbounds i8, ptr %9, i64 68
  store i32 0, ptr %166, align 4, !tbaa !15
  %167 = getelementptr inbounds i8, ptr %9, i64 72
  %168 = getelementptr inbounds i8, ptr %9, i64 76
  store i32 0, ptr %168, align 4, !tbaa !14
  store i32 1, ptr %167, align 8, !tbaa !11
  br label %169

169:                                              ; preds = %.thread362, %.thread358, %165
  %.1360 = phi i32 [ 12, %165 ], [ 12, %.thread358 ], [ %.0313, %.thread362 ]
  %170 = phi ptr [ %166, %165 ], [ %159, %.thread358 ], [ %162, %.thread362 ]
  %171 = phi ptr [ %167, %165 ], [ %160, %.thread358 ], [ %163, %.thread362 ]
  %.1315 = phi i32 [ 12, %165 ], [ 12, %.thread358 ], [ %.0314, %.thread362 ]
  store i32 %.1360, ptr %9, align 8, !tbaa !16
  %172 = getelementptr inbounds i8, ptr %9, i64 4
  store i32 %.1315, ptr %172, align 4, !tbaa !17
  %173 = getelementptr inbounds i8, ptr %9, i64 12
  store i32 %.0316, ptr %173, align 4, !tbaa !18
  %174 = getelementptr inbounds i8, ptr %9, i64 8
  store i32 %.0317, ptr %174, align 8, !tbaa !19
  %175 = getelementptr inbounds i8, ptr %9, i64 40
  store double %.0335, ptr %175, align 8, !tbaa !20
  %176 = getelementptr inbounds i8, ptr %9, i64 56
  store i32 %.0338, ptr %176, align 8, !tbaa !21
  %177 = getelementptr inbounds i8, ptr %9, i64 60
  store i32 %.0337, ptr %177, align 4, !tbaa !22
  %178 = getelementptr inbounds i8, ptr %9, i64 64
  store i32 %.0336, ptr %178, align 8, !tbaa !23
  %179 = getelementptr inbounds i8, ptr %9, i64 48
  store i32 %.0323, ptr %179, align 8, !tbaa !24
  %180 = getelementptr inbounds i8, ptr %9, i64 52
  store i32 %.0339, ptr %180, align 4, !tbaa !25
  %181 = getelementptr inbounds i8, ptr %9, i64 80
  store i32 0, ptr %181, align 8, !tbaa !26
  %182 = getelementptr inbounds i8, ptr %9, i64 84
  store i32 %.2327, ptr %182, align 4, !tbaa !27
  br i1 %or.cond, label %185, label %183

183:                                              ; preds = %169
  %184 = tail call noalias ptr @fopen(ptr noundef %.0333, ptr noundef nonnull @.str.8)
  br label %189

185:                                              ; preds = %169
  %186 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.9)
  %187 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.10, i32 noundef %119, i32 noundef %118, i32 noundef %118, i32 noundef %117, i32 noundef %119, i32 noundef %117, ptr noundef %.0309, ptr noundef %.0310, ptr noundef %.0311, ptr noundef %.0312)
  %188 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.9)
  br label %189

189:                                              ; preds = %185, %183
  %.0332 = phi ptr [ %184, %183 ], [ null, %185 ]
  %190 = getelementptr inbounds i8, ptr %9, i64 16
  %191 = getelementptr inbounds i8, ptr %9, i64 36
  %192 = getelementptr inbounds i8, ptr %9, i64 20
  %193 = getelementptr inbounds i8, ptr %9, i64 24
  %194 = getelementptr inbounds i8, ptr %9, i64 28
  %195 = getelementptr inbounds i8, ptr %9, i64 32
  %196 = fcmp oeq double %.0335, 0.000000e+00
  %197 = sitofp i32 %.0324 to double
  br label %198

198:                                              ; preds = %400, %189
  %.0320 = phi i32 [ 0, %189 ], [ 1, %400 ]
  br i1 %or.cond, label %213, label %199

199:                                              ; preds = %198
  call void @llvm.lifetime.start.p0(i64 512, ptr nonnull %10) #8
  %200 = call ptr @fgets(ptr noundef nonnull %10, i32 noundef 512, ptr noundef %.0332)
  %.not349 = icmp eq ptr %200, null
  br i1 %.not349, label %.thread366, label %201

.thread366:                                       ; preds = %199
  call void @llvm.lifetime.end.p0(i64 512, ptr nonnull %10) #8
  br label %.loopexit

201:                                              ; preds = %199
  %202 = call i32 (ptr, ptr, ...) @__isoc99_sscanf(ptr noundef nonnull %10, ptr noundef nonnull @.str.11, ptr noundef nonnull %3, ptr noundef nonnull %4, ptr noundef nonnull %5, ptr noundef nonnull %7, ptr noundef nonnull %8, ptr noundef nonnull %6) #8
  %.not = icmp eq i32 %202, 6
  br i1 %.not, label %204, label %203

203:                                              ; preds = %201
  call void @exit(i32 noundef 1) #11
  unreachable

204:                                              ; preds = %201
  %205 = load ptr, ptr %1, align 8, !tbaa !9
  %206 = load i32, ptr %3, align 4, !tbaa !5
  %207 = load i32, ptr %4, align 4, !tbaa !5
  %208 = load i32, ptr %5, align 4, !tbaa !5
  %209 = load i32, ptr %6, align 4, !tbaa !5
  %210 = load i32, ptr %7, align 4, !tbaa !5
  %211 = load i32, ptr %8, align 4, !tbaa !5
  %212 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, ptr noundef %205, ptr noundef %.0309, ptr noundef %.0310, ptr noundef %.0311, ptr noundef %.0312, i32 noundef %206, i32 noundef %207, i32 noundef %208, i32 noundef %209, double noundef %.0322, i32 noundef %210, i32 noundef %211, double noundef %.0335, i32 noundef %.0323, i32 noundef %.0339, i32 noundef %.0338, i32 noundef %.0337, i32 noundef %.0336, i32 noundef %.0324, i32 noundef %.2327)
  call void @llvm.lifetime.end.p0(i64 512, ptr nonnull %10) #8
  br label %213

213:                                              ; preds = %204, %198
  %.2 = phi i32 [ 1, %204 ], [ %.0320, %198 ]
  %214 = load i32, ptr %3, align 4, !tbaa !5
  store i32 %214, ptr %190, align 8, !tbaa !28
  %215 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %215, ptr %191, align 4, !tbaa !29
  %216 = load i32, ptr %4, align 4, !tbaa !5
  store i32 %216, ptr %192, align 4, !tbaa !30
  %217 = load i32, ptr %5, align 4, !tbaa !5
  store i32 %217, ptr %193, align 8, !tbaa !31
  %218 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %218, ptr %194, align 4, !tbaa !32
  %219 = load i32, ptr %8, align 4, !tbaa !5
  store i32 %219, ptr %195, align 8, !tbaa !33
  call void @libxsmm_rng_set_seed(i32 noundef 555) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #8
  %220 = load i32, ptr %9, align 8, !tbaa !16
  %221 = call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %220) #8
  %222 = load i32, ptr %3, align 4, !tbaa !5
  %223 = sext i32 %222 to i64
  %224 = load i32, ptr %6, align 4, !tbaa !5
  %225 = sext i32 %224 to i64
  %226 = mul nsw i64 %225, %223
  %227 = load i32, ptr %5, align 4, !tbaa !5
  %228 = sext i32 %227 to i64
  %229 = mul i64 %226, %228
  %230 = load i32, ptr %9, align 8
  switch i32 %230, label %231 [
    i32 0, label %236
    i32 1, label %.fold.split
  ]

231:                                              ; preds = %213
  %232 = and i32 %230, -2
  %switch.tableidx = add i32 %232, -2
  %233 = icmp ult i32 %switch.tableidx, 11
  br i1 %233, label %switch.hole_check, label %234

234:                                              ; preds = %switch.hole_check, %231
  call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 931, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #11
  unreachable

.fold.split:                                      ; preds = %213
  br label %236

switch.hole_check:                                ; preds = %231
  %switch.maskindex = trunc nuw i32 %switch.tableidx to i16
  %switch.shifted = lshr i16 1365, %switch.maskindex
  %switch.lobit = trunc i16 %switch.shifted to i1
  br i1 %switch.lobit, label %switch.lookup, label %234

switch.lookup:                                    ; preds = %switch.hole_check
  %235 = zext nneg i32 %switch.tableidx to i64
  %switch.gep = getelementptr inbounds [11 x i64], ptr @switch.table.main.5, i64 0, i64 %235
  %switch.load = load i64, ptr %switch.gep, align 8
  br label %236

236:                                              ; preds = %switch.lookup, %213, %.fold.split
  %237 = phi i64 [ 8, %213 ], [ 4, %.fold.split ], [ %switch.load, %switch.lookup ]
  %238 = mul i64 %229, %237
  %239 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %238, i64 noundef 64) #8
  %240 = icmp eq i32 %221, 1
  br i1 %240, label %260, label %241

241:                                              ; preds = %236
  %242 = load i32, ptr %3, align 4, !tbaa !5
  %243 = sext i32 %242 to i64
  %244 = load i32, ptr %6, align 4, !tbaa !5
  %245 = sext i32 %244 to i64
  %246 = mul nsw i64 %245, %243
  %247 = load i32, ptr %5, align 4, !tbaa !5
  %248 = sext i32 %247 to i64
  %249 = mul i64 %246, %248
  %250 = load i32, ptr %9, align 8
  switch i32 %250, label %251 [
    i32 0, label %256
    i32 1, label %.fold.split352
  ]

251:                                              ; preds = %241
  %252 = and i32 %250, -2
  %switch.tableidx407 = add i32 %252, -2
  %253 = icmp ult i32 %switch.tableidx407, 11
  br i1 %253, label %switch.hole_check408, label %254

254:                                              ; preds = %switch.hole_check408, %251
  call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 935, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #11
  unreachable

.fold.split352:                                   ; preds = %241
  br label %256

switch.hole_check408:                             ; preds = %251
  %switch.maskindex410 = trunc nuw i32 %switch.tableidx407 to i16
  %switch.shifted411 = lshr i16 1365, %switch.maskindex410
  %switch.lobit412 = trunc i16 %switch.shifted411 to i1
  br i1 %switch.lobit412, label %switch.lookup409, label %254

switch.lookup409:                                 ; preds = %switch.hole_check408
  %255 = zext nneg i32 %switch.tableidx407 to i64
  %switch.gep413 = getelementptr inbounds [11 x i64], ptr @switch.table.main.5, i64 0, i64 %255
  %switch.load414 = load i64, ptr %switch.gep413, align 8
  br label %256

256:                                              ; preds = %switch.lookup409, %241, %.fold.split352
  %257 = phi i64 [ 8, %241 ], [ 4, %.fold.split352 ], [ %switch.load414, %switch.lookup409 ]
  %258 = mul i64 %249, %257
  %259 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %258, i64 noundef 64) #8
  br label %260

260:                                              ; preds = %236, %256
  %.0308 = phi ptr [ %259, %256 ], [ %239, %236 ]
  %261 = load i32, ptr %5, align 4, !tbaa !5
  %262 = sext i32 %261 to i64
  %263 = load i32, ptr %4, align 4, !tbaa !5
  %264 = sext i32 %263 to i64
  %265 = mul nsw i64 %264, %262
  %266 = load i32, ptr %172, align 4
  switch i32 %266, label %267 [
    i32 0, label %272
    i32 1, label %.fold.split353
  ]

267:                                              ; preds = %260
  %268 = and i32 %266, -2
  %switch.tableidx416 = add i32 %268, -2
  %269 = icmp ult i32 %switch.tableidx416, 11
  br i1 %269, label %switch.hole_check417, label %270

270:                                              ; preds = %switch.hole_check417, %267
  call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 937, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #11
  unreachable

.fold.split353:                                   ; preds = %260
  br label %272

switch.hole_check417:                             ; preds = %267
  %switch.maskindex419 = trunc nuw i32 %switch.tableidx416 to i16
  %switch.shifted420 = lshr i16 1365, %switch.maskindex419
  %switch.lobit421 = trunc i16 %switch.shifted420 to i1
  br i1 %switch.lobit421, label %switch.lookup418, label %270

switch.lookup418:                                 ; preds = %switch.hole_check417
  %271 = zext nneg i32 %switch.tableidx416 to i64
  %switch.gep422 = getelementptr inbounds [11 x i64], ptr @switch.table.main.5, i64 0, i64 %271
  %switch.load423 = load i64, ptr %switch.gep422, align 8
  br label %272

272:                                              ; preds = %switch.lookup418, %260, %.fold.split353
  %273 = phi i64 [ 8, %260 ], [ 4, %.fold.split353 ], [ %switch.load423, %switch.lookup418 ]
  %274 = mul i64 %265, %273
  %275 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %274, i64 noundef 64) #8
  %276 = load i32, ptr %3, align 4, !tbaa !5
  %277 = sext i32 %276 to i64
  %278 = load i32, ptr %6, align 4, !tbaa !5
  %279 = sext i32 %278 to i64
  %280 = mul nsw i64 %279, %277
  %281 = load i32, ptr %4, align 4, !tbaa !5
  %282 = sext i32 %281 to i64
  %283 = mul i64 %280, %282
  %284 = load i32, ptr %174, align 8
  switch i32 %284, label %285 [
    i32 0, label %290
    i32 1, label %.fold.split354
  ]

285:                                              ; preds = %272
  %286 = and i32 %284, -2
  %switch.tableidx425 = add i32 %286, -2
  %287 = icmp ult i32 %switch.tableidx425, 11
  br i1 %287, label %switch.hole_check426, label %288

288:                                              ; preds = %switch.hole_check426, %285
  call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 938, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #11
  unreachable

.fold.split354:                                   ; preds = %272
  br label %290

switch.hole_check426:                             ; preds = %285
  %switch.maskindex428 = trunc nuw i32 %switch.tableidx425 to i16
  %switch.shifted429 = lshr i16 1365, %switch.maskindex428
  %switch.lobit430 = trunc i16 %switch.shifted429 to i1
  br i1 %switch.lobit430, label %switch.lookup427, label %288

switch.lookup427:                                 ; preds = %switch.hole_check426
  %289 = zext nneg i32 %switch.tableidx425 to i64
  %switch.gep431 = getelementptr inbounds [11 x i64], ptr @switch.table.main.5, i64 0, i64 %289
  %switch.load432 = load i64, ptr %switch.gep431, align 8
  br label %290

290:                                              ; preds = %switch.lookup427, %272, %.fold.split354
  %291 = phi i64 [ 8, %272 ], [ 4, %.fold.split354 ], [ %switch.load432, %switch.lookup427 ]
  %292 = mul i64 %283, %291
  %293 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %292, i64 noundef 64) #8
  %294 = load i32, ptr %3, align 4, !tbaa !5
  %295 = sext i32 %294 to i64
  %296 = load i32, ptr %6, align 4, !tbaa !5
  %297 = sext i32 %296 to i64
  %298 = mul nsw i64 %297, %295
  %299 = load i32, ptr %4, align 4, !tbaa !5
  %300 = sext i32 %299 to i64
  %301 = mul i64 %298, %300
  %302 = load i32, ptr %174, align 8
  switch i32 %302, label %303 [
    i32 0, label %308
    i32 1, label %.fold.split355
  ]

303:                                              ; preds = %290
  %304 = and i32 %302, -2
  %switch.tableidx434 = add i32 %304, -2
  %305 = icmp ult i32 %switch.tableidx434, 11
  br i1 %305, label %switch.hole_check435, label %306

306:                                              ; preds = %switch.hole_check435, %303
  call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 939, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #11
  unreachable

.fold.split355:                                   ; preds = %290
  br label %308

switch.hole_check435:                             ; preds = %303
  %switch.maskindex437 = trunc nuw i32 %switch.tableidx434 to i16
  %switch.shifted438 = lshr i16 1365, %switch.maskindex437
  %switch.lobit439 = trunc i16 %switch.shifted438 to i1
  br i1 %switch.lobit439, label %switch.lookup436, label %306

switch.lookup436:                                 ; preds = %switch.hole_check435
  %307 = zext nneg i32 %switch.tableidx434 to i64
  %switch.gep440 = getelementptr inbounds [11 x i64], ptr @switch.table.main.5, i64 0, i64 %307
  %switch.load441 = load i64, ptr %switch.gep440, align 8
  br label %308

308:                                              ; preds = %switch.lookup436, %290, %.fold.split355
  %309 = phi i64 [ 8, %290 ], [ 4, %.fold.split355 ], [ %switch.load441, %switch.lookup436 ]
  %310 = mul i64 %301, %309
  %311 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %310, i64 noundef 64) #8
  %312 = load i32, ptr %3, align 4, !tbaa !5
  %313 = sext i32 %312 to i64
  %314 = load i32, ptr %6, align 4, !tbaa !5
  %315 = sext i32 %314 to i64
  %316 = mul nsw i64 %315, %313
  %317 = load i32, ptr %4, align 4, !tbaa !5
  %318 = sext i32 %317 to i64
  %319 = mul i64 %316, %318
  %320 = load i32, ptr %174, align 8
  switch i32 %320, label %321 [
    i32 0, label %326
    i32 1, label %.fold.split356
  ]

321:                                              ; preds = %308
  %322 = and i32 %320, -2
  %switch.tableidx443 = add i32 %322, -2
  %323 = icmp ult i32 %switch.tableidx443, 11
  br i1 %323, label %switch.hole_check444, label %324

324:                                              ; preds = %switch.hole_check444, %321
  call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 940, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #11
  unreachable

.fold.split356:                                   ; preds = %308
  br label %326

switch.hole_check444:                             ; preds = %321
  %switch.maskindex446 = trunc nuw i32 %switch.tableidx443 to i16
  %switch.shifted447 = lshr i16 1365, %switch.maskindex446
  %switch.lobit448 = trunc i16 %switch.shifted447 to i1
  br i1 %switch.lobit448, label %switch.lookup445, label %324

switch.lookup445:                                 ; preds = %switch.hole_check444
  %325 = zext nneg i32 %switch.tableidx443 to i64
  %switch.gep449 = getelementptr inbounds [11 x i64], ptr @switch.table.main.5, i64 0, i64 %325
  %switch.load450 = load i64, ptr %switch.gep449, align 8
  br label %326

326:                                              ; preds = %switch.lookup445, %308, %.fold.split356
  %327 = phi i64 [ 8, %308 ], [ 4, %.fold.split356 ], [ %switch.load450, %switch.lookup445 ]
  %328 = mul i64 %319, %327
  %329 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %328, i64 noundef 64) #8
  %330 = load i32, ptr %9, align 8, !tbaa !16
  %331 = load i32, ptr %3, align 4, !tbaa !5
  %332 = load i32, ptr %6, align 4, !tbaa !5
  %333 = mul nsw i32 %332, %331
  %334 = load i32, ptr %5, align 4, !tbaa !5
  %335 = load i32, ptr %170, align 4, !tbaa !15
  call void @init_random_matrix(i32 noundef %330, ptr noundef %239, i32 noundef 1, i32 noundef %333, i32 noundef %334, i32 noundef %335)
  %336 = load i32, ptr %172, align 4, !tbaa !17
  %337 = load i32, ptr %5, align 4, !tbaa !5
  %338 = load i32, ptr %4, align 4, !tbaa !5
  %339 = load i32, ptr %171, align 8, !tbaa !11
  call void @init_random_matrix(i32 noundef %336, ptr noundef %275, i32 noundef 1, i32 noundef %337, i32 noundef %338, i32 noundef %339)
  call void @create_spmm_inputs(ptr noundef nonnull %9, double noundef %.0322, ptr noundef %239, ptr noundef %275, ptr noundef %.0308, ptr noundef nonnull %13, ptr noundef nonnull %11, ptr noundef nonnull %12)
  %340 = load i32, ptr %174, align 8, !tbaa !19
  %341 = load i32, ptr %3, align 4, !tbaa !5
  %342 = load i32, ptr %6, align 4, !tbaa !5
  %343 = mul nsw i32 %342, %341
  %344 = load i32, ptr %4, align 4, !tbaa !5
  br i1 %196, label %345, label %356

345:                                              ; preds = %326
  call void @init_garbage_matrix(i32 noundef %340, ptr noundef %293, i32 noundef 1, i32 noundef %343, i32 noundef %344)
  %346 = load i32, ptr %174, align 8, !tbaa !19
  %347 = load i32, ptr %3, align 4, !tbaa !5
  %348 = load i32, ptr %6, align 4, !tbaa !5
  %349 = mul nsw i32 %348, %347
  %350 = load i32, ptr %4, align 4, !tbaa !5
  call void @init_garbage_matrix(i32 noundef %346, ptr noundef %311, i32 noundef 1, i32 noundef %349, i32 noundef %350)
  %351 = load i32, ptr %174, align 8, !tbaa !19
  %352 = load i32, ptr %3, align 4, !tbaa !5
  %353 = load i32, ptr %6, align 4, !tbaa !5
  %354 = mul nsw i32 %353, %352
  %355 = load i32, ptr %4, align 4, !tbaa !5
  call void @init_garbage_matrix(i32 noundef %351, ptr noundef %329, i32 noundef 1, i32 noundef %354, i32 noundef %355)
  br label %367

356:                                              ; preds = %326
  call void @init_zero_matrix(i32 noundef %340, ptr noundef %293, i32 noundef 1, i32 noundef %343, i32 noundef %344)
  %357 = load i32, ptr %174, align 8, !tbaa !19
  %358 = load i32, ptr %3, align 4, !tbaa !5
  %359 = load i32, ptr %6, align 4, !tbaa !5
  %360 = mul nsw i32 %359, %358
  %361 = load i32, ptr %4, align 4, !tbaa !5
  call void @init_zero_matrix(i32 noundef %357, ptr noundef %311, i32 noundef 1, i32 noundef %360, i32 noundef %361)
  %362 = load i32, ptr %174, align 8, !tbaa !19
  %363 = load i32, ptr %3, align 4, !tbaa !5
  %364 = load i32, ptr %6, align 4, !tbaa !5
  %365 = mul nsw i32 %364, %363
  %366 = load i32, ptr %4, align 4, !tbaa !5
  call void @init_zero_matrix(i32 noundef %362, ptr noundef %329, i32 noundef 1, i32 noundef %365, i32 noundef %366)
  br label %367

367:                                              ; preds = %356, %345
  call void @dense_gemm_ref(ptr noundef nonnull %9, ptr noundef %239, ptr noundef %275, ptr noundef %329)
  %368 = load ptr, ptr %13, align 8, !tbaa !9
  %369 = load ptr, ptr %11, align 8, !tbaa !9
  %370 = load ptr, ptr %12, align 8, !tbaa !9
  %371 = call double @jit_matmul(ptr noundef nonnull %9, ptr noundef %.0308, ptr noundef %368, ptr noundef %369, ptr noundef %370, ptr noundef %293, ptr noundef %311, i32 noundef %.0324)
  %372 = load i32, ptr %174, align 8, !tbaa !19
  %373 = load i32, ptr %3, align 4, !tbaa !5
  %374 = load i32, ptr %6, align 4, !tbaa !5
  %375 = mul nsw i32 %374, %373
  %376 = load i32, ptr %4, align 4, !tbaa !5
  %377 = call double @check_matrix(i32 noundef %372, ptr noundef %329, ptr noundef %293, i32 noundef %375, i32 noundef %375, i32 noundef %376)
  call void @libxsmm_free(ptr noundef %239) #8
  br i1 %240, label %379, label %378

378:                                              ; preds = %367
  call void @libxsmm_free(ptr noundef %.0308) #8
  br label %379

379:                                              ; preds = %378, %367
  call void @libxsmm_free(ptr noundef %275) #8
  call void @libxsmm_free(ptr noundef %293) #8
  call void @libxsmm_free(ptr noundef %311) #8
  call void @libxsmm_free(ptr noundef %329) #8
  %380 = load ptr, ptr %11, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %380) #8
  %381 = load ptr, ptr %12, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %381) #8
  %382 = load ptr, ptr %13, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %382) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #8
  %383 = fmul double %371, 1.000000e+09
  br i1 %or.cond, label %384, label %392

384:                                              ; preds = %379
  %385 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, double noundef %371)
  %386 = load i32, ptr %3, align 4, !tbaa !5
  %387 = sitofp i32 %386 to double
  %388 = fmul double %197, %387
  %389 = load i32, ptr %6, align 4, !tbaa !5
  %390 = sitofp i32 %389 to double
  %391 = fmul double %388, %390
  br label %400

392:                                              ; preds = %379
  %393 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, double noundef %371)
  %394 = load i32, ptr %3, align 4, !tbaa !5
  %395 = sitofp i32 %394 to double
  %396 = fmul double %197, %395
  %397 = load i32, ptr %6, align 4, !tbaa !5
  %398 = sitofp i32 %397 to double
  %399 = fmul double %396, %398
  br label %400

400:                                              ; preds = %384, %392
  %.sink451 = phi double [ %391, %384 ], [ %399, %392 ]
  %.str.14.sink = phi ptr [ @.str.14, %384 ], [ @.str.17, %392 ]
  %.sink453 = load i32, ptr %4, align 4, !tbaa !5
  %401 = sitofp i32 %.sink453 to double
  %402 = fmul double %.sink451, %401
  %.sink405 = load i32, ptr %5, align 4, !tbaa !5
  %403 = sitofp i32 %.sink405 to double
  %404 = fmul double %402, %403
  %405 = fmul double %404, 2.000000e+00
  %406 = fdiv double %405, %383
  %407 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.14.sink, double noundef %406)
  %408 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, double noundef %377)
  %.not351 = icmp eq i32 %.2, 0
  br i1 %.not351, label %.loopexit, label %198, !llvm.loop !34

.loopexit:                                        ; preds = %400, %.thread366, %71
  %.0 = phi i32 [ 1, %71 ], [ 0, %.thread366 ], [ 0, %400 ]
  call void @llvm.lifetime.end.p0(i64 88, ptr nonnull %9) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %8) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %7) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3) #8
  ret i32 %.0
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @char_to_libxsmm_datatype(ptr noundef) local_unnamed_addr #4

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare i32 @atoi(ptr nocapture noundef nonnull) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare double @atof(ptr nocapture noundef nonnull) local_unnamed_addr #5

; Function Attrs: nofree nounwind memory(read)
declare noundef ptr @getenv(ptr nocapture noundef) local_unnamed_addr #6

declare ptr @libxsmm_stristr(ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @libxsmm_cpuid(ptr noundef) local_unnamed_addr #2

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

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

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) local_unnamed_addr #3

; Function Attrs: nofree nounwind
declare noalias noundef ptr @fopen(ptr nocapture noundef readonly, ptr nocapture noundef readonly) local_unnamed_addr #7

; Function Attrs: nofree nounwind
declare noundef ptr @fgets(ptr noundef, i32 noundef, ptr nocapture noundef) local_unnamed_addr #7

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

declare void @libxsmm_rng_set_seed(i32 noundef) local_unnamed_addr #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init_random_matrix(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init_garbage_matrix(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init_zero_matrix(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden double @jit_matmul(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden double @check_matrix(i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #4

declare void @libxsmm_free(ptr noundef) local_unnamed_addr #2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !6, i64 72}
!12 = !{!"spmm_def", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28, !6, i64 32, !6, i64 36, !13, i64 40, !6, i64 48, !6, i64 52, !6, i64 56, !6, i64 60, !6, i64 64, !6, i64 68, !6, i64 72, !6, i64 76, !6, i64 80, !6, i64 84}
!13 = !{!"double", !7, i64 0}
!14 = !{!12, !6, i64 76}
!15 = !{!12, !6, i64 68}
!16 = !{!12, !6, i64 0}
!17 = !{!12, !6, i64 4}
!18 = !{!12, !6, i64 12}
!19 = !{!12, !6, i64 8}
!20 = !{!12, !13, i64 40}
!21 = !{!12, !6, i64 56}
!22 = !{!12, !6, i64 60}
!23 = !{!12, !6, i64 64}
!24 = !{!12, !6, i64 48}
!25 = !{!12, !6, i64 52}
!26 = !{!12, !6, i64 80}
!27 = !{!12, !6, i64 84}
!28 = !{!12, !6, i64 16}
!29 = !{!12, !6, i64 36}
!30 = !{!12, !6, i64 20}
!31 = !{!12, !6, i64 24}
!32 = !{!12, !6, i64 28}
!33 = !{!12, !6, i64 32}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.mustprogress"}


; Effective O3 passes: BDCEPass,ConstantMergePass,CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass