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

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

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

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

declare i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef) #1

declare i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_generator_gemm_init_micro_kernel_config_aarch64(ptr noundef, i32 noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @libxsmm_generator_gemm_aarch64_get_initial_m_blocking(ptr noundef %0, ptr noundef %1, i32 noundef %2) #2 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store i32 %2, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  store i32 0, ptr %7, align 4, !tbaa !9
  %8 = load i32, ptr %6, align 4, !tbaa !9
  %9 = icmp eq i32 %8, 2001
  br i1 %9, label %16, label %10

10:                                               ; preds = %3
  %11 = load i32, ptr %6, align 4, !tbaa !9
  %12 = icmp eq i32 %11, 2002
  br i1 %12, label %16, label %13

13:                                               ; preds = %10
  %14 = load i32, ptr %6, align 4, !tbaa !9
  %15 = icmp eq i32 %14, 2101
  br i1 %15, label %16, label %61

16:                                               ; preds = %13, %10, %3
  %17 = load ptr, ptr %5, align 8, !tbaa !5
  %18 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %17, i32 0, i32 8
  %19 = getelementptr inbounds [3 x i8], ptr %18, i64 0, i64 0
  %20 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %19)
  %21 = icmp eq i32 1, %20
  br i1 %21, label %22, label %61

22:                                               ; preds = %16
  %23 = load ptr, ptr %5, align 8, !tbaa !5
  %24 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %23, i32 0, i32 0
  %25 = load i32, ptr %24, align 1, !tbaa !11
  %26 = icmp uge i32 %25, 16
  br i1 %26, label %27, label %28

27:                                               ; preds = %22
  store i32 16, ptr %7, align 4, !tbaa !9
  br label %60

28:                                               ; preds = %22
  %29 = load ptr, ptr %5, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %29, i32 0, i32 0
  %31 = load i32, ptr %30, align 1, !tbaa !11
  store i32 %31, ptr %7, align 4, !tbaa !9
  %32 = load i32, ptr %7, align 4, !tbaa !9
  %33 = icmp eq i32 %32, 15
  br i1 %33, label %34, label %35

34:                                               ; preds = %28
  store i32 12, ptr %7, align 4, !tbaa !9
  br label %35

35:                                               ; preds = %34, %28
  %36 = load ptr, ptr %5, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %36, i32 0, i32 21
  %38 = load i8, ptr %37, align 1, !tbaa !15
  %39 = zext i8 %38 to i32
  %40 = icmp eq i32 %39, 1
  br i1 %40, label %41, label %59

41:                                               ; preds = %35
  %42 = load ptr, ptr %5, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %42, i32 0, i32 27
  %44 = load i16, ptr %43, align 1, !tbaa !16
  %45 = zext i16 %44 to i32
  %46 = icmp eq i32 %45, 5
  br i1 %46, label %47, label %59

47:                                               ; preds = %41
  %48 = load ptr, ptr %5, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %48, i32 0, i32 24
  %50 = load i16, ptr %49, align 1, !tbaa !17
  %51 = zext i16 %50 to i32
  %52 = and i32 %51, 1
  %53 = icmp sgt i32 %52, 0
  br i1 %53, label %54, label %59

54:                                               ; preds = %47
  %55 = load i32, ptr %7, align 4, !tbaa !9
  %56 = icmp ugt i32 %55, 8
  br i1 %56, label %57, label %58

57:                                               ; preds = %54
  store i32 8, ptr %7, align 4, !tbaa !9
  br label %58

58:                                               ; preds = %57, %54
  br label %59

59:                                               ; preds = %58, %47, %41, %35
  br label %60

60:                                               ; preds = %59, %27
  br label %260

61:                                               ; preds = %16, %13
  %62 = load i32, ptr %6, align 4, !tbaa !9
  %63 = icmp eq i32 %62, 2001
  br i1 %63, label %73, label %64

