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

; 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_micro_kernel_config = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [4 x i32], [4 x i32], [4 x i32], [4 x i32], [4 x i32], [4 x i32], i32, [2 x %struct.libxsmm_blocking_info_t], %struct.libxsmm_tile_config, i32, i32, i32, i32, i32, i32, i32, i32, ptr, i32, i32, i32, i32, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.libxsmm_blocking_info_t = type { i32, [4 x i32], i32, i32 }
%struct.libxsmm_tile_config = type { i8, i16, i8, i16, i8, i16, i8, i16, i8, i16, i8, i16, i8, i16, i8, i16, i8 }
%struct.libxsmm_gp_reg_mapping_struct = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, 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 }>

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

declare i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_gemm_avx2_microkernel(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, i32 noundef %4, i32 noundef %5) #2 {
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  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 i32 %4, ptr %11, align 4, !tbaa !9
  store i32 %5, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  %19 = load i32, ptr %11, align 4, !tbaa !9
  %20 = load ptr, ptr %9, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %20, i32 0, i32 2
  %22 = load i32, ptr %21, align 8, !tbaa !11
  %23 = urem i32 %19, %22
  %24 = icmp eq i32 %23, 0
  br i1 %24, label %25, label %31

25:                                               ; preds = %6
  %26 = load i32, ptr %11, align 4, !tbaa !9
  %27 = load ptr, ptr %9, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %27, i32 0, i32 2
  %29 = load i32, ptr %28, align 8, !tbaa !11
  %30 = udiv i32 %26, %29
  br label %38

31:                                               ; preds = %6
  %32 = load i32, ptr %11, align 4, !tbaa !9
  %33 = load ptr, ptr %9, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %33, i32 0, i32 2
  %35 = load i32, ptr %34, align 8, !tbaa !11
  %36 = udiv i32 %32, %35
  %37 = add i32 %36, 1
  br label %38

38:                                               ; preds = %31, %25
  %39 = phi i32 [ %30, %25 ], [ %37, %31 ]
  store i32 %39, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  store i32 0, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  store i32 0, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #3
  %40 = load i32, ptr %12, align 4, !tbaa !9
  %41 = load i32, ptr %13, align 4, !tbaa !9
  %42 = mul i32 %40, %41
  %43 = sub i32 16, %42
  store i32 %43, ptr %16, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #3
  store i32 0, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  store i32 1, ptr %18, align 4, !tbaa !9
  %44 = load ptr, ptr %9, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %44, i32 0, i32 11
  %46 = load i32, ptr %45, align 4, !tbaa !15
  %47 = icmp ne i32 %46, 0
  br i1 %47, label %48, label %54

48:                                               ; preds = %38
  %49 = load ptr, ptr %7, align 8, !tbaa !5
  %50 = load ptr, ptr %9, align 8, !tbaa !5
  %51 = load ptr, ptr %8, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %51, i32 0, i32 22
  %53 = load i32, ptr %52, align 4, !tbaa !16
  call void @libxsmm_generator_gemm_getval_stack_var(ptr noundef %49, ptr noundef %50, i32 noundef 22, i32 noundef %53)
  br label %54

54:                                               ; preds = %48, %38
  %55 = load ptr, ptr %10, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %55, i32 0, i32 6
  %57 = load i32, ptr %56, align 1, !tbaa !18
  %58 = and i32 %57, 2048
  %59 = icmp eq i32 %58, 2048
  br i1 %59, label %60, label %66

60:                                               ; preds = %54
  %61 = load ptr, ptr %10, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %61, i32 0, i32 8
  %63 = getelementptr inbounds [3 x i8], ptr %62, i64 0, i64 0
  %64 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %63)
  %65 = call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %64)
  store i32 %65, ptr %18, align 4, !tbaa !9
  br label %66

66:                                               ; preds = %60, %54
  %67 = load i32, ptr %13, align 4, !tbaa !9
  %68 = icmp eq i32 %67, 1
  br i1 %68, label %69, label %303

69:                                               ; preds = %66
  %70 = load ptr, ptr %9, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %70, i32 0, i32 11
  %72 = load i32, ptr %71, align 4, !tbaa !15
  %73 = icmp ne i32 %72, 0
  br i1 %73, label %74, label %83

74:                                               ; preds = %69
  %75 = load ptr, ptr %7, align 8, !tbaa !5
  %76 = load ptr, ptr %9, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %76, i32 0, i32 0
  %78 = load i32, ptr %77, align 8, !tbaa !21
  %79 = load ptr, ptr %8, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %79, i32 0, i32 22
  %81 = load i32, ptr %80, align 4, !tbaa !16
  %82 = load i32, ptr %12, align 4, !tbaa !9
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %75, i32 noundef %78, i32 noundef 537138704, i32 noundef %81, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext 121, i32 noundef %82, i32 noundef 0, i32 noundef 0, i32 noundef 0)
  br label %83

83:                                               ; preds = %74, %69
  %84 = load ptr, ptr %7, align 8, !tbaa !5
  %85 = load ptr, ptr %9, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %85, i32 0, i32 6
  %87 = load i32, ptr %86, align 8, !tbaa !22
  %88 = load ptr, ptr %8, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %88, i32 0, i32 1
  %90 = load i32, ptr %89, align 4, !tbaa !23
  %91 = load ptr, ptr %9, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %91, i32 0, i32 21
  %93 = load i8, ptr %92, align 4, !tbaa !24
  %94 = load i32, ptr %12, align 4, !tbaa !9
  %95 = load ptr, ptr %9, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %95, i32 0, i32 11
  %97 = load i32, ptr %96, align 4, !tbaa !15
  %98 = load i32, ptr %12, align 4, !tbaa !9
  call void @libxsmm_x86_instruction_unified_vec_move(ptr noundef %84, i32 noundef %87, i32 noundef %90, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext %93, i32 noundef %94, i32 noundef %97, i32 noundef %98, i32 noundef 0)
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %99

99:                                               ; preds = %299, %83
  %100 = load i32, ptr %14, align 4, !tbaa !9
  %101 = load i32, ptr %12, align 4, !tbaa !9
  %102 = icmp ult i32 %100, %101
  br i1 %102, label %103, label %302

103:                                              ; preds = %99
  %104 = load i32, ptr %14, align 4, !tbaa !9
  %105 = icmp eq i32 %104, 0
  br i1 %105, label %106, label %126

106:                                              ; preds = %103
  %107 = load ptr, ptr %7, align 8, !tbaa !5
  %108 = load ptr, ptr %9, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %108, i32 0, i32 16
  %110 = load i32, ptr %109, align 8, !tbaa !25
  %111 = load ptr, ptr %8, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %111, i32 0, i32 1
  %113 = load i32, ptr %112, align 4, !tbaa !23
  %114 = load ptr, ptr %10, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %114, i32 0, i32 3
  %116 = load i32, ptr %115, align 1, !tbaa !26
  %117 = zext i32 %116 to i64
  %118 = load ptr, ptr %9, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %118, i32 0, i32 3
  %120 = load i32, ptr %119, align 4, !tbaa !27
  %121 = zext i32 %120 to i64
  %122 = mul nsw i64 %117, %121
  %123 = load i32, ptr %18, align 4, !tbaa !9
  %124 = zext i32 %123 to i64
  %125 = mul nsw i64 %122, %124
  call void @libxsmm_x86_instruction_alu_imm(ptr noundef %107, i32 noundef %110, i32 noundef %113, i64 noundef %125)
  br label %126

126:                                              ; preds = %106, %103
  %127 = load ptr, ptr %10, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %127, i32 0, i32 6
  %129 = load i32, ptr %128, align 1, !tbaa !18
  %130 = and i32 %129, 2
  %131 = icmp ugt i32 %130, 0
  br i1 %131, label %132, label %140

132:                                              ; preds = %126
  %133 = load i32, ptr %14, align 4, !tbaa !9
  %134 = load ptr, ptr %9, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %134, i32 0, i32 3
  %136 = load i32, ptr %135, align 4, !tbaa !27
  %137 = mul i32 %133, %136
  %138 = load i32, ptr %18, align 4, !tbaa !9
  %139 = mul i32 %137, %138
  store i32 %139, ptr %17, align 4, !tbaa !9
  br label %150

140:                                              ; preds = %126
  %141 = load ptr, ptr %10, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %141, i32 0, i32 4
  %143 = load i32, ptr %142, align 1, !tbaa !28
  %144 = load i32, ptr %14, align 4, !tbaa !9
  %145 = mul i32 %143, %144
  %146 = load ptr, ptr %9, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %146, i32 0, i32 3
  %148 = load i32, ptr %147, align 4, !tbaa !27
  %149 = mul i32 %145, %148
  store i32 %149, ptr %17, align 4, !tbaa !9
  br label %150

150:                                              ; preds = %140, %132
  %151 = load ptr, ptr %7, align 8, !tbaa !5
  %152 = load ptr, ptr %9, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %152, i32 0, i32 0
  %154 = load i32, ptr %153, align 8, !tbaa !21
  %155 = load ptr, ptr %9, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %155, i32 0, i32 7
  %157 = load i32, ptr %156, align 4, !tbaa !29
  %158 = load ptr, ptr %8, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %158, i32 0, i32 3
  %160 = load i32, ptr %159, align 4, !tbaa !30
  %161 = load i32, ptr %17, align 4, !tbaa !9
  %162 = load ptr, ptr %9, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %162, i32 0, i32 21
  %164 = load i8, ptr %163, align 4, !tbaa !24
  %165 = load i32, ptr %14, align 4, !tbaa !9
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %151, i32 noundef %154, i32 noundef %157, i32 noundef %160, i32 noundef 127, i32 noundef 0, i32 noundef %161, i8 noundef signext %164, i32 noundef %165, i32 noundef 0, i32 noundef 1, i32 noundef 0)
  %166 = load i32, ptr %14, align 4, !tbaa !9
  %167 = load i32, ptr %12, align 4, !tbaa !9
  %168 = sub i32 %167, 1
  %169 = icmp eq i32 %166, %168
  br i1 %169, label %170, label %200

170:                                              ; preds = %150
  %171 = load ptr, ptr %10, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %171, i32 0, i32 6
  %173 = load i32, ptr %172, align 1, !tbaa !18
  %174 = and i32 %173, 2
  %175 = icmp ugt i32 %174, 0
  br i1 %175, label %176, label %184

176:                                              ; preds = %170
  %177 = load ptr, ptr %10, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %177, i32 0, i32 4
  %179 = load i32, ptr %178, align 1, !tbaa !28
  %180 = load ptr, ptr %9, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %180, i32 0, i32 3
  %182 = load i32, ptr %181, align 4, !tbaa !27
  %183 = mul i32 %179, %182
  store i32 %183, ptr %17, align 4, !tbaa !9
  br label %190

184:                                              ; preds = %170
  %185 = load ptr, ptr %9, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %185, i32 0, i32 3
  %187 = load i32, ptr %186, align 4, !tbaa !27
  %188 = load i32, ptr %18, align 4, !tbaa !9
  %189 = mul i32 %187, %188
  store i32 %189, ptr %17, align 4, !tbaa !9
  br label %190

190:                                              ; preds = %184, %176
  %191 = load ptr, ptr %7, align 8, !tbaa !5
  %192 = load ptr, ptr %9, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %192, i32 0, i32 16
  %194 = load i32, ptr %193, align 8, !tbaa !25
  %195 = load ptr, ptr %8, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %195, i32 0, i32 3
  %197 = load i32, ptr %196, align 4, !tbaa !30
  %198 = load i32, ptr %17, align 4, !tbaa !9
  %199 = sext i32 %198 to i64
  call void @libxsmm_x86_instruction_alu_imm(ptr noundef %191, i32 noundef %194, i32 noundef %197, i64 noundef %199)
  br label %200

