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

; 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_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 [25 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [64 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [65 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [33 x i8], align 1
@__func__.libxsmm_generator_spgemm_csr_asparse = external hidden unnamed_addr constant [37 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [84 x i8], align 1
@libxsmm_ninit = external global i32, align 4
@libxsmm_verbosity = external global i32, align 4
@.str.22 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [96 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_spgemm_csr_asparse(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr 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 ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca [512 x i8], align 16
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  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 ptr %5, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  store i32 0, ptr %16, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 512, ptr %17) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  store i32 511, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #5
  store i32 0, ptr %19, align 4, !tbaa !9
  %21 = load ptr, ptr %12, align 8, !tbaa !5
  %22 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %23 = load i32, ptr %18, align 4, !tbaa !9
  %24 = sext i32 %23 to i64
  %25 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %22, i64 noundef %24, ptr noundef @.str) #5
  store i32 %25, ptr %19, align 4, !tbaa !9
  %26 = load ptr, ptr %7, align 8, !tbaa !5
  %27 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %28 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %26, ptr noundef %27, i32 noundef %28)
  %29 = load ptr, ptr %8, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %29, i32 0, i32 6
  %31 = load i32, ptr %30, align 1, !tbaa !11
  %32 = and i32 4, %31
  %33 = icmp ne i32 0, %32
  br i1 %33, label %34, label %110

34:                                               ; preds = %6
  %35 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %36 = load i32, ptr %18, align 4, !tbaa !9
  %37 = sext i32 %36 to i64
  %38 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %35, i64 noundef %37, ptr noundef @.str.1) #5
  store i32 %38, ptr %19, align 4, !tbaa !9
  %39 = load ptr, ptr %7, align 8, !tbaa !5
  %40 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %41 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %39, ptr noundef %40, i32 noundef %41)
  %42 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %43 = load i32, ptr %18, align 4, !tbaa !9
  %44 = sext i32 %43 to i64
  %45 = load ptr, ptr %8, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %45, i32 0, i32 0
  %47 = load i32, ptr %46, align 1, !tbaa !15
  %48 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %42, i64 noundef %44, ptr noundef @.str.2, i32 noundef %47) #5
  store i32 %48, ptr %19, align 4, !tbaa !9
  %49 = load ptr, ptr %7, align 8, !tbaa !5
  %50 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %51 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %49, ptr noundef %50, i32 noundef %51)
  %52 = load ptr, ptr %8, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %52, i32 0, i32 0
  %54 = load i32, ptr %53, align 1, !tbaa !15
  %55 = icmp ugt i32 %54, 1
  br i1 %55, label %56, label %71

56:                                               ; preds = %34
  %57 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %58 = load i32, ptr %18, align 4, !tbaa !9
  %59 = sext i32 %58 to i64
  %60 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %57, i64 noundef %59, ptr noundef @.str.3) #5
  store i32 %60, ptr %19, align 4, !tbaa !9
  %61 = load ptr, ptr %7, align 8, !tbaa !5
  %62 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %63 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %61, ptr noundef %62, i32 noundef %63)
  %64 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %65 = load i32, ptr %18, align 4, !tbaa !9
  %66 = sext i32 %65 to i64
  %67 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %64, i64 noundef %66, ptr noundef @.str.4) #5
  store i32 %67, ptr %19, align 4, !tbaa !9
  %68 = load ptr, ptr %7, align 8, !tbaa !5
  %69 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %70 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %68, ptr noundef %69, i32 noundef %70)
  br label %71

71:                                               ; preds = %56, %34
  %72 = load ptr, ptr %8, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %72, i32 0, i32 8
  %74 = getelementptr inbounds [3 x i8], ptr %73, i64 0, i64 0
  %75 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %74)
  %76 = icmp eq i32 0, %75
  br i1 %76, label %77, label %88

77:                                               ; preds = %71
  %78 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %79 = load i32, ptr %18, align 4, !tbaa !9
  %80 = sext i32 %79 to i64
  %81 = load ptr, ptr %8, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %81, i32 0, i32 5
  %83 = load i32, ptr %82, align 1, !tbaa !16
  %84 = load ptr, ptr %8, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %84, i32 0, i32 5
  %86 = load i32, ptr %85, align 1, !tbaa !16
  %87 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %78, i64 noundef %80, ptr noundef @.str.5, i32 noundef %83, i32 noundef %86) #5
  store i32 %87, ptr %19, align 4, !tbaa !9
  br label %99