64:                                               ; preds = %61
  %65 = load i32, ptr %6, align 4, !tbaa !9
  %66 = icmp eq i32 %65, 2002
  br i1 %66, label %73, label %67

67:                                               ; preds = %64
  %68 = load i32, ptr %6, align 4, !tbaa !9
  %69 = icmp eq i32 %68, 2101
  br i1 %69, label %73, label %70

70:                                               ; preds = %67
  %71 = load i32, ptr %6, align 4, !tbaa !9
  %72 = icmp eq i32 %71, 2501
  br i1 %72, label %73, label %90

73:                                               ; preds = %70, %67, %64, %61
  %74 = load ptr, ptr %5, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %74, i32 0, i32 8
  %76 = getelementptr inbounds [3 x i8], ptr %75, i64 0, i64 0
  %77 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %76)
  %78 = icmp eq i32 0, %77
  br i1 %78, label %79, label %90

79:                                               ; preds = %73
  %80 = load ptr, ptr %5, align 8, !tbaa !5
  %81 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %80, i32 0, i32 0
  %82 = load i32, ptr %81, align 1, !tbaa !11
  %83 = icmp uge i32 %82, 8
  br i1 %83, label %84, label %85

84:                                               ; preds = %79
  store i32 8, ptr %7, align 4, !tbaa !9
  br label %89

85:                                               ; preds = %79
  %86 = load ptr, ptr %5, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %86, i32 0, i32 0
  %88 = load i32, ptr %87, align 1, !tbaa !11
  store i32 %88, ptr %7, align 4, !tbaa !9
  br label %89

89:                                               ; preds = %85, %84
  br label %259

90:                                               ; preds = %73, %70
  %91 = load i32, ptr %6, align 4, !tbaa !9
  %92 = icmp eq i32 %91, 2301
  br i1 %92, label %96, label %93

93:                                               ; preds = %90
  %94 = load i32, ptr %6, align 4, !tbaa !9
  %95 = icmp eq i32 %94, 2302
  br i1 %95, label %96, label %125

96:                                               ; preds = %93, %90
  %97 = load ptr, ptr %5, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %97, i32 0, i32 8
  %99 = getelementptr inbounds [3 x i8], ptr %98, i64 0, i64 0
  %100 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %99)
  %101 = icmp eq i32 1, %100
  br i1 %101, label %114, label %102

102:                                              ; preds = %96
  %103 = load ptr, ptr %5, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %103, i32 0, i32 8
  %105 = getelementptr inbounds [3 x i8], ptr %104, i64 0, i64 0
  %106 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %105)
  %107 = icmp eq i32 8, %106
  br i1 %107, label %114, label %108

108:                                              ; preds = %102
  %109 = load ptr, ptr %5, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %109, i32 0, i32 8
  %111 = getelementptr inbounds [3 x i8], ptr %110, i64 0, i64 0
  %112 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %111)
  %113 = icmp eq i32 2, %112
  br i1 %113, label %114, label %125

114:                                              ; preds = %108, %102, %96
  %115 = load ptr, ptr %5, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %115, i32 0, i32 0
  %117 = load i32, ptr %116, align 1, !tbaa !11
  %118 = icmp uge i32 %117, 32
  br i1 %118, label %119, label %120

119:                                              ; preds = %114
  store i32 32, ptr %7, align 4, !tbaa !9
  br label %124

120:                                              ; preds = %114
  %121 = load ptr, ptr %5, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %121, i32 0, i32 0
  %123 = load i32, ptr %122, align 1, !tbaa !11
  store i32 %123, ptr %7, align 4, !tbaa !9
  br label %124

124:                                              ; preds = %120, %119
  br label %258

125:                                              ; preds = %108, %93
  %126 = load i32, ptr %6, align 4, !tbaa !9
  %127 = icmp eq i32 %126, 2301
  br i1 %127, label %131, label %128

128:                                              ; preds = %125
  %129 = load i32, ptr %6, align 4, !tbaa !9
  %130 = icmp eq i32 %129, 2302
  br i1 %130, label %131, label %148