200:                                              ; preds = %190, %150
  %201 = load ptr, ptr %10, 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_AB_COMMON_PREC(ptr noundef %203)
  %205 = icmp eq i32 12, %204
  br i1 %205, label %206, label %285

206:                                              ; preds = %200
  %207 = load ptr, ptr %10, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %207, i32 0, i32 6
  %209 = load i32, ptr %208, align 1, !tbaa !18
  %210 = and i32 %209, 256
  %211 = icmp ugt i32 %210, 0
  br i1 %211, label %212, label %228

212:                                              ; preds = %206
  %213 = load ptr, ptr %10, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %213, i32 0, i32 6
  %215 = load i32, ptr %214, align 1, !tbaa !18
  %216 = and i32 %215, 512
  %217 = icmp eq i32 %216, 0
  br i1 %217, label %218, label %228

218:                                              ; preds = %212
  %219 = load ptr, ptr %7, align 8, !tbaa !5
  %220 = load ptr, ptr %9, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %220, i32 0, i32 21
  %222 = load i8, ptr %221, align 4, !tbaa !24
  %223 = load i32, ptr %14, align 4, !tbaa !9
  %224 = load i32, ptr %12, align 4, !tbaa !9
  %225 = load i32, ptr %16, align 4, !tbaa !9
  %226 = load i32, ptr %14, align 4, !tbaa !9
  %227 = add i32 %225, %226
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %219, i32 noundef 805643856, i8 noundef signext %222, i32 noundef %223, i32 noundef %224, i32 noundef %227)
  br label %284

228:                                              ; preds = %212, %206
  %229 = load ptr, ptr %10, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %229, i32 0, i32 6
  %231 = load i32, ptr %230, align 1, !tbaa !18
  %232 = and i32 %231, 256
  %233 = icmp eq i32 %232, 0
  br i1 %233, label %234, label %250

234:                                              ; preds = %228
  %235 = load ptr, ptr %10, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %235, i32 0, i32 6
  %237 = load i32, ptr %236, align 1, !tbaa !18
  %238 = and i32 %237, 512
  %239 = icmp ugt i32 %238, 0
  br i1 %239, label %240, label %250

240:                                              ; preds = %234
  %241 = load ptr, ptr %7, align 8, !tbaa !5
  %242 = load ptr, ptr %9, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %242, i32 0, i32 21
  %244 = load i8, ptr %243, align 4, !tbaa !24
  %245 = load i32, ptr %12, align 4, !tbaa !9
  %246 = load i32, ptr %14, align 4, !tbaa !9
  %247 = load i32, ptr %16, align 4, !tbaa !9
  %248 = load i32, ptr %14, align 4, !tbaa !9
  %249 = add i32 %247, %248
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %241, i32 noundef 805643856, i8 noundef signext %244, i32 noundef %245, i32 noundef %246, i32 noundef %249)
  br label %283

250:                                              ; preds = %234, %228
  %251 = load ptr, ptr %10, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %251, i32 0, i32 6
  %253 = load i32, ptr %252, align 1, !tbaa !18
  %254 = and i32 %253, 256
  %255 = icmp eq i32 %254, 0
  br i1 %255, label %256, label %272

256:                                              ; preds = %250
  %257 = load ptr, ptr %10, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %257, i32 0, i32 6
  %259 = load i32, ptr %258, align 1, !tbaa !18
  %260 = and i32 %259, 512
  %261 = icmp eq i32 %260, 0
  br i1 %261, label %262, label %272

262:                                              ; preds = %256
  %263 = load ptr, ptr %7, align 8, !tbaa !5
  %264 = load ptr, ptr %9, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %264, i32 0, i32 21
  %266 = load i8, ptr %265, align 4, !tbaa !24
  %267 = load i32, ptr %12, align 4, !tbaa !9
  %268 = load i32, ptr %14, align 4, !tbaa !9
  %269 = load i32, ptr %16, align 4, !tbaa !9
  %270 = load i32, ptr %14, align 4, !tbaa !9
  %271 = add i32 %269, %270
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %263, i32 noundef 1879515216, i8 noundef signext %266, i32 noundef %267, i32 noundef %268, i32 noundef %271)
  br label %282

272:                                              ; preds = %256, %250
  %273 = load ptr, ptr %7, align 8, !tbaa !5
  %274 = load ptr, ptr %9, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %274, i32 0, i32 21
  %276 = load i8, ptr %275, align 4, !tbaa !24
  %277 = load i32, ptr %12, align 4, !tbaa !9
  %278 = load i32, ptr %14, align 4, !tbaa !9
  %279 = load i32, ptr %16, align 4, !tbaa !9
  %280 = load i32, ptr %14, align 4, !tbaa !9
  %281 = add i32 %279, %280
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %273, i32 noundef 1879318608, i8 noundef signext %276, i32 noundef %277, i32 noundef %278, i32 noundef %281)
  br label %282

282:                                              ; preds = %272, %262
  br label %283

283:                                              ; preds = %282, %240
  br label %284

284:                                              ; preds = %283, %218
  br label %298

285:                                              ; preds = %200
  %286 = load ptr, ptr %7, align 8, !tbaa !5
  %287 = load ptr, ptr %9, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %287, i32 0, i32 14
  %289 = load i32, ptr %288, align 8, !tbaa !31
  %290 = load ptr, ptr %9, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %290, i32 0, i32 21
  %292 = load i8, ptr %291, align 4, !tbaa !24
  %293 = load i32, ptr %12, align 4, !tbaa !9
  %294 = load i32, ptr %14, align 4, !tbaa !9
  %295 = load i32, ptr %16, align 4, !tbaa !9
  %296 = load i32, ptr %14, align 4, !tbaa !9
  %297 = add i32 %295, %296
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %286, i32 noundef %289, i8 noundef signext %292, i32 noundef %293, i32 noundef %294, i32 noundef %297)
  br label %298

298:                                              ; preds = %285, %284
  br label %299

299:                                              ; preds = %298
  %300 = load i32, ptr %14, align 4, !tbaa !9
  %301 = add i32 %300, 1
  store i32 %301, ptr %14, align 4, !tbaa !9
  br label %99, !llvm.loop !32

302:                                              ; preds = %99
  br label %845

303:                                              ; preds = %66
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %304

304:                                              ; preds = %348, %303
  %305 = load i32, ptr %14, align 4, !tbaa !9
  %306 = load i32, ptr %12, align 4, !tbaa !9
  %307 = icmp ult i32 %305, %306
  br i1 %307, label %308, label %351

308:                                              ; preds = %304
  %309 = load ptr, ptr %10, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %309, i32 0, i32 6
  %311 = load i32, ptr %310, align 1, !tbaa !18
  %312 = and i32 %311, 2
  %313 = icmp ugt i32 %312, 0
  br i1 %313, label %314, label %322

314:                                              ; preds = %308
  %315 = load i32, ptr %14, align 4, !tbaa !9
  %316 = load ptr, ptr %9, align 8, !tbaa !5
  %317 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %316, i32 0, i32 3
  %318 = load i32, ptr %317, align 4, !tbaa !27
  %319 = mul i32 %315, %318
  %320 = load i32, ptr %18, align 4, !tbaa !9
  %321 = mul i32 %319, %320
  store i32 %321, ptr %17, align 4, !tbaa !9
  br label %332

322:                                              ; preds = %308
  %323 = load ptr, ptr %10, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %323, i32 0, i32 4
  %325 = load i32, ptr %324, align 1, !tbaa !28
  %326 = load i32, ptr %14, align 4, !tbaa !9
  %327 = mul i32 %325, %326
  %328 = load ptr, ptr %9, align 8, !tbaa !5
  %329 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %328, i32 0, i32 3
  %330 = load i32, ptr %329, align 4, !tbaa !27
  %331 = mul i32 %327, %330
  store i32 %331, ptr %17, align 4, !tbaa !9
  br label %332

332:                                              ; preds = %322, %314
  %333 = load ptr, ptr %7, align 8, !tbaa !5
  %334 = load ptr, ptr %9, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %334, i32 0, i32 0
  %336 = load i32, ptr %335, align 8, !tbaa !21
  %337 = load ptr, ptr %9, align 8, !tbaa !5
  %338 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %337, i32 0, i32 7
  %339 = load i32, ptr %338, align 4, !tbaa !29
  %340 = load ptr, ptr %8, align 8, !tbaa !5
  %341 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %340, i32 0, i32 3
  %342 = load i32, ptr %341, align 4, !tbaa !30
  %343 = load i32, ptr %17, align 4, !tbaa !9
  %344 = load ptr, ptr %9, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %344, i32 0, i32 21
  %346 = load i8, ptr %345, align 4, !tbaa !24
  %347 = load i32, ptr %14, align 4, !tbaa !9
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %333, i32 noundef %336, i32 noundef %339, i32 noundef %342, i32 noundef 127, i32 noundef 0, i32 noundef %343, i8 noundef signext %346, i32 noundef %347, i32 noundef 0, i32 noundef 1, i32 noundef 0)
  br label %348

348:                                              ; preds = %332
  %349 = load i32, ptr %14, align 4, !tbaa !9
  %350 = add i32 %349, 1
  store i32 %350, ptr %14, align 4, !tbaa !9
  br label %304, !llvm.loop !34

351:                                              ; preds = %304
  %352 = load ptr, ptr %10, align 8, !tbaa !5
  %353 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %352, i32 0, i32 6
  %354 = load i32, ptr %353, align 1, !tbaa !18
  %355 = and i32 %354, 2
  %356 = icmp ugt i32 %355, 0
  br i1 %356, label %357, label %365

357:                                              ; preds = %351
  %358 = load ptr, ptr %10, align 8, !tbaa !5
  %359 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %358, i32 0, i32 4
  %360 = load i32, ptr %359, align 1, !tbaa !28
  %361 = load ptr, ptr %9, align 8, !tbaa !5
  %362 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %361, i32 0, i32 3
  %363 = load i32, ptr %362, align 4, !tbaa !27
  %364 = mul i32 %360, %363
  store i32 %364, ptr %17, align 4, !tbaa !9
  br label %371

365:                                              ; preds = %351
  %366 = load ptr, ptr %9, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %366, i32 0, i32 3
  %368 = load i32, ptr %367, align 4, !tbaa !27
  %369 = load i32, ptr %18, align 4, !tbaa !9
  %370 = mul i32 %368, %369
  store i32 %370, ptr %17, align 4, !tbaa !9
  br label %371

371:                                              ; preds = %365, %357
  %372 = load ptr, ptr %7, align 8, !tbaa !5
  %373 = load ptr, ptr %9, align 8, !tbaa !5
  %374 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %373, i32 0, i32 16
  %375 = load i32, ptr %374, align 8, !tbaa !25
  %376 = load ptr, ptr %8, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %376, i32 0, i32 3
  %378 = load i32, ptr %377, align 4, !tbaa !30
  %379 = load i32, ptr %17, align 4, !tbaa !9
  %380 = sext i32 %379 to i64
  call void @libxsmm_x86_instruction_alu_imm(ptr noundef %372, i32 noundef %375, i32 noundef %378, i64 noundef %380)
  %381 = load i32, ptr %13, align 4, !tbaa !9
  %382 = icmp eq i32 %381, 4
  br i1 %382, label %383, label %601

383:                                              ; preds = %371
  store i32 0, ptr %15, align 4, !tbaa !9
  br label %384

384:                                              ; preds = %597, %383
  %385 = load i32, ptr %15, align 4, !tbaa !9
  %386 = load i32, ptr %13, align 4, !tbaa !9
  %387 = icmp ult i32 %385, %386
  br i1 %387, label %388, label %600

388:                                              ; preds = %384
  %389 = load i32, ptr %15, align 4, !tbaa !9
  %390 = load i32, ptr %13, align 4, !tbaa !9
  %391 = sub i32 %390, 1
  %392 = icmp eq i32 %389, %391
  br i1 %392, label %393, label %407