88:                                               ; preds = %71
  %89 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %90 = load i32, ptr %18, align 4, !tbaa !9
  %91 = sext i32 %90 to i64
  %92 = load ptr, ptr %8, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %92, i32 0, i32 5
  %94 = load i32, ptr %93, align 1, !tbaa !16
  %95 = load ptr, ptr %8, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %95, i32 0, i32 5
  %97 = load i32, ptr %96, align 1, !tbaa !16
  %98 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %89, i64 noundef %91, ptr noundef @.str.6, i32 noundef %94, i32 noundef %97) #5
  store i32 %98, ptr %19, align 4, !tbaa !9
  br label %99

99:                                               ; preds = %88, %77
  %100 = load ptr, ptr %7, align 8, !tbaa !5
  %101 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %102 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %100, ptr noundef %101, i32 noundef %102)
  %103 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %104 = load i32, ptr %18, align 4, !tbaa !9
  %105 = sext i32 %104 to i64
  %106 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %103, i64 noundef %105, ptr noundef @.str.7) #5
  store i32 %106, ptr %19, align 4, !tbaa !9
  %107 = load ptr, ptr %7, align 8, !tbaa !5
  %108 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %109 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %107, ptr noundef %108, i32 noundef %109)
  br label %110

110:                                              ; preds = %99, %6
  %111 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %112 = load i32, ptr %18, align 4, !tbaa !9
  %113 = sext i32 %112 to i64
  %114 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %111, i64 noundef %113, ptr noundef @.str.8) #5
  store i32 %114, ptr %19, align 4, !tbaa !9
  %115 = load ptr, ptr %7, align 8, !tbaa !5
  %116 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %117 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %115, ptr noundef %116, i32 noundef %117)
  %118 = load ptr, ptr %9, align 8, !tbaa !5
  %119 = call i32 @strcmp(ptr noundef %118, ptr noundef @.str.9) #6
  %120 = icmp eq i32 %119, 0
  br i1 %120, label %133, label %121

121:                                              ; preds = %110
  %122 = load ptr, ptr %9, align 8, !tbaa !5
  %123 = call i32 @strcmp(ptr noundef %122, ptr noundef @.str.10) #6
  %124 = icmp eq i32 %123, 0
  br i1 %124, label %133, label %125

125:                                              ; preds = %121
  %126 = load ptr, ptr %9, align 8, !tbaa !5
  %127 = call i32 @strcmp(ptr noundef %126, ptr noundef @.str.11) #6
  %128 = icmp eq i32 %127, 0
  br i1 %128, label %133, label %129

129:                                              ; preds = %125
  %130 = load ptr, ptr %9, align 8, !tbaa !5
  %131 = call i32 @strcmp(ptr noundef %130, ptr noundef @.str.12) #6
  %132 = icmp eq i32 %131, 0
  br i1 %132, label %133, label %176

133:                                              ; preds = %129, %125, %121, %110
  %134 = load ptr, ptr %8, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %134, i32 0, i32 1
  %136 = load i32, ptr %135, align 1, !tbaa !17
  %137 = icmp ugt i32 %136, 7
  br i1 %137, label %138, label %146

138:                                              ; preds = %133
  %139 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %140 = load i32, ptr %18, align 4, !tbaa !9
  %141 = sext i32 %140 to i64
  %142 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %139, i64 noundef %141, ptr noundef @.str.13) #5
  store i32 %142, ptr %19, align 4, !tbaa !9
  %143 = load ptr, ptr %7, align 8, !tbaa !5
  %144 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %145 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %143, ptr noundef %144, i32 noundef %145)
  br label %175

146:                                              ; preds = %133
  %147 = load ptr, ptr %8, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %147, i32 0, i32 1
  %149 = load i32, ptr %148, align 1, !tbaa !17
  %150 = icmp ugt i32 %149, 3
  br i1 %150, label %151, label %159

151:                                              ; preds = %146
  %152 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %153 = load i32, ptr %18, align 4, !tbaa !9
  %154 = sext i32 %153 to i64
  %155 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %152, i64 noundef %154, ptr noundef @.str.14) #5
  store i32 %155, ptr %19, align 4, !tbaa !9
  %156 = load ptr, ptr %7, align 8, !tbaa !5
  %157 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %158 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %156, ptr noundef %157, i32 noundef %158)
  br label %174

159:                                              ; preds = %146
  %160 = load ptr, ptr %8, align 8, !tbaa !5
  %161 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %160, i32 0, i32 1
  %162 = load i32, ptr %161, align 1, !tbaa !17
  %163 = icmp ugt i32 %162, 1
  br i1 %163, label %164, label %172

164:                                              ; preds = %159
  %165 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %166 = load i32, ptr %18, align 4, !tbaa !9
  %167 = sext i32 %166 to i64
  %168 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %165, i64 noundef %167, ptr noundef @.str.15) #5
  store i32 %168, ptr %19, align 4, !tbaa !9
  %169 = load ptr, ptr %7, align 8, !tbaa !5
  %170 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %171 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %169, ptr noundef %170, i32 noundef %171)
  br label %173

172:                                              ; preds = %159
  br label %173

173:                                              ; preds = %172, %164
  br label %174

174:                                              ; preds = %173, %151
  br label %175

175:                                              ; preds = %174, %138
  br label %216

176:                                              ; preds = %129
  %177 = load ptr, ptr %9, align 8, !tbaa !5
  %178 = call i32 @strcmp(ptr noundef %177, ptr noundef @.str.16) #6
  %179 = icmp eq i32 %178, 0
  br i1 %179, label %192, label %180

180:                                              ; preds = %176
  %181 = load ptr, ptr %9, align 8, !tbaa !5
  %182 = call i32 @strcmp(ptr noundef %181, ptr noundef @.str.17) #6
  %183 = icmp eq i32 %182, 0
  br i1 %183, label %192, label %184

184:                                              ; preds = %180
  %185 = load ptr, ptr %9, align 8, !tbaa !5
  %186 = call i32 @strcmp(ptr noundef %185, ptr noundef @.str.18) #6
  %187 = icmp eq i32 %186, 0
  br i1 %187, label %192, label %188

188:                                              ; preds = %184
  %189 = load ptr, ptr %9, align 8, !tbaa !5
  %190 = call i32 @strcmp(ptr noundef %189, ptr noundef @.str.19) #6
  %191 = icmp eq i32 %190, 0
  br i1 %191, label %192, label %206

192:                                              ; preds = %188, %184, %180, %176
  %193 = load ptr, ptr %8, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %193, i32 0, i32 1
  %195 = load i32, ptr %194, align 1, !tbaa !17
  %196 = icmp ugt i32 %195, 1
  br i1 %196, label %197, label %205

197:                                              ; preds = %192
  %198 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %199 = load i32, ptr %18, align 4, !tbaa !9
  %200 = sext i32 %199 to i64
  %201 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %198, i64 noundef %200, ptr noundef @.str.20) #5
  store i32 %201, ptr %19, align 4, !tbaa !9
  %202 = load ptr, ptr %7, align 8, !tbaa !5
  %203 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %204 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %202, ptr noundef %203, i32 noundef %204)
  br label %205

205:                                              ; preds = %197, %192
  br label %215

206:                                              ; preds = %188
  %207 = load ptr, ptr %7, align 8, !tbaa !5
  %208 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !9
  %209 = icmp ult i32 1, %208
  br i1 %209, label %210, label %212

210:                                              ; preds = %206
  %211 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !9
  br label %213

212:                                              ; preds = %206
  br label %213

213:                                              ; preds = %212, %210
  %214 = phi i32 [ %211, %210 ], [ 1, %212 ]
  call void @libxsmm_handle_error(ptr noundef %207, i32 noundef 90005, ptr noundef @__func__.libxsmm_generator_spgemm_csr_asparse, ptr noundef @.str.21, i32 noundef 86, i32 noundef %214)
  store i32 1, ptr %20, align 4
  br label %356

215:                                              ; preds = %205
  br label %216

216:                                              ; preds = %215, %175
  %217 = load ptr, ptr %8, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %217, i32 0, i32 1
  %219 = load i32, ptr %218, align 1, !tbaa !17
  %220 = icmp ugt i32 %219, 1
  br i1 %220, label %221, label %241

221:                                              ; preds = %216
  %222 = load ptr, ptr %8, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %222, i32 0, i32 6
  %224 = load i32, ptr %223, align 1, !tbaa !11
  %225 = and i32 8, %224
  %226 = icmp ne i32 %225, 0
  br i1 %226, label %227, label %241

227:                                              ; preds = %221
  %228 = load ptr, ptr %8, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %228, i32 0, i32 6
  %230 = load i32, ptr %229, align 1, !tbaa !11
  %231 = and i32 16, %230
  %232 = icmp ne i32 %231, 0
  br i1 %232, label %233, label %241

233:                                              ; preds = %227
  %234 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %235 = load i32, ptr %18, align 4, !tbaa !9
  %236 = sext i32 %235 to i64
  %237 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %234, i64 noundef %236, ptr noundef @.str.22) #5
  store i32 %237, ptr %19, align 4, !tbaa !9
  %238 = load ptr, ptr %7, align 8, !tbaa !5
  %239 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %240 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %238, ptr noundef %239, i32 noundef %240)
  br label %241

241:                                              ; preds = %233, %227, %221, %216
  %242 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %243 = load i32, ptr %18, align 4, !tbaa !9
  %244 = sext i32 %243 to i64
  %245 = load ptr, ptr %8, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %245, i32 0, i32 1
  %247 = load i32, ptr %246, align 1, !tbaa !17
  %248 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %242, i64 noundef %244, ptr noundef @.str.23, i32 noundef %247) #5
  store i32 %248, ptr %19, align 4, !tbaa !9
  %249 = load ptr, ptr %7, align 8, !tbaa !5
  %250 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %251 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %249, ptr noundef %250, i32 noundef %251)
  store i32 0, ptr %13, align 4, !tbaa !9
  br label %252

252:                                              ; preds = %333, %241
  %253 = load i32, ptr %13, align 4, !tbaa !9
  %254 = load ptr, ptr %8, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %254, i32 0, i32 0
  %256 = load i32, ptr %255, align 1, !tbaa !15
  %257 = icmp ult i32 %253, %256
  br i1 %257, label %258, label %336

258:                                              ; preds = %252
  %259 = load ptr, ptr %10, align 8, !tbaa !5
  %260 = load i32, ptr %13, align 4, !tbaa !9
  %261 = add i32 %260, 1
  %262 = zext i32 %261 to i64
  %263 = getelementptr inbounds i32, ptr %259, i64 %262
  %264 = load i32, ptr %263, align 4, !tbaa !9
  %265 = load ptr, ptr %10, align 8, !tbaa !5
  %266 = load i32, ptr %13, align 4, !tbaa !9
  %267 = zext i32 %266 to i64
  %268 = getelementptr inbounds i32, ptr %265, i64 %267
  %269 = load i32, ptr %268, align 4, !tbaa !9
  %270 = sub i32 %264, %269
  store i32 %270, ptr %15, align 4, !tbaa !9
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %271

271:                                              ; preds = %329, %258
  %272 = load i32, ptr %14, align 4, !tbaa !9
  %273 = load i32, ptr %15, align 4, !tbaa !9
  %274 = icmp ult i32 %272, %273
  br i1 %274, label %275, label %332

275:                                              ; preds = %271
  %276 = load ptr, ptr %11, align 8, !tbaa !5
  %277 = load ptr, ptr %10, align 8, !tbaa !5
  %278 = load i32, ptr %13, align 4, !tbaa !9
  %279 = zext i32 %278 to i64
  %280 = getelementptr inbounds i32, ptr %277, i64 %279
  %281 = load i32, ptr %280, align 4, !tbaa !9
  %282 = load i32, ptr %14, align 4, !tbaa !9
  %283 = add i32 %281, %282
  %284 = zext i32 %283 to i64
  %285 = getelementptr inbounds i32, ptr %276, i64 %284
  %286 = load i32, ptr %285, align 4, !tbaa !9
  %287 = load ptr, ptr %8, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %287, i32 0, i32 2
  %289 = load i32, ptr %288, align 1, !tbaa !18
  %290 = icmp ult i32 %286, %289
  br i1 %290, label %291, label %328

291:                                              ; preds = %275
  %292 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %293 = load i32, ptr %18, align 4, !tbaa !9
  %294 = sext i32 %293 to i64
  %295 = load i32, ptr %13, align 4, !tbaa !9
  %296 = load ptr, ptr %8, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %296, i32 0, i32 5
  %298 = load i32, ptr %297, align 1, !tbaa !16
  %299 = mul i32 %295, %298
  %300 = load ptr, ptr %10, align 8, !tbaa !5
  %301 = load i32, ptr %13, align 4, !tbaa !9
  %302 = zext i32 %301 to i64
  %303 = getelementptr inbounds i32, ptr %300, i64 %302
  %304 = load i32, ptr %303, align 4, !tbaa !9
  %305 = load i32, ptr %14, align 4, !tbaa !9
  %306 = add i32 %304, %305
  %307 = load ptr, ptr %11, align 8, !tbaa !5
  %308 = load ptr, ptr %10, align 8, !tbaa !5
  %309 = load i32, ptr %13, align 4, !tbaa !9
  %310 = zext i32 %309 to i64
  %311 = getelementptr inbounds i32, ptr %308, i64 %310
  %312 = load i32, ptr %311, align 4, !tbaa !9
  %313 = load i32, ptr %14, align 4, !tbaa !9
  %314 = add i32 %312, %313
  %315 = zext i32 %314 to i64
  %316 = getelementptr inbounds i32, ptr %307, i64 %315
  %317 = load i32, ptr %316, align 4, !tbaa !9
  %318 = load ptr, ptr %8, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %318, i32 0, i32 4
  %320 = load i32, ptr %319, align 1, !tbaa !19
  %321 = mul i32 %317, %320
  %322 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %292, i64 noundef %294, ptr noundef @.str.24, i32 noundef %299, i32 noundef %306, i32 noundef %321) #5
  store i32 %322, ptr %19, align 4, !tbaa !9
  %323 = load ptr, ptr %7, align 8, !tbaa !5
  %324 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %325 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %323, ptr noundef %324, i32 noundef %325)
  %326 = load i32, ptr %16, align 4, !tbaa !9
  %327 = add i32 %326, 2
  store i32 %327, ptr %16, align 4, !tbaa !9
  br label %328

328:                                              ; preds = %291, %275
  br label %329

329:                                              ; preds = %328
  %330 = load i32, ptr %14, align 4, !tbaa !9
  %331 = add i32 %330, 1
  store i32 %331, ptr %14, align 4, !tbaa !9
  br label %271, !llvm.loop !20

332:                                              ; preds = %271
  br label %333

333:                                              ; preds = %332
  %334 = load i32, ptr %13, align 4, !tbaa !9
  %335 = add i32 %334, 1
  store i32 %335, ptr %13, align 4, !tbaa !9
  br label %252, !llvm.loop !22

336:                                              ; preds = %252
  %337 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %338 = load i32, ptr %18, align 4, !tbaa !9
  %339 = sext i32 %338 to i64
  %340 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %337, i64 noundef %339, ptr noundef @.str.7) #5
  store i32 %340, ptr %19, align 4, !tbaa !9
  %341 = load ptr, ptr %7, align 8, !tbaa !5
  %342 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %343 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %341, ptr noundef %342, i32 noundef %343)
  %344 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %345 = load i32, ptr %18, align 4, !tbaa !9
  %346 = sext i32 %345 to i64
  %347 = load i32, ptr %16, align 4, !tbaa !9
  %348 = load ptr, ptr %8, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %348, i32 0, i32 0
  %350 = load i32, ptr %349, align 1, !tbaa !15
  %351 = mul i32 %347, %350
  %352 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %344, i64 noundef %346, ptr noundef @.str.25, i32 noundef %351) #5
  store i32 %352, ptr %19, align 4, !tbaa !9
  %353 = load ptr, ptr %7, align 8, !tbaa !5
  %354 = getelementptr inbounds [512 x i8], ptr %17, i64 0, i64 0
  %355 = load i32, ptr %19, align 4, !tbaa !9
  call void @libxsmm_append_code_as_string(ptr noundef %353, ptr noundef %354, i32 noundef %355)
  store i32 0, ptr %20, align 4
  br label %356

356:                                              ; preds = %336, %213
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 512, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  %357 = load i32, ptr %20, align 4
  switch i32 %357, label %359 [
    i32 0, label %358
    i32 1, label %358
  ]

358:                                              ; preds = %356, %356
  ret void

359:                                              ; preds = %356
  unreachable
}

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

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

declare void @libxsmm_append_code_as_string(ptr noundef, ptr noundef, i32 noundef) #3

declare i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef) #3

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

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

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind willreturn memory(read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nounwind }
attributes #6 = { nounwind willreturn memory(read) }

!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 = !{!12, !10, i64 24}
!12 = !{!"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, !13, i64 33, !13, i64 41, !7, i64 49, !10, i64 50, !10, i64 54, !10, i64 58, !14, i64 62, !14, i64 64, !7, i64 66, !7, i64 67, !7, i64 68, !7, i64 69, !14, i64 70, !14, i64 72, !14, i64 74, !14, i64 76, !14, i64 78, !14, i64 80, !10, i64 82, !10, i64 86, !10, i64 90, !7, i64 94}
!13 = !{!"long long", !7, i64 0}
!14 = !{!"short", !7, i64 0}
!15 = !{!12, !10, i64 0}
!16 = !{!12, !10, i64 20}
!17 = !{!12, !10, i64 4}
!18 = !{!12, !10, i64 8}
!19 = !{!12, !10, i64 16}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = distinct !{!22, !21}


; 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"

@.str = external hidden unnamed_addr constant [25 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [64 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [65 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [33 x i8], align 1
@__func__.libxsmm_generator_spgemm_csr_asparse = external hidden unnamed_addr constant [37 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [84 x i8], align 1
@libxsmm_ninit = external local_unnamed_addr global i32, align 4
@libxsmm_verbosity = external local_unnamed_addr global i32, align 4
@.str.22 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [96 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_spgemm_csr_asparse(ptr noundef %0, ptr noundef %1, ptr nocapture noundef readonly %2, ptr nocapture noundef readonly %3, ptr nocapture noundef readonly %4, ptr nocapture noundef readnone %5) local_unnamed_addr #0 {
  %7 = alloca [512 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 512, ptr nonnull %7) #5
  %8 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %8) #5
  %9 = getelementptr inbounds i8, ptr %1, i64 24
  %10 = load i32, ptr %9, align 1, !tbaa !5
  %11 = and i32 %10, 4
  %.not = icmp eq i32 %11, 0
  br i1 %.not, label %29, label %12

12:                                               ; preds = %6
  %13 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.1) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %13) #5
  %14 = load i32, ptr %1, align 1, !tbaa !12
  %15 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.2, i32 noundef %14) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %15) #5
  %16 = load i32, ptr %1, align 1, !tbaa !12
  %17 = icmp ugt i32 %16, 1
  br i1 %17, label %18, label %21

18:                                               ; preds = %12
  %19 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.3) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %19) #5
  %20 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.4) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %20) #5
  br label %21

21:                                               ; preds = %18, %12
  %22 = getelementptr inbounds i8, ptr %1, i64 29
  %23 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %22) #5
  %24 = icmp eq i32 %23, 0
  %25 = getelementptr inbounds i8, ptr %1, i64 20
  %26 = load i32, ptr %25, align 1, !tbaa !13
  %.str.5..str.6 = select i1 %24, ptr @.str.5, ptr @.str.6
  %27 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull %.str.5..str.6, i32 noundef %26, i32 noundef %26) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %27) #5
  %28 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.7) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %28) #5
  br label %29

29:                                               ; preds = %21, %6
  %30 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.8) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %30) #5
  %31 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.9) #6
  %32 = icmp eq i32 %31, 0
  br i1 %32, label %42, label %33

33:                                               ; preds = %29
  %34 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.10) #6
  %35 = icmp eq i32 %34, 0
  br i1 %35, label %42, label %36

36:                                               ; preds = %33
  %37 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.11) #6
  %38 = icmp eq i32 %37, 0
  br i1 %38, label %42, label %39

39:                                               ; preds = %36
  %40 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.12) #6
  %41 = icmp eq i32 %40, 0
  br i1 %41, label %42, label %50

42:                                               ; preds = %39, %36, %33, %29
  %43 = getelementptr inbounds i8, ptr %1, i64 4
  %44 = load i32, ptr %43, align 1, !tbaa !14
  %45 = icmp ugt i32 %44, 7
  br i1 %45, label %.sink.split, label %46

46:                                               ; preds = %42
  %47 = icmp ugt i32 %44, 3
  br i1 %47, label %.sink.split, label %48

48:                                               ; preds = %46
  %49 = icmp ugt i32 %44, 1
  br i1 %49, label %.sink.split, label %72

50:                                               ; preds = %39
  %51 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.16) #6
  %52 = icmp eq i32 %51, 0
  br i1 %52, label %62, label %53

53:                                               ; preds = %50
  %54 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.17) #6
  %55 = icmp eq i32 %54, 0
  br i1 %55, label %62, label %56

56:                                               ; preds = %53
  %57 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.18) #6
  %58 = icmp eq i32 %57, 0
  br i1 %58, label %62, label %59

59:                                               ; preds = %56
  %60 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %2, ptr noundef nonnull dereferenceable(1) @.str.19) #6
  %61 = icmp eq i32 %60, 0
  br i1 %61, label %62, label %66

62:                                               ; preds = %59, %56, %53, %50
  %63 = getelementptr inbounds i8, ptr %1, i64 4
  %64 = load i32, ptr %63, align 1, !tbaa !14
  %65 = icmp ugt i32 %64, 1
  br i1 %65, label %.sink.split, label %72

66:                                               ; preds = %59
  %67 = load i32, ptr @libxsmm_ninit, align 4, !tbaa !15
  %68 = icmp ugt i32 %67, 1
  %69 = load i32, ptr @libxsmm_verbosity, align 4
  %70 = select i1 %68, i32 %69, i32 1
  call void @libxsmm_handle_error(ptr noundef %0, i32 noundef 90005, ptr noundef nonnull @__func__.libxsmm_generator_spgemm_csr_asparse, ptr noundef nonnull @.str.21, i32 noundef 86, i32 noundef %70) #5
  br label %119

.sink.split:                                      ; preds = %62, %48, %46, %42
  %.str.20.sink = phi ptr [ @.str.13, %42 ], [ @.str.14, %46 ], [ @.str.15, %48 ], [ @.str.20, %62 ]
  %71 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull %.str.20.sink) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %71) #5
  br label %72

72:                                               ; preds = %.sink.split, %62, %48
  %73 = getelementptr inbounds i8, ptr %1, i64 4
  %74 = load i32, ptr %73, align 1, !tbaa !14
  %75 = icmp ugt i32 %74, 1
  br i1 %75, label %76, label %81

76:                                               ; preds = %72
  %77 = load i32, ptr %9, align 1, !tbaa !5
  %78 = and i32 %77, 24
  %or.cond.not = icmp eq i32 %78, 24
  br i1 %or.cond.not, label %79, label %81

79:                                               ; preds = %76
  %80 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.22) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %80) #5
  %.pre = load i32, ptr %73, align 1, !tbaa !14
  br label %81

81:                                               ; preds = %79, %76, %72
  %82 = phi i32 [ %.pre, %79 ], [ %74, %76 ], [ %74, %72 ]
  %83 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.23, i32 noundef %82) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %83) #5
  %84 = load i32, ptr %1, align 1, !tbaa !12
  %.not118 = icmp eq i32 %84, 0
  br i1 %.not118, label %._crit_edge, label %.lr.ph116

.lr.ph116:                                        ; preds = %81
  %85 = getelementptr inbounds i8, ptr %1, i64 8
  %86 = getelementptr inbounds i8, ptr %1, i64 20
  %87 = getelementptr inbounds i8, ptr %1, i64 16
  br label %91

.loopexit.loopexit:                               ; preds = %113
  %.pre121 = load i32, ptr %1, align 1, !tbaa !12
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit, %91
  %88 = phi i32 [ %92, %91 ], [ %.pre121, %.loopexit.loopexit ]
  %.1.lcssa = phi i32 [ %.0106114, %91 ], [ %.2, %.loopexit.loopexit ]
  %89 = zext i32 %88 to i64
  %90 = icmp ult i64 %indvars.iv.next, %89
  br i1 %90, label %91, label %._crit_edge, !llvm.loop !16

91:                                               ; preds = %.lr.ph116, %.loopexit
  %92 = phi i32 [ %84, %.lr.ph116 ], [ %88, %.loopexit ]
  %indvars.iv = phi i64 [ 0, %.lr.ph116 ], [ %indvars.iv.next, %.loopexit ]
  %.0106114 = phi i32 [ 0, %.lr.ph116 ], [ %.1.lcssa, %.loopexit ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %93 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv.next
  %94 = load i32, ptr %93, align 4, !tbaa !15
  %95 = getelementptr inbounds i32, ptr %3, i64 %indvars.iv
  %96 = load i32, ptr %95, align 4, !tbaa !15
  %97 = sub i32 %94, %96
  %.not119 = icmp eq i32 %94, %96
  br i1 %.not119, label %.loopexit, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %91
  %98 = trunc nuw i64 %indvars.iv to i32
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %113
  %.1113 = phi i32 [ %.2, %113 ], [ %.0106114, %.lr.ph.preheader ]
  %.0107112 = phi i32 [ %114, %113 ], [ 0, %.lr.ph.preheader ]
  %99 = load i32, ptr %95, align 4, !tbaa !15
  %100 = add i32 %99, %.0107112
  %101 = zext i32 %100 to i64
  %102 = getelementptr inbounds i32, ptr %4, i64 %101
  %103 = load i32, ptr %102, align 4, !tbaa !15
  %104 = load i32, ptr %85, align 1, !tbaa !18
  %105 = icmp ult i32 %103, %104
  br i1 %105, label %106, label %113

106:                                              ; preds = %.lr.ph
  %107 = load i32, ptr %86, align 1, !tbaa !13
  %108 = mul i32 %107, %98
  %109 = load i32, ptr %87, align 1, !tbaa !19
  %110 = mul i32 %109, %103
  %111 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.24, i32 noundef %108, i32 noundef %100, i32 noundef %110) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %111) #5
  %112 = add i32 %.1113, 2
  br label %113

113:                                              ; preds = %.lr.ph, %106
  %.2 = phi i32 [ %112, %106 ], [ %.1113, %.lr.ph ]
  %114 = add nuw i32 %.0107112, 1
  %exitcond.not = icmp eq i32 %114, %97
  br i1 %exitcond.not, label %.loopexit.loopexit, label %.lr.ph, !llvm.loop !20

._crit_edge:                                      ; preds = %.loopexit, %81
  %.0106.lcssa = phi i32 [ 0, %81 ], [ %.1.lcssa, %.loopexit ]
  %115 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.7) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %115) #5
  %116 = load i32, ptr %1, align 1, !tbaa !12
  %117 = mul i32 %116, %.0106.lcssa
  %118 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %7, i64 noundef 511, ptr noundef nonnull @.str.25, i32 noundef %117) #5
  call void @libxsmm_append_code_as_string(ptr noundef %0, ptr noundef nonnull %7, i32 noundef %118) #5
  br label %119

119:                                              ; preds = %._crit_edge, %66
  call void @llvm.lifetime.end.p0(i64 512, ptr nonnull %7) #5
  ret void
}

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

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

declare void @libxsmm_append_code_as_string(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #3

declare i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef) local_unnamed_addr #3

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #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 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress nofree nounwind willreturn memory(argmem: read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nounwind }
attributes #6 = { nounwind willreturn memory(read) }

!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, !7, i64 24}
!6 = !{!"libxsmm_gemm_descriptor", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !8, i64 28, !8, i64 29, !8, i64 32, !10, i64 33, !10, i64 41, !8, i64 49, !7, i64 50, !7, i64 54, !7, i64 58, !11, i64 62, !11, i64 64, !8, i64 66, !8, i64 67, !8, i64 68, !8, i64 69, !11, i64 70, !11, i64 72, !11, i64 74, !11, i64 76, !11, i64 78, !11, i64 80, !7, i64 82, !7, i64 86, !7, i64 90, !8, i64 94}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"long long", !8, i64 0}
!11 = !{!"short", !8, i64 0}
!12 = !{!6, !7, i64 0}
!13 = !{!6, !7, i64 20}
!14 = !{!6, !7, i64 4}
!15 = !{!7, !7, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = !{!6, !7, i64 8}
!19 = !{!6, !7, i64 16}
!20 = distinct !{!20, !17}


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