131:                                              ; preds = %128, %125
  %132 = load ptr, ptr %5, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %132, i32 0, i32 8
  %134 = getelementptr inbounds [3 x i8], ptr %133, i64 0, i64 0
  %135 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %134)
  %136 = icmp eq i32 0, %135
  br i1 %136, label %137, label %148

137:                                              ; preds = %131
  %138 = load ptr, ptr %5, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %138, i32 0, i32 0
  %140 = load i32, ptr %139, align 1, !tbaa !11
  %141 = icmp uge i32 %140, 16
  br i1 %141, label %142, label %143

142:                                              ; preds = %137
  store i32 16, ptr %7, align 4, !tbaa !9
  br label %147

143:                                              ; preds = %137
  %144 = load ptr, ptr %5, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %144, i32 0, i32 0
  %146 = load i32, ptr %145, align 1, !tbaa !11
  store i32 %146, ptr %7, align 4, !tbaa !9
  br label %147

147:                                              ; preds = %143, %142
  br label %257

148:                                              ; preds = %131, %128
  %149 = load i32, ptr %6, align 4, !tbaa !9
  %150 = icmp eq i32 %149, 2401
  br i1 %150, label %154, label %151

151:                                              ; preds = %148
  %152 = load i32, ptr %6, align 4, !tbaa !9
  %153 = icmp eq i32 %152, 2402
  br i1 %153, label %154, label %171

154:                                              ; preds = %151, %148
  %155 = load ptr, ptr %5, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %155, i32 0, i32 8
  %157 = getelementptr inbounds [3 x i8], ptr %156, i64 0, i64 0
  %158 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %157)
  %159 = icmp eq i32 1, %158
  br i1 %159, label %160, label %171

160:                                              ; preds = %154
  %161 = load ptr, ptr %5, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %161, i32 0, i32 0
  %163 = load i32, ptr %162, align 1, !tbaa !11
  %164 = icmp uge i32 %163, 64
  br i1 %164, label %165, label %166

165:                                              ; preds = %160
  store i32 64, ptr %7, align 4, !tbaa !9
  br label %170

166:                                              ; preds = %160
  %167 = load ptr, ptr %5, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %167, i32 0, i32 0
  %169 = load i32, ptr %168, align 1, !tbaa !11
  store i32 %169, ptr %7, align 4, !tbaa !9
  br label %170

170:                                              ; preds = %166, %165
  br label %256

171:                                              ; preds = %154, %151
  %172 = load i32, ptr %6, align 4, !tbaa !9
  %173 = icmp eq i32 %172, 2401
  br i1 %173, label %177, label %174

174:                                              ; preds = %171
  %175 = load i32, ptr %6, align 4, !tbaa !9
  %176 = icmp eq i32 %175, 2402
  br i1 %176, label %177, label %194

177:                                              ; preds = %174, %171
  %178 = load ptr, ptr %5, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %178, i32 0, i32 8
  %180 = getelementptr inbounds [3 x i8], ptr %179, i64 0, i64 0
  %181 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %180)
  %182 = icmp eq i32 0, %181
  br i1 %182, label %183, label %194

183:                                              ; preds = %177
  %184 = load ptr, ptr %5, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %184, i32 0, i32 0
  %186 = load i32, ptr %185, align 1, !tbaa !11
  %187 = icmp uge i32 %186, 32
  br i1 %187, label %188, label %189

188:                                              ; preds = %183
  store i32 32, ptr %7, align 4, !tbaa !9
  br label %193

189:                                              ; preds = %183
  %190 = load ptr, ptr %5, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %190, i32 0, i32 0
  %192 = load i32, ptr %191, align 1, !tbaa !11
  store i32 %192, ptr %7, align 4, !tbaa !9
  br label %193

193:                                              ; preds = %189, %188
  br label %255

194:                                              ; preds = %177, %174
  %195 = load i32, ptr %6, align 4, !tbaa !9
  %196 = icmp eq i32 %195, 2201
  br i1 %196, label %200, label %197