393:                                              ; preds = %388
  %394 = load ptr, ptr %9, align 8, !tbaa !5
  %395 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %394, i32 0, i32 11
  %396 = load i32, ptr %395, align 4, !tbaa !15
  %397 = icmp ne i32 %396, 0
  br i1 %397, label %398, label %407

398:                                              ; preds = %393
  %399 = load ptr, ptr %7, align 8, !tbaa !5
  %400 = load ptr, ptr %9, align 8, !tbaa !5
  %401 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %400, i32 0, i32 0
  %402 = load i32, ptr %401, align 8, !tbaa !21
  %403 = load ptr, ptr %8, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %403, i32 0, i32 22
  %405 = load i32, ptr %404, align 4, !tbaa !16
  %406 = load i32, ptr %12, align 4, !tbaa !9
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %399, i32 noundef %402, i32 noundef 537138704, i32 noundef %405, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext 121, i32 noundef %406, i32 noundef 0, i32 noundef 0, i32 noundef 0)
  br label %407

407:                                              ; preds = %398, %393, %388
  %408 = load ptr, ptr %7, align 8, !tbaa !5
  %409 = load ptr, ptr %9, align 8, !tbaa !5
  %410 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %409, i32 0, i32 6
  %411 = load i32, ptr %410, align 8, !tbaa !22
  %412 = load ptr, ptr %8, align 8, !tbaa !5
  %413 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %412, i32 0, i32 1
  %414 = load i32, ptr %413, align 4, !tbaa !23
  %415 = load ptr, ptr %9, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %415, i32 0, i32 3
  %417 = load i32, ptr %416, align 4, !tbaa !27
  %418 = load ptr, ptr %9, align 8, !tbaa !5
  %419 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %418, i32 0, i32 2
  %420 = load i32, ptr %419, align 8, !tbaa !11
  %421 = mul i32 %417, %420
  %422 = load i32, ptr %15, align 4, !tbaa !9
  %423 = mul i32 %421, %422
  %424 = load i32, ptr %18, align 4, !tbaa !9
  %425 = mul i32 %423, %424
  %426 = load ptr, ptr %9, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %426, i32 0, i32 21
  %428 = load i8, ptr %427, align 4, !tbaa !24
  %429 = load i32, ptr %12, align 4, !tbaa !9
  %430 = load i32, ptr %15, align 4, !tbaa !9
  %431 = load i32, ptr %13, align 4, !tbaa !9
  %432 = sub i32 %431, 1
  %433 = icmp eq i32 %430, %432
  br i1 %433, label %434, label %438

434:                                              ; preds = %407
  %435 = load ptr, ptr %9, align 8, !tbaa !5
  %436 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %435, i32 0, i32 11
  %437 = load i32, ptr %436, align 4, !tbaa !15
  br label %439

438:                                              ; preds = %407
  br label %439

439:                                              ; preds = %438, %434
  %440 = phi i32 [ %437, %434 ], [ 0, %438 ]
  %441 = load i32, ptr %12, align 4, !tbaa !9
  call void @libxsmm_x86_instruction_unified_vec_move(ptr noundef %408, i32 noundef %411, i32 noundef %414, i32 noundef 127, i32 noundef 0, i32 noundef %425, i8 noundef signext %428, i32 noundef %429, i32 noundef %440, i32 noundef %441, i32 noundef 0)
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %442

442:                                              ; preds = %593, %439
  %443 = load i32, ptr %14, align 4, !tbaa !9
  %444 = load i32, ptr %12, align 4, !tbaa !9
  %445 = icmp ult i32 %443, %444
  br i1 %445, label %446, label %596

446:                                              ; preds = %442
  %447 = load i32, ptr %15, align 4, !tbaa !9
  %448 = load i32, ptr %13, align 4, !tbaa !9
  %449 = sub i32 %448, 1
  %450 = icmp eq i32 %447, %449
  br i1 %450, label %451, label %474

451:                                              ; preds = %446
  %452 = load i32, ptr %14, align 4, !tbaa !9
  %453 = icmp eq i32 %452, 0
  br i1 %453, label %454, label %474

454:                                              ; preds = %451
  %455 = load ptr, ptr %7, align 8, !tbaa !5
  %456 = load ptr, ptr %9, align 8, !tbaa !5
  %457 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %456, i32 0, i32 16
  %458 = load i32, ptr %457, align 8, !tbaa !25
  %459 = load ptr, ptr %8, align 8, !tbaa !5
  %460 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %459, i32 0, i32 1
  %461 = load i32, ptr %460, align 4, !tbaa !23
  %462 = load ptr, ptr %10, align 8, !tbaa !5
  %463 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %462, i32 0, i32 3
  %464 = load i32, ptr %463, align 1, !tbaa !26
  %465 = zext i32 %464 to i64
  %466 = load ptr, ptr %9, align 8, !tbaa !5
  %467 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %466, i32 0, i32 3
  %468 = load i32, ptr %467, align 4, !tbaa !27
  %469 = zext i32 %468 to i64
  %470 = mul nsw i64 %465, %469
  %471 = load i32, ptr %18, align 4, !tbaa !9
  %472 = zext i32 %471 to i64
  %473 = mul nsw i64 %470, %472
  call void @libxsmm_x86_instruction_alu_imm(ptr noundef %455, i32 noundef %458, i32 noundef %461, i64 noundef %473)
  br label %474

474:                                              ; preds = %454, %451, %446
  %475 = load ptr, ptr %10, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %475, i32 0, i32 8
  %477 = getelementptr inbounds [3 x i8], ptr %476, i64 0, i64 0
  %478 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %477)
  %479 = icmp eq i32 12, %478
  br i1 %479, label %480, label %575

480:                                              ; preds = %474
  %481 = load ptr, ptr %10, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %481, i32 0, i32 6
  %483 = load i32, ptr %482, align 1, !tbaa !18
  %484 = and i32 %483, 256
  %485 = icmp ugt i32 %484, 0
  br i1 %485, label %486, label %506

486:                                              ; preds = %480
  %487 = load ptr, ptr %10, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %487, i32 0, i32 6
  %489 = load i32, ptr %488, align 1, !tbaa !18
  %490 = and i32 %489, 512
  %491 = icmp eq i32 %490, 0
  br i1 %491, label %492, label %506

492:                                              ; preds = %486
  %493 = load ptr, ptr %7, align 8, !tbaa !5
  %494 = load ptr, ptr %9, align 8, !tbaa !5
  %495 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %494, i32 0, i32 21
  %496 = load i8, ptr %495, align 4, !tbaa !24
  %497 = load i32, ptr %14, align 4, !tbaa !9
  %498 = load i32, ptr %12, align 4, !tbaa !9
  %499 = load i32, ptr %16, align 4, !tbaa !9
  %500 = load i32, ptr %15, align 4, !tbaa !9
  %501 = add i32 %499, %500
  %502 = load i32, ptr %13, align 4, !tbaa !9
  %503 = load i32, ptr %14, align 4, !tbaa !9
  %504 = mul i32 %502, %503
  %505 = add i32 %501, %504
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %493, i32 noundef 805643856, i8 noundef signext %496, i32 noundef %497, i32 noundef %498, i32 noundef %505)
  br label %574

506:                                              ; preds = %486, %480
  %507 = load ptr, ptr %10, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %507, i32 0, i32 6
  %509 = load i32, ptr %508, align 1, !tbaa !18
  %510 = and i32 %509, 256
  %511 = icmp eq i32 %510, 0
  br i1 %511, label %512, label %532

512:                                              ; preds = %506
  %513 = load ptr, ptr %10, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %513, i32 0, i32 6
  %515 = load i32, ptr %514, align 1, !tbaa !18
  %516 = and i32 %515, 512
  %517 = icmp ugt i32 %516, 0
  br i1 %517, label %518, label %532

518:                                              ; preds = %512
  %519 = load ptr, ptr %7, align 8, !tbaa !5
  %520 = load ptr, ptr %9, align 8, !tbaa !5
  %521 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %520, i32 0, i32 21
  %522 = load i8, ptr %521, align 4, !tbaa !24
  %523 = load i32, ptr %12, align 4, !tbaa !9
  %524 = load i32, ptr %14, align 4, !tbaa !9
  %525 = load i32, ptr %16, align 4, !tbaa !9
  %526 = load i32, ptr %15, align 4, !tbaa !9
  %527 = add i32 %525, %526
  %528 = load i32, ptr %13, align 4, !tbaa !9
  %529 = load i32, ptr %14, align 4, !tbaa !9
  %530 = mul i32 %528, %529
  %531 = add i32 %527, %530
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %519, i32 noundef 805643856, i8 noundef signext %522, i32 noundef %523, i32 noundef %524, i32 noundef %531)
  br label %573

532:                                              ; preds = %512, %506
  %533 = load ptr, ptr %10, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %533, i32 0, i32 6
  %535 = load i32, ptr %534, align 1, !tbaa !18
  %536 = and i32 %535, 256
  %537 = icmp eq i32 %536, 0
  br i1 %537, label %538, label %558

538:                                              ; preds = %532
  %539 = load ptr, ptr %10, align 8, !tbaa !5
  %540 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %539, i32 0, i32 6
  %541 = load i32, ptr %540, align 1, !tbaa !18
  %542 = and i32 %541, 512
  %543 = icmp eq i32 %542, 0
  br i1 %543, label %544, label %558

544:                                              ; preds = %538
  %545 = load ptr, ptr %7, align 8, !tbaa !5
  %546 = load ptr, ptr %9, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %546, i32 0, i32 21
  %548 = load i8, ptr %547, align 4, !tbaa !24
  %549 = load i32, ptr %12, align 4, !tbaa !9
  %550 = load i32, ptr %14, align 4, !tbaa !9
  %551 = load i32, ptr %16, align 4, !tbaa !9
  %552 = load i32, ptr %15, align 4, !tbaa !9
  %553 = add i32 %551, %552
  %554 = load i32, ptr %13, align 4, !tbaa !9
  %555 = load i32, ptr %14, align 4, !tbaa !9
  %556 = mul i32 %554, %555
  %557 = add i32 %553, %556
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %545, i32 noundef 1879515216, i8 noundef signext %548, i32 noundef %549, i32 noundef %550, i32 noundef %557)
  br label %572

558:                                              ; preds = %538, %532
  %559 = load ptr, ptr %7, align 8, !tbaa !5
  %560 = load ptr, ptr %9, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %560, i32 0, i32 21
  %562 = load i8, ptr %561, align 4, !tbaa !24
  %563 = load i32, ptr %12, align 4, !tbaa !9
  %564 = load i32, ptr %14, align 4, !tbaa !9
  %565 = load i32, ptr %16, align 4, !tbaa !9
  %566 = load i32, ptr %15, align 4, !tbaa !9
  %567 = add i32 %565, %566
  %568 = load i32, ptr %13, align 4, !tbaa !9
  %569 = load i32, ptr %14, align 4, !tbaa !9
  %570 = mul i32 %568, %569
  %571 = add i32 %567, %570
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %559, i32 noundef 1879318608, i8 noundef signext %562, i32 noundef %563, i32 noundef %564, i32 noundef %571)
  br label %572

572:                                              ; preds = %558, %544
  br label %573

573:                                              ; preds = %572, %518
  br label %574

574:                                              ; preds = %573, %492
  br label %592

575:                                              ; preds = %474
  %576 = load ptr, ptr %7, align 8, !tbaa !5
  %577 = load ptr, ptr %9, align 8, !tbaa !5
  %578 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %577, i32 0, i32 14
  %579 = load i32, ptr %578, align 8, !tbaa !31
  %580 = load ptr, ptr %9, align 8, !tbaa !5
  %581 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %580, i32 0, i32 21
  %582 = load i8, ptr %581, align 4, !tbaa !24
  %583 = load i32, ptr %12, align 4, !tbaa !9
  %584 = load i32, ptr %14, align 4, !tbaa !9
  %585 = load i32, ptr %16, align 4, !tbaa !9
  %586 = load i32, ptr %15, align 4, !tbaa !9
  %587 = add i32 %585, %586
  %588 = load i32, ptr %13, align 4, !tbaa !9
  %589 = load i32, ptr %14, align 4, !tbaa !9
  %590 = mul i32 %588, %589
  %591 = add i32 %587, %590
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %576, i32 noundef %579, i8 noundef signext %582, i32 noundef %583, i32 noundef %584, i32 noundef %591)
  br label %592

592:                                              ; preds = %575, %574
  br label %593

593:                                              ; preds = %592
  %594 = load i32, ptr %14, align 4, !tbaa !9
  %595 = add i32 %594, 1
  store i32 %595, ptr %14, align 4, !tbaa !9
  br label %442, !llvm.loop !35

596:                                              ; preds = %442
  br label %597

597:                                              ; preds = %596
  %598 = load i32, ptr %15, align 4, !tbaa !9
  %599 = add i32 %598, 1
  store i32 %599, ptr %15, align 4, !tbaa !9
  br label %384, !llvm.loop !36

600:                                              ; preds = %384
  br label %844

601:                                              ; preds = %371
  store i32 0, ptr %15, align 4, !tbaa !9
  br label %602

602:                                              ; preds = %666, %601
  %603 = load i32, ptr %15, align 4, !tbaa !9
  %604 = load i32, ptr %13, align 4, !tbaa !9
  %605 = icmp ult i32 %603, %604
  br i1 %605, label %606, label %669

606:                                              ; preds = %602
  %607 = load i32, ptr %15, align 4, !tbaa !9
  %608 = load i32, ptr %13, align 4, !tbaa !9
  %609 = sub i32 %608, 1
  %610 = icmp eq i32 %607, %609
  br i1 %610, label %611, label %627

611:                                              ; preds = %606
  %612 = load ptr, ptr %9, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %612, i32 0, i32 11
  %614 = load i32, ptr %613, align 4, !tbaa !15
  %615 = icmp ne i32 %614, 0
  br i1 %615, label %616, label %627

616:                                              ; preds = %611
  %617 = load ptr, ptr %7, align 8, !tbaa !5
  %618 = load ptr, ptr %9, align 8, !tbaa !5
  %619 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %618, i32 0, i32 0
  %620 = load i32, ptr %619, align 8, !tbaa !21
  %621 = load ptr, ptr %8, align 8, !tbaa !5
  %622 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %621, i32 0, i32 22
  %623 = load i32, ptr %622, align 4, !tbaa !16
  %624 = load i32, ptr %12, align 4, !tbaa !9
  %625 = load i32, ptr %15, align 4, !tbaa !9
  %626 = add i32 %624, %625
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %617, i32 noundef %620, i32 noundef 537138704, i32 noundef %623, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext 121, i32 noundef %626, i32 noundef 0, i32 noundef 0, i32 noundef 0)
  br label %627

627:                                              ; preds = %616, %611, %606
  %628 = load ptr, ptr %7, align 8, !tbaa !5
  %629 = load ptr, ptr %9, align 8, !tbaa !5
  %630 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %629, i32 0, i32 6
  %631 = load i32, ptr %630, align 8, !tbaa !22
  %632 = load ptr, ptr %8, align 8, !tbaa !5
  %633 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %632, i32 0, i32 1
  %634 = load i32, ptr %633, align 4, !tbaa !23
  %635 = load ptr, ptr %9, align 8, !tbaa !5
  %636 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %635, i32 0, i32 3
  %637 = load i32, ptr %636, align 4, !tbaa !27
  %638 = load ptr, ptr %9, align 8, !tbaa !5
  %639 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %638, i32 0, i32 2
  %640 = load i32, ptr %639, align 8, !tbaa !11
  %641 = mul i32 %637, %640
  %642 = load i32, ptr %15, align 4, !tbaa !9
  %643 = mul i32 %641, %642
  %644 = load i32, ptr %18, align 4, !tbaa !9
  %645 = mul i32 %643, %644
  %646 = load ptr, ptr %9, align 8, !tbaa !5
  %647 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %646, i32 0, i32 21
  %648 = load i8, ptr %647, align 4, !tbaa !24
  %649 = load i32, ptr %12, align 4, !tbaa !9
  %650 = load i32, ptr %15, align 4, !tbaa !9
  %651 = add i32 %649, %650
  %652 = load i32, ptr %15, align 4, !tbaa !9
  %653 = load i32, ptr %13, align 4, !tbaa !9
  %654 = sub i32 %653, 1
  %655 = icmp eq i32 %652, %654
  br i1 %655, label %656, label %660

656:                                              ; preds = %627
  %657 = load ptr, ptr %9, align 8, !tbaa !5
  %658 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %657, i32 0, i32 11
  %659 = load i32, ptr %658, align 4, !tbaa !15
  br label %661

660:                                              ; preds = %627
  br label %661

661:                                              ; preds = %660, %656
  %662 = phi i32 [ %659, %656 ], [ 0, %660 ]
  %663 = load i32, ptr %12, align 4, !tbaa !9
  %664 = load i32, ptr %15, align 4, !tbaa !9
  %665 = add i32 %663, %664
  call void @libxsmm_x86_instruction_unified_vec_move(ptr noundef %628, i32 noundef %631, i32 noundef %634, i32 noundef 127, i32 noundef 0, i32 noundef %645, i8 noundef signext %648, i32 noundef %651, i32 noundef %662, i32 noundef %665, i32 noundef 0)
  br label %666

666:                                              ; preds = %661
  %667 = load i32, ptr %15, align 4, !tbaa !9
  %668 = add i32 %667, 1
  store i32 %668, ptr %15, align 4, !tbaa !9
  br label %602, !llvm.loop !37

669:                                              ; preds = %602
  store i32 0, ptr %15, align 4, !tbaa !9
  br label %670

670:                                              ; preds = %840, %669
  %671 = load i32, ptr %15, align 4, !tbaa !9
  %672 = load i32, ptr %13, align 4, !tbaa !9
  %673 = icmp ult i32 %671, %672
  br i1 %673, label %674, label %843

674:                                              ; preds = %670
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %675

675:                                              ; preds = %836, %674
  %676 = load i32, ptr %14, align 4, !tbaa !9
  %677 = load i32, ptr %12, align 4, !tbaa !9
  %678 = icmp ult i32 %676, %677
  br i1 %678, label %679, label %839

679:                                              ; preds = %675
  %680 = load i32, ptr %15, align 4, !tbaa !9
  %681 = load i32, ptr %13, align 4, !tbaa !9
  %682 = sub i32 %681, 1
  %683 = icmp eq i32 %680, %682
  br i1 %683, label %684, label %707

684:                                              ; preds = %679
  %685 = load i32, ptr %14, align 4, !tbaa !9
  %686 = icmp eq i32 %685, 0
  br i1 %686, label %687, label %707

687:                                              ; preds = %684
  %688 = load ptr, ptr %7, align 8, !tbaa !5
  %689 = load ptr, ptr %9, align 8, !tbaa !5
  %690 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %689, i32 0, i32 16
  %691 = load i32, ptr %690, align 8, !tbaa !25
  %692 = load ptr, ptr %8, align 8, !tbaa !5
  %693 = getelementptr inbounds %struct.libxsmm_gp_reg_mapping_struct, ptr %692, i32 0, i32 1
  %694 = load i32, ptr %693, align 4, !tbaa !23
  %695 = load ptr, ptr %10, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %695, i32 0, i32 3
  %697 = load i32, ptr %696, align 1, !tbaa !26
  %698 = zext i32 %697 to i64
  %699 = load ptr, ptr %9, align 8, !tbaa !5
  %700 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %699, i32 0, i32 3
  %701 = load i32, ptr %700, align 4, !tbaa !27
  %702 = zext i32 %701 to i64
  %703 = mul nsw i64 %698, %702
  %704 = load i32, ptr %18, align 4, !tbaa !9
  %705 = zext i32 %704 to i64
  %706 = mul nsw i64 %703, %705
  call void @libxsmm_x86_instruction_alu_imm(ptr noundef %688, i32 noundef %691, i32 noundef %694, i64 noundef %706)
  br label %707

707:                                              ; preds = %687, %684, %679
  %708 = load ptr, ptr %10, align 8, !tbaa !5
  %709 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %708, i32 0, i32 8
  %710 = getelementptr inbounds [3 x i8], ptr %709, i64 0, i64 0
  %711 = call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef %710)
  %712 = icmp eq i32 12, %711
  br i1 %712, label %713, label %816

713:                                              ; preds = %707
  %714 = load ptr, ptr %10, align 8, !tbaa !5
  %715 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %714, i32 0, i32 6
  %716 = load i32, ptr %715, align 1, !tbaa !18
  %717 = and i32 %716, 256
  %718 = icmp ugt i32 %717, 0
  br i1 %718, label %719, label %741

719:                                              ; preds = %713
  %720 = load ptr, ptr %10, align 8, !tbaa !5
  %721 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %720, i32 0, i32 6
  %722 = load i32, ptr %721, align 1, !tbaa !18
  %723 = and i32 %722, 512
  %724 = icmp eq i32 %723, 0
  br i1 %724, label %725, label %741

725:                                              ; preds = %719
  %726 = load ptr, ptr %7, align 8, !tbaa !5
  %727 = load ptr, ptr %9, align 8, !tbaa !5
  %728 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %727, i32 0, i32 21
  %729 = load i8, ptr %728, align 4, !tbaa !24
  %730 = load i32, ptr %14, align 4, !tbaa !9
  %731 = load i32, ptr %12, align 4, !tbaa !9
  %732 = load i32, ptr %15, align 4, !tbaa !9
  %733 = add i32 %731, %732
  %734 = load i32, ptr %16, align 4, !tbaa !9
  %735 = load i32, ptr %15, align 4, !tbaa !9
  %736 = add i32 %734, %735
  %737 = load i32, ptr %13, align 4, !tbaa !9
  %738 = load i32, ptr %14, align 4, !tbaa !9
  %739 = mul i32 %737, %738
  %740 = add i32 %736, %739
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %726, i32 noundef 805643856, i8 noundef signext %729, i32 noundef %730, i32 noundef %733, i32 noundef %740)
  br label %815

741:                                              ; preds = %719, %713
  %742 = load ptr, ptr %10, align 8, !tbaa !5
  %743 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %742, i32 0, i32 6
  %744 = load i32, ptr %743, align 1, !tbaa !18
  %745 = and i32 %744, 256
  %746 = icmp eq i32 %745, 0
  br i1 %746, label %747, label %769

747:                                              ; preds = %741
  %748 = load ptr, ptr %10, align 8, !tbaa !5
  %749 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %748, i32 0, i32 6
  %750 = load i32, ptr %749, align 1, !tbaa !18
  %751 = and i32 %750, 512
  %752 = icmp ugt i32 %751, 0
  br i1 %752, label %753, label %769

753:                                              ; preds = %747
  %754 = load ptr, ptr %7, align 8, !tbaa !5
  %755 = load ptr, ptr %9, align 8, !tbaa !5
  %756 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %755, i32 0, i32 21
  %757 = load i8, ptr %756, align 4, !tbaa !24
  %758 = load i32, ptr %12, align 4, !tbaa !9
  %759 = load i32, ptr %15, align 4, !tbaa !9
  %760 = add i32 %758, %759
  %761 = load i32, ptr %14, align 4, !tbaa !9
  %762 = load i32, ptr %16, align 4, !tbaa !9
  %763 = load i32, ptr %15, align 4, !tbaa !9
  %764 = add i32 %762, %763
  %765 = load i32, ptr %13, align 4, !tbaa !9
  %766 = load i32, ptr %14, align 4, !tbaa !9
  %767 = mul i32 %765, %766
  %768 = add i32 %764, %767
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %754, i32 noundef 805643856, i8 noundef signext %757, i32 noundef %760, i32 noundef %761, i32 noundef %768)
  br label %814

769:                                              ; preds = %747, %741
  %770 = load ptr, ptr %10, align 8, !tbaa !5
  %771 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %770, i32 0, i32 6
  %772 = load i32, ptr %771, align 1, !tbaa !18
  %773 = and i32 %772, 256
  %774 = icmp eq i32 %773, 0
  br i1 %774, label %775, label %797

775:                                              ; preds = %769
  %776 = load ptr, ptr %10, align 8, !tbaa !5
  %777 = getelementptr inbounds %struct.libxsmm_gemm_descriptor, ptr %776, i32 0, i32 6
  %778 = load i32, ptr %777, align 1, !tbaa !18
  %779 = and i32 %778, 512
  %780 = icmp eq i32 %779, 0
  br i1 %780, label %781, label %797

781:                                              ; preds = %775
  %782 = load ptr, ptr %7, align 8, !tbaa !5
  %783 = load ptr, ptr %9, align 8, !tbaa !5
  %784 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %783, i32 0, i32 21
  %785 = load i8, ptr %784, align 4, !tbaa !24
  %786 = load i32, ptr %12, align 4, !tbaa !9
  %787 = load i32, ptr %15, align 4, !tbaa !9
  %788 = add i32 %786, %787
  %789 = load i32, ptr %14, align 4, !tbaa !9
  %790 = load i32, ptr %16, align 4, !tbaa !9
  %791 = load i32, ptr %15, align 4, !tbaa !9
  %792 = add i32 %790, %791
  %793 = load i32, ptr %13, align 4, !tbaa !9
  %794 = load i32, ptr %14, align 4, !tbaa !9
  %795 = mul i32 %793, %794
  %796 = add i32 %792, %795
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %782, i32 noundef 1879515216, i8 noundef signext %785, i32 noundef %788, i32 noundef %789, i32 noundef %796)
  br label %813

797:                                              ; preds = %775, %769
  %798 = load ptr, ptr %7, align 8, !tbaa !5
  %799 = load ptr, ptr %9, align 8, !tbaa !5
  %800 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %799, i32 0, i32 21
  %801 = load i8, ptr %800, align 4, !tbaa !24
  %802 = load i32, ptr %12, align 4, !tbaa !9
  %803 = load i32, ptr %15, align 4, !tbaa !9
  %804 = add i32 %802, %803
  %805 = load i32, ptr %14, align 4, !tbaa !9
  %806 = load i32, ptr %16, align 4, !tbaa !9
  %807 = load i32, ptr %15, align 4, !tbaa !9
  %808 = add i32 %806, %807
  %809 = load i32, ptr %13, align 4, !tbaa !9
  %810 = load i32, ptr %14, align 4, !tbaa !9
  %811 = mul i32 %809, %810
  %812 = add i32 %808, %811
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %798, i32 noundef 1879318608, i8 noundef signext %801, i32 noundef %804, i32 noundef %805, i32 noundef %812)
  br label %813

813:                                              ; preds = %797, %781
  br label %814

814:                                              ; preds = %813, %753
  br label %815

815:                                              ; preds = %814, %725
  br label %835

816:                                              ; preds = %707
  %817 = load ptr, ptr %7, align 8, !tbaa !5
  %818 = load ptr, ptr %9, align 8, !tbaa !5
  %819 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %818, i32 0, i32 14
  %820 = load i32, ptr %819, align 8, !tbaa !31
  %821 = load ptr, ptr %9, align 8, !tbaa !5
  %822 = getelementptr inbounds %struct.libxsmm_micro_kernel_config, ptr %821, i32 0, i32 21
  %823 = load i8, ptr %822, align 4, !tbaa !24
  %824 = load i32, ptr %12, align 4, !tbaa !9
  %825 = load i32, ptr %15, align 4, !tbaa !9
  %826 = add i32 %824, %825
  %827 = load i32, ptr %14, align 4, !tbaa !9
  %828 = load i32, ptr %16, align 4, !tbaa !9
  %829 = load i32, ptr %15, align 4, !tbaa !9
  %830 = add i32 %828, %829
  %831 = load i32, ptr %13, align 4, !tbaa !9
  %832 = load i32, ptr %14, align 4, !tbaa !9
  %833 = mul i32 %831, %832
  %834 = add i32 %830, %833
  call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %817, i32 noundef %820, i8 noundef signext %823, i32 noundef %826, i32 noundef %827, i32 noundef %834)
  br label %835

835:                                              ; preds = %816, %815
  br label %836

836:                                              ; preds = %835
  %837 = load i32, ptr %14, align 4, !tbaa !9
  %838 = add i32 %837, 1
  store i32 %838, ptr %14, align 4, !tbaa !9
  br label %675, !llvm.loop !38

839:                                              ; preds = %675
  br label %840

840:                                              ; preds = %839
  %841 = load i32, ptr %15, align 4, !tbaa !9
  %842 = add i32 %841, 1
  store i32 %842, ptr %15, align 4, !tbaa !9
  br label %670, !llvm.loop !39

843:                                              ; preds = %670
  br label %844

844:                                              ; preds = %843, %600
  br label %845

845:                                              ; preds = %844, %302
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  ret void
}

declare i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef) #1

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

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

declare void @libxsmm_x86_instruction_vec_move(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef signext, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #1

declare void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef, i32 noundef, i8 noundef signext, i32 noundef, i32 noundef, i32 noundef) #1

declare void @libxsmm_x86_instruction_unified_vec_move(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef signext, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #1

declare void @libxsmm_x86_instruction_alu_imm(ptr noundef, i32 noundef, i32 noundef, i64 noundef) #1

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 8}
!12 = !{!"libxsmm_micro_kernel_config", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !7, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !10, i64 104, !10, i64 108, !10, i64 112, !10, i64 116, !10, i64 120, !10, i64 124, !10, i64 128, !10, i64 132, !10, i64 136, !10, i64 140, !10, i64 144, !10, i64 148, !10, i64 152, !10, i64 156, !10, i64 160, !10, i64 164, !10, i64 168, !10, i64 172, !10, i64 176, !10, i64 180, !10, i64 184, !10, i64 188, !10, i64 192, !10, i64 196, !10, i64 200, !10, i64 204, !10, i64 208, !10, i64 212, !10, i64 216, !10, i64 220, !10, i64 224, !10, i64 228, !10, i64 232, !10, i64 236, !10, i64 240, !10, i64 244, !10, i64 248, !10, i64 252, !10, i64 256, !10, i64 260, !10, i64 264, !10, i64 268, !10, i64 272, !10, i64 276, !10, i64 280, !10, i64 284, !10, i64 288, !10, i64 292, !10, i64 296, !10, i64 300, !10, i64 304, !10, i64 308, !10, i64 312, !10, i64 316, !10, i64 320, !10, i64 324, !10, i64 328, !10, i64 332, !10, i64 336, !10, i64 340, !10, i64 344, !10, i64 348, !10, i64 352, !10, i64 356, !10, i64 360, !7, i64 364, !7, i64 380, !7, i64 396, !7, i64 412, !7, i64 428, !7, i64 444, !10, i64 460, !7, i64 464, !13, i64 520, !10, i64 556, !10, i64 560, !10, i64 564, !10, i64 568, !10, i64 572, !10, i64 576, !10, i64 580, !10, i64 584, !6, i64 592, !10, i64 600, !10, i64 604, !10, i64 608, !10, i64 612, !6, i64 616, !10, i64 624, !10, i64 628, !10, i64 632, !10, i64 636, !10, i64 640, !10, i64 644, !10, i64 648, !10, i64 652, !10, i64 656, !10, i64 660, !10, i64 664, !10, i64 668, !10, i64 672, !10, i64 676, !10, i64 680}
!13 = !{!"libxsmm_tile_config", !7, i64 0, !14, i64 2, !7, i64 4, !14, i64 6, !7, i64 8, !14, i64 10, !7, i64 12, !14, i64 14, !7, i64 16, !14, i64 18, !7, i64 20, !14, i64 22, !7, i64 24, !14, i64 26, !7, i64 28, !14, i64 30, !7, i64 32}
!14 = !{!"short", !7, i64 0}
!15 = !{!12, !10, i64 44}
!16 = !{!17, !10, i64 88}
!17 = !{!"libxsmm_gp_reg_mapping_struct", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !10, i64 104, !10, i64 108, !10, i64 112, !10, i64 116, !10, i64 120, !10, i64 124, !10, i64 128}
!18 = !{!19, !10, i64 24}
!19 = !{!"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, !20, i64 33, !20, 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}
!20 = !{!"long long", !7, i64 0}
!21 = !{!12, !10, i64 0}
!22 = !{!12, !10, i64 24}
!23 = !{!17, !10, i64 4}
!24 = !{!12, !7, i64 84}
!25 = !{!12, !10, i64 64}
!26 = !{!19, !10, i64 12}
!27 = !{!12, !10, i64 12}
!28 = !{!19, !10, i64 16}
!29 = !{!12, !10, i64 28}
!30 = !{!17, !10, i64 12}
!31 = !{!12, !10, i64 56}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}
!35 = distinct !{!35, !33}
!36 = distinct !{!36, !33}
!37 = distinct !{!37, !33}
!38 = distinct !{!38, !33}
!39 = distinct !{!39, !33}


; 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

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_gemm_avx2_microkernel(ptr noundef %0, ptr nocapture noundef readonly %1, ptr noundef %2, ptr noundef %3, i32 noundef %4, i32 noundef %5) local_unnamed_addr #1 {
  %7 = getelementptr inbounds i8, ptr %2, i64 8
  %8 = load i32, ptr %7, align 8, !tbaa !5
  %9 = urem i32 %4, %8
  %10 = icmp ne i32 %9, 0
  %11 = udiv i32 %4, %8
  %12 = zext i1 %10 to i32
  %13 = add i32 %11, %12
  %14 = mul i32 %13, %5
  %15 = sub i32 16, %14
  %16 = getelementptr inbounds i8, ptr %2, i64 44
  %17 = load i32, ptr %16, align 4, !tbaa !13
  %.not = icmp eq i32 %17, 0
  br i1 %.not, label %21, label %18

18:                                               ; preds = %6
  %19 = getelementptr inbounds i8, ptr %1, i64 88
  %20 = load i32, ptr %19, align 4, !tbaa !14
  tail call void @libxsmm_generator_gemm_getval_stack_var(ptr noundef %0, ptr noundef nonnull %2, i32 noundef 22, i32 noundef %20) #2
  br label %21

21:                                               ; preds = %18, %6
  %22 = getelementptr inbounds i8, ptr %3, i64 24
  %23 = load i32, ptr %22, align 1, !tbaa !16
  %24 = and i32 %23, 2048
  %.not317 = icmp eq i32 %24, 0
  br i1 %.not317, label %29, label %25

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %3, i64 29
  %27 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %26) #2
  %28 = tail call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %27) #2
  br label %29

29:                                               ; preds = %25, %21
  %.0 = phi i32 [ %28, %25 ], [ 1, %21 ]
  %30 = icmp eq i32 %13, 1
  br i1 %30, label %36, label %.preheader351

.preheader351:                                    ; preds = %29
  %.not367 = icmp eq i32 %5, 0
  br i1 %.not367, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader351
  %31 = getelementptr inbounds i8, ptr %2, i64 12
  %32 = getelementptr inbounds i8, ptr %3, i64 16
  %33 = getelementptr inbounds i8, ptr %2, i64 28
  %34 = getelementptr inbounds i8, ptr %1, i64 12
  %35 = getelementptr inbounds i8, ptr %2, i64 84
  br label %147

36:                                               ; preds = %29
  %37 = load i32, ptr %16, align 4, !tbaa !13
  %.not326 = icmp eq i32 %37, 0
  br i1 %.not326, label %42, label %38

38:                                               ; preds = %36
  %39 = load i32, ptr %2, align 8, !tbaa !19
  %40 = getelementptr inbounds i8, ptr %1, i64 88
  %41 = load i32, ptr %40, align 4, !tbaa !14
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef %0, i32 noundef %39, i32 noundef 537138704, i32 noundef %41, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext 121, i32 noundef %5, i32 noundef 0, i32 noundef 0, i32 noundef 0) #2
  %.pre = load i32, ptr %16, align 4, !tbaa !13
  br label %42

42:                                               ; preds = %38, %36
  %43 = phi i32 [ %.pre, %38 ], [ 0, %36 ]
  %44 = getelementptr inbounds i8, ptr %2, i64 24
  %45 = load i32, ptr %44, align 8, !tbaa !20
  %46 = getelementptr inbounds i8, ptr %1, i64 4
  %47 = load i32, ptr %46, align 4, !tbaa !21
  %48 = getelementptr inbounds i8, ptr %2, i64 84
  %49 = load i8, ptr %48, align 4, !tbaa !22
  tail call void @libxsmm_x86_instruction_unified_vec_move(ptr noundef %0, i32 noundef %45, i32 noundef %47, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext %49, i32 noundef %5, i32 noundef %43, i32 noundef %5, i32 noundef 0) #2
  %.not372 = icmp eq i32 %5, 0
  br i1 %.not372, label %.loopexit, label %50

50:                                               ; preds = %42
  %51 = getelementptr inbounds i8, ptr %2, i64 64
  %52 = getelementptr inbounds i8, ptr %2, i64 12
  %53 = getelementptr inbounds i8, ptr %3, i64 16
  %54 = getelementptr inbounds i8, ptr %2, i64 28
  %55 = getelementptr inbounds i8, ptr %1, i64 12
  %56 = add i32 %5, -1
  %57 = getelementptr inbounds i8, ptr %3, i64 29
  %58 = getelementptr inbounds i8, ptr %2, i64 56
  %59 = zext i32 %.0 to i64
  %60 = getelementptr inbounds i8, ptr %3, i64 12
  %61 = load i32, ptr %51, align 8, !tbaa !23
  %62 = load i32, ptr %46, align 4, !tbaa !21
  %63 = load i32, ptr %60, align 1, !tbaa !24
  %64 = zext i32 %63 to i64
  %65 = load i32, ptr %52, align 4, !tbaa !25
  %66 = zext i32 %65 to i64
  %67 = mul nuw i64 %64, %59
  %68 = mul i64 %67, %66
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef %0, i32 noundef %61, i32 noundef %62, i64 noundef %68) #2
  %69 = load i32, ptr %2, align 8, !tbaa !19
  %70 = load i32, ptr %54, align 4, !tbaa !26
  %71 = load i32, ptr %55, align 4, !tbaa !27
  %72 = load i8, ptr %48, align 4, !tbaa !22
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef %0, i32 noundef %69, i32 noundef %70, i32 noundef %71, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext %72, i32 noundef 0, i32 noundef 0, i32 noundef 1, i32 noundef 0) #2
  %73 = icmp eq i32 %56, 0
  br i1 %73, label %74, label %85

74:                                               ; preds = %50
  %75 = load i32, ptr %22, align 1, !tbaa !16
  %76 = and i32 %75, 2
  %.not328.peel = icmp eq i32 %76, 0
  br i1 %.not328.peel, label %79, label %77

77:                                               ; preds = %74
  %78 = load i32, ptr %53, align 1, !tbaa !28
  br label %79

79:                                               ; preds = %74, %77
  %.0.sink = phi i32 [ %78, %77 ], [ %.0, %74 ]
  %80 = load i32, ptr %52, align 4, !tbaa !25
  %81 = mul i32 %80, %.0.sink
  %82 = load i32, ptr %51, align 8, !tbaa !23
  %83 = load i32, ptr %55, align 4, !tbaa !27
  %84 = sext i32 %81 to i64
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef %0, i32 noundef %82, i32 noundef %83, i64 noundef %84) #2
  br label %85

85:                                               ; preds = %79, %50
  %86 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %57) #2
  %87 = icmp eq i32 %86, 12
  br i1 %87, label %91, label %88

88:                                               ; preds = %85
  %89 = load i32, ptr %58, align 8, !tbaa !29
  %90 = load i8, ptr %48, align 4, !tbaa !22
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef %89, i8 noundef signext %90, i32 noundef %5, i32 noundef 0, i32 noundef %15) #2
  br label %100

91:                                               ; preds = %85
  %92 = load i32, ptr %22, align 1, !tbaa !16
  %93 = lshr i32 %92, 8
  %94 = and i32 %93, 3
  %95 = load i8, ptr %48, align 4, !tbaa !22
  switch i32 %94, label %.unreachabledefault [
    i32 1, label %99
    i32 2, label %98
    i32 0, label %97
    i32 3, label %96
  ]

.unreachabledefault:                              ; preds = %91
  unreachable

96:                                               ; preds = %91
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879318608, i8 noundef signext %95, i32 noundef %5, i32 noundef 0, i32 noundef %15) #2
  br label %100

97:                                               ; preds = %91
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879515216, i8 noundef signext %95, i32 noundef %5, i32 noundef 0, i32 noundef %15) #2
  br label %100

98:                                               ; preds = %91
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %95, i32 noundef %5, i32 noundef 0, i32 noundef %15) #2
  br label %100

99:                                               ; preds = %91
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %95, i32 noundef 0, i32 noundef %5, i32 noundef %15) #2
  br label %100

100:                                              ; preds = %99, %98, %97, %96, %88
  %exitcond385.peel.not = icmp eq i32 %5, 1
  br i1 %exitcond385.peel.not, label %.loopexit, label %.peel.next387

.peel.next387:                                    ; preds = %100, %145
  %.0307364 = phi i32 [ %146, %145 ], [ 1, %100 ]
  %.pre390 = load i32, ptr %22, align 1, !tbaa !16
  %101 = and i32 %.pre390, 2
  %.not327 = icmp eq i32 %101, 0
  br i1 %.not327, label %106, label %102

102:                                              ; preds = %.peel.next387
  %103 = load i32, ptr %52, align 4, !tbaa !25
  %104 = mul i32 %.0307364, %.0
  %105 = mul i32 %104, %103
  br label %111

106:                                              ; preds = %.peel.next387
  %107 = load i32, ptr %53, align 1, !tbaa !28
  %108 = mul i32 %107, %.0307364
  %109 = load i32, ptr %52, align 4, !tbaa !25
  %110 = mul i32 %108, %109
  br label %111

111:                                              ; preds = %106, %102
  %.0306 = phi i32 [ %105, %102 ], [ %110, %106 ]
  %112 = load i32, ptr %2, align 8, !tbaa !19
  %113 = load i32, ptr %54, align 4, !tbaa !26
  %114 = load i32, ptr %55, align 4, !tbaa !27
  %115 = load i8, ptr %48, align 4, !tbaa !22
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef %0, i32 noundef %112, i32 noundef %113, i32 noundef %114, i32 noundef 127, i32 noundef 0, i32 noundef %.0306, i8 noundef signext %115, i32 noundef %.0307364, i32 noundef 0, i32 noundef 1, i32 noundef 0) #2
  %116 = icmp eq i32 %.0307364, %56
  br i1 %116, label %117, label %128

117:                                              ; preds = %111
  %118 = load i32, ptr %22, align 1, !tbaa !16
  %119 = and i32 %118, 2
  %.not328 = icmp eq i32 %119, 0
  br i1 %.not328, label %122, label %120

120:                                              ; preds = %117
  %121 = load i32, ptr %53, align 1, !tbaa !28
  br label %122

122:                                              ; preds = %117, %120
  %.0.sink394 = phi i32 [ %121, %120 ], [ %.0, %117 ]
  %123 = load i32, ptr %52, align 4, !tbaa !25
  %124 = mul i32 %123, %.0.sink394
  %125 = load i32, ptr %51, align 8, !tbaa !23
  %126 = load i32, ptr %55, align 4, !tbaa !27
  %127 = sext i32 %124 to i64
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef %0, i32 noundef %125, i32 noundef %126, i64 noundef %127) #2
  br label %128

128:                                              ; preds = %122, %111
  %129 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %57) #2
  %130 = icmp eq i32 %129, 12
  br i1 %130, label %131, label %141

131:                                              ; preds = %128
  %132 = load i32, ptr %22, align 1, !tbaa !16
  %133 = lshr i32 %132, 8
  %134 = and i32 %133, 3
  %135 = load i8, ptr %48, align 4, !tbaa !22
  %136 = add i32 %.0307364, %15
  switch i32 %134, label %.unreachabledefault397 [
    i32 1, label %137
    i32 2, label %138
    i32 0, label %139
    i32 3, label %140
  ]

137:                                              ; preds = %131
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %135, i32 noundef %.0307364, i32 noundef %5, i32 noundef %136) #2
  br label %145

138:                                              ; preds = %131
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %135, i32 noundef %5, i32 noundef %.0307364, i32 noundef %136) #2
  br label %145

139:                                              ; preds = %131
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879515216, i8 noundef signext %135, i32 noundef %5, i32 noundef %.0307364, i32 noundef %136) #2
  br label %145

.unreachabledefault397:                           ; preds = %131
  unreachable

140:                                              ; preds = %131
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879318608, i8 noundef signext %135, i32 noundef %5, i32 noundef %.0307364, i32 noundef %136) #2
  br label %145

141:                                              ; preds = %128
  %142 = load i32, ptr %58, align 8, !tbaa !29
  %143 = load i8, ptr %48, align 4, !tbaa !22
  %144 = add i32 %.0307364, %15
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef %142, i8 noundef signext %143, i32 noundef %5, i32 noundef %.0307364, i32 noundef %144) #2
  br label %145

145:                                              ; preds = %141, %138, %140, %139, %137
  %146 = add nuw i32 %.0307364, 1
  %exitcond385.not = icmp eq i32 %146, %5
  br i1 %exitcond385.not, label %.loopexit, label %.peel.next387, !llvm.loop !30

147:                                              ; preds = %.lr.ph, %159
  %.1308352 = phi i32 [ 0, %.lr.ph ], [ %164, %159 ]
  %148 = load i32, ptr %22, align 1, !tbaa !16
  %149 = and i32 %148, 2
  %.not325 = icmp eq i32 %149, 0
  br i1 %.not325, label %154, label %150

150:                                              ; preds = %147
  %151 = load i32, ptr %31, align 4, !tbaa !25
  %152 = mul i32 %.1308352, %.0
  %153 = mul i32 %152, %151
  br label %159

154:                                              ; preds = %147
  %155 = load i32, ptr %32, align 1, !tbaa !28
  %156 = mul i32 %155, %.1308352
  %157 = load i32, ptr %31, align 4, !tbaa !25
  %158 = mul i32 %156, %157
  br label %159

159:                                              ; preds = %154, %150
  %.2 = phi i32 [ %153, %150 ], [ %158, %154 ]
  %160 = load i32, ptr %2, align 8, !tbaa !19
  %161 = load i32, ptr %33, align 4, !tbaa !26
  %162 = load i32, ptr %34, align 4, !tbaa !27
  %163 = load i8, ptr %35, align 4, !tbaa !22
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef %0, i32 noundef %160, i32 noundef %161, i32 noundef %162, i32 noundef 127, i32 noundef 0, i32 noundef %.2, i8 noundef signext %163, i32 noundef %.1308352, i32 noundef 0, i32 noundef 1, i32 noundef 0) #2
  %164 = add nuw i32 %.1308352, 1
  %exitcond.not = icmp eq i32 %164, %5
  br i1 %exitcond.not, label %._crit_edge, label %147, !llvm.loop !33

._crit_edge:                                      ; preds = %159, %.preheader351
  %165 = load i32, ptr %22, align 1, !tbaa !16
  %166 = and i32 %165, 2
  %.not318 = icmp eq i32 %166, 0
  br i1 %.not318, label %170, label %167

167:                                              ; preds = %._crit_edge
  %168 = getelementptr inbounds i8, ptr %3, i64 16
  %169 = load i32, ptr %168, align 1, !tbaa !28
  br label %170

170:                                              ; preds = %._crit_edge, %167
  %.0.sink395 = phi i32 [ %169, %167 ], [ %.0, %._crit_edge ]
  %171 = getelementptr inbounds i8, ptr %2, i64 12
  %172 = load i32, ptr %171, align 4, !tbaa !25
  %173 = mul i32 %172, %.0.sink395
  %174 = getelementptr inbounds i8, ptr %2, i64 64
  %175 = load i32, ptr %174, align 8, !tbaa !23
  %176 = getelementptr inbounds i8, ptr %1, i64 12
  %177 = load i32, ptr %176, align 4, !tbaa !27
  %178 = sext i32 %173 to i64
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef %0, i32 noundef %175, i32 noundef %177, i64 noundef %178) #2
  switch i32 %13, label %.lr.ph354 [
    i32 4, label %.preheader
    i32 0, label %.loopexit
  ]

.lr.ph354:                                        ; preds = %170
  %179 = add i32 %13, -1
  %180 = getelementptr inbounds i8, ptr %1, i64 88
  %181 = getelementptr inbounds i8, ptr %2, i64 24
  %182 = getelementptr inbounds i8, ptr %1, i64 4
  %183 = getelementptr inbounds i8, ptr %2, i64 12
  %184 = getelementptr inbounds i8, ptr %2, i64 84
  %185 = add i32 %179, %5
  br label %316

.preheader:                                       ; preds = %170
  %186 = getelementptr inbounds i8, ptr %1, i64 88
  %187 = getelementptr inbounds i8, ptr %2, i64 24
  %188 = getelementptr inbounds i8, ptr %1, i64 4
  %189 = getelementptr inbounds i8, ptr %2, i64 12
  %190 = getelementptr inbounds i8, ptr %2, i64 84
  %191 = getelementptr inbounds i8, ptr %3, i64 12
  %192 = zext i32 %.0 to i64
  %193 = getelementptr inbounds i8, ptr %3, i64 29
  %194 = getelementptr inbounds i8, ptr %2, i64 56
  %exitcond380.peel.not = icmp eq i32 %5, 1
  br label %195

195:                                              ; preds = %.preheader, %._crit_edge362
  %.0311363 = phi i32 [ 0, %.preheader ], [ %258, %._crit_edge362 ]
  %196 = icmp eq i32 %.0311363, 3
  br i1 %196, label %197, label %202

197:                                              ; preds = %195
  %198 = load i32, ptr %16, align 4, !tbaa !13
  %.not322 = icmp eq i32 %198, 0
  br i1 %.not322, label %202, label %199

199:                                              ; preds = %197
  %200 = load i32, ptr %2, align 8, !tbaa !19
  %201 = load i32, ptr %186, align 4, !tbaa !14
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef %0, i32 noundef %200, i32 noundef 537138704, i32 noundef %201, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext 121, i32 noundef %5, i32 noundef 0, i32 noundef 0, i32 noundef 0) #2
  br label %202

202:                                              ; preds = %199, %197, %195
  %203 = load i32, ptr %187, align 8, !tbaa !20
  %204 = load i32, ptr %188, align 4, !tbaa !21
  %205 = load i32, ptr %189, align 4, !tbaa !25
  %206 = load i32, ptr %7, align 8, !tbaa !5
  %207 = mul i32 %.0311363, %.0
  %208 = mul i32 %207, %205
  %209 = mul i32 %208, %206
  %210 = load i8, ptr %190, align 4, !tbaa !22
  br i1 %196, label %211, label %.thread

211:                                              ; preds = %202
  %212 = load i32, ptr %16, align 4, !tbaa !13
  tail call void @libxsmm_x86_instruction_unified_vec_move(ptr noundef %0, i32 noundef %203, i32 noundef %204, i32 noundef 127, i32 noundef 0, i32 noundef %209, i8 noundef signext %210, i32 noundef %5, i32 noundef %212, i32 noundef %5, i32 noundef 0) #2
  br i1 %.not367, label %.loopexit, label %213

.thread:                                          ; preds = %202
  tail call void @libxsmm_x86_instruction_unified_vec_move(ptr noundef %0, i32 noundef %203, i32 noundef %204, i32 noundef 127, i32 noundef 0, i32 noundef %209, i8 noundef signext %210, i32 noundef %5, i32 noundef 0, i32 noundef %5, i32 noundef 0) #2
  br i1 %.not367, label %._crit_edge362, label %.lr.ph361.thread

213:                                              ; preds = %211
  %214 = load i32, ptr %174, align 8, !tbaa !23
  %215 = load i32, ptr %188, align 4, !tbaa !21
  %216 = load i32, ptr %191, align 1, !tbaa !24
  %217 = zext i32 %216 to i64
  %218 = load i32, ptr %189, align 4, !tbaa !25
  %219 = zext i32 %218 to i64
  %220 = mul nuw i64 %217, %192
  %221 = mul i64 %220, %219
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef %0, i32 noundef %214, i32 noundef %215, i64 noundef %221) #2
  br label %.lr.ph361.thread

.lr.ph361.thread:                                 ; preds = %.thread, %213
  %222 = add nuw nsw i32 %.0311363, %15
  %223 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %193) #2
  %224 = icmp eq i32 %223, 12
  br i1 %224, label %228, label %225

225:                                              ; preds = %.lr.ph361.thread
  %226 = load i32, ptr %194, align 8, !tbaa !29
  %227 = load i8, ptr %190, align 4, !tbaa !22
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef %226, i8 noundef signext %227, i32 noundef %5, i32 noundef 0, i32 noundef %222) #2
  br label %237

228:                                              ; preds = %.lr.ph361.thread
  %229 = load i32, ptr %22, align 1, !tbaa !16
  %230 = lshr i32 %229, 8
  %231 = and i32 %230, 3
  %232 = load i8, ptr %190, align 4, !tbaa !22
  switch i32 %231, label %.unreachabledefault398 [
    i32 1, label %236
    i32 2, label %235
    i32 0, label %234
    i32 3, label %233
  ]

.unreachabledefault398:                           ; preds = %228
  unreachable

233:                                              ; preds = %228
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879318608, i8 noundef signext %232, i32 noundef %5, i32 noundef 0, i32 noundef %222) #2
  br label %237

234:                                              ; preds = %228
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879515216, i8 noundef signext %232, i32 noundef %5, i32 noundef 0, i32 noundef %222) #2
  br label %237

235:                                              ; preds = %228
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %232, i32 noundef %5, i32 noundef 0, i32 noundef %222) #2
  br label %237

236:                                              ; preds = %228
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %232, i32 noundef 0, i32 noundef %5, i32 noundef %222) #2
  br label %237

237:                                              ; preds = %236, %235, %234, %233, %225
  br i1 %exitcond380.peel.not, label %._crit_edge362, label %.peel.next382

.peel.next382:                                    ; preds = %237, %256
  %.2309359 = phi i32 [ %257, %256 ], [ 1, %237 ]
  %238 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %193) #2
  %239 = icmp eq i32 %238, 12
  br i1 %239, label %240, label %251

240:                                              ; preds = %.peel.next382
  %241 = load i32, ptr %22, align 1, !tbaa !16
  %242 = lshr i32 %241, 8
  %243 = and i32 %242, 3
  %244 = load i8, ptr %190, align 4, !tbaa !22
  %245 = shl i32 %.2309359, 2
  %246 = add i32 %222, %245
  switch i32 %243, label %.unreachabledefault399 [
    i32 1, label %247
    i32 2, label %248
    i32 0, label %249
    i32 3, label %250
  ]

247:                                              ; preds = %240
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %244, i32 noundef %.2309359, i32 noundef %5, i32 noundef %246) #2
  br label %256

248:                                              ; preds = %240
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %244, i32 noundef %5, i32 noundef %.2309359, i32 noundef %246) #2
  br label %256

249:                                              ; preds = %240
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879515216, i8 noundef signext %244, i32 noundef %5, i32 noundef %.2309359, i32 noundef %246) #2
  br label %256

.unreachabledefault399:                           ; preds = %240
  unreachable

250:                                              ; preds = %240
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879318608, i8 noundef signext %244, i32 noundef %5, i32 noundef %.2309359, i32 noundef %246) #2
  br label %256

251:                                              ; preds = %.peel.next382
  %252 = load i32, ptr %194, align 8, !tbaa !29
  %253 = load i8, ptr %190, align 4, !tbaa !22
  %254 = shl i32 %.2309359, 2
  %255 = add i32 %222, %254
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef %252, i8 noundef signext %253, i32 noundef %5, i32 noundef %.2309359, i32 noundef %255) #2
  br label %256

256:                                              ; preds = %251, %248, %250, %249, %247
  %257 = add nuw i32 %.2309359, 1
  %exitcond380.not = icmp eq i32 %257, %5
  br i1 %exitcond380.not, label %._crit_edge362, label %.peel.next382, !llvm.loop !34

._crit_edge362:                                   ; preds = %256, %237, %.thread
  %258 = add nuw nsw i32 %.0311363, 1
  %exitcond384.not = icmp eq i32 %258, 4
  br i1 %exitcond384.not, label %.loopexit, label %195, !llvm.loop !35

.preheader347.lr.ph:                              ; preds = %335
  %259 = add i32 %13, -1
  %260 = getelementptr inbounds i8, ptr %1, i64 4
  %261 = getelementptr inbounds i8, ptr %3, i64 12
  %262 = getelementptr inbounds i8, ptr %2, i64 12
  %263 = zext i32 %.0 to i64
  %264 = getelementptr inbounds i8, ptr %3, i64 29
  %265 = getelementptr inbounds i8, ptr %2, i64 56
  %266 = getelementptr inbounds i8, ptr %2, i64 84
  br i1 %.not367, label %.loopexit, label %.preheader347.us.preheader

.preheader347.us.preheader:                       ; preds = %.preheader347.lr.ph
  %exitcond377.peel.not = icmp eq i32 %5, 1
  br label %.preheader347.us

.preheader347.us:                                 ; preds = %.preheader347.us.preheader, %._crit_edge357.us
  %.2313358.us = phi i32 [ %315, %._crit_edge357.us ], [ 0, %.preheader347.us.preheader ]
  %267 = icmp eq i32 %.2313358.us, %259
  %268 = add i32 %.2313358.us, %5
  %269 = add i32 %.2313358.us, %15
  br i1 %267, label %270, label %279

270:                                              ; preds = %.preheader347.us
  %271 = load i32, ptr %174, align 8, !tbaa !23
  %272 = load i32, ptr %260, align 4, !tbaa !21
  %273 = load i32, ptr %261, align 1, !tbaa !24
  %274 = zext i32 %273 to i64
  %275 = load i32, ptr %262, align 4, !tbaa !25
  %276 = zext i32 %275 to i64
  %277 = mul nuw i64 %274, %263
  %278 = mul i64 %277, %276
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef %0, i32 noundef %271, i32 noundef %272, i64 noundef %278) #2
  br label %279

279:                                              ; preds = %270, %.preheader347.us
  %280 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %264) #2
  %281 = icmp eq i32 %280, 12
  br i1 %281, label %285, label %282

282:                                              ; preds = %279
  %283 = load i32, ptr %265, align 8, !tbaa !29
  %284 = load i8, ptr %266, align 4, !tbaa !22
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef %283, i8 noundef signext %284, i32 noundef %268, i32 noundef 0, i32 noundef %269) #2
  br label %294

285:                                              ; preds = %279
  %286 = load i32, ptr %22, align 1, !tbaa !16
  %287 = lshr i32 %286, 8
  %288 = and i32 %287, 3
  %289 = load i8, ptr %266, align 4, !tbaa !22
  switch i32 %288, label %.unreachabledefault400 [
    i32 1, label %293
    i32 2, label %292
    i32 0, label %291
    i32 3, label %290
  ]

.unreachabledefault400:                           ; preds = %285
  unreachable

290:                                              ; preds = %285
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879318608, i8 noundef signext %289, i32 noundef %268, i32 noundef 0, i32 noundef %269) #2
  br label %294

291:                                              ; preds = %285
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879515216, i8 noundef signext %289, i32 noundef %268, i32 noundef 0, i32 noundef %269) #2
  br label %294

292:                                              ; preds = %285
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %289, i32 noundef %268, i32 noundef 0, i32 noundef %269) #2
  br label %294

293:                                              ; preds = %285
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %289, i32 noundef 0, i32 noundef %268, i32 noundef %269) #2
  br label %294

294:                                              ; preds = %293, %292, %291, %290, %282
  br i1 %exitcond377.peel.not, label %._crit_edge357.us, label %.peel.next

.peel.next:                                       ; preds = %294, %313
  %.3310355.us = phi i32 [ %314, %313 ], [ 1, %294 ]
  %295 = tail call i32 @LIBXSMM_GEMM_GETENUM_AB_COMMON_PREC(ptr noundef nonnull %264) #2
  %296 = icmp eq i32 %295, 12
  br i1 %296, label %302, label %297

297:                                              ; preds = %.peel.next
  %298 = load i32, ptr %265, align 8, !tbaa !29
  %299 = load i8, ptr %266, align 4, !tbaa !22
  %300 = mul i32 %.3310355.us, %13
  %301 = add i32 %269, %300
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef %298, i8 noundef signext %299, i32 noundef %268, i32 noundef %.3310355.us, i32 noundef %301) #2
  br label %313

302:                                              ; preds = %.peel.next
  %303 = load i32, ptr %22, align 1, !tbaa !16
  %304 = lshr i32 %303, 8
  %305 = and i32 %304, 3
  %306 = load i8, ptr %266, align 4, !tbaa !22
  %307 = mul i32 %.3310355.us, %13
  %308 = add i32 %269, %307
  switch i32 %305, label %.unreachabledefault401 [
    i32 1, label %312
    i32 2, label %311
    i32 0, label %310
    i32 3, label %309
  ]

.unreachabledefault401:                           ; preds = %302
  unreachable

309:                                              ; preds = %302
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879318608, i8 noundef signext %306, i32 noundef %268, i32 noundef %.3310355.us, i32 noundef %308) #2
  br label %313

310:                                              ; preds = %302
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 1879515216, i8 noundef signext %306, i32 noundef %268, i32 noundef %.3310355.us, i32 noundef %308) #2
  br label %313

311:                                              ; preds = %302
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %306, i32 noundef %268, i32 noundef %.3310355.us, i32 noundef %308) #2
  br label %313

312:                                              ; preds = %302
  tail call void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef %0, i32 noundef 805643856, i8 noundef signext %306, i32 noundef %.3310355.us, i32 noundef %268, i32 noundef %308) #2
  br label %313

313:                                              ; preds = %312, %311, %310, %309, %297
  %314 = add nuw i32 %.3310355.us, 1
  %exitcond377.not = icmp eq i32 %314, %5
  br i1 %exitcond377.not, label %._crit_edge357.us, label %.peel.next, !llvm.loop !36

._crit_edge357.us:                                ; preds = %313, %294
  %315 = add nuw i32 %.2313358.us, 1
  %exitcond379.not = icmp eq i32 %315, %13
  br i1 %exitcond379.not, label %.loopexit, label %.preheader347.us, !llvm.loop !37

316:                                              ; preds = %.lr.ph354, %335
  %.1312353 = phi i32 [ 0, %.lr.ph354 ], [ %337, %335 ]
  %317 = icmp eq i32 %.1312353, %179
  br i1 %317, label %318, label %323

318:                                              ; preds = %316
  %319 = load i32, ptr %16, align 4, !tbaa !13
  %.not321 = icmp eq i32 %319, 0
  br i1 %.not321, label %323, label %320

320:                                              ; preds = %318
  %321 = load i32, ptr %2, align 8, !tbaa !19
  %322 = load i32, ptr %180, align 4, !tbaa !14
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef %0, i32 noundef %321, i32 noundef 537138704, i32 noundef %322, i32 noundef 127, i32 noundef 0, i32 noundef 0, i8 noundef signext 121, i32 noundef %185, i32 noundef 0, i32 noundef 0, i32 noundef 0) #2
  br label %323

323:                                              ; preds = %320, %318, %316
  %324 = load i32, ptr %181, align 8, !tbaa !20
  %325 = load i32, ptr %182, align 4, !tbaa !21
  %326 = load i32, ptr %183, align 4, !tbaa !25
  %327 = load i32, ptr %7, align 8, !tbaa !5
  %328 = mul i32 %.1312353, %.0
  %329 = mul i32 %328, %326
  %330 = mul i32 %329, %327
  %331 = load i8, ptr %184, align 4, !tbaa !22
  %332 = add i32 %.1312353, %5
  br i1 %317, label %333, label %335

333:                                              ; preds = %323
  %334 = load i32, ptr %16, align 4, !tbaa !13
  br label %335

335:                                              ; preds = %323, %333
  %336 = phi i32 [ %334, %333 ], [ 0, %323 ]
  tail call void @libxsmm_x86_instruction_unified_vec_move(ptr noundef %0, i32 noundef %324, i32 noundef %325, i32 noundef 127, i32 noundef 0, i32 noundef %330, i8 noundef signext %331, i32 noundef %332, i32 noundef %336, i32 noundef %332, i32 noundef 0) #2
  %337 = add nuw i32 %.1312353, 1
  %exitcond376.not = icmp eq i32 %337, %13
  br i1 %exitcond376.not, label %.preheader347.lr.ph, label %316, !llvm.loop !38

.loopexit:                                        ; preds = %211, %._crit_edge362, %._crit_edge357.us, %145, %170, %100, %.preheader347.lr.ph, %42
  ret void
}

declare i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef) local_unnamed_addr #0

declare void @libxsmm_generator_gemm_getval_stack_var(ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

declare void @libxsmm_x86_instruction_vec_move(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef signext, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

declare void @libxsmm_x86_instruction_vec_compute_3reg(ptr noundef, i32 noundef, i8 noundef signext, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

declare void @libxsmm_x86_instruction_unified_vec_move(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef signext, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

declare void @libxsmm_x86_instruction_alu_imm(ptr noundef, i32 noundef, i32 noundef, i64 noundef) local_unnamed_addr #0

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 = { 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 8}
!6 = !{!"libxsmm_micro_kernel_config", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !7, i64 40, !7, i64 44, !7, i64 48, !7, i64 52, !7, i64 56, !7, i64 60, !7, i64 64, !7, i64 68, !7, i64 72, !7, i64 76, !7, i64 80, !8, i64 84, !7, i64 88, !7, i64 92, !7, i64 96, !7, i64 100, !7, i64 104, !7, i64 108, !7, i64 112, !7, i64 116, !7, i64 120, !7, i64 124, !7, i64 128, !7, i64 132, !7, i64 136, !7, i64 140, !7, i64 144, !7, i64 148, !7, i64 152, !7, i64 156, !7, i64 160, !7, i64 164, !7, i64 168, !7, i64 172, !7, i64 176, !7, i64 180, !7, i64 184, !7, i64 188, !7, i64 192, !7, i64 196, !7, i64 200, !7, i64 204, !7, i64 208, !7, i64 212, !7, i64 216, !7, i64 220, !7, i64 224, !7, i64 228, !7, i64 232, !7, i64 236, !7, i64 240, !7, i64 244, !7, i64 248, !7, i64 252, !7, i64 256, !7, i64 260, !7, i64 264, !7, i64 268, !7, i64 272, !7, i64 276, !7, i64 280, !7, i64 284, !7, i64 288, !7, i64 292, !7, i64 296, !7, i64 300, !7, i64 304, !7, i64 308, !7, i64 312, !7, i64 316, !7, i64 320, !7, i64 324, !7, i64 328, !7, i64 332, !7, i64 336, !7, i64 340, !7, i64 344, !7, i64 348, !7, i64 352, !7, i64 356, !7, i64 360, !8, i64 364, !8, i64 380, !8, i64 396, !8, i64 412, !8, i64 428, !8, i64 444, !7, i64 460, !8, i64 464, !10, i64 520, !7, i64 556, !7, i64 560, !7, i64 564, !7, i64 568, !7, i64 572, !7, i64 576, !7, i64 580, !7, i64 584, !12, i64 592, !7, i64 600, !7, i64 604, !7, i64 608, !7, i64 612, !12, i64 616, !7, i64 624, !7, i64 628, !7, i64 632, !7, i64 636, !7, i64 640, !7, i64 644, !7, i64 648, !7, i64 652, !7, i64 656, !7, i64 660, !7, i64 664, !7, i64 668, !7, i64 672, !7, i64 676, !7, i64 680}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"libxsmm_tile_config", !8, i64 0, !11, i64 2, !8, i64 4, !11, i64 6, !8, i64 8, !11, i64 10, !8, i64 12, !11, i64 14, !8, i64 16, !11, i64 18, !8, i64 20, !11, i64 22, !8, i64 24, !11, i64 26, !8, i64 28, !11, i64 30, !8, i64 32}
!11 = !{!"short", !8, i64 0}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!6, !7, i64 44}
!14 = !{!15, !7, i64 88}
!15 = !{!"libxsmm_gp_reg_mapping_struct", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !7, i64 40, !7, i64 44, !7, i64 48, !7, i64 52, !7, i64 56, !7, i64 60, !7, i64 64, !7, i64 68, !7, i64 72, !7, i64 76, !7, i64 80, !7, i64 84, !7, i64 88, !7, i64 92, !7, i64 96, !7, i64 100, !7, i64 104, !7, i64 108, !7, i64 112, !7, i64 116, !7, i64 120, !7, i64 124, !7, i64 128}
!16 = !{!17, !7, i64 24}
!17 = !{!"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, !18, i64 33, !18, 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}
!18 = !{!"long long", !8, i64 0}
!19 = !{!6, !7, i64 0}
!20 = !{!6, !7, i64 24}
!21 = !{!15, !7, i64 4}
!22 = !{!6, !8, i64 84}
!23 = !{!6, !7, i64 64}
!24 = !{!17, !7, i64 12}
!25 = !{!6, !7, i64 12}
!26 = !{!6, !7, i64 28}
!27 = !{!15, !7, i64 12}
!28 = !{!17, !7, i64 16}
!29 = !{!6, !7, i64 56}
!30 = distinct !{!30, !31, !32}
!31 = !{!"llvm.loop.mustprogress"}
!32 = !{!"llvm.loop.peeled.count", i32 1}
!33 = distinct !{!33, !31}
!34 = distinct !{!34, !31, !32}
!35 = distinct !{!35, !31}
!36 = distinct !{!36, !31, !32}
!37 = distinct !{!37, !31}
!38 = distinct !{!38, !31}


; Effective O3 passes: ADCEPass,BDCEPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopFullUnrollPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass