; LLVM IR from libxsmm/libxsmm :: src (generator_spgemm)

; 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.libxsmm_generated_code = type { ptr, i32, i32, i32, i32, i32, i32 }
%struct.libxsmm_gemm_descriptor = type <{ i32, i32, i32, i32, i32, i32, i32, i8, [3 x i8], i8, i64, i64, i8, i32, i32, i32, i16, i16, i8, i8, i8, i8, i16, i16, i16, i16, i16, i16, i32, i32, i32, i8 }>

@.str = external hidden unnamed_addr constant [72 x i8], align 1
@libxsmm_ninit = external global i32, align 4
@libxsmm_verbosity = external global i32, align 4
@stderr = external global ptr, align 8
@.str.2 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [83 x i8], align 1
@__func__.libxsmm_generator_spgemm = external hidden unnamed_addr constant [25 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [41 x i8], align 1
@__PRETTY_FUNCTION__.libxsmm_generator_spgemm = external hidden unnamed_addr constant [130 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [82 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [89 x i8], align 1

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

declare void @libxsmm_handle_error(ptr noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef) #1

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

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

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_spgemm(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, i32 noundef %5) #0 {
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca %struct.libxsmm_generated_code, align 8
  %20 = alloca i8, align 1
  %21 = alloca ptr, align 8
  %22 = alloca i8, align 1
  %23 = alloca ptr, align 8
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca ptr, align 8
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca ptr, align 8
  store ptr %0, ptr %7, align 8, !tbaa !5
  store ptr %1, ptr %8, align 8, !tbaa !5
  store ptr %2, ptr %9, align 8, !tbaa !5
  store ptr %3, ptr %10, align 8, !tbaa !5
  store ptr %4, ptr %11, align 8, !tbaa !5
  store i32 %5, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  store ptr null, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  store ptr null, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  store ptr null, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #6
  store i32 0, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %19) #6
  br label %33

33:                                               ; preds = %6
  call void @llvm.lifetime.start.p0(i64 1, ptr %20) #6
  store i8 32, ptr %20, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  store ptr %19, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %22) #6
  store i8 0, ptr %22, align 1, !tbaa !11
  br label %34

34:                                               ; preds = %45, %33
  %35 = load i8, ptr %22, align 1, !tbaa !11
  %36 = sext i8 %35 to i32
  %37 = load i8, ptr %20, align 1, !tbaa !11
  %38 = sext i8 %37 to i32
  %39 = icmp slt i32 %36, %38
  br i1 %39, label %40, label %48

40:                                               ; preds = %34
  %41 = load ptr, ptr %21, align 8, !tbaa !5
  %42 = load i8, ptr %22, align 1, !tbaa !11
  %43 = sext i8 %42 to i64
  %44 = getelementptr inbounds i8, ptr %41, i64 %43
  store i8 0, ptr %44, align 1, !tbaa !11
  br label %45

45:                                               ; preds = %40
  %46 = load i8, ptr %22, align 1, !tbaa !11
  %47 = add i8 %46, 1
  store i8 %47, ptr %22, align 1, !tbaa !11
  br label %34, !llvm.loop !12

48:                                               ; preds = %34
  call void @llvm.lifetime.end.p0(i64 1, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %20) #6
  br label %49

49:                                               ; preds = %48
  br label %50

50:                                               ; preds = %49
  %51 = load ptr, ptr %8, align 8, !tbaa !5
  %52 = load ptr, ptr %9, align 8, !tbaa !5
  call void @libxsmm_mmfunction_signature(ptr noundef %19, ptr noundef %51, ptr noundef %52)
  %53 = load ptr, ptr %9, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %53, i32 0, i32 1
  %55 = load i32, ptr %54, align 1, !tbaa !15
  store i32 %55, ptr %17, align 4, !tbaa !9
  %56 = load ptr, ptr %9, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %56, i32 0, i32 0
  %58 = load i32, ptr %57, align 1, !tbaa !19
  store i32 %58, ptr %16, align 4, !tbaa !9
  %59 = load i32, ptr %12, align 4, !tbaa !9
  %60 = icmp eq i32 %59, 0
  br i1 %60, label %64, label %61

61:                                               ; preds = %50
  %62 = load i32, ptr %12, align 4, !tbaa !9
  %63 = icmp sgt i32 %62, 9
  br i1 %63, label %64, label %286

64:                                               ; preds = %61, %50
  %65 = load ptr, ptr %11, align 8, !tbaa !5
  call void @libxsmm_sparse_csc_reader(ptr noundef %19, ptr noundef %65, ptr noundef %13, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %17, ptr noundef %18)
  %66 = load ptr, ptr %13, align 8, !tbaa !5
  %67 = icmp ne ptr null, %66
  br i1 %67, label %68, label %285

68:                                               ; preds = %64
  %69 = load ptr, ptr %14, align 8, !tbaa !5
  %70 = icmp ne ptr null, %69
  br i1 %70, label %71, label %285

71:                                               ; preds = %68
  %72 = load ptr, ptr %15, align 8, !tbaa !5
  %73 = icmp ne ptr null, %72
  br i1 %73, label %74, label %285

74:                                               ; preds = %71
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  %75 = load i32, ptr %16, align 4, !tbaa !9
  %76 = zext i32 %75 to i64
  %77 = load i32, ptr %17, align 4, !tbaa !9
  %78 = zext i32 %77 to i64
  %79 = mul i64 %76, %78
  %80 = call noalias ptr @calloc(i64 noundef %79, i64 noundef 8) #7
  store ptr %80, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  %81 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  %82 = load i32, ptr %16, align 4, !tbaa !9
  %83 = load i32, ptr %17, align 4, !tbaa !9
  %84 = load i32, ptr %18, align 4, !tbaa !9
  %85 = call i32 (ptr, ...) @printf(ptr noundef @.str.3, i32 noundef %82, i32 noundef %83, i32 noundef %84)
  %86 = load ptr, ptr %23, align 8, !tbaa !5
  %87 = icmp eq ptr %86, null
  br i1 %87, label %88, label %98

88:                                               ; preds = %74
  %89 = load ptr, ptr @stderr, align 8, !tbaa !5
  %90 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %89, ptr noundef @.str.4) #6
  %91 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %92 = icmp ult i32 1, %91
  br i1 %92, label %93, label %95

93:                                               ; preds = %88
  %94 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !9
  br label %96

95:                                               ; preds = %88
  br label %96

96:                                               ; preds = %95, %93
  %97 = phi i32 [ %94, %93 ], [ 1, %95 ]
  call void @libxsmm_handle_error(ptr noundef %19, i32 noundef 90000, ptr noundef @__func__.libxsmm_generator_spgemm, ptr noundef @.str, i32 noundef 208, i32 noundef %97)
  store i32 1, ptr %26, align 4
  br label %282

98:                                               ; preds = %74
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %99

99:                                               ; preds = %110, %98
  %100 = load i32, ptr %24, align 4, !tbaa !9
  %101 = load i32, ptr %16, align 4, !tbaa !9
  %102 = load i32, ptr %17, align 4, !tbaa !9
  %103 = mul i32 %101, %102
  %104 = icmp ult i32 %100, %103
  br i1 %104, label %105, label %113

105:                                              ; preds = %99
  %106 = load ptr, ptr %23, align 8, !tbaa !5
  %107 = load i32, ptr %24, align 4, !tbaa !9
  %108 = zext i32 %107 to i64
  %109 = getelementptr inbounds double, ptr %106, i64 %108
  store double 0.000000e+00, ptr %109, align 8, !tbaa !20
  br label %110

110:                                              ; preds = %105
  %111 = load i32, ptr %24, align 4, !tbaa !9
  %112 = add i32 %111, 1
  store i32 %112, ptr %24, align 4, !tbaa !9
  br label %99, !llvm.loop !22

113:                                              ; preds = %99
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %114

114:                                              ; preds = %126, %113
  %115 = load i32, ptr %24, align 4, !tbaa !9
  %116 = load i32, ptr %16, align 4, !tbaa !9
  %117 = add i32 %116, 1
  %118 = icmp ult i32 %115, %117
  br i1 %118, label %119, label %129

119:                                              ; preds = %114
  %120 = load ptr, ptr %14, align 8, !tbaa !5
  %121 = load i32, ptr %24, align 4, !tbaa !9
  %122 = zext i32 %121 to i64
  %123 = getelementptr inbounds i32, ptr %120, i64 %122
  %124 = load i32, ptr %123, align 4, !tbaa !9
  %125 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, i32 noundef %124)
  br label %126

126:                                              ; preds = %119
  %127 = load i32, ptr %24, align 4, !tbaa !9
  %128 = add i32 %127, 1
  store i32 %128, ptr %24, align 4, !tbaa !9
  br label %114, !llvm.loop !23

129:                                              ; preds = %114
  %130 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %131

131:                                              ; preds = %142, %129
  %132 = load i32, ptr %24, align 4, !tbaa !9
  %133 = load i32, ptr %18, align 4, !tbaa !9
  %134 = icmp ult i32 %132, %133
  br i1 %134, label %135, label %145

135:                                              ; preds = %131
  %136 = load ptr, ptr %13, align 8, !tbaa !5
  %137 = load i32, ptr %24, align 4, !tbaa !9
  %138 = zext i32 %137 to i64
  %139 = getelementptr inbounds i32, ptr %136, i64 %138
  %140 = load i32, ptr %139, align 4, !tbaa !9
  %141 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, i32 noundef %140)
  br label %142

142:                                              ; preds = %135
  %143 = load i32, ptr %24, align 4, !tbaa !9
  %144 = add i32 %143, 1
  store i32 %144, ptr %24, align 4, !tbaa !9
  br label %131, !llvm.loop !24

145:                                              ; preds = %131
  %146 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %147

147:                                              ; preds = %158, %145
  %148 = load i32, ptr %24, align 4, !tbaa !9
  %149 = load i32, ptr %18, align 4, !tbaa !9
  %150 = icmp ult i32 %148, %149
  br i1 %150, label %151, label %161

151:                                              ; preds = %147
  %152 = load ptr, ptr %15, align 8, !tbaa !5
  %153 = load i32, ptr %24, align 4, !tbaa !9
  %154 = zext i32 %153 to i64
  %155 = getelementptr inbounds double, ptr %152, i64 %154
  %156 = load double, ptr %155, align 8, !tbaa !20
  %157 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %156)
  br label %158

158:                                              ; preds = %151
  %159 = load i32, ptr %24, align 4, !tbaa !9
  %160 = add i32 %159, 1
  store i32 %160, ptr %24, align 4, !tbaa !9
  br label %147, !llvm.loop !25

161:                                              ; preds = %147
  %162 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %163

163:                                              ; preds = %233, %161
  %164 = load i32, ptr %24, align 4, !tbaa !9
  %165 = load i32, ptr %17, align 4, !tbaa !9
  %166 = icmp ult i32 %164, %165
  br i1 %166, label %167, label %236

167:                                              ; preds = %163
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #6
  %168 = load ptr, ptr %14, align 8, !tbaa !5
  %169 = load i32, ptr %24, align 4, !tbaa !9
  %170 = add i32 %169, 1
  %171 = zext i32 %170 to i64
  %172 = getelementptr inbounds i32, ptr %168, i64 %171
  %173 = load i32, ptr %172, align 4, !tbaa !9
  %174 = load ptr, ptr %14, align 8, !tbaa !5
  %175 = load i32, ptr %24, align 4, !tbaa !9
  %176 = zext i32 %175 to i64
  %177 = getelementptr inbounds i32, ptr %174, i64 %176
  %178 = load i32, ptr %177, align 4, !tbaa !9
  %179 = sub i32 %173, %178
  store i32 %179, ptr %27, align 4, !tbaa !9
  %180 = load ptr, ptr %14, align 8, !tbaa !5
  %181 = load i32, ptr %24, align 4, !tbaa !9
  %182 = add i32 %181, 1
  %183 = zext i32 %182 to i64
  %184 = getelementptr inbounds i32, ptr %180, i64 %183
  %185 = load i32, ptr %184, align 4, !tbaa !9
  %186 = load ptr, ptr %14, align 8, !tbaa !5
  %187 = load i32, ptr %24, align 4, !tbaa !9
  %188 = zext i32 %187 to i64
  %189 = getelementptr inbounds i32, ptr %186, i64 %188
  %190 = load i32, ptr %189, align 4, !tbaa !9
  %191 = icmp uge i32 %185, %190
  br i1 %191, label %192, label %193

192:                                              ; preds = %167
  br label %194

193:                                              ; preds = %167
  call void @__assert_fail(ptr noundef @.str.8, ptr noundef @.str, i32 noundef 231, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #8
  unreachable

194:                                              ; preds = %192
  store i32 0, ptr %25, align 4, !tbaa !9
  br label %195

195:                                              ; preds = %229, %194
  %196 = load i32, ptr %25, align 4, !tbaa !9
  %197 = load i32, ptr %27, align 4, !tbaa !9
  %198 = icmp ult i32 %196, %197
  br i1 %198, label %199, label %232

199:                                              ; preds = %195
  %200 = load ptr, ptr %15, align 8, !tbaa !5
  %201 = load ptr, ptr %14, align 8, !tbaa !5
  %202 = load i32, ptr %24, align 4, !tbaa !9
  %203 = zext i32 %202 to i64
  %204 = getelementptr inbounds i32, ptr %201, i64 %203
  %205 = load i32, ptr %204, align 4, !tbaa !9
  %206 = load i32, ptr %25, align 4, !tbaa !9
  %207 = add i32 %205, %206
  %208 = zext i32 %207 to i64
  %209 = getelementptr inbounds double, ptr %200, i64 %208
  %210 = load double, ptr %209, align 8, !tbaa !20
  %211 = load ptr, ptr %23, align 8, !tbaa !5
  %212 = load ptr, ptr %13, align 8, !tbaa !5
  %213 = load ptr, ptr %14, align 8, !tbaa !5
  %214 = load i32, ptr %24, align 4, !tbaa !9
  %215 = zext i32 %214 to i64
  %216 = getelementptr inbounds i32, ptr %213, i64 %215
  %217 = load i32, ptr %216, align 4, !tbaa !9
  %218 = load i32, ptr %25, align 4, !tbaa !9
  %219 = add i32 %217, %218
  %220 = zext i32 %219 to i64
  %221 = getelementptr inbounds i32, ptr %212, i64 %220
  %222 = load i32, ptr %221, align 4, !tbaa !9
  %223 = load i32, ptr %17, align 4, !tbaa !9
  %224 = mul i32 %222, %223
  %225 = load i32, ptr %24, align 4, !tbaa !9
  %226 = add i32 %224, %225
  %227 = zext i32 %226 to i64
  %228 = getelementptr inbounds double, ptr %211, i64 %227
  store double %210, ptr %228, align 8, !tbaa !20
  br label %229

229:                                              ; preds = %199
  %230 = load i32, ptr %25, align 4, !tbaa !9
  %231 = add i32 %230, 1
  store i32 %231, ptr %25, align 4, !tbaa !9
  br label %195, !llvm.loop !26

232:                                              ; preds = %195
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #6
  br label %233

233:                                              ; preds = %232
  %234 = load i32, ptr %24, align 4, !tbaa !9
  %235 = add i32 %234, 1
  store i32 %235, ptr %24, align 4, !tbaa !9
  br label %163, !llvm.loop !27

236:                                              ; preds = %163
  %237 = load ptr, ptr %23, align 8, !tbaa !5
  %238 = icmp ne ptr null, %237
  br i1 %238, label %239, label %240

239:                                              ; preds = %236
  br label %241

240:                                              ; preds = %236
  call void @__assert_fail(ptr noundef @.str.9, ptr noundef @.str, i32 noundef 238, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #8
  unreachable

241:                                              ; preds = %239
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %242

242:                                              ; preds = %267, %241
  %243 = load i32, ptr %24, align 4, !tbaa !9
  %244 = load i32, ptr %16, align 4, !tbaa !9
  %245 = icmp ult i32 %243, %244
  br i1 %245, label %246, label %270

246:                                              ; preds = %242
  store i32 0, ptr %25, align 4, !tbaa !9
  br label %247

247:                                              ; preds = %262, %246
  %248 = load i32, ptr %25, align 4, !tbaa !9
  %249 = load i32, ptr %17, align 4, !tbaa !9
  %250 = icmp ult i32 %248, %249
  br i1 %250, label %251, label %265

251:                                              ; preds = %247
  %252 = load ptr, ptr %23, align 8, !tbaa !5
  %253 = load i32, ptr %24, align 4, !tbaa !9
  %254 = load i32, ptr %17, align 4, !tbaa !9
  %255 = mul i32 %253, %254
  %256 = load i32, ptr %25, align 4, !tbaa !9
  %257 = add i32 %255, %256
  %258 = zext i32 %257 to i64
  %259 = getelementptr inbounds double, ptr %252, i64 %258
  %260 = load double, ptr %259, align 8, !tbaa !20
  %261 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %260)
  br label %262

262:                                              ; preds = %251
  %263 = load i32, ptr %25, align 4, !tbaa !9
  %264 = add i32 %263, 1
  store i32 %264, ptr %25, align 4, !tbaa !9
  br label %247, !llvm.loop !28

265:                                              ; preds = %247
  %266 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  br label %267

267:                                              ; preds = %265
  %268 = load i32, ptr %24, align 4, !tbaa !9
  %269 = add i32 %268, 1
  store i32 %269, ptr %24, align 4, !tbaa !9
  br label %242, !llvm.loop !29

270:                                              ; preds = %242
  %271 = load ptr, ptr %23, align 8, !tbaa !5
  call void @free(ptr noundef %271) #6
  %272 = load i32, ptr %12, align 4, !tbaa !9
  %273 = icmp eq i32 %272, 0
  br i1 %273, label %274, label %280

274:                                              ; preds = %270
  %275 = load ptr, ptr %9, align 8, !tbaa !5
  %276 = load ptr, ptr %10, align 8, !tbaa !5
  %277 = load ptr, ptr %13, align 8, !tbaa !5
  %278 = load ptr, ptr %14, align 8, !tbaa !5
  %279 = load ptr, ptr %15, align 8, !tbaa !5
  call void @libxsmm_generator_spgemm_csc_kernel(ptr noundef %19, ptr noundef %275, ptr noundef %276, ptr noundef %277, ptr noundef %278, ptr noundef %279)
  br label %281

280:                                              ; preds = %270
  call void @__assert_fail(ptr noundef @.str.10, ptr noundef @.str, i32 noundef 252, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #8
  unreachable

281:                                              ; preds = %274
  store i32 0, ptr %26, align 4
  br label %282

282:                                              ; preds = %281, %96
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  %283 = load i32, ptr %26, align 4
  switch i32 %283, label %569 [
    i32 0, label %284
  ]

284:                                              ; preds = %282
  br label %285

285:                                              ; preds = %284, %71, %68, %64
  br label %507

286:                                              ; preds = %61
  %287 = load ptr, ptr %11, align 8, !tbaa !5
  call void @libxsmm_sparse_csr_reader(ptr noundef %19, ptr noundef %287, ptr noundef %13, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %17, ptr noundef %18)
  %288 = load ptr, ptr %13, align 8, !tbaa !5
  %289 = icmp ne ptr null, %288
  br i1 %289, label %290, label %506

290:                                              ; preds = %286
  %291 = load ptr, ptr %14, align 8, !tbaa !5
  %292 = icmp ne ptr null, %291
  br i1 %292, label %293, label %506

293:                                              ; preds = %290
  %294 = load ptr, ptr %15, align 8, !tbaa !5
  %295 = icmp ne ptr null, %294
  br i1 %295, label %296, label %506

296:                                              ; preds = %293
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  %297 = load i32, ptr %16, align 4, !tbaa !9
  %298 = zext i32 %297 to i64
  %299 = load i32, ptr %17, align 4, !tbaa !9
  %300 = zext i32 %299 to i64
  %301 = mul i64 %298, %300
  %302 = call noalias ptr @calloc(i64 noundef %301, i64 noundef 8) #7
  store ptr %302, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  %303 = call i32 (ptr, ...) @printf(ptr noundef @.str.11)
  %304 = load i32, ptr %16, align 4, !tbaa !9
  %305 = load i32, ptr %17, align 4, !tbaa !9
  %306 = load i32, ptr %18, align 4, !tbaa !9
  %307 = call i32 (ptr, ...) @printf(ptr noundef @.str.3, i32 noundef %304, i32 noundef %305, i32 noundef %306)
  %308 = load ptr, ptr %28, align 8, !tbaa !5
  %309 = icmp eq ptr %308, null
  br i1 %309, label %310, label %320

310:                                              ; preds = %296
  %311 = load ptr, ptr @stderr, align 8, !tbaa !5
  %312 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %311, ptr noundef @.str.12) #6
  %313 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %314 = icmp ult i32 1, %313
  br i1 %314, label %315, label %317

315:                                              ; preds = %310
  %316 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !9
  br label %318

317:                                              ; preds = %310
  br label %318

318:                                              ; preds = %317, %315
  %319 = phi i32 [ %316, %315 ], [ 1, %317 ]
  call void @libxsmm_handle_error(ptr noundef %19, i32 noundef 90000, ptr noundef @__func__.libxsmm_generator_spgemm, ptr noundef @.str, i32 noundef 271, i32 noundef %319)
  store i32 1, ptr %26, align 4
  br label %503

320:                                              ; preds = %296
  store i32 0, ptr %29, align 4, !tbaa !9
  br label %321

321:                                              ; preds = %332, %320
  %322 = load i32, ptr %29, align 4, !tbaa !9
  %323 = load i32, ptr %16, align 4, !tbaa !9
  %324 = load i32, ptr %17, align 4, !tbaa !9
  %325 = mul i32 %323, %324
  %326 = icmp ult i32 %322, %325
  br i1 %326, label %327, label %335

327:                                              ; preds = %321
  %328 = load ptr, ptr %28, align 8, !tbaa !5
  %329 = load i32, ptr %29, align 4, !tbaa !9
  %330 = zext i32 %329 to i64
  %331 = getelementptr inbounds double, ptr %328, i64 %330
  store double 0.000000e+00, ptr %331, align 8, !tbaa !20
  br label %332

332:                                              ; preds = %327
  %333 = load i32, ptr %29, align 4, !tbaa !9
  %334 = add i32 %333, 1
  store i32 %334, ptr %29, align 4, !tbaa !9
  br label %321, !llvm.loop !30

335:                                              ; preds = %321
  store i32 0, ptr %29, align 4, !tbaa !9
  br label %336

336:                                              ; preds = %347, %335
  %337 = load i32, ptr %29, align 4, !tbaa !9
  %338 = load i32, ptr %16, align 4, !tbaa !9
  %339 = icmp ule i32 %337, %338
  br i1 %339, label %340, label %350

340:                                              ; preds = %336
  %341 = load ptr, ptr %13, align 8, !tbaa !5
  %342 = load i32, ptr %29, align 4, !tbaa !9
  %343 = zext i32 %342 to i64
  %344 = getelementptr inbounds i32, ptr %341, i64 %343
  %345 = load i32, ptr %344, align 4, !tbaa !9
  %346 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, i32 noundef %345)
  br label %347

347:                                              ; preds = %340
  %348 = load i32, ptr %29, align 4, !tbaa !9
  %349 = add i32 %348, 1
  store i32 %349, ptr %29, align 4, !tbaa !9
  br label %336, !llvm.loop !31

350:                                              ; preds = %336
  %351 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  store i32 0, ptr %29, align 4, !tbaa !9
  br label %352

352:                                              ; preds = %363, %350
  %353 = load i32, ptr %29, align 4, !tbaa !9
  %354 = load i32, ptr %18, align 4, !tbaa !9
  %355 = icmp ult i32 %353, %354
  br i1 %355, label %356, label %366

356:                                              ; preds = %352
  %357 = load ptr, ptr %14, align 8, !tbaa !5
  %358 = load i32, ptr %29, align 4, !tbaa !9
  %359 = zext i32 %358 to i64
  %360 = getelementptr inbounds i32, ptr %357, i64 %359
  %361 = load i32, ptr %360, align 4, !tbaa !9
  %362 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, i32 noundef %361)
  br label %363

363:                                              ; preds = %356
  %364 = load i32, ptr %29, align 4, !tbaa !9
  %365 = add i32 %364, 1
  store i32 %365, ptr %29, align 4, !tbaa !9
  br label %352, !llvm.loop !32

366:                                              ; preds = %352
  %367 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  store i32 0, ptr %29, align 4, !tbaa !9
  br label %368

368:                                              ; preds = %379, %366
  %369 = load i32, ptr %29, align 4, !tbaa !9
  %370 = load i32, ptr %18, align 4, !tbaa !9
  %371 = icmp ult i32 %369, %370
  br i1 %371, label %372, label %382

372:                                              ; preds = %368
  %373 = load ptr, ptr %15, align 8, !tbaa !5
  %374 = load i32, ptr %29, align 4, !tbaa !9
  %375 = zext i32 %374 to i64
  %376 = getelementptr inbounds double, ptr %373, i64 %375
  %377 = load double, ptr %376, align 8, !tbaa !20
  %378 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %377)
  br label %379

379:                                              ; preds = %372
  %380 = load i32, ptr %29, align 4, !tbaa !9
  %381 = add i32 %380, 1
  store i32 %381, ptr %29, align 4, !tbaa !9
  br label %368, !llvm.loop !33

382:                                              ; preds = %368
  %383 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  store i32 0, ptr %29, align 4, !tbaa !9
  br label %384

384:                                              ; preds = %454, %382
  %385 = load i32, ptr %29, align 4, !tbaa !9
  %386 = load i32, ptr %16, align 4, !tbaa !9
  %387 = icmp ult i32 %385, %386
  br i1 %387, label %388, label %457

388:                                              ; preds = %384
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #6
  %389 = load ptr, ptr %13, align 8, !tbaa !5
  %390 = load i32, ptr %29, align 4, !tbaa !9
  %391 = add i32 %390, 1
  %392 = zext i32 %391 to i64
  %393 = getelementptr inbounds i32, ptr %389, i64 %392
  %394 = load i32, ptr %393, align 4, !tbaa !9
  %395 = load ptr, ptr %13, align 8, !tbaa !5
  %396 = load i32, ptr %29, align 4, !tbaa !9
  %397 = zext i32 %396 to i64
  %398 = getelementptr inbounds i32, ptr %395, i64 %397
  %399 = load i32, ptr %398, align 4, !tbaa !9
  %400 = sub i32 %394, %399
  store i32 %400, ptr %31, align 4, !tbaa !9
  %401 = load ptr, ptr %13, align 8, !tbaa !5
  %402 = load i32, ptr %29, align 4, !tbaa !9
  %403 = add i32 %402, 1
  %404 = zext i32 %403 to i64
  %405 = getelementptr inbounds i32, ptr %401, i64 %404
  %406 = load i32, ptr %405, align 4, !tbaa !9
  %407 = load ptr, ptr %13, align 8, !tbaa !5
  %408 = load i32, ptr %29, align 4, !tbaa !9
  %409 = zext i32 %408 to i64
  %410 = getelementptr inbounds i32, ptr %407, i64 %409
  %411 = load i32, ptr %410, align 4, !tbaa !9
  %412 = icmp uge i32 %406, %411
  br i1 %412, label %413, label %414

413:                                              ; preds = %388
  br label %415

414:                                              ; preds = %388
  call void @__assert_fail(ptr noundef @.str.13, ptr noundef @.str, i32 noundef 295, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #8
  unreachable

415:                                              ; preds = %413
  store i32 0, ptr %30, align 4, !tbaa !9
  br label %416

416:                                              ; preds = %450, %415
  %417 = load i32, ptr %30, align 4, !tbaa !9
  %418 = load i32, ptr %31, align 4, !tbaa !9
  %419 = icmp ult i32 %417, %418
  br i1 %419, label %420, label %453

420:                                              ; preds = %416
  %421 = load ptr, ptr %15, align 8, !tbaa !5
  %422 = load ptr, ptr %13, align 8, !tbaa !5
  %423 = load i32, ptr %29, align 4, !tbaa !9
  %424 = zext i32 %423 to i64
  %425 = getelementptr inbounds i32, ptr %422, i64 %424
  %426 = load i32, ptr %425, align 4, !tbaa !9
  %427 = load i32, ptr %30, align 4, !tbaa !9
  %428 = add i32 %426, %427
  %429 = zext i32 %428 to i64
  %430 = getelementptr inbounds double, ptr %421, i64 %429
  %431 = load double, ptr %430, align 8, !tbaa !20
  %432 = load ptr, ptr %28, align 8, !tbaa !5
  %433 = load i32, ptr %29, align 4, !tbaa !9
  %434 = load i32, ptr %17, align 4, !tbaa !9
  %435 = mul i32 %433, %434
  %436 = load ptr, ptr %14, align 8, !tbaa !5
  %437 = load ptr, ptr %13, align 8, !tbaa !5
  %438 = load i32, ptr %29, align 4, !tbaa !9
  %439 = zext i32 %438 to i64
  %440 = getelementptr inbounds i32, ptr %437, i64 %439
  %441 = load i32, ptr %440, align 4, !tbaa !9
  %442 = load i32, ptr %30, align 4, !tbaa !9
  %443 = add i32 %441, %442
  %444 = zext i32 %443 to i64
  %445 = getelementptr inbounds i32, ptr %436, i64 %444
  %446 = load i32, ptr %445, align 4, !tbaa !9
  %447 = add i32 %435, %446
  %448 = zext i32 %447 to i64
  %449 = getelementptr inbounds double, ptr %432, i64 %448
  store double %431, ptr %449, align 8, !tbaa !20
  br label %450

450:                                              ; preds = %420
  %451 = load i32, ptr %30, align 4, !tbaa !9
  %452 = add i32 %451, 1
  store i32 %452, ptr %30, align 4, !tbaa !9
  br label %416, !llvm.loop !34

453:                                              ; preds = %416
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #6
  br label %454

454:                                              ; preds = %453
  %455 = load i32, ptr %29, align 4, !tbaa !9
  %456 = add i32 %455, 1
  store i32 %456, ptr %29, align 4, !tbaa !9
  br label %384, !llvm.loop !35

457:                                              ; preds = %384
  %458 = load ptr, ptr %28, align 8, !tbaa !5
  %459 = icmp ne ptr null, %458
  br i1 %459, label %460, label %461

460:                                              ; preds = %457
  br label %462

461:                                              ; preds = %457
  call void @__assert_fail(ptr noundef @.str.9, ptr noundef @.str, i32 noundef 302, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #8
  unreachable

462:                                              ; preds = %460
  store i32 0, ptr %29, align 4, !tbaa !9
  br label %463

463:                                              ; preds = %488, %462
  %464 = load i32, ptr %29, align 4, !tbaa !9
  %465 = load i32, ptr %16, align 4, !tbaa !9
  %466 = icmp ult i32 %464, %465
  br i1 %466, label %467, label %491

467:                                              ; preds = %463
  store i32 0, ptr %30, align 4, !tbaa !9
  br label %468

468:                                              ; preds = %483, %467
  %469 = load i32, ptr %30, align 4, !tbaa !9
  %470 = load i32, ptr %17, align 4, !tbaa !9
  %471 = icmp ult i32 %469, %470
  br i1 %471, label %472, label %486

472:                                              ; preds = %468
  %473 = load ptr, ptr %28, align 8, !tbaa !5
  %474 = load i32, ptr %29, align 4, !tbaa !9
  %475 = load i32, ptr %17, align 4, !tbaa !9
  %476 = mul i32 %474, %475
  %477 = load i32, ptr %30, align 4, !tbaa !9
  %478 = add i32 %476, %477
  %479 = zext i32 %478 to i64
  %480 = getelementptr inbounds double, ptr %473, i64 %479
  %481 = load double, ptr %480, align 8, !tbaa !20
  %482 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %481)
  br label %483

483:                                              ; preds = %472
  %484 = load i32, ptr %30, align 4, !tbaa !9
  %485 = add i32 %484, 1
  store i32 %485, ptr %30, align 4, !tbaa !9
  br label %468, !llvm.loop !36

486:                                              ; preds = %468
  %487 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  br label %488

488:                                              ; preds = %486
  %489 = load i32, ptr %29, align 4, !tbaa !9
  %490 = add i32 %489, 1
  store i32 %490, ptr %29, align 4, !tbaa !9
  br label %463, !llvm.loop !37

491:                                              ; preds = %463
  %492 = load ptr, ptr %28, align 8, !tbaa !5
  call void @free(ptr noundef %492) #6
  %493 = load i32, ptr %12, align 4, !tbaa !9
  %494 = icmp eq i32 %493, 1
  br i1 %494, label %495, label %501

495:                                              ; preds = %491
  %496 = load ptr, ptr %9, align 8, !tbaa !5
  %497 = load ptr, ptr %10, align 8, !tbaa !5
  %498 = load ptr, ptr %13, align 8, !tbaa !5
  %499 = load ptr, ptr %14, align 8, !tbaa !5
  %500 = load ptr, ptr %15, align 8, !tbaa !5
  call void @libxsmm_generator_spgemm_csr_kernel(ptr noundef %19, ptr noundef %496, ptr noundef %497, ptr noundef %498, ptr noundef %499, ptr noundef %500)
  br label %502

501:                                              ; preds = %491
  call void @__assert_fail(ptr noundef @.str.10, ptr noundef @.str, i32 noundef 316, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #8
  unreachable

502:                                              ; preds = %495
  store i32 0, ptr %26, align 4
  br label %503

503:                                              ; preds = %502, %318
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  %504 = load i32, ptr %26, align 4
  switch i32 %504, label %569 [
    i32 0, label %505
  ]

505:                                              ; preds = %503
  br label %506

506:                                              ; preds = %505, %293, %290, %286
  br label %507

507:                                              ; preds = %506, %285
  call void @libxsmm_close_function(ptr noundef %19)
  %508 = load ptr, ptr %13, align 8, !tbaa !5
  %509 = icmp ne ptr %508, null
  br i1 %509, label %510, label %512

510:                                              ; preds = %507
  %511 = load ptr, ptr %13, align 8, !tbaa !5
  call void @free(ptr noundef %511) #6
  br label %512

512:                                              ; preds = %510, %507
  %513 = load ptr, ptr %14, align 8, !tbaa !5
  %514 = icmp ne ptr %513, null
  br i1 %514, label %515, label %517

515:                                              ; preds = %512
  %516 = load ptr, ptr %14, align 8, !tbaa !5
  call void @free(ptr noundef %516) #6
  br label %517

517:                                              ; preds = %515, %512
  %518 = load ptr, ptr %15, align 8, !tbaa !5
  %519 = icmp ne ptr %518, null
  br i1 %519, label %520, label %522

520:                                              ; preds = %517
  %521 = load ptr, ptr %15, align 8, !tbaa !5
  call void @free(ptr noundef %521) #6
  br label %522

522:                                              ; preds = %520, %517
  %523 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %19, i32 0, i32 5
  %524 = load i32, ptr %523, align 8, !tbaa !38
  %525 = icmp ne i32 %524, 0
  br i1 %525, label %526, label %536

526:                                              ; preds = %522
  %527 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %19, i32 0, i32 5
  %528 = load i32, ptr %527, align 8, !tbaa !38
  call void @libxsmm_handle_error(ptr noundef %19, i32 noundef %528, ptr noundef @__func__.libxsmm_generator_spgemm, ptr noundef @.str, i32 noundef 337, i32 noundef 1)
  %529 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %530 = icmp ult i32 1, %529
  br i1 %530, label %531, label %533

531:                                              ; preds = %526
  %532 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !9
  br label %534

533:                                              ; preds = %526
  br label %534

534:                                              ; preds = %533, %531
  %535 = phi i32 [ %532, %531 ], [ 1, %533 ]
  call void @libxsmm_handle_error(ptr noundef %19, i32 noundef 90000, ptr noundef @__func__.libxsmm_generator_spgemm, ptr noundef @.str, i32 noundef 338, i32 noundef %535)
  store i32 1, ptr %26, align 4
  br label %569

536:                                              ; preds = %522
  %537 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %19, i32 0, i32 0
  %538 = load ptr, ptr %537, align 8, !tbaa !40
  %539 = icmp ne ptr %538, null
  br i1 %539, label %540, label %566

540:                                              ; preds = %536
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #6
  %541 = load ptr, ptr %7, align 8, !tbaa !5
  %542 = call noalias ptr @fopen(ptr noundef %541, ptr noundef @.str.14)
  store ptr %542, ptr %32, align 8, !tbaa !5
  %543 = load ptr, ptr %32, align 8, !tbaa !5
  %544 = icmp ne ptr %543, null
  br i1 %544, label %545, label %552

545:                                              ; preds = %540
  %546 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %19, i32 0, i32 0
  %547 = load ptr, ptr %546, align 8, !tbaa !40
  %548 = load ptr, ptr %32, align 8, !tbaa !5
  %549 = call i32 @fputs(ptr noundef %547, ptr noundef %548)
  %550 = load ptr, ptr %32, align 8, !tbaa !5
  %551 = call i32 @fclose(ptr noundef %550)
  br label %562

552:                                              ; preds = %540
  %553 = load ptr, ptr @stderr, align 8, !tbaa !5
  %554 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %553, ptr noundef @.str.15) #6
  %555 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %556 = icmp ult i32 1, %555
  br i1 %556, label %557, label %559

557:                                              ; preds = %552
  %558 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !9
  br label %560

559:                                              ; preds = %552
  br label %560

560:                                              ; preds = %559, %557
  %561 = phi i32 [ %558, %557 ], [ 1, %559 ]
  call void @libxsmm_handle_error(ptr noundef %19, i32 noundef 90000, ptr noundef @__func__.libxsmm_generator_spgemm, ptr noundef @.str, i32 noundef 350, i32 noundef %561)
  store i32 1, ptr %26, align 4
  br label %563

562:                                              ; preds = %545
  store i32 0, ptr %26, align 4
  br label %563

563:                                              ; preds = %562, %560
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #6
  %564 = load i32, ptr %26, align 4
  switch i32 %564, label %569 [
    i32 0, label %565
  ]

565:                                              ; preds = %563
  br label %566

566:                                              ; preds = %565, %536
  %567 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %19, i32 0, i32 0
  %568 = load ptr, ptr %567, align 8, !tbaa !40
  call void @free(ptr noundef %568) #6
  store i32 0, ptr %26, align 4
  br label %569

569:                                              ; preds = %566, %563, %534, %503, %282
  call void @llvm.lifetime.end.p0(i64 32, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  %570 = load i32, ptr %26, align 4
  switch i32 %570, label %572 [
    i32 0, label %571
    i32 1, label %571
  ]

571:                                              ; preds = %569, %569
  ret void

572:                                              ; preds = %569
  unreachable
}

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

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

declare void @libxsmm_mmfunction_signature(ptr noundef, ptr noundef, ptr noundef) #1

declare void @libxsmm_sparse_csc_reader(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

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

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

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

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

declare void @libxsmm_sparse_csr_reader(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #1

declare void @libxsmm_close_function(ptr noundef) #1

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

declare i32 @fputs(ptr noundef, ptr noundef) #1

declare i32 @fclose(ptr noundef) #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = distinct !{!12, !13, !14}
!13 = !{!"llvm.loop.mustprogress"}
!14 = !{!"llvm.loop.unroll.count", i32 4}
!15 = !{!16, !10, i64 4}
!16 = !{!"libxsmm_gemm_descriptor", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !7, i64 28, !7, i64 29, !7, i64 32, !17, i64 33, !17, i64 41, !7, i64 49, !10, i64 50, !10, i64 54, !10, i64 58, !18, i64 62, !18, i64 64, !7, i64 66, !7, i64 67, !7, i64 68, !7, i64 69, !18, i64 70, !18, i64 72, !18, i64 74, !18, i64 76, !18, i64 78, !18, i64 80, !10, i64 82, !10, i64 86, !10, i64 90, !7, i64 94}
!17 = !{!"long long", !7, i64 0}
!18 = !{!"short", !7, i64 0}
!19 = !{!16, !10, i64 0}
!20 = !{!21, !21, i64 0}
!21 = !{!"double", !7, i64 0}
!22 = distinct !{!22, !13}
!23 = distinct !{!23, !13}
!24 = distinct !{!24, !13}
!25 = distinct !{!25, !13}
!26 = distinct !{!26, !13}
!27 = distinct !{!27, !13}
!28 = distinct !{!28, !13}
!29 = distinct !{!29, !13}
!30 = distinct !{!30, !13}
!31 = distinct !{!31, !13}
!32 = distinct !{!32, !13}
!33 = distinct !{!33, !13}
!34 = distinct !{!34, !13}
!35 = distinct !{!35, !13}
!36 = distinct !{!36, !13}
!37 = distinct !{!37, !13}
!38 = !{!39, !10, i64 24}
!39 = !{!"libxsmm_generated_code", !6, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28}
!40 = !{!39, !6, i64 0}


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

@.str = external hidden unnamed_addr constant [72 x i8], align 1
@libxsmm_ninit = external local_unnamed_addr global i32, align 4
@libxsmm_verbosity = external local_unnamed_addr global i32, align 4
@stderr = external local_unnamed_addr global ptr, align 8
@.str.2 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [83 x i8], align 1
@__func__.libxsmm_generator_spgemm = external hidden unnamed_addr constant [25 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [41 x i8], align 1
@__PRETTY_FUNCTION__.libxsmm_generator_spgemm = external hidden unnamed_addr constant [130 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [82 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [89 x i8], align 1

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

declare void @libxsmm_handle_error(ptr noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

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

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

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_spgemm(ptr nocapture noundef readonly %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, i32 noundef %5) local_unnamed_addr #0 {
  %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 %struct.libxsmm_generated_code, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #8
  store ptr null, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #8
  store ptr null, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #8
  store ptr null, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #8
  store i32 0, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %13) #8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(32) %13, i8 0, i64 32, i1 false), !tbaa !11
  call void @libxsmm_mmfunction_signature(ptr noundef nonnull %13, ptr noundef %1, ptr noundef %2) #8
  %14 = getelementptr inbounds i8, ptr %2, i64 4
  %15 = load i32, ptr %14, align 1, !tbaa !12
  store i32 %15, ptr %11, align 4, !tbaa !9
  %16 = load i32, ptr %2, align 1, !tbaa !16
  store i32 %16, ptr %10, align 4, !tbaa !9
  %17 = icmp eq i32 %5, 0
  %18 = icmp sgt i32 %5, 9
  %or.cond = or i1 %17, %18
  br i1 %or.cond, label %19, label %139

19:                                               ; preds = %6
  call void @libxsmm_sparse_csc_reader(ptr noundef nonnull %13, ptr noundef %4, ptr noundef nonnull %7, ptr noundef nonnull %8, ptr noundef nonnull %9, ptr noundef nonnull %10, ptr noundef nonnull %11, ptr noundef nonnull %12) #8
  %20 = load ptr, ptr %7, align 8, !tbaa !5
  %21 = icmp ne ptr %20, null
  %22 = load ptr, ptr %8, align 8
  %23 = icmp ne ptr %22, null
  %or.cond5 = select i1 %21, i1 %23, i1 false
  %24 = load ptr, ptr %9, align 8
  %25 = icmp ne ptr %24, null
  %or.cond7 = select i1 %or.cond5, i1 %25, i1 false
  br i1 %or.cond7, label %26, label %258

26:                                               ; preds = %19
  %27 = load i32, ptr %10, align 4, !tbaa !9
  %28 = zext i32 %27 to i64
  %29 = load i32, ptr %11, align 4, !tbaa !9
  %30 = zext i32 %29 to i64
  %31 = mul nuw i64 %30, %28
  %32 = call noalias ptr @calloc(i64 noundef %31, i64 noundef 8) #9
  %33 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  %34 = load i32, ptr %10, align 4, !tbaa !9
  %35 = load i32, ptr %11, align 4, !tbaa !9
  %36 = load i32, ptr %12, align 4, !tbaa !9
  %37 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3, i32 noundef %34, i32 noundef %35, i32 noundef %36)
  %.not139 = icmp eq ptr %32, null
  br i1 %.not139, label %.thread, label %.preheader151

.preheader151:                                    ; preds = %26
  %38 = load i32, ptr %10, align 4, !tbaa !9
  %.not208 = icmp eq i32 %38, -1
  br i1 %.not208, label %._crit_edge181, label %.lr.ph180

.thread:                                          ; preds = %26
  %39 = load ptr, ptr @stderr, align 8, !tbaa !5
  %40 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %39, ptr noundef nonnull @.str.4) #10
  %41 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %42 = icmp ugt i32 %41, 1
  %43 = load i32, ptr @libxsmm_verbosity, align 4
  %44 = select i1 %42, i32 %43, i32 1
  call void @libxsmm_handle_error(ptr noundef nonnull %13, i32 noundef 90000, ptr noundef nonnull @__func__.libxsmm_generator_spgemm, ptr noundef nonnull @.str, i32 noundef 208, i32 noundef %44) #8
  br label %291

.lr.ph180:                                        ; preds = %.preheader151, %.lr.ph180
  %indvars.iv232 = phi i64 [ %indvars.iv.next233, %.lr.ph180 ], [ 0, %.preheader151 ]
  %45 = load ptr, ptr %8, align 8, !tbaa !5
  %46 = getelementptr inbounds i32, ptr %45, i64 %indvars.iv232
  %47 = load i32, ptr %46, align 4, !tbaa !9
  %48 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, i32 noundef %47)
  %indvars.iv.next233 = add nuw nsw i64 %indvars.iv232, 1
  %49 = load i32, ptr %10, align 4, !tbaa !9
  %50 = add i32 %49, 1
  %51 = zext i32 %50 to i64
  %52 = icmp ult i64 %indvars.iv.next233, %51
  br i1 %52, label %.lr.ph180, label %._crit_edge181, !llvm.loop !17

._crit_edge181:                                   ; preds = %.lr.ph180, %.preheader151
  %53 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %54 = load i32, ptr %12, align 4, !tbaa !9
  %.not209 = icmp eq i32 %54, 0
  br i1 %.not209, label %._crit_edge185, label %.lr.ph184

.lr.ph184:                                        ; preds = %._crit_edge181, %.lr.ph184
  %indvars.iv235 = phi i64 [ %indvars.iv.next236, %.lr.ph184 ], [ 0, %._crit_edge181 ]
  %55 = load ptr, ptr %7, align 8, !tbaa !5
  %56 = getelementptr inbounds i32, ptr %55, i64 %indvars.iv235
  %57 = load i32, ptr %56, align 4, !tbaa !9
  %58 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, i32 noundef %57)
  %indvars.iv.next236 = add nuw nsw i64 %indvars.iv235, 1
  %59 = load i32, ptr %12, align 4, !tbaa !9
  %60 = zext i32 %59 to i64
  %61 = icmp ult i64 %indvars.iv.next236, %60
  br i1 %61, label %.lr.ph184, label %._crit_edge185, !llvm.loop !19

._crit_edge185:                                   ; preds = %.lr.ph184, %._crit_edge181
  %62 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %63 = load i32, ptr %12, align 4, !tbaa !9
  %.not210 = icmp eq i32 %63, 0
  br i1 %.not210, label %._crit_edge189, label %.lr.ph188

.lr.ph188:                                        ; preds = %._crit_edge185, %.lr.ph188
  %indvars.iv238 = phi i64 [ %indvars.iv.next239, %.lr.ph188 ], [ 0, %._crit_edge185 ]
  %64 = load ptr, ptr %9, align 8, !tbaa !5
  %65 = getelementptr inbounds double, ptr %64, i64 %indvars.iv238
  %66 = load double, ptr %65, align 8, !tbaa !20
  %67 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %66)
  %indvars.iv.next239 = add nuw nsw i64 %indvars.iv238, 1
  %68 = load i32, ptr %12, align 4, !tbaa !9
  %69 = zext i32 %68 to i64
  %70 = icmp ult i64 %indvars.iv.next239, %69
  br i1 %70, label %.lr.ph188, label %._crit_edge189, !llvm.loop !22

._crit_edge189:                                   ; preds = %.lr.ph188, %._crit_edge185
  %71 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %72 = load i32, ptr %11, align 4, !tbaa !9
  %.not211 = icmp eq i32 %72, 0
  br i1 %.not211, label %.preheader148, label %.lr.ph194

.lr.ph194:                                        ; preds = %._crit_edge189
  %73 = load ptr, ptr %8, align 8, !tbaa !5
  %74 = load ptr, ptr %9, align 8
  %75 = load ptr, ptr %7, align 8
  %wide.trip.count249 = zext i32 %72 to i64
  %.pre251 = load i32, ptr %73, align 4, !tbaa !9
  br label %88

.loopexit.loopexit.unr-lcssa:                     ; preds = %.lr.ph191, %.lr.ph191.preheader
  %indvars.iv241.unr = phi i64 [ 0, %.lr.ph191.preheader ], [ %indvars.iv.next242.1, %.lr.ph191 ]
  %lcmp.mod254.not = icmp eq i64 %xtraiter253, 0
  br i1 %lcmp.mod254.not, label %.loopexit, label %.lr.ph191.epil

.lr.ph191.epil:                                   ; preds = %.loopexit.loopexit.unr-lcssa
  %76 = trunc nuw i64 %indvars.iv241.unr to i32
  %77 = add i32 %89, %76
  %78 = zext i32 %77 to i64
  %79 = getelementptr inbounds double, ptr %74, i64 %78
  %80 = load double, ptr %79, align 8, !tbaa !20
  %81 = getelementptr inbounds i32, ptr %75, i64 %78
  %82 = load i32, ptr %81, align 4, !tbaa !9
  %83 = mul i32 %82, %72
  %84 = add i32 %83, %93
  %85 = zext i32 %84 to i64
  %86 = getelementptr inbounds double, ptr %32, i64 %85
  store double %80, ptr %86, align 8, !tbaa !20
  br label %.loopexit

.loopexit:                                        ; preds = %.lr.ph191.epil, %.loopexit.loopexit.unr-lcssa, %.preheader149
  %exitcond250.not = icmp eq i64 %indvars.iv.next247, %wide.trip.count249
  br i1 %exitcond250.not, label %.preheader148, label %88, !llvm.loop !23

.preheader148:                                    ; preds = %.loopexit, %._crit_edge189
  %87 = load i32, ptr %10, align 4, !tbaa !9
  %.not213 = icmp eq i32 %87, 0
  br i1 %.not213, label %._crit_edge199, label %.preheader

88:                                               ; preds = %.lr.ph194, %.loopexit
  %89 = phi i32 [ %.pre251, %.lr.ph194 ], [ %91, %.loopexit ]
  %indvars.iv246 = phi i64 [ 0, %.lr.ph194 ], [ %indvars.iv.next247, %.loopexit ]
  %indvars.iv.next247 = add nuw nsw i64 %indvars.iv246, 1
  %90 = getelementptr inbounds i32, ptr %73, i64 %indvars.iv.next247
  %91 = load i32, ptr %90, align 4, !tbaa !9
  %92 = sub i32 %91, %89
  %.not138 = icmp ult i32 %91, %89
  br i1 %.not138, label %95, label %.preheader149

.preheader149:                                    ; preds = %88
  %.not212 = icmp eq i32 %91, %89
  br i1 %.not212, label %.loopexit, label %.lr.ph191.preheader

.lr.ph191.preheader:                              ; preds = %.preheader149
  %wide.trip.count244 = zext i32 %92 to i64
  %93 = trunc nuw i64 %indvars.iv246 to i32
  %xtraiter253 = and i64 %wide.trip.count244, 1
  %94 = icmp eq i32 %92, 1
  br i1 %94, label %.loopexit.loopexit.unr-lcssa, label %.lr.ph191.preheader.new

.lr.ph191.preheader.new:                          ; preds = %.lr.ph191.preheader
  %unroll_iter255 = and i64 %wide.trip.count244, 4294967294
  br label %.lr.ph191

95:                                               ; preds = %88
  call void @__assert_fail(ptr noundef nonnull @.str.8, ptr noundef nonnull @.str, i32 noundef 231, ptr noundef nonnull @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #11
  unreachable

.lr.ph191:                                        ; preds = %.lr.ph191, %.lr.ph191.preheader.new
  %indvars.iv241 = phi i64 [ 0, %.lr.ph191.preheader.new ], [ %indvars.iv.next242.1, %.lr.ph191 ]
  %niter256 = phi i64 [ 0, %.lr.ph191.preheader.new ], [ %niter256.next.1, %.lr.ph191 ]
  %96 = trunc nuw i64 %indvars.iv241 to i32
  %97 = add i32 %89, %96
  %98 = zext i32 %97 to i64
  %99 = getelementptr inbounds double, ptr %74, i64 %98
  %100 = load double, ptr %99, align 8, !tbaa !20
  %101 = getelementptr inbounds i32, ptr %75, i64 %98
  %102 = load i32, ptr %101, align 4, !tbaa !9
  %103 = mul i32 %102, %72
  %104 = add i32 %103, %93
  %105 = zext i32 %104 to i64
  %106 = getelementptr inbounds double, ptr %32, i64 %105
  store double %100, ptr %106, align 8, !tbaa !20
  %107 = trunc i64 %indvars.iv241 to i32
  %108 = or disjoint i32 %107, 1
  %109 = add i32 %89, %108
  %110 = zext i32 %109 to i64
  %111 = getelementptr inbounds double, ptr %74, i64 %110
  %112 = load double, ptr %111, align 8, !tbaa !20
  %113 = getelementptr inbounds i32, ptr %75, i64 %110
  %114 = load i32, ptr %113, align 4, !tbaa !9
  %115 = mul i32 %114, %72
  %116 = add i32 %115, %93
  %117 = zext i32 %116 to i64
  %118 = getelementptr inbounds double, ptr %32, i64 %117
  store double %112, ptr %118, align 8, !tbaa !20
  %indvars.iv.next242.1 = add nuw nsw i64 %indvars.iv241, 2
  %niter256.next.1 = add i64 %niter256, 2
  %niter256.ncmp.1 = icmp eq i64 %niter256.next.1, %unroll_iter255
  br i1 %niter256.ncmp.1, label %.loopexit.loopexit.unr-lcssa, label %.lr.ph191, !llvm.loop !24

.preheader:                                       ; preds = %.preheader148, %._crit_edge197
  %.5198 = phi i32 [ %131, %._crit_edge197 ], [ 0, %.preheader148 ]
  %119 = load i32, ptr %11, align 4, !tbaa !9
  %.not214 = icmp eq i32 %119, 0
  br i1 %.not214, label %._crit_edge197, label %.lr.ph196

.lr.ph196:                                        ; preds = %.preheader, %.lr.ph196
  %120 = phi i32 [ %128, %.lr.ph196 ], [ %119, %.preheader ]
  %.1122195 = phi i32 [ %127, %.lr.ph196 ], [ 0, %.preheader ]
  %121 = mul i32 %120, %.5198
  %122 = add i32 %121, %.1122195
  %123 = zext i32 %122 to i64
  %124 = getelementptr inbounds double, ptr %32, i64 %123
  %125 = load double, ptr %124, align 8, !tbaa !20
  %126 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %125)
  %127 = add nuw i32 %.1122195, 1
  %128 = load i32, ptr %11, align 4, !tbaa !9
  %129 = icmp ult i32 %127, %128
  br i1 %129, label %.lr.ph196, label %._crit_edge197, !llvm.loop !25

._crit_edge197:                                   ; preds = %.lr.ph196, %.preheader
  %130 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %131 = add nuw i32 %.5198, 1
  %132 = load i32, ptr %10, align 4, !tbaa !9
  %133 = icmp ult i32 %131, %132
  br i1 %133, label %.preheader, label %._crit_edge199, !llvm.loop !26

._crit_edge199:                                   ; preds = %._crit_edge197, %.preheader148
  call void @free(ptr noundef %32) #8
  br i1 %17, label %135, label %134

134:                                              ; preds = %._crit_edge199
  call void @__assert_fail(ptr noundef nonnull @.str.10, ptr noundef nonnull @.str, i32 noundef 252, ptr noundef nonnull @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #11
  unreachable

135:                                              ; preds = %._crit_edge199
  %136 = load ptr, ptr %7, align 8, !tbaa !5
  %137 = load ptr, ptr %8, align 8, !tbaa !5
  %138 = load ptr, ptr %9, align 8, !tbaa !5
  call void @libxsmm_generator_spgemm_csc_kernel(ptr noundef nonnull %13, ptr noundef nonnull %2, ptr noundef %3, ptr noundef %136, ptr noundef %137, ptr noundef %138)
  br label %258

139:                                              ; preds = %6
  call void @libxsmm_sparse_csr_reader(ptr noundef nonnull %13, ptr noundef %4, ptr noundef nonnull %7, ptr noundef nonnull %8, ptr noundef nonnull %9, ptr noundef nonnull %10, ptr noundef nonnull %11, ptr noundef nonnull %12) #8
  %140 = load ptr, ptr %7, align 8, !tbaa !5
  %141 = icmp ne ptr %140, null
  %142 = load ptr, ptr %8, align 8
  %143 = icmp ne ptr %142, null
  %or.cond9 = select i1 %141, i1 %143, i1 false
  %144 = load ptr, ptr %9, align 8
  %145 = icmp ne ptr %144, null
  %or.cond11 = select i1 %or.cond9, i1 %145, i1 false
  br i1 %or.cond11, label %146, label %258

146:                                              ; preds = %139
  %147 = load i32, ptr %10, align 4, !tbaa !9
  %148 = zext i32 %147 to i64
  %149 = load i32, ptr %11, align 4, !tbaa !9
  %150 = zext i32 %149 to i64
  %151 = mul nuw i64 %150, %148
  %152 = call noalias ptr @calloc(i64 noundef %151, i64 noundef 8) #9
  %153 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11)
  %154 = load i32, ptr %10, align 4, !tbaa !9
  %155 = load i32, ptr %11, align 4, !tbaa !9
  %156 = load i32, ptr %12, align 4, !tbaa !9
  %157 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3, i32 noundef %154, i32 noundef %155, i32 noundef %156)
  %.not137 = icmp eq ptr %152, null
  br i1 %.not137, label %.thread146, label %.preheader157

.thread146:                                       ; preds = %146
  %158 = load ptr, ptr @stderr, align 8, !tbaa !5
  %159 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %158, ptr noundef nonnull @.str.12) #10
  %160 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %161 = icmp ugt i32 %160, 1
  %162 = load i32, ptr @libxsmm_verbosity, align 4
  %163 = select i1 %161, i32 %162, i32 1
  call void @libxsmm_handle_error(ptr noundef nonnull %13, i32 noundef 90000, ptr noundef nonnull @__func__.libxsmm_generator_spgemm, ptr noundef nonnull @.str, i32 noundef 271, i32 noundef %163) #8
  br label %291

.preheader157:                                    ; preds = %146, %.preheader157
  %.1116160 = phi i32 [ %169, %.preheader157 ], [ 0, %146 ]
  %164 = load ptr, ptr %7, align 8, !tbaa !5
  %165 = zext i32 %.1116160 to i64
  %166 = getelementptr inbounds i32, ptr %164, i64 %165
  %167 = load i32, ptr %166, align 4, !tbaa !9
  %168 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, i32 noundef %167)
  %169 = add i32 %.1116160, 1
  %170 = load i32, ptr %10, align 4, !tbaa !9
  %.not = icmp ugt i32 %169, %170
  br i1 %.not, label %171, label %.preheader157, !llvm.loop !27

171:                                              ; preds = %.preheader157
  %172 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %173 = load i32, ptr %12, align 4, !tbaa !9
  %.not201 = icmp eq i32 %173, 0
  br i1 %.not201, label %._crit_edge, label %.lr.ph162

.lr.ph162:                                        ; preds = %171, %.lr.ph162
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph162 ], [ 0, %171 ]
  %174 = load ptr, ptr %8, align 8, !tbaa !5
  %175 = getelementptr inbounds i32, ptr %174, i64 %indvars.iv
  %176 = load i32, ptr %175, align 4, !tbaa !9
  %177 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, i32 noundef %176)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %178 = load i32, ptr %12, align 4, !tbaa !9
  %179 = zext i32 %178 to i64
  %180 = icmp ult i64 %indvars.iv.next, %179
  br i1 %180, label %.lr.ph162, label %._crit_edge, !llvm.loop !28

._crit_edge:                                      ; preds = %.lr.ph162, %171
  %181 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %182 = load i32, ptr %12, align 4, !tbaa !9
  %.not202 = icmp eq i32 %182, 0
  br i1 %.not202, label %._crit_edge166, label %.lr.ph165

.lr.ph165:                                        ; preds = %._crit_edge, %.lr.ph165
  %indvars.iv218 = phi i64 [ %indvars.iv.next219, %.lr.ph165 ], [ 0, %._crit_edge ]
  %183 = load ptr, ptr %9, align 8, !tbaa !5
  %184 = getelementptr inbounds double, ptr %183, i64 %indvars.iv218
  %185 = load double, ptr %184, align 8, !tbaa !20
  %186 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %185)
  %indvars.iv.next219 = add nuw nsw i64 %indvars.iv218, 1
  %187 = load i32, ptr %12, align 4, !tbaa !9
  %188 = zext i32 %187 to i64
  %189 = icmp ult i64 %indvars.iv.next219, %188
  br i1 %189, label %.lr.ph165, label %._crit_edge166, !llvm.loop !29

._crit_edge166:                                   ; preds = %.lr.ph165, %._crit_edge
  %190 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %191 = load i32, ptr %10, align 4, !tbaa !9
  %.not203 = icmp eq i32 %191, 0
  br i1 %.not203, label %._crit_edge176, label %.lr.ph171

.lr.ph171:                                        ; preds = %._crit_edge166
  %192 = load ptr, ptr %7, align 8, !tbaa !5
  %193 = load ptr, ptr %9, align 8
  %194 = load i32, ptr %11, align 4
  %195 = load ptr, ptr %8, align 8
  %wide.trip.count227 = zext i32 %191 to i64
  %.pre = load i32, ptr %192, align 4, !tbaa !9
  br label %206

.loopexit155.loopexit.unr-lcssa:                  ; preds = %215, %.lr.ph168
  %indvars.iv221.unr = phi i64 [ 0, %.lr.ph168 ], [ %indvars.iv.next222.1, %215 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.loopexit155, label %.loopexit155.loopexit.epilog-lcssa

.loopexit155.loopexit.epilog-lcssa:               ; preds = %.loopexit155.loopexit.unr-lcssa
  %196 = trunc nuw i64 %indvars.iv221.unr to i32
  %197 = add i32 %207, %196
  %198 = zext i32 %197 to i64
  %199 = getelementptr inbounds double, ptr %193, i64 %198
  %200 = load double, ptr %199, align 8, !tbaa !20
  %201 = getelementptr inbounds i32, ptr %195, i64 %198
  %202 = load i32, ptr %201, align 4, !tbaa !9
  %203 = add i32 %202, %212
  %204 = zext i32 %203 to i64
  %205 = getelementptr inbounds double, ptr %152, i64 %204
  store double %200, ptr %205, align 8, !tbaa !20
  br label %.loopexit155

.loopexit155:                                     ; preds = %.loopexit155.loopexit.epilog-lcssa, %.loopexit155.loopexit.unr-lcssa, %.preheader154
  %exitcond228.not = icmp eq i64 %indvars.iv.next225, %wide.trip.count227
  br i1 %exitcond228.not, label %.preheader153, label %206, !llvm.loop !30

.preheader153:                                    ; preds = %.loopexit155
  br i1 %.not203, label %._crit_edge176, label %.preheader152

206:                                              ; preds = %.lr.ph171, %.loopexit155
  %207 = phi i32 [ %.pre, %.lr.ph171 ], [ %209, %.loopexit155 ]
  %indvars.iv224 = phi i64 [ 0, %.lr.ph171 ], [ %indvars.iv.next225, %.loopexit155 ]
  %indvars.iv.next225 = add nuw nsw i64 %indvars.iv224, 1
  %208 = getelementptr inbounds i32, ptr %192, i64 %indvars.iv.next225
  %209 = load i32, ptr %208, align 4, !tbaa !9
  %210 = sub i32 %209, %207
  %.not136 = icmp ult i32 %209, %207
  br i1 %.not136, label %214, label %.preheader154

.preheader154:                                    ; preds = %206
  %.not204 = icmp eq i32 %209, %207
  br i1 %.not204, label %.loopexit155, label %.lr.ph168

.lr.ph168:                                        ; preds = %.preheader154
  %211 = trunc nuw i64 %indvars.iv224 to i32
  %212 = mul i32 %194, %211
  %wide.trip.count = zext i32 %210 to i64
  %xtraiter = and i64 %wide.trip.count, 1
  %213 = icmp eq i32 %210, 1
  br i1 %213, label %.loopexit155.loopexit.unr-lcssa, label %.lr.ph168.new

.lr.ph168.new:                                    ; preds = %.lr.ph168
  %unroll_iter = and i64 %wide.trip.count, 4294967294
  br label %215

214:                                              ; preds = %206
  call void @__assert_fail(ptr noundef nonnull @.str.13, ptr noundef nonnull @.str, i32 noundef 295, ptr noundef nonnull @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #11
  unreachable

215:                                              ; preds = %215, %.lr.ph168.new
  %indvars.iv221 = phi i64 [ 0, %.lr.ph168.new ], [ %indvars.iv.next222.1, %215 ]
  %niter = phi i64 [ 0, %.lr.ph168.new ], [ %niter.next.1, %215 ]
  %216 = trunc nuw i64 %indvars.iv221 to i32
  %217 = add i32 %207, %216
  %218 = zext i32 %217 to i64
  %219 = getelementptr inbounds double, ptr %193, i64 %218
  %220 = load double, ptr %219, align 8, !tbaa !20
  %221 = getelementptr inbounds i32, ptr %195, i64 %218
  %222 = load i32, ptr %221, align 4, !tbaa !9
  %223 = add i32 %222, %212
  %224 = zext i32 %223 to i64
  %225 = getelementptr inbounds double, ptr %152, i64 %224
  store double %220, ptr %225, align 8, !tbaa !20
  %226 = trunc i64 %indvars.iv221 to i32
  %227 = or disjoint i32 %226, 1
  %228 = add i32 %207, %227
  %229 = zext i32 %228 to i64
  %230 = getelementptr inbounds double, ptr %193, i64 %229
  %231 = load double, ptr %230, align 8, !tbaa !20
  %232 = getelementptr inbounds i32, ptr %195, i64 %229
  %233 = load i32, ptr %232, align 4, !tbaa !9
  %234 = add i32 %233, %212
  %235 = zext i32 %234 to i64
  %236 = getelementptr inbounds double, ptr %152, i64 %235
  store double %231, ptr %236, align 8, !tbaa !20
  %indvars.iv.next222.1 = add nuw nsw i64 %indvars.iv221, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.loopexit155.loopexit.unr-lcssa, label %215, !llvm.loop !31

.preheader152:                                    ; preds = %.preheader153, %._crit_edge174
  %.5120175 = phi i32 [ %249, %._crit_edge174 ], [ 0, %.preheader153 ]
  %237 = load i32, ptr %11, align 4, !tbaa !9
  %.not206 = icmp eq i32 %237, 0
  br i1 %.not206, label %._crit_edge174, label %.lr.ph173

.lr.ph173:                                        ; preds = %.preheader152, %.lr.ph173
  %238 = phi i32 [ %246, %.lr.ph173 ], [ %237, %.preheader152 ]
  %.1114172 = phi i32 [ %245, %.lr.ph173 ], [ 0, %.preheader152 ]
  %239 = mul i32 %238, %.5120175
  %240 = add i32 %239, %.1114172
  %241 = zext i32 %240 to i64
  %242 = getelementptr inbounds double, ptr %152, i64 %241
  %243 = load double, ptr %242, align 8, !tbaa !20
  %244 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %243)
  %245 = add nuw i32 %.1114172, 1
  %246 = load i32, ptr %11, align 4, !tbaa !9
  %247 = icmp ult i32 %245, %246
  br i1 %247, label %.lr.ph173, label %._crit_edge174, !llvm.loop !32

._crit_edge174:                                   ; preds = %.lr.ph173, %.preheader152
  %248 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  %249 = add nuw i32 %.5120175, 1
  %250 = load i32, ptr %10, align 4, !tbaa !9
  %251 = icmp ult i32 %249, %250
  br i1 %251, label %.preheader152, label %._crit_edge176, !llvm.loop !33

._crit_edge176:                                   ; preds = %._crit_edge174, %._crit_edge166, %.preheader153
  call void @free(ptr noundef %152) #8
  %252 = icmp eq i32 %5, 1
  br i1 %252, label %254, label %253

253:                                              ; preds = %._crit_edge176
  call void @__assert_fail(ptr noundef nonnull @.str.10, ptr noundef nonnull @.str, i32 noundef 316, ptr noundef nonnull @__PRETTY_FUNCTION__.libxsmm_generator_spgemm) #11
  unreachable

254:                                              ; preds = %._crit_edge176
  %255 = load ptr, ptr %7, align 8, !tbaa !5
  %256 = load ptr, ptr %8, align 8, !tbaa !5
  %257 = load ptr, ptr %9, align 8, !tbaa !5
  call void @libxsmm_generator_spgemm_csr_kernel(ptr noundef nonnull %13, ptr noundef nonnull %2, ptr noundef %3, ptr noundef %255, ptr noundef %256, ptr noundef %257)
  br label %258

258:                                              ; preds = %135, %254, %139, %19
  call void @libxsmm_close_function(ptr noundef nonnull %13) #8
  %259 = load ptr, ptr %7, align 8, !tbaa !5
  %.not140 = icmp eq ptr %259, null
  br i1 %.not140, label %261, label %260

260:                                              ; preds = %258
  call void @free(ptr noundef nonnull %259) #8
  br label %261

261:                                              ; preds = %260, %258
  %262 = load ptr, ptr %8, align 8, !tbaa !5
  %.not141 = icmp eq ptr %262, null
  br i1 %.not141, label %264, label %263

263:                                              ; preds = %261
  call void @free(ptr noundef nonnull %262) #8
  br label %264

264:                                              ; preds = %263, %261
  %265 = load ptr, ptr %9, align 8, !tbaa !5
  %.not142 = icmp eq ptr %265, null
  br i1 %.not142, label %267, label %266

266:                                              ; preds = %264
  call void @free(ptr noundef nonnull %265) #8
  br label %267

267:                                              ; preds = %266, %264
  %268 = getelementptr inbounds i8, ptr %13, i64 24
  %269 = load i32, ptr %268, align 8, !tbaa !34
  %.not143 = icmp eq i32 %269, 0
  br i1 %.not143, label %275, label %270

270:                                              ; preds = %267
  call void @libxsmm_handle_error(ptr noundef nonnull %13, i32 noundef %269, ptr noundef nonnull @__func__.libxsmm_generator_spgemm, ptr noundef nonnull @.str, i32 noundef 337, i32 noundef 1) #8
  %271 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %272 = icmp ugt i32 %271, 1
  %273 = load i32, ptr @libxsmm_verbosity, align 4
  %274 = select i1 %272, i32 %273, i32 1
  call void @libxsmm_handle_error(ptr noundef nonnull %13, i32 noundef 90000, ptr noundef nonnull @__func__.libxsmm_generator_spgemm, ptr noundef nonnull @.str, i32 noundef 338, i32 noundef %274) #8
  br label %291

275:                                              ; preds = %267
  %276 = load ptr, ptr %13, align 8, !tbaa !36
  %.not144 = icmp eq ptr %276, null
  br i1 %.not144, label %289, label %277

277:                                              ; preds = %275
  %278 = call noalias ptr @fopen(ptr noundef %0, ptr noundef nonnull @.str.14)
  %.not145.not = icmp eq ptr %278, null
  br i1 %.not145.not, label %.thread147, label %285

.thread147:                                       ; preds = %277
  %279 = load ptr, ptr @stderr, align 8, !tbaa !5
  %280 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %279, ptr noundef nonnull @.str.15) #10
  %281 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %282 = icmp ugt i32 %281, 1
  %283 = load i32, ptr @libxsmm_verbosity, align 4
  %284 = select i1 %282, i32 %283, i32 1
  call void @libxsmm_handle_error(ptr noundef nonnull %13, i32 noundef 90000, ptr noundef nonnull @__func__.libxsmm_generator_spgemm, ptr noundef nonnull @.str, i32 noundef 350, i32 noundef %284) #8
  br label %291

285:                                              ; preds = %277
  %286 = load ptr, ptr %13, align 8, !tbaa !36
  %287 = call i32 @fputs(ptr noundef %286, ptr noundef nonnull %278)
  %288 = call i32 @fclose(ptr noundef nonnull %278)
  %.pre252 = load ptr, ptr %13, align 8, !tbaa !36
  br label %289

289:                                              ; preds = %285, %275
  %290 = phi ptr [ %.pre252, %285 ], [ null, %275 ]
  call void @free(ptr noundef %290) #8
  br label %291

291:                                              ; preds = %.thread147, %.thread146, %.thread, %289, %270
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %13) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #8
  ret void
}

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

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

declare void @libxsmm_mmfunction_signature(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare void @libxsmm_sparse_csc_reader(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

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

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

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

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

declare void @libxsmm_sparse_csr_reader(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

declare void @libxsmm_close_function(ptr noundef) local_unnamed_addr #1

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

; Function Attrs: nofree nounwind
declare noundef i32 @fputs(ptr nocapture noundef readonly, ptr nocapture noundef) local_unnamed_addr #2

; Function Attrs: nofree nounwind
declare noundef i32 @fclose(ptr nocapture noundef) local_unnamed_addr #2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #7

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "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 = { 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 #3 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { mustprogress nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { 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 #6 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #8 = { nounwind }
attributes #9 = { nounwind allocsize(0,1) }
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 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !10, i64 4}
!13 = !{!"libxsmm_gemm_descriptor", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !7, i64 28, !7, i64 29, !7, i64 32, !14, i64 33, !14, i64 41, !7, i64 49, !10, i64 50, !10, i64 54, !10, i64 58, !15, i64 62, !15, i64 64, !7, i64 66, !7, i64 67, !7, i64 68, !7, i64 69, !15, i64 70, !15, i64 72, !15, i64 74, !15, i64 76, !15, i64 78, !15, i64 80, !10, i64 82, !10, i64 86, !10, i64 90, !7, i64 94}
!14 = !{!"long long", !7, i64 0}
!15 = !{!"short", !7, i64 0}
!16 = !{!13, !10, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18}
!20 = !{!21, !21, i64 0}
!21 = !{!"double", !7, i64 0}
!22 = distinct !{!22, !18}
!23 = distinct !{!23, !18}
!24 = distinct !{!24, !18}
!25 = distinct !{!25, !18}
!26 = distinct !{!26, !18}
!27 = distinct !{!27, !18}
!28 = distinct !{!28, !18}
!29 = distinct !{!29, !18}
!30 = distinct !{!30, !18}
!31 = distinct !{!31, !18}
!32 = distinct !{!32, !18}
!33 = distinct !{!33, !18}
!34 = !{!35, !10, i64 24}
!35 = !{!"libxsmm_generated_code", !6, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28}
!36 = !{!35, !6, i64 0}


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