197:                                              ; preds = %194
  %198 = load i32, ptr %6, align 4, !tbaa !9
  %199 = icmp eq i32 %198, 2202
  br i1 %199, label %200, label %229

200:                                              ; preds = %197, %194
  %201 = load ptr, ptr %5, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %201, i32 0, i32 8
  %203 = getelementptr inbounds [3 x i8], ptr %202, i64 0, i64 0
  %204 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %203)
  %205 = icmp eq i32 1, %204
  br i1 %205, label %218, label %206

206:                                              ; preds = %200
  %207 = load ptr, ptr %5, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %207, i32 0, i32 8
  %209 = getelementptr inbounds [3 x i8], ptr %208, i64 0, i64 0
  %210 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %209)
  %211 = icmp eq i32 8, %210
  br i1 %211, label %218, label %212

212:                                              ; preds = %206
  %213 = load ptr, ptr %5, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %213, i32 0, i32 8
  %215 = getelementptr inbounds [3 x i8], ptr %214, i64 0, i64 0
  %216 = call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef %215)
  %217 = icmp eq i32 2, %216
  br i1 %217, label %218, label %229

218:                                              ; preds = %212, %206, %200
  %219 = load ptr, ptr %5, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %219, i32 0, i32 0
  %221 = load i32, ptr %220, align 1, !tbaa !11
  %222 = icmp uge i32 %221, 16
  br i1 %222, label %223, label %224

223:                                              ; preds = %218
  store i32 16, ptr %7, align 4, !tbaa !9
  br label %228

224:                                              ; preds = %218
  %225 = load ptr, ptr %5, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %225, i32 0, i32 0
  %227 = load i32, ptr %226, align 1, !tbaa !11
  store i32 %227, ptr %7, align 4, !tbaa !9
  br label %228

228:                                              ; preds = %224, %223
  br label %254

229:                                              ; preds = %212, %197
  %230 = load i32, ptr %6, align 4, !tbaa !9
  %231 = icmp eq i32 %230, 2201
  br i1 %231, label %235, label %232

232:                                              ; preds = %229
  %233 = load i32, ptr %6, align 4, !tbaa !9
  %234 = icmp eq i32 %233, 2202
  br i1 %234, label %235, label %252

235:                                              ; preds = %232, %229
  %236 = load ptr, ptr %5, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %236, i32 0, i32 8
  %238 = getelementptr inbounds [3 x i8], ptr %237, i64 0, i64 0
  %239 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %238)
  %240 = icmp eq i32 0, %239
  br i1 %240, label %241, label %252

241:                                              ; preds = %235
  %242 = load ptr, ptr %5, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %242, i32 0, i32 0
  %244 = load i32, ptr %243, align 1, !tbaa !11
  %245 = icmp uge i32 %244, 8
  br i1 %245, label %246, label %247

246:                                              ; preds = %241
  store i32 8, ptr %7, align 4, !tbaa !9
  br label %251

247:                                              ; preds = %241
  %248 = load ptr, ptr %5, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %248, i32 0, i32 0
  %250 = load i32, ptr %249, align 1, !tbaa !11
  store i32 %250, ptr %7, align 4, !tbaa !9
  br label %251

251:                                              ; preds = %247, %246
  br label %253

252:                                              ; preds = %235, %232
  br label %253

253:                                              ; preds = %252, %251
  br label %254

254:                                              ; preds = %253, %228
  br label %255

255:                                              ; preds = %254, %193
  br label %256

256:                                              ; preds = %255, %170
  br label %257

257:                                              ; preds = %256, %147
  br label %258

258:                                              ; preds = %257, %124
  br label %259

259:                                              ; preds = %258, %89
  br label %260

260:                                              ; preds = %259, %60
  %261 = load ptr, ptr %4, align 8, !tbaa !5
  %262 = load i32, ptr %6, align 4, !tbaa !9
  %263 = load ptr, ptr %5, align 8, !tbaa !5
  call void @libxsmm_generator_gemm_init_micro_kernel_config_aarch64(ptr noundef %261, i32 noundef %262, ptr noundef %263)
  %264 = load i32, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  ret i32 %264
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 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 #3 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"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 0}
!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, !7, i64 69}
!16 = !{!12, !14, i64 80}
!17 = !{!12, !14, i64 74}


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

declare i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef) local_unnamed_addr #0

declare i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 65) i32 @libxsmm_generator_gemm_aarch64_get_initial_m_blocking(ptr noundef %0, ptr noundef %1, i32 noundef %2) local_unnamed_addr #1 {
  switch i32 %2, label %32 [
    i32 2101, label %4
    i32 2002, label %4
    i32 2001, label %4
    i32 2501, label %26
  ]

4:                                                ; preds = %3, %3, %3
  %5 = getelementptr inbounds i8, ptr %1, i64 29
  %6 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %5) #3
  %7 = icmp eq i32 %6, 1
  br i1 %7, label %8, label %25

8:                                                ; preds = %4
  %9 = load i32, ptr %1, align 1, !tbaa !5
  %10 = icmp ugt i32 %9, 15
  br i1 %10, label %.critedge93, label %11

11:                                               ; preds = %8
  %12 = icmp eq i32 %9, 15
  %spec.store.select = select i1 %12, i32 12, i32 %9
  %13 = getelementptr inbounds i8, ptr %1, i64 69
  %14 = load i8, ptr %13, align 1, !tbaa !12
  %15 = icmp eq i8 %14, 1
  br i1 %15, label %16, label %.critedge93

16:                                               ; preds = %11
  %17 = getelementptr inbounds i8, ptr %1, i64 80
  %18 = load i16, ptr %17, align 1, !tbaa !13
  %19 = icmp eq i16 %18, 5
  br i1 %19, label %20, label %.critedge93

20:                                               ; preds = %16
  %21 = getelementptr inbounds i8, ptr %1, i64 74
  %22 = load i16, ptr %21, align 1, !tbaa !14
  %23 = and i16 %22, 1
  %.not = icmp eq i16 %23, 0
  br i1 %.not, label %.critedge93, label %24

24:                                               ; preds = %20
  %spec.store.select4 = tail call i32 @llvm.umin.i32(i32 %spec.store.select, i32 8)
  br label %.critedge93

25:                                               ; preds = %4
  switch i32 %2, label %.critedge93 [
    i32 2001, label %26
    i32 2101, label %26
    i32 2002, label %26
  ]

26:                                               ; preds = %25, %3, %25, %25
  %27 = getelementptr inbounds i8, ptr %1, i64 29
  %28 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %27) #3
  %29 = icmp eq i32 %28, 0
  br i1 %29, label %30, label %32

30:                                               ; preds = %26
  %31 = load i32, ptr %1, align 1, !tbaa !5
  %. = tail call i32 @llvm.umin.i32(i32 %31, i32 8)
  br label %.critedge93

32:                                               ; preds = %3, %26
  %33 = add i32 %2, -2301
  %or.cond12 = icmp ult i32 %33, 2
  br i1 %or.cond12, label %34, label %.critedge

34:                                               ; preds = %32
  %35 = getelementptr inbounds i8, ptr %1, i64 29
  %36 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %35) #3
  %37 = icmp eq i32 %36, 1
  br i1 %37, label %44, label %38

38:                                               ; preds = %34
  %39 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %35) #3
  %40 = icmp eq i32 %39, 8
  br i1 %40, label %44, label %41

41:                                               ; preds = %38
  %42 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %35) #3
  %43 = icmp eq i32 %42, 2
  br i1 %43, label %44, label %46

44:                                               ; preds = %41, %38, %34
  %45 = load i32, ptr %1, align 1, !tbaa !5
  %.85 = tail call i32 @llvm.umin.i32(i32 %45, i32 32)
  br label %.critedge93

46:                                               ; preds = %41
  %47 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %35) #3
  %48 = icmp eq i32 %47, 0
  br i1 %48, label %49, label %.critedge93

49:                                               ; preds = %46
  %50 = load i32, ptr %1, align 1, !tbaa !5
  %.86 = tail call i32 @llvm.umin.i32(i32 %50, i32 16)
  br label %.critedge93

.critedge:                                        ; preds = %32
  %51 = add i32 %2, -2401
  %or.cond16 = icmp ult i32 %51, 2
  br i1 %or.cond16, label %52, label %.critedge89

52:                                               ; preds = %.critedge
  %53 = getelementptr inbounds i8, ptr %1, i64 29
  %54 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %53) #3
  %55 = icmp eq i32 %54, 1
  br i1 %55, label %56, label %58

56:                                               ; preds = %52
  %57 = load i32, ptr %1, align 1, !tbaa !5
  %.87 = tail call i32 @llvm.umin.i32(i32 %57, i32 64)
  br label %.critedge93

58:                                               ; preds = %52
  %59 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %53) #3
  %60 = icmp eq i32 %59, 0
  br i1 %60, label %61, label %.critedge93

61:                                               ; preds = %58
  %62 = load i32, ptr %1, align 1, !tbaa !5
  %.90 = tail call i32 @llvm.umin.i32(i32 %62, i32 32)
  br label %.critedge93

.critedge89:                                      ; preds = %.critedge
  %63 = add i32 %2, -2201
  %or.cond20 = icmp ult i32 %63, 2
  br i1 %or.cond20, label %64, label %.critedge93

64:                                               ; preds = %.critedge89
  %65 = getelementptr inbounds i8, ptr %1, i64 29
  %66 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %65) #3
  %67 = icmp eq i32 %66, 1
  br i1 %67, label %74, label %68

68:                                               ; preds = %64
  %69 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %65) #3
  %70 = icmp eq i32 %69, 8
  br i1 %70, label %74, label %71

71:                                               ; preds = %68
  %72 = tail call i32 @LIBXSMM_GEMM_GETENUM_C_PREC(ptr noundef nonnull %65) #3
  %73 = icmp eq i32 %72, 2
  br i1 %73, label %74, label %76

74:                                               ; preds = %71, %68, %64
  %75 = load i32, ptr %1, align 1, !tbaa !5
  %.91 = tail call i32 @llvm.umin.i32(i32 %75, i32 16)
  br label %.critedge93

76:                                               ; preds = %71
  %77 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %65) #3
  %78 = icmp eq i32 %77, 0
  br i1 %78, label %79, label %.critedge93

79:                                               ; preds = %76
  %80 = load i32, ptr %1, align 1, !tbaa !5
  %.94 = tail call i32 @llvm.umin.i32(i32 %80, i32 8)
  br label %.critedge93

.critedge93:                                      ; preds = %46, %25, %58, %.critedge89, %79, %74, %61, %56, %49, %44, %30, %8, %76, %24, %20, %16, %11
  %.0 = phi i32 [ %spec.store.select4, %24 ], [ %spec.store.select, %20 ], [ %spec.store.select, %16 ], [ %spec.store.select, %11 ], [ 0, %76 ], [ 16, %8 ], [ %., %30 ], [ %.85, %44 ], [ %.86, %49 ], [ %.87, %56 ], [ %.90, %61 ], [ %.91, %74 ], [ %.94, %79 ], [ 0, %.critedge89 ], [ 0, %58 ], [ 0, %25 ], [ 0, %46 ]
  tail call void @libxsmm_generator_gemm_init_micro_kernel_config_aarch64(ptr noundef %0, i32 noundef %2, ptr noundef %1)
  ret i32 %.0
}

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!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, !8, i64 69}
!13 = !{!6, !11, i64 80}
!14 = !{!6, !11, i64 74}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,SROAPass,SimplifyCFGPass,TailCallElimPass