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

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

%union.libxsmm_ref_code_pointer = type { ptr }
%struct.libxsmm_generated_code = type { ptr, i32, i32, i32, i32, i32, i32 }
%struct.libxsmm_meqn_descriptor = type <{ i32, i32, i32, i8, i32 }>
%struct.libxsmm_matrix_eqn = type { ptr, ptr, i32, i32, i32, i32 }
%struct.libxsmm_meqn_elem = type { ptr, ptr, ptr, ptr, i32, %union.libxsmm_meqn_info, i32, i32, %struct.libxsmm_meqn_tmp_info, i32, i32, i32, %union.libxsmm_meqn_fusion_info }
%union.libxsmm_meqn_info = type { %struct.libxsmm_meqn_arg }
%struct.libxsmm_meqn_arg = type { i32, i32, i32, i32, i32, i32, i32, %struct.libxsmm_matrix_arg_attributes }
%struct.libxsmm_matrix_arg_attributes = type { i32, i32, i32, i32 }
%struct.libxsmm_meqn_tmp_info = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%union.libxsmm_meqn_fusion_info = type { %struct.libxsmm_meqn_xgemm_fusion_info }
%struct.libxsmm_meqn_xgemm_fusion_info = type { i32, i32, i32, i32, i32 }

@stderr = external global ptr, align 8
@.str.1 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [79 x i8], align 1
@__PRETTY_FUNCTION__.libxsmm_generator_matequation_x86_reference_kernel = external hidden unnamed_addr constant [115 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [21 x i8], align 1
@libxsmm_verbosity = external global i32, align 4
@.str.5 = external hidden unnamed_addr constant [90 x i8], align 1

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

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

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #3

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

declare void @libxsmm_x86_instruction_open_stream_alt(ptr noundef, i32 noundef, i32 noundef) #4

declare void @libxsmm_x86_instruction_push_reg(ptr noundef, i32 noundef) #4

declare void @libxsmm_x86_instruction_alu_reg(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #4

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

declare void @libxsmm_x86_instruction_alu_imm_i64(ptr noundef, i32 noundef, i32 noundef, i64 noundef) #4

declare void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef, ptr noundef, ptr noundef, i8 noundef signext, i32 noundef) #4

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) #4

declare void @libxsmm_x86_instruction_pop_reg(ptr noundef, i32 noundef) #4

declare void @libxsmm_x86_instruction_close_stream_alt(ptr noundef, i32 noundef) #4

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

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

31:                                               ; preds = %2
  %32 = load ptr, ptr @stderr, align 8, !tbaa !5
  %33 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %32, ptr noundef @.str.1) #8
  store i32 1, ptr %19, align 4
  br label %494

34:                                               ; preds = %2
  %35 = load ptr, ptr %8, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %35, i32 0, i32 0
  %37 = load ptr, ptr %36, align 8, !tbaa !17
  %38 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %37, i32 0, i32 7
  %39 = load i32, ptr %38, align 4, !tbaa !17
  store i32 %39, ptr %10, align 4, !tbaa !12
  %40 = load i32, ptr %10, align 4, !tbaa !12
  %41 = add i32 %40, 1
  %42 = mul i32 %41, 5
  %43 = zext i32 %42 to i64
  %44 = mul i64 %43, 184
  %45 = add i64 %44, 63
  %46 = udiv i64 %45, 64
  %47 = mul i64 %46, 64
  store i64 %47, ptr %12, align 8, !tbaa !15
  %48 = load i64, ptr %12, align 8, !tbaa !15
  %49 = call noalias ptr @malloc(i64 noundef %48) #9
  store ptr %49, ptr %11, align 8, !tbaa !5
  %50 = load ptr, ptr %11, align 8, !tbaa !5
  %51 = load i64, ptr %12, align 8, !tbaa !15
  call void @llvm.memset.p0.i64(ptr align 8 %50, i8 0, i64 %51, i1 false)
  %52 = load ptr, ptr %8, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %52, i32 0, i32 0
  %54 = load ptr, ptr %53, align 8, !tbaa !17
  %55 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %54, i32 0, i32 11
  %56 = load i32, ptr %55, align 8, !tbaa !17
  %57 = sext i32 %56 to i64
  store i64 %57, ptr %14, align 8, !tbaa !15
  %58 = load ptr, ptr %8, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %58, i32 0, i32 0
  %60 = load ptr, ptr %59, align 8, !tbaa !17
  %61 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %60, i32 0, i32 6
  %62 = load i32, ptr %61, align 8, !tbaa !17
  %63 = sext i32 %62 to i64
  store i64 %63, ptr %15, align 8, !tbaa !15
  %64 = load ptr, ptr %8, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %64, i32 0, i32 0
  %66 = load ptr, ptr %65, align 8, !tbaa !17
  %67 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %66, i32 0, i32 9
  %68 = load i32, ptr %67, align 8, !tbaa !17
  %69 = sext i32 %68 to i64
  %70 = load i64, ptr %14, align 8, !tbaa !15
  %71 = mul i64 %69, %70
  store i64 %71, ptr %16, align 8, !tbaa !15
  br label %72

72:                                               ; preds = %34
  store i32 7, ptr %6, align 4, !tbaa !12
  %73 = load ptr, ptr %3, align 8, !tbaa !5
  %74 = load i32, ptr %6, align 4, !tbaa !12
  call void @libxsmm_x86_instruction_open_stream_alt(ptr noundef %73, i32 noundef %74, i32 noundef 1)
  %75 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_push_reg(ptr noundef %75, i32 noundef 5)
  %76 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_alu_reg(ptr noundef %76, i32 noundef -1568407413, i32 noundef 4, i32 noundef 5)
  %77 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_alu_imm_i64(ptr noundef %77, i32 noundef -1568407413, i32 noundef 0, i64 noundef -64)
  %78 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_alu_reg(ptr noundef %78, i32 noundef 30001, i32 noundef 0, i32 noundef 4)
  store i32 0, ptr %9, align 4, !tbaa !12
  br label %79

79:                                               ; preds = %379, %72
  %80 = load i32, ptr %9, align 4, !tbaa !12
  %81 = load i32, ptr %10, align 4, !tbaa !12
  %82 = icmp ule i32 %80, %81
  br i1 %82, label %83, label %382

83:                                               ; preds = %79
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #8
  %84 = load ptr, ptr %8, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %84, i32 0, i32 0
  %86 = load ptr, ptr %85, align 8, !tbaa !17
  %87 = load i32, ptr %9, align 4, !tbaa !12
  %88 = call ptr @libxsmm_generator_matequation_find_op_at_timestamp(ptr noundef %86, i32 noundef %87)
  store ptr %88, ptr %20, align 8, !tbaa !5
  %89 = load ptr, ptr %20, align 8, !tbaa !5
  %90 = icmp ne ptr %89, null
  br i1 %90, label %91, label %99

91:                                               ; preds = %83
  %92 = load ptr, ptr %11, align 8, !tbaa !5
  %93 = load i32, ptr %9, align 4, !tbaa !12
  %94 = mul i32 %93, 5
  %95 = add i32 %94, 0
  %96 = zext i32 %95 to i64
  %97 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %92, i64 %96
  %98 = load ptr, ptr %20, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %97, ptr align 8 %98, i64 184, i1 false), !tbaa.struct !18
  br label %99

99:                                               ; preds = %91, %83
  %100 = load ptr, ptr %20, align 8, !tbaa !5
  %101 = icmp ne ptr %100, null
  br i1 %101, label %102, label %117

102:                                              ; preds = %99
  %103 = load ptr, ptr %20, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %103, i32 0, i32 0
  %105 = load ptr, ptr %104, align 8, !tbaa !17
  %106 = icmp ne ptr %105, null
  br i1 %106, label %107, label %117

107:                                              ; preds = %102
  %108 = load ptr, ptr %11, align 8, !tbaa !5
  %109 = load i32, ptr %9, align 4, !tbaa !12
  %110 = mul i32 %109, 5
  %111 = add i32 %110, 1
  %112 = zext i32 %111 to i64
  %113 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %108, i64 %112
  %114 = load ptr, ptr %20, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %114, i32 0, i32 0
  %116 = load ptr, ptr %115, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %113, ptr align 8 %116, i64 184, i1 false), !tbaa.struct !18
  br label %117

117:                                              ; preds = %107, %102, %99
  %118 = load ptr, ptr %20, align 8, !tbaa !5
  %119 = icmp ne ptr %118, null
  br i1 %119, label %120, label %135

120:                                              ; preds = %117
  %121 = load ptr, ptr %20, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %121, i32 0, i32 1
  %123 = load ptr, ptr %122, align 8, !tbaa !17
  %124 = icmp ne ptr %123, null
  br i1 %124, label %125, label %135

125:                                              ; preds = %120
  %126 = load ptr, ptr %11, align 8, !tbaa !5
  %127 = load i32, ptr %9, align 4, !tbaa !12
  %128 = mul i32 %127, 5
  %129 = add i32 %128, 2
  %130 = zext i32 %129 to i64
  %131 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %126, i64 %130
  %132 = load ptr, ptr %20, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %132, i32 0, i32 1
  %134 = load ptr, ptr %133, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %131, ptr align 8 %134, i64 184, i1 false), !tbaa.struct !18
  br label %135

135:                                              ; preds = %125, %120, %117
  %136 = load ptr, ptr %20, align 8, !tbaa !5
  %137 = icmp ne ptr %136, null
  br i1 %137, label %138, label %153

138:                                              ; preds = %135
  %139 = load ptr, ptr %20, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %139, i32 0, i32 2
  %141 = load ptr, ptr %140, align 8, !tbaa !17
  %142 = icmp ne ptr %141, null
  br i1 %142, label %143, label %153

143:                                              ; preds = %138
  %144 = load ptr, ptr %11, align 8, !tbaa !5
  %145 = load i32, ptr %9, align 4, !tbaa !12
  %146 = mul i32 %145, 5
  %147 = add i32 %146, 3
  %148 = zext i32 %147 to i64
  %149 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %144, i64 %148
  %150 = load ptr, ptr %20, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %150, i32 0, i32 2
  %152 = load ptr, ptr %151, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %149, ptr align 8 %152, i64 184, i1 false), !tbaa.struct !18
  br label %153

153:                                              ; preds = %143, %138, %135
  %154 = load ptr, ptr %20, align 8, !tbaa !5
  %155 = icmp ne ptr %154, null
  br i1 %155, label %156, label %171

156:                                              ; preds = %153
  %157 = load ptr, ptr %20, align 8, !tbaa !5
  %158 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %157, i32 0, i32 3
  %159 = load ptr, ptr %158, align 8, !tbaa !17
  %160 = icmp ne ptr %159, null
  br i1 %160, label %161, label %171

161:                                              ; preds = %156
  %162 = load ptr, ptr %11, align 8, !tbaa !5
  %163 = load i32, ptr %9, align 4, !tbaa !12
  %164 = mul i32 %163, 5
  %165 = add i32 %164, 4
  %166 = zext i32 %165 to i64
  %167 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %162, i64 %166
  %168 = load ptr, ptr %20, align 8, !tbaa !5
  %169 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %168, i32 0, i32 3
  %170 = load ptr, ptr %169, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %167, ptr align 8 %170, i64 184, i1 false), !tbaa.struct !18
  br label %171

171:                                              ; preds = %161, %156, %153
  %172 = load i32, ptr %9, align 4, !tbaa !12
  %173 = load i32, ptr %10, align 4, !tbaa !12
  %174 = icmp eq i32 %172, %173
  br i1 %174, label %175, label %378

175:                                              ; preds = %171
  %176 = load ptr, ptr %11, align 8, !tbaa !5
  %177 = load i32, ptr %9, align 4, !tbaa !12
  %178 = mul i32 %177, 5
  %179 = add i32 %178, 0
  %180 = zext i32 %179 to i64
  %181 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %176, i64 %180
  %182 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %181, i32 0, i32 6
  store i32 -1, ptr %182, align 8, !tbaa !17
  %183 = load ptr, ptr %4, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %183, i32 0, i32 2
  %185 = load i32, ptr %184, align 1, !tbaa !19
  %186 = load ptr, ptr %11, align 8, !tbaa !5
  %187 = load i32, ptr %9, align 4, !tbaa !12
  %188 = mul i32 %187, 5
  %189 = add i32 %188, 0
  %190 = zext i32 %189 to i64
  %191 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %186, i64 %190
  %192 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %191, i32 0, i32 8
  %193 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %192, i32 0, i32 3
  store i32 %185, ptr %193, align 4, !tbaa !17
  %194 = load ptr, ptr %4, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %194, i32 0, i32 3
  %196 = load i8, ptr %195, align 1, !tbaa !20
  %197 = zext i8 %196 to i32
  %198 = ashr i32 %197, 4
  %199 = icmp eq i32 0, %198
  br i1 %199, label %200, label %362

200:                                              ; preds = %175
  %201 = load ptr, ptr %4, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %201, i32 0, i32 3
  %203 = load i8, ptr %202, align 1, !tbaa !20
  %204 = zext i8 %203 to i32
  %205 = and i32 %204, 15
  %206 = icmp eq i32 0, %205
  br i1 %206, label %207, label %208

207:                                              ; preds = %200
  br label %360

208:                                              ; preds = %200
  %209 = load ptr, ptr %4, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %209, i32 0, i32 3
  %211 = load i8, ptr %210, align 1, !tbaa !20
  %212 = zext i8 %211 to i32
  %213 = and i32 %212, 15
  %214 = icmp eq i32 1, %213
  br i1 %214, label %215, label %216

215:                                              ; preds = %208
  br label %358

216:                                              ; preds = %208
  %217 = load ptr, ptr %4, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %217, i32 0, i32 3
  %219 = load i8, ptr %218, align 1, !tbaa !20
  %220 = zext i8 %219 to i32
  %221 = and i32 %220, 15
  %222 = icmp eq i32 2, %221
  br i1 %222, label %223, label %224

223:                                              ; preds = %216
  br label %356

224:                                              ; preds = %216
  %225 = load ptr, ptr %4, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %225, i32 0, i32 3
  %227 = load i8, ptr %226, align 1, !tbaa !20
  %228 = zext i8 %227 to i32
  %229 = and i32 %228, 15
  %230 = icmp eq i32 3, %229
  br i1 %230, label %231, label %232

231:                                              ; preds = %224
  br label %354

232:                                              ; preds = %224
  %233 = load ptr, ptr %4, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %233, i32 0, i32 3
  %235 = load i8, ptr %234, align 1, !tbaa !20
  %236 = zext i8 %235 to i32
  %237 = and i32 %236, 15
  %238 = icmp eq i32 4, %237
  br i1 %238, label %239, label %240

239:                                              ; preds = %232
  br label %352

240:                                              ; preds = %232
  %241 = load ptr, ptr %4, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %241, i32 0, i32 3
  %243 = load i8, ptr %242, align 1, !tbaa !20
  %244 = zext i8 %243 to i32
  %245 = and i32 %244, 15
  %246 = icmp eq i32 5, %245
  br i1 %246, label %247, label %248

247:                                              ; preds = %240
  br label %350

248:                                              ; preds = %240
  %249 = load ptr, ptr %4, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %249, i32 0, i32 3
  %251 = load i8, ptr %250, align 1, !tbaa !20
  %252 = zext i8 %251 to i32
  %253 = and i32 %252, 15
  %254 = icmp eq i32 6, %253
  br i1 %254, label %255, label %256

255:                                              ; preds = %248
  br label %348

256:                                              ; preds = %248
  %257 = load ptr, ptr %4, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %257, i32 0, i32 3
  %259 = load i8, ptr %258, align 1, !tbaa !20
  %260 = zext i8 %259 to i32
  %261 = and i32 %260, 15
  %262 = icmp eq i32 7, %261
  br i1 %262, label %263, label %264

263:                                              ; preds = %256
  br label %346

264:                                              ; preds = %256
  %265 = load ptr, ptr %4, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %265, i32 0, i32 3
  %267 = load i8, ptr %266, align 1, !tbaa !20
  %268 = zext i8 %267 to i32
  %269 = and i32 %268, 15
  %270 = icmp eq i32 8, %269
  br i1 %270, label %271, label %272

271:                                              ; preds = %264
  br label %344

272:                                              ; preds = %264
  %273 = load ptr, ptr %4, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %273, i32 0, i32 3
  %275 = load i8, ptr %274, align 1, !tbaa !20
  %276 = zext i8 %275 to i32
  %277 = and i32 %276, 15
  %278 = icmp eq i32 9, %277
  br i1 %278, label %279, label %280

279:                                              ; preds = %272
  br label %342

280:                                              ; preds = %272
  %281 = load ptr, ptr %4, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %281, i32 0, i32 3
  %283 = load i8, ptr %282, align 1, !tbaa !20
  %284 = zext i8 %283 to i32
  %285 = and i32 %284, 15
  %286 = icmp eq i32 10, %285
  br i1 %286, label %287, label %288

287:                                              ; preds = %280
  br label %340

288:                                              ; preds = %280
  %289 = load ptr, ptr %4, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %289, i32 0, i32 3
  %291 = load i8, ptr %290, align 1, !tbaa !20
  %292 = zext i8 %291 to i32
  %293 = and i32 %292, 15
  %294 = icmp eq i32 11, %293
  br i1 %294, label %295, label %296

295:                                              ; preds = %288
  br label %338

296:                                              ; preds = %288
  %297 = load ptr, ptr %4, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %297, i32 0, i32 3
  %299 = load i8, ptr %298, align 1, !tbaa !20
  %300 = zext i8 %299 to i32
  %301 = and i32 %300, 15
  %302 = icmp eq i32 12, %301
  br i1 %302, label %303, label %304

303:                                              ; preds = %296
  br label %336

304:                                              ; preds = %296
  %305 = load ptr, ptr %4, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %305, i32 0, i32 3
  %307 = load i8, ptr %306, align 1, !tbaa !20
  %308 = zext i8 %307 to i32
  %309 = and i32 %308, 15
  %310 = icmp eq i32 13, %309
  br i1 %310, label %311, label %312

311:                                              ; preds = %304
  br label %334

312:                                              ; preds = %304
  %313 = load ptr, ptr %4, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %313, i32 0, i32 3
  %315 = load i8, ptr %314, align 1, !tbaa !20
  %316 = zext i8 %315 to i32
  %317 = and i32 %316, 15
  %318 = icmp eq i32 14, %317
  br i1 %318, label %319, label %320

319:                                              ; preds = %312
  br label %332

320:                                              ; preds = %312
  %321 = load ptr, ptr %4, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %321, i32 0, i32 3
  %323 = load i8, ptr %322, align 1, !tbaa !20
  %324 = zext i8 %323 to i32
  %325 = and i32 %324, 15
  %326 = icmp eq i32 15, %325
  br i1 %326, label %327, label %328

327:                                              ; preds = %320
  br label %330

328:                                              ; preds = %320
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str.3, i32 noundef 160, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_x86_reference_kernel) #10
  unreachable

329:                                              ; No predecessors!
  br label %330

330:                                              ; preds = %329, %327
  %331 = phi i32 [ 15, %327 ], [ 0, %329 ]
  br label %332

332:                                              ; preds = %330, %319
  %333 = phi i32 [ 14, %319 ], [ %331, %330 ]
  br label %334

334:                                              ; preds = %332, %311
  %335 = phi i32 [ 12, %311 ], [ %333, %332 ]
  br label %336

336:                                              ; preds = %334, %303
  %337 = phi i32 [ 12, %303 ], [ %335, %334 ]
  br label %338

338:                                              ; preds = %336, %295
  %339 = phi i32 [ 10, %295 ], [ %337, %336 ]
  br label %340

340:                                              ; preds = %338, %287
  %341 = phi i32 [ 10, %287 ], [ %339, %338 ]
  br label %342

342:                                              ; preds = %340, %279
  %343 = phi i32 [ 8, %279 ], [ %341, %340 ]
  br label %344

344:                                              ; preds = %342, %271
  %345 = phi i32 [ 8, %271 ], [ %343, %342 ]
  br label %346

346:                                              ; preds = %344, %263
  %347 = phi i32 [ 6, %263 ], [ %345, %344 ]
  br label %348

348:                                              ; preds = %346, %255
  %349 = phi i32 [ 6, %255 ], [ %347, %346 ]
  br label %350

350:                                              ; preds = %348, %247
  %351 = phi i32 [ 5, %247 ], [ %349, %348 ]
  br label %352

352:                                              ; preds = %350, %239
  %353 = phi i32 [ 4, %239 ], [ %351, %350 ]
  br label %354

354:                                              ; preds = %352, %231
  %355 = phi i32 [ 3, %231 ], [ %353, %352 ]
  br label %356

356:                                              ; preds = %354, %223
  %357 = phi i32 [ 2, %223 ], [ %355, %354 ]
  br label %358

358:                                              ; preds = %356, %215
  %359 = phi i32 [ 1, %215 ], [ %357, %356 ]
  br label %360

360:                                              ; preds = %358, %207
  %361 = phi i32 [ 0, %207 ], [ %359, %358 ]
  br label %368

362:                                              ; preds = %175
  %363 = load ptr, ptr %4, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %363, i32 0, i32 3
  %365 = load i8, ptr %364, align 1, !tbaa !20
  %366 = zext i8 %365 to i32
  %367 = ashr i32 %366, 4
  br label %368

368:                                              ; preds = %362, %360
  %369 = phi i32 [ %361, %360 ], [ %367, %362 ]
  %370 = load ptr, ptr %11, align 8, !tbaa !5
  %371 = load i32, ptr %9, align 4, !tbaa !12
  %372 = mul i32 %371, 5
  %373 = add i32 %372, 0
  %374 = zext i32 %373 to i64
  %375 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %370, i64 %374
  %376 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %375, i32 0, i32 8
  %377 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %376, i32 0, i32 4
  store i32 %369, ptr %377, align 8, !tbaa !17
  br label %378

378:                                              ; preds = %368, %171
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  br label %379

379:                                              ; preds = %378
  %380 = load i32, ptr %9, align 4, !tbaa !12
  %381 = add i32 %380, 1
  store i32 %381, ptr %9, align 4, !tbaa !12
  br label %79, !llvm.loop !21

382:                                              ; preds = %79
  %383 = load ptr, ptr %3, align 8, !tbaa !5
  %384 = load i64, ptr %12, align 8, !tbaa !15
  call void @libxsmm_x86_instruction_alu_imm(ptr noundef %383, i32 noundef 30008, i32 noundef 4, i64 noundef %384)
  store i64 0, ptr %13, align 8, !tbaa !15
  br label %385

385:                                              ; preds = %438, %382
  %386 = load i64, ptr %13, align 8, !tbaa !15
  %387 = load i64, ptr %12, align 8, !tbaa !15
  %388 = udiv i64 %387, 32
  %389 = icmp ult i64 %386, %388
  br i1 %389, label %390, label %441

390:                                              ; preds = %385
  %391 = load ptr, ptr %3, align 8, !tbaa !5
  %392 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %391, i32 0, i32 6
  %393 = load i32, ptr %392, align 4, !tbaa !23
  %394 = icmp ult i32 %393, 1005
  br i1 %394, label %395, label %424

395:                                              ; preds = %390
  %396 = load ptr, ptr %3, align 8, !tbaa !5
  %397 = load ptr, ptr %11, align 8, !tbaa !5
  %398 = getelementptr inbounds i8, ptr %397, i64 0
  %399 = load i64, ptr %13, align 8, !tbaa !15
  %400 = mul i64 32, %399
  %401 = getelementptr inbounds i8, ptr %398, i64 %400
  call void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef %396, ptr noundef %401, ptr noundef @.str.4, i8 noundef signext 120, i32 noundef 0)
  %402 = load ptr, ptr %3, align 8, !tbaa !5
  %403 = load ptr, ptr %3, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %403, i32 0, i32 6
  %405 = load i32, ptr %404, align 4, !tbaa !23
  %406 = load i64, ptr %13, align 8, !tbaa !15
  %407 = mul i64 32, %406
  %408 = add i64 0, %407
  %409 = trunc i64 %408 to i32
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %402, i32 noundef %405, i32 noundef 537138704, i32 noundef 4, i32 noundef 127, i32 noundef 0, i32 noundef %409, i8 noundef signext 120, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 1)
  %410 = load ptr, ptr %3, align 8, !tbaa !5
  %411 = load ptr, ptr %11, align 8, !tbaa !5
  %412 = getelementptr inbounds i8, ptr %411, i64 16
  %413 = load i64, ptr %13, align 8, !tbaa !15
  %414 = mul i64 32, %413
  %415 = getelementptr inbounds i8, ptr %412, i64 %414
  call void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef %410, ptr noundef %415, ptr noundef @.str.4, i8 noundef signext 120, i32 noundef 0)
  %416 = load ptr, ptr %3, align 8, !tbaa !5
  %417 = load ptr, ptr %3, align 8, !tbaa !5
  %418 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %417, i32 0, i32 6
  %419 = load i32, ptr %418, align 4, !tbaa !23
  %420 = load i64, ptr %13, align 8, !tbaa !15
  %421 = mul i64 32, %420
  %422 = add i64 16, %421
  %423 = trunc i64 %422 to i32
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %416, i32 noundef %419, i32 noundef 537138704, i32 noundef 4, i32 noundef 127, i32 noundef 0, i32 noundef %423, i8 noundef signext 120, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 1)
  br label %437

424:                                              ; preds = %390
  %425 = load ptr, ptr %3, align 8, !tbaa !5
  %426 = load ptr, ptr %11, align 8, !tbaa !5
  %427 = load i64, ptr %13, align 8, !tbaa !15
  %428 = mul i64 32, %427
  %429 = getelementptr inbounds i8, ptr %426, i64 %428
  call void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef %425, ptr noundef %429, ptr noundef @.str.4, i8 noundef signext 121, i32 noundef 0)
  %430 = load ptr, ptr %3, align 8, !tbaa !5
  %431 = load ptr, ptr %3, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %431, i32 0, i32 6
  %433 = load i32, ptr %432, align 4, !tbaa !23
  %434 = load i64, ptr %13, align 8, !tbaa !15
  %435 = mul i64 32, %434
  %436 = trunc i64 %435 to i32
  call void @libxsmm_x86_instruction_vec_move(ptr noundef %430, i32 noundef %433, i32 noundef 537138704, i32 noundef 4, i32 noundef 127, i32 noundef 0, i32 noundef %436, i8 noundef signext 121, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 1)
  br label %437

437:                                              ; preds = %424, %395
  br label %438

438:                                              ; preds = %437
  %439 = load i64, ptr %13, align 8, !tbaa !15
  %440 = add i64 %439, 1
  store i64 %440, ptr %13, align 8, !tbaa !15
  br label %385, !llvm.loop !24

441:                                              ; preds = %385
  %442 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_alu_reg(ptr noundef %442, i32 noundef -1568407413, i32 noundef 4, i32 noundef 6)
  %443 = load i64, ptr %16, align 8, !tbaa !15
  %444 = urem i64 %443, 64
  %445 = icmp eq i64 %444, 0
  br i1 %445, label %446, label %448

446:                                              ; preds = %441
  %447 = load i64, ptr %16, align 8, !tbaa !15
  br label %453

448:                                              ; preds = %441
  %449 = load i64, ptr %16, align 8, !tbaa !15
  %450 = add i64 %449, 63
  %451 = udiv i64 %450, 64
  %452 = mul i64 %451, 64
  br label %453

453:                                              ; preds = %448, %446
  %454 = phi i64 [ %447, %446 ], [ %452, %448 ]
  store i64 %454, ptr %16, align 8, !tbaa !15
  %455 = load i64, ptr %16, align 8, !tbaa !15
  %456 = load i64, ptr %15, align 8, !tbaa !15
  %457 = mul i64 %455, %456
  store i64 %457, ptr %17, align 8, !tbaa !15
  %458 = load ptr, ptr %3, align 8, !tbaa !5
  %459 = load i64, ptr %17, align 8, !tbaa !15
  call void @libxsmm_x86_instruction_alu_imm(ptr noundef %458, i32 noundef 30008, i32 noundef 4, i64 noundef %459)
  %460 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !12
  %461 = icmp slt i32 %460, 0
  br i1 %461, label %462, label %470

462:                                              ; preds = %453
  %463 = load ptr, ptr @stderr, align 8, !tbaa !5
  %464 = load i64, ptr %15, align 8, !tbaa !15
  %465 = load i64, ptr %17, align 8, !tbaa !15
  %466 = uitofp i64 %465 to double
  %467 = fmul double 1.000000e+00, %466
  %468 = fdiv double %467, 1.024000e+03
  %469 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %463, ptr noundef @.str.5, i64 noundef %464, double noundef %468) #8
  br label %470

470:                                              ; preds = %462, %453
  %471 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_alu_reg(ptr noundef %471, i32 noundef -1568407413, i32 noundef 4, i32 noundef 2)
  %472 = load ptr, ptr %3, align 8, !tbaa !5
  %473 = load i64, ptr %16, align 8, !tbaa !15
  call void @libxsmm_x86_instruction_alu_imm_i64(ptr noundef %472, i32 noundef -1568407413, i32 noundef 1, i64 noundef %473)
  store ptr @libxsmm_reference_matequation, ptr %18, align 8, !tbaa !17
  %474 = load ptr, ptr %3, align 8, !tbaa !5
  %475 = load i64, ptr %18, align 8, !tbaa !17
  call void @libxsmm_x86_instruction_alu_imm_i64(ptr noundef %474, i32 noundef -1568407413, i32 noundef 0, i64 noundef %475)
  %476 = load ptr, ptr %5, align 8, !tbaa !5
  %477 = load ptr, ptr %3, align 8, !tbaa !5
  %478 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %477, i32 0, i32 2
  %479 = load i32, ptr %478, align 4, !tbaa !25
  %480 = add i32 %479, 1
  store i32 %480, ptr %478, align 4, !tbaa !25
  %481 = zext i32 %479 to i64
  %482 = getelementptr inbounds i8, ptr %476, i64 %481
  store i8 -1, ptr %482, align 1, !tbaa !17
  %483 = load ptr, ptr %5, align 8, !tbaa !5
  %484 = load ptr, ptr %3, align 8, !tbaa !5
  %485 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %484, i32 0, i32 2
  %486 = load i32, ptr %485, align 4, !tbaa !25
  %487 = add i32 %486, 1
  store i32 %487, ptr %485, align 4, !tbaa !25
  %488 = zext i32 %486 to i64
  %489 = getelementptr inbounds i8, ptr %483, i64 %488
  store i8 -48, ptr %489, align 1, !tbaa !17
  %490 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_alu_reg(ptr noundef %490, i32 noundef -1568407413, i32 noundef 5, i32 noundef 4)
  %491 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_pop_reg(ptr noundef %491, i32 noundef 5)
  %492 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_x86_instruction_close_stream_alt(ptr noundef %492, i32 noundef 1)
  %493 = load ptr, ptr %11, align 8, !tbaa !5
  call void @free(ptr noundef %493) #8
  store i32 0, ptr %19, align 4
  br label %494

494:                                              ; preds = %470, %31
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #8
  %495 = load i32, ptr %19, align 4
  switch i32 %495, label %497 [
    i32 0, label %496
    i32 1, label %496
  ]

496:                                              ; preds = %494, %494
  ret void

497:                                              ; preds = %494
  unreachable
}

declare ptr @libxsmm_meqn_get_equation(i32 noundef) #4

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

declare ptr @libxsmm_generator_matequation_find_op_at_timestamp(ptr noundef, i32 noundef) #4

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

declare void @libxsmm_reference_matequation(ptr noundef, ptr noundef, ptr noundef, i64 noundef) #4

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 0}
!10 = !{!"libxsmm_generated_code", !6, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28}
!11 = !{!"int", !7, i64 0}
!12 = !{!11, !11, i64 0}
!13 = !{!14, !11, i64 13}
!14 = !{!"libxsmm_meqn_descriptor", !11, i64 0, !11, i64 4, !11, i64 8, !7, i64 12, !11, i64 13}
!15 = !{!16, !16, i64 0}
!16 = !{!"long long", !7, i64 0}
!17 = !{!7, !7, i64 0}
!18 = !{i64 0, i64 8, !17, i64 8, i64 8, !17, i64 16, i64 8, !17, i64 24, i64 8, !17, i64 32, i64 4, !17, i64 36, i64 44, !17, i64 80, i64 4, !17, i64 84, i64 4, !17, i64 88, i64 4, !17, i64 92, i64 4, !17, i64 96, i64 4, !17, i64 100, i64 4, !17, i64 104, i64 4, !17, i64 108, i64 4, !17, i64 112, i64 4, !17, i64 116, i64 4, !17, i64 120, i64 4, !17, i64 124, i64 4, !17, i64 128, i64 4, !17, i64 132, i64 4, !17, i64 136, i64 4, !17, i64 140, i64 4, !17, i64 144, i64 4, !17, i64 148, i64 4, !17, i64 152, i64 4, !17, i64 156, i64 4, !17, i64 160, i64 4, !17, i64 164, i64 20, !17}
!19 = !{!14, !11, i64 8}
!20 = !{!14, !7, i64 12}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = !{!10, !11, i64 28}
!24 = distinct !{!24, !22}
!25 = !{!10, !11, i64 12}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.libxsmm_meqn_elem = type { ptr, ptr, ptr, ptr, i32, %union.libxsmm_meqn_info, i32, i32, %struct.libxsmm_meqn_tmp_info, i32, i32, i32, %union.libxsmm_meqn_fusion_info }
%union.libxsmm_meqn_info = type { %struct.libxsmm_meqn_arg }
%struct.libxsmm_meqn_arg = type { i32, i32, i32, i32, i32, i32, i32, %struct.libxsmm_matrix_arg_attributes }
%struct.libxsmm_matrix_arg_attributes = type { i32, i32, i32, i32 }
%struct.libxsmm_meqn_tmp_info = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%union.libxsmm_meqn_fusion_info = type { %struct.libxsmm_meqn_xgemm_fusion_info }
%struct.libxsmm_meqn_xgemm_fusion_info = type { i32, i32, i32, i32, i32 }

@stderr = external local_unnamed_addr global ptr, align 8
@.str.1 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [21 x i8], align 1
@libxsmm_verbosity = external local_unnamed_addr global i32, align 4
@.str.5 = external hidden unnamed_addr constant [90 x i8], align 1
@switch.table.libxsmm_generator_matequation_x86_reference_kernel = private unnamed_addr constant [15 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 6, i32 8, i32 8, i32 10, i32 10, i32 12, i32 12, i32 14], align 4

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #0

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

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

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

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

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

declare void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef, ptr noundef, ptr noundef, i8 noundef signext, i32 noundef) local_unnamed_addr #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) local_unnamed_addr #1

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

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

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

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_matequation_x86_reference_kernel(ptr noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #3 {
  %3 = load ptr, ptr %0, align 8, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %1, i64 13
  %5 = load i32, ptr %4, align 1, !tbaa !11
  %6 = tail call ptr @libxsmm_meqn_get_equation(i32 noundef %5) #7
  %7 = icmp eq ptr %6, null
  br i1 %7, label %8, label %11

8:                                                ; preds = %2
  %9 = load ptr, ptr @stderr, align 8, !tbaa !13
  %10 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %9, ptr noundef nonnull @.str.1) #8
  br label %120

11:                                               ; preds = %2
  %12 = load ptr, ptr %6, align 8, !tbaa !14
  %13 = getelementptr inbounds i8, ptr %12, i64 84
  %14 = load i32, ptr %13, align 4, !tbaa !14
  %15 = mul i32 %14, 5
  %16 = add i32 %15, 5
  %17 = zext i32 %16 to i64
  %18 = mul nuw nsw i64 %17, 184
  %19 = add nuw nsw i64 %18, 63
  %20 = and i64 %19, 2199023255488
  %calloc = tail call ptr @calloc(i64 1, i64 %20)
  %21 = getelementptr inbounds i8, ptr %12, i64 160
  %22 = load i32, ptr %21, align 8, !tbaa !14
  %23 = getelementptr inbounds i8, ptr %12, i64 80
  %24 = load i32, ptr %23, align 8, !tbaa !14
  %25 = getelementptr inbounds i8, ptr %12, i64 152
  %26 = load i32, ptr %25, align 8, !tbaa !14
  %27 = sext i32 %26 to i64
  tail call void @libxsmm_x86_instruction_open_stream_alt(ptr noundef nonnull %0, i32 noundef 7, i32 noundef 1) #7
  tail call void @libxsmm_x86_instruction_push_reg(ptr noundef nonnull %0, i32 noundef 5) #7
  tail call void @libxsmm_x86_instruction_alu_reg(ptr noundef nonnull %0, i32 noundef -1568407413, i32 noundef 4, i32 noundef 5) #7
  tail call void @libxsmm_x86_instruction_alu_imm_i64(ptr noundef nonnull %0, i32 noundef -1568407413, i32 noundef 0, i64 noundef -64) #7
  tail call void @libxsmm_x86_instruction_alu_reg(ptr noundef nonnull %0, i32 noundef 30001, i32 noundef 0, i32 noundef 4) #7
  %28 = getelementptr inbounds i8, ptr %1, i64 8
  %29 = getelementptr inbounds i8, ptr %1, i64 12
  %30 = zext i32 %15 to i64
  %31 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %calloc, i64 %30
  %32 = getelementptr inbounds i8, ptr %31, i64 80
  %33 = getelementptr inbounds i8, ptr %31, i64 100
  %34 = getelementptr inbounds i8, ptr %31, i64 104
  br label %35

35:                                               ; preds = %11, %77
  %.0120151 = phi i32 [ 0, %11 ], [ %78, %77 ]
  %36 = load ptr, ptr %6, align 8, !tbaa !14
  %37 = tail call ptr @libxsmm_generator_matequation_find_op_at_timestamp(ptr noundef %36, i32 noundef %.0120151) #7
  %.not130 = icmp eq ptr %37, null
  br i1 %.not130, label %.critedge137, label %38

38:                                               ; preds = %35
  %39 = mul i32 %.0120151, 5
  %40 = zext i32 %39 to i64
  %41 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %calloc, i64 %40
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %41, ptr noundef nonnull align 8 dereferenceable(184) %37, i64 184, i1 false), !tbaa.struct !15
  %42 = load ptr, ptr %37, align 8, !tbaa !14
  %.not131 = icmp eq ptr %42, null
  br i1 %.not131, label %.critedge, label %43

43:                                               ; preds = %38
  %44 = add i32 %39, 1
  %45 = zext i32 %44 to i64
  %46 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %calloc, i64 %45
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %46, ptr noundef nonnull align 8 dereferenceable(184) %42, i64 184, i1 false), !tbaa.struct !15
  br label %.critedge

.critedge:                                        ; preds = %38, %43
  %47 = getelementptr inbounds i8, ptr %37, i64 8
  %48 = load ptr, ptr %47, align 8, !tbaa !14
  %.not132 = icmp eq ptr %48, null
  br i1 %.not132, label %.critedge135, label %49

49:                                               ; preds = %.critedge
  %50 = add i32 %39, 2
  %51 = zext i32 %50 to i64
  %52 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %calloc, i64 %51
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %52, ptr noundef nonnull align 8 dereferenceable(184) %48, i64 184, i1 false), !tbaa.struct !15
  br label %.critedge135

.critedge135:                                     ; preds = %.critedge, %49
  %53 = getelementptr inbounds i8, ptr %37, i64 16
  %54 = load ptr, ptr %53, align 8, !tbaa !14
  %.not133 = icmp eq ptr %54, null
  br i1 %.not133, label %.critedge136, label %55

55:                                               ; preds = %.critedge135
  %56 = add i32 %39, 3
  %57 = zext i32 %56 to i64
  %58 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %calloc, i64 %57
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %58, ptr noundef nonnull align 8 dereferenceable(184) %54, i64 184, i1 false), !tbaa.struct !15
  br label %.critedge136

.critedge136:                                     ; preds = %.critedge135, %55
  %59 = getelementptr inbounds i8, ptr %37, i64 24
  %60 = load ptr, ptr %59, align 8, !tbaa !14
  %.not134 = icmp eq ptr %60, null
  br i1 %.not134, label %.critedge137, label %61

61:                                               ; preds = %.critedge136
  %62 = add i32 %39, 4
  %63 = zext i32 %62 to i64
  %64 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %calloc, i64 %63
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %64, ptr noundef nonnull align 8 dereferenceable(184) %60, i64 184, i1 false), !tbaa.struct !15
  br label %.critedge137

.critedge137:                                     ; preds = %35, %61, %.critedge136
  %65 = icmp eq i32 %.0120151, %14
  br i1 %65, label %66, label %77

66:                                               ; preds = %.critedge137
  store i32 -1, ptr %32, align 8, !tbaa !14
  %67 = load i32, ptr %28, align 1, !tbaa !16
  store i32 %67, ptr %33, align 4, !tbaa !14
  %68 = load i8, ptr %29, align 1, !tbaa !17
  %69 = icmp ult i8 %68, 16
  br i1 %69, label %70, label %71

70:                                               ; preds = %66
  %.not154 = icmp eq i8 %68, 15
  br i1 %.not154, label %75, label %switch.lookup

71:                                               ; preds = %66
  %72 = lshr i8 %68, 4
  %73 = zext nneg i8 %72 to i32
  br label %75

switch.lookup:                                    ; preds = %70
  %74 = zext nneg i8 %68 to i64
  %switch.gep = getelementptr inbounds [15 x i32], ptr @switch.table.libxsmm_generator_matequation_x86_reference_kernel, i64 0, i64 %74
  %switch.load = load i32, ptr %switch.gep, align 4
  br label %75

75:                                               ; preds = %70, %switch.lookup, %71
  %76 = phi i32 [ %73, %71 ], [ %switch.load, %switch.lookup ], [ 15, %70 ]
  store i32 %76, ptr %34, align 8, !tbaa !14
  br label %77

77:                                               ; preds = %75, %.critedge137
  %78 = add i32 %.0120151, 1
  %.not = icmp ugt i32 %78, %14
  br i1 %.not, label %79, label %35, !llvm.loop !18

79:                                               ; preds = %77
  %80 = sext i32 %22 to i64
  %81 = sext i32 %24 to i64
  %82 = mul nsw i64 %27, %80
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef nonnull %0, i32 noundef 30008, i32 noundef 4, i64 noundef %20) #7
  %.not153 = icmp eq i64 %20, 0
  br i1 %.not153, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %79
  %83 = lshr exact i64 %20, 5
  %84 = getelementptr inbounds i8, ptr %0, i64 28
  %85 = getelementptr inbounds i8, ptr %calloc, i64 16
  %umax = tail call i64 @llvm.umax.i64(i64 %83, i64 1)
  br label %86

86:                                               ; preds = %.lr.ph, %99
  %.0152 = phi i64 [ 0, %.lr.ph ], [ %100, %99 ]
  %87 = load i32, ptr %84, align 4, !tbaa !20
  %88 = icmp ult i32 %87, 1005
  %89 = shl nuw nsw i64 %.0152, 5
  %90 = getelementptr inbounds i8, ptr %calloc, i64 %89
  %91 = trunc i64 %89 to i32
  br i1 %88, label %92, label %97

92:                                               ; preds = %86
  tail call void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef nonnull %0, ptr noundef %90, ptr noundef nonnull @.str.4, i8 noundef signext 120, i32 noundef 0) #7
  %93 = load i32, ptr %84, align 4, !tbaa !20
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef nonnull %0, i32 noundef %93, i32 noundef 537138704, i32 noundef 4, i32 noundef 127, i32 noundef 0, i32 noundef %91, i8 noundef signext 120, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 1) #7
  %94 = getelementptr inbounds i8, ptr %85, i64 %89
  tail call void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef nonnull %0, ptr noundef nonnull %94, ptr noundef nonnull @.str.4, i8 noundef signext 120, i32 noundef 0) #7
  %95 = load i32, ptr %84, align 4, !tbaa !20
  %96 = or disjoint i32 %91, 16
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef nonnull %0, i32 noundef %95, i32 noundef 537138704, i32 noundef 4, i32 noundef 127, i32 noundef 0, i32 noundef %96, i8 noundef signext 120, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 1) #7
  br label %99

97:                                               ; preds = %86
  tail call void @libxsmm_x86_instruction_full_vec_load_of_constants(ptr noundef nonnull %0, ptr noundef %90, ptr noundef nonnull @.str.4, i8 noundef signext 121, i32 noundef 0) #7
  %98 = load i32, ptr %84, align 4, !tbaa !20
  tail call void @libxsmm_x86_instruction_vec_move(ptr noundef nonnull %0, i32 noundef %98, i32 noundef 537138704, i32 noundef 4, i32 noundef 127, i32 noundef 0, i32 noundef %91, i8 noundef signext 121, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 1) #7
  br label %99

99:                                               ; preds = %92, %97
  %100 = add nuw nsw i64 %.0152, 1
  %exitcond.not = icmp eq i64 %100, %umax
  br i1 %exitcond.not, label %._crit_edge, label %86, !llvm.loop !21

._crit_edge:                                      ; preds = %99, %79
  tail call void @libxsmm_x86_instruction_alu_reg(ptr noundef nonnull %0, i32 noundef -1568407413, i32 noundef 4, i32 noundef 6) #7
  %.biased = add nsw i64 %82, 63
  %101 = and i64 %.biased, -64
  %102 = mul i64 %101, %81
  tail call void @libxsmm_x86_instruction_alu_imm(ptr noundef nonnull %0, i32 noundef 30008, i32 noundef 4, i64 noundef %102) #7
  %103 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !22
  %104 = icmp slt i32 %103, 0
  br i1 %104, label %105, label %110

105:                                              ; preds = %._crit_edge
  %106 = load ptr, ptr @stderr, align 8, !tbaa !13
  %107 = uitofp i64 %102 to double
  %108 = fmul double %107, 0x3F50000000000000
  %109 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %106, ptr noundef nonnull @.str.5, i64 noundef %81, double noundef %108) #8
  br label %110

110:                                              ; preds = %105, %._crit_edge
  tail call void @libxsmm_x86_instruction_alu_reg(ptr noundef nonnull %0, i32 noundef -1568407413, i32 noundef 4, i32 noundef 2) #7
  tail call void @libxsmm_x86_instruction_alu_imm_i64(ptr noundef nonnull %0, i32 noundef -1568407413, i32 noundef 1, i64 noundef %101) #7
  tail call void @libxsmm_x86_instruction_alu_imm_i64(ptr noundef nonnull %0, i32 noundef -1568407413, i32 noundef 0, i64 noundef ptrtoint (ptr @libxsmm_reference_matequation to i64)) #7
  %111 = getelementptr inbounds i8, ptr %0, i64 12
  %112 = load i32, ptr %111, align 4, !tbaa !23
  %113 = add i32 %112, 1
  store i32 %113, ptr %111, align 4, !tbaa !23
  %114 = zext i32 %112 to i64
  %115 = getelementptr inbounds i8, ptr %3, i64 %114
  store i8 -1, ptr %115, align 1, !tbaa !14
  %116 = load i32, ptr %111, align 4, !tbaa !23
  %117 = add i32 %116, 1
  store i32 %117, ptr %111, align 4, !tbaa !23
  %118 = zext i32 %116 to i64
  %119 = getelementptr inbounds i8, ptr %3, i64 %118
  store i8 -48, ptr %119, align 1, !tbaa !14
  tail call void @libxsmm_x86_instruction_alu_reg(ptr noundef nonnull %0, i32 noundef -1568407413, i32 noundef 5, i32 noundef 4) #7
  tail call void @libxsmm_x86_instruction_pop_reg(ptr noundef nonnull %0, i32 noundef 5) #7
  tail call void @libxsmm_x86_instruction_close_stream_alt(ptr noundef nonnull %0, i32 noundef 1) #7
  tail call void @free(ptr noundef %calloc) #7
  br label %120

120:                                              ; preds = %110, %8
  ret void
}

declare ptr @libxsmm_meqn_get_equation(i32 noundef) local_unnamed_addr #1

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

declare ptr @libxsmm_generator_matequation_find_op_at_timestamp(ptr noundef, i32 noundef) local_unnamed_addr #1

declare void @libxsmm_reference_matequation(ptr noundef, ptr noundef, ptr noundef, i64 noundef) #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.umax.i64(i64, i64) #5

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

attributes #0 = { mustprogress nocallback nofree 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 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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 #4 = { nofree nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
attributes #7 = { nounwind }
attributes #8 = { cold nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"libxsmm_generated_code", !7, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!12, !10, i64 13}
!12 = !{!"libxsmm_meqn_descriptor", !10, i64 0, !10, i64 4, !10, i64 8, !8, i64 12, !10, i64 13}
!13 = !{!7, !7, i64 0}
!14 = !{!8, !8, i64 0}
!15 = !{i64 0, i64 8, !14, i64 8, i64 8, !14, i64 16, i64 8, !14, i64 24, i64 8, !14, i64 32, i64 4, !14, i64 36, i64 44, !14, i64 80, i64 4, !14, i64 84, i64 4, !14, i64 88, i64 4, !14, i64 92, i64 4, !14, i64 96, i64 4, !14, i64 100, i64 4, !14, i64 104, i64 4, !14, i64 108, i64 4, !14, i64 112, i64 4, !14, i64 116, i64 4, !14, i64 120, i64 4, !14, i64 124, i64 4, !14, i64 128, i64 4, !14, i64 132, i64 4, !14, i64 136, i64 4, !14, i64 140, i64 4, !14, i64 144, i64 4, !14, i64 148, i64 4, !14, i64 152, i64 4, !14, i64 156, i64 4, !14, i64 160, i64 4, !14, i64 164, i64 20, !14}
!16 = !{!12, !10, i64 8}
!17 = !{!12, !8, i64 12}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!6, !10, i64 28}
!21 = distinct !{!21, !19}
!22 = !{!10, !10, i64 0}
!23 = !{!6, !10, i64 12}


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass