; LLVM IR from libxsmm/libxsmm :: src (generator_aarch64_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 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [83 x i8], align 1
@__PRETTY_FUNCTION__.libxsmm_generator_matequation_aarch64_reference_kernel = external hidden unnamed_addr constant [119 x i8], align 1
@libxsmm_verbosity = external global i32, align 4
@.str.3 = 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_aarch64_instruction_open_stream(ptr noundef, i16 noundef zeroext) #4

declare void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef zeroext) #4

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

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

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

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

declare void @libxsmm_aarch64_instruction_close_stream(ptr noundef, i16 noundef zeroext) #4

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

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

36:                                               ; preds = %2
  %37 = load ptr, ptr @stderr, align 8, !tbaa !5
  %38 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %37, ptr noundef @.str) #8
  store i32 1, ptr %24, align 4
  br label %528

39:                                               ; preds = %2
  %40 = load ptr, ptr %12, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %40, i32 0, i32 0
  %42 = load ptr, ptr %41, align 8, !tbaa !17
  %43 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %42, i32 0, i32 7
  %44 = load i32, ptr %43, align 4, !tbaa !17
  store i32 %44, ptr %14, align 4, !tbaa !12
  %45 = load i32, ptr %14, align 4, !tbaa !12
  %46 = add i32 %45, 1
  %47 = mul i32 %46, 5
  %48 = zext i32 %47 to i64
  %49 = mul i64 %48, 184
  %50 = add i64 %49, 63
  %51 = udiv i64 %50, 64
  %52 = mul i64 %51, 64
  store i64 %52, ptr %16, align 8, !tbaa !15
  %53 = load i64, ptr %16, align 8, !tbaa !15
  %54 = call noalias ptr @malloc(i64 noundef %53) #9
  store ptr %54, ptr %15, align 8, !tbaa !5
  %55 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %55, ptr %22, align 8, !tbaa !5
  %56 = load ptr, ptr %15, align 8, !tbaa !5
  %57 = load i64, ptr %16, align 8, !tbaa !15
  call void @llvm.memset.p0.i64(ptr align 8 %56, i8 0, i64 %57, i1 false)
  %58 = load ptr, ptr %12, 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 11
  %62 = load i32, ptr %61, align 8, !tbaa !17
  %63 = sext i32 %62 to i64
  store i64 %63, ptr %18, align 8, !tbaa !15
  %64 = load ptr, ptr %12, 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 6
  %68 = load i32, ptr %67, align 8, !tbaa !17
  %69 = sext i32 %68 to i64
  store i64 %69, ptr %19, align 8, !tbaa !15
  %70 = load ptr, ptr %12, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %70, i32 0, i32 0
  %72 = load ptr, ptr %71, align 8, !tbaa !17
  %73 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %72, i32 0, i32 9
  %74 = load i32, ptr %73, align 8, !tbaa !17
  %75 = sext i32 %74 to i64
  %76 = load i64, ptr %18, align 8, !tbaa !15
  %77 = mul i64 %75, %76
  store i64 %77, ptr %20, align 8, !tbaa !15
  br label %78

78:                                               ; preds = %39
  %79 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_aarch64_instruction_open_stream(ptr noundef %79, i16 noundef zeroext 3072)
  %80 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %80, i32 noundef 285212678, i32 noundef 63, i32 noundef 61, i32 noundef 0, i8 noundef zeroext 0)
  %81 = load ptr, ptr %3, align 8, !tbaa !5
  %82 = load i32, ptr %6, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef %81, i32 noundef %82, i64 noundef -64)
  %83 = load ptr, ptr %3, align 8, !tbaa !5
  %84 = load i32, ptr %7, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %83, i32 noundef 285212678, i32 noundef 63, i32 noundef %84, i32 noundef 0, i8 noundef zeroext 0)
  %85 = load ptr, ptr %3, align 8, !tbaa !5
  %86 = load i32, ptr %7, align 4, !tbaa !12
  %87 = load i32, ptr %6, align 4, !tbaa !12
  %88 = load i32, ptr %7, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_shifted_reg(ptr noundef %85, i32 noundef 167772167, i32 noundef %86, i32 noundef %87, i32 noundef %88, i32 noundef 0, i32 noundef 0)
  %89 = load ptr, ptr %3, align 8, !tbaa !5
  %90 = load i32, ptr %7, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %89, i32 noundef 285212678, i32 noundef %90, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0)
  store i32 0, ptr %13, align 4, !tbaa !12
  br label %91

91:                                               ; preds = %391, %78
  %92 = load i32, ptr %13, align 4, !tbaa !12
  %93 = load i32, ptr %14, align 4, !tbaa !12
  %94 = icmp ule i32 %92, %93
  br i1 %94, label %95, label %394

95:                                               ; preds = %91
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #8
  %96 = load ptr, ptr %12, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.libxsmm_matrix_eqn, ptr %96, i32 0, i32 0
  %98 = load ptr, ptr %97, align 8, !tbaa !17
  %99 = load i32, ptr %13, align 4, !tbaa !12
  %100 = call ptr @libxsmm_generator_matequation_find_op_at_timestamp(ptr noundef %98, i32 noundef %99)
  store ptr %100, ptr %25, align 8, !tbaa !5
  %101 = load ptr, ptr %25, align 8, !tbaa !5
  %102 = icmp ne ptr %101, null
  br i1 %102, label %103, label %111

103:                                              ; preds = %95
  %104 = load ptr, ptr %15, align 8, !tbaa !5
  %105 = load i32, ptr %13, align 4, !tbaa !12
  %106 = mul i32 %105, 5
  %107 = add i32 %106, 0
  %108 = zext i32 %107 to i64
  %109 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %104, i64 %108
  %110 = load ptr, ptr %25, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %109, ptr align 8 %110, i64 184, i1 false), !tbaa.struct !18
  br label %111

111:                                              ; preds = %103, %95
  %112 = load ptr, ptr %25, align 8, !tbaa !5
  %113 = icmp ne ptr %112, null
  br i1 %113, label %114, label %129

114:                                              ; preds = %111
  %115 = load ptr, ptr %25, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %115, i32 0, i32 0
  %117 = load ptr, ptr %116, align 8, !tbaa !17
  %118 = icmp ne ptr %117, null
  br i1 %118, label %119, label %129

119:                                              ; preds = %114
  %120 = load ptr, ptr %15, align 8, !tbaa !5
  %121 = load i32, ptr %13, align 4, !tbaa !12
  %122 = mul i32 %121, 5
  %123 = add i32 %122, 1
  %124 = zext i32 %123 to i64
  %125 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %120, i64 %124
  %126 = load ptr, ptr %25, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %126, i32 0, i32 0
  %128 = load ptr, ptr %127, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %125, ptr align 8 %128, i64 184, i1 false), !tbaa.struct !18
  br label %129

129:                                              ; preds = %119, %114, %111
  %130 = load ptr, ptr %25, align 8, !tbaa !5
  %131 = icmp ne ptr %130, null
  br i1 %131, label %132, label %147

132:                                              ; preds = %129
  %133 = load ptr, ptr %25, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %133, i32 0, i32 1
  %135 = load ptr, ptr %134, align 8, !tbaa !17
  %136 = icmp ne ptr %135, null
  br i1 %136, label %137, label %147

137:                                              ; preds = %132
  %138 = load ptr, ptr %15, align 8, !tbaa !5
  %139 = load i32, ptr %13, align 4, !tbaa !12
  %140 = mul i32 %139, 5
  %141 = add i32 %140, 2
  %142 = zext i32 %141 to i64
  %143 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %138, i64 %142
  %144 = load ptr, ptr %25, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %144, i32 0, i32 1
  %146 = load ptr, ptr %145, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %143, ptr align 8 %146, i64 184, i1 false), !tbaa.struct !18
  br label %147

147:                                              ; preds = %137, %132, %129
  %148 = load ptr, ptr %25, align 8, !tbaa !5
  %149 = icmp ne ptr %148, null
  br i1 %149, label %150, label %165

150:                                              ; preds = %147
  %151 = load ptr, ptr %25, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %151, i32 0, i32 2
  %153 = load ptr, ptr %152, align 8, !tbaa !17
  %154 = icmp ne ptr %153, null
  br i1 %154, label %155, label %165

155:                                              ; preds = %150
  %156 = load ptr, ptr %15, align 8, !tbaa !5
  %157 = load i32, ptr %13, align 4, !tbaa !12
  %158 = mul i32 %157, 5
  %159 = add i32 %158, 3
  %160 = zext i32 %159 to i64
  %161 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %156, i64 %160
  %162 = load ptr, ptr %25, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %162, i32 0, i32 2
  %164 = load ptr, ptr %163, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %161, ptr align 8 %164, i64 184, i1 false), !tbaa.struct !18
  br label %165

165:                                              ; preds = %155, %150, %147
  %166 = load ptr, ptr %25, align 8, !tbaa !5
  %167 = icmp ne ptr %166, null
  br i1 %167, label %168, label %183

168:                                              ; preds = %165
  %169 = load ptr, ptr %25, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %169, i32 0, i32 3
  %171 = load ptr, ptr %170, align 8, !tbaa !17
  %172 = icmp ne ptr %171, null
  br i1 %172, label %173, label %183

173:                                              ; preds = %168
  %174 = load ptr, ptr %15, align 8, !tbaa !5
  %175 = load i32, ptr %13, align 4, !tbaa !12
  %176 = mul i32 %175, 5
  %177 = add i32 %176, 4
  %178 = zext i32 %177 to i64
  %179 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %174, i64 %178
  %180 = load ptr, ptr %25, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %180, i32 0, i32 3
  %182 = load ptr, ptr %181, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %179, ptr align 8 %182, i64 184, i1 false), !tbaa.struct !18
  br label %183

183:                                              ; preds = %173, %168, %165
  %184 = load i32, ptr %13, align 4, !tbaa !12
  %185 = load i32, ptr %14, align 4, !tbaa !12
  %186 = icmp eq i32 %184, %185
  br i1 %186, label %187, label %390

187:                                              ; preds = %183
  %188 = load ptr, ptr %15, align 8, !tbaa !5
  %189 = load i32, ptr %13, align 4, !tbaa !12
  %190 = mul i32 %189, 5
  %191 = add i32 %190, 0
  %192 = zext i32 %191 to i64
  %193 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %188, i64 %192
  %194 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %193, i32 0, i32 6
  store i32 -1, ptr %194, align 8, !tbaa !17
  %195 = load ptr, ptr %4, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %195, i32 0, i32 2
  %197 = load i32, ptr %196, align 1, !tbaa !19
  %198 = load ptr, ptr %15, align 8, !tbaa !5
  %199 = load i32, ptr %13, align 4, !tbaa !12
  %200 = mul i32 %199, 5
  %201 = add i32 %200, 0
  %202 = zext i32 %201 to i64
  %203 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %198, i64 %202
  %204 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %203, i32 0, i32 8
  %205 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %204, i32 0, i32 3
  store i32 %197, ptr %205, align 4, !tbaa !17
  %206 = load ptr, ptr %4, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %206, i32 0, i32 3
  %208 = load i8, ptr %207, align 1, !tbaa !20
  %209 = zext i8 %208 to i32
  %210 = ashr i32 %209, 4
  %211 = icmp eq i32 0, %210
  br i1 %211, label %212, label %374

212:                                              ; preds = %187
  %213 = load ptr, ptr %4, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %213, i32 0, i32 3
  %215 = load i8, ptr %214, align 1, !tbaa !20
  %216 = zext i8 %215 to i32
  %217 = and i32 %216, 15
  %218 = icmp eq i32 0, %217
  br i1 %218, label %219, label %220

219:                                              ; preds = %212
  br label %372

220:                                              ; preds = %212
  %221 = load ptr, ptr %4, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %221, i32 0, i32 3
  %223 = load i8, ptr %222, align 1, !tbaa !20
  %224 = zext i8 %223 to i32
  %225 = and i32 %224, 15
  %226 = icmp eq i32 1, %225
  br i1 %226, label %227, label %228

227:                                              ; preds = %220
  br label %370

228:                                              ; preds = %220
  %229 = load ptr, ptr %4, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %229, i32 0, i32 3
  %231 = load i8, ptr %230, align 1, !tbaa !20
  %232 = zext i8 %231 to i32
  %233 = and i32 %232, 15
  %234 = icmp eq i32 2, %233
  br i1 %234, label %235, label %236

235:                                              ; preds = %228
  br label %368

236:                                              ; preds = %228
  %237 = load ptr, ptr %4, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %237, i32 0, i32 3
  %239 = load i8, ptr %238, align 1, !tbaa !20
  %240 = zext i8 %239 to i32
  %241 = and i32 %240, 15
  %242 = icmp eq i32 3, %241
  br i1 %242, label %243, label %244

243:                                              ; preds = %236
  br label %366

244:                                              ; preds = %236
  %245 = load ptr, ptr %4, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %245, i32 0, i32 3
  %247 = load i8, ptr %246, align 1, !tbaa !20
  %248 = zext i8 %247 to i32
  %249 = and i32 %248, 15
  %250 = icmp eq i32 4, %249
  br i1 %250, label %251, label %252

251:                                              ; preds = %244
  br label %364

252:                                              ; preds = %244
  %253 = load ptr, ptr %4, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %253, i32 0, i32 3
  %255 = load i8, ptr %254, align 1, !tbaa !20
  %256 = zext i8 %255 to i32
  %257 = and i32 %256, 15
  %258 = icmp eq i32 5, %257
  br i1 %258, label %259, label %260

259:                                              ; preds = %252
  br label %362

260:                                              ; preds = %252
  %261 = load ptr, ptr %4, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %261, i32 0, i32 3
  %263 = load i8, ptr %262, align 1, !tbaa !20
  %264 = zext i8 %263 to i32
  %265 = and i32 %264, 15
  %266 = icmp eq i32 6, %265
  br i1 %266, label %267, label %268

267:                                              ; preds = %260
  br label %360

268:                                              ; preds = %260
  %269 = load ptr, ptr %4, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %269, i32 0, i32 3
  %271 = load i8, ptr %270, align 1, !tbaa !20
  %272 = zext i8 %271 to i32
  %273 = and i32 %272, 15
  %274 = icmp eq i32 7, %273
  br i1 %274, label %275, label %276

275:                                              ; preds = %268
  br label %358

276:                                              ; preds = %268
  %277 = load ptr, ptr %4, align 8, !tbaa !5
  %278 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %277, i32 0, i32 3
  %279 = load i8, ptr %278, align 1, !tbaa !20
  %280 = zext i8 %279 to i32
  %281 = and i32 %280, 15
  %282 = icmp eq i32 8, %281
  br i1 %282, label %283, label %284

283:                                              ; preds = %276
  br label %356

284:                                              ; preds = %276
  %285 = load ptr, ptr %4, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %285, i32 0, i32 3
  %287 = load i8, ptr %286, align 1, !tbaa !20
  %288 = zext i8 %287 to i32
  %289 = and i32 %288, 15
  %290 = icmp eq i32 9, %289
  br i1 %290, label %291, label %292

291:                                              ; preds = %284
  br label %354

292:                                              ; preds = %284
  %293 = load ptr, ptr %4, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %293, i32 0, i32 3
  %295 = load i8, ptr %294, align 1, !tbaa !20
  %296 = zext i8 %295 to i32
  %297 = and i32 %296, 15
  %298 = icmp eq i32 10, %297
  br i1 %298, label %299, label %300

299:                                              ; preds = %292
  br label %352

300:                                              ; preds = %292
  %301 = load ptr, ptr %4, align 8, !tbaa !5
  %302 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %301, i32 0, i32 3
  %303 = load i8, ptr %302, align 1, !tbaa !20
  %304 = zext i8 %303 to i32
  %305 = and i32 %304, 15
  %306 = icmp eq i32 11, %305
  br i1 %306, label %307, label %308

307:                                              ; preds = %300
  br label %350

308:                                              ; preds = %300
  %309 = load ptr, ptr %4, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %309, i32 0, i32 3
  %311 = load i8, ptr %310, align 1, !tbaa !20
  %312 = zext i8 %311 to i32
  %313 = and i32 %312, 15
  %314 = icmp eq i32 12, %313
  br i1 %314, label %315, label %316

315:                                              ; preds = %308
  br label %348

316:                                              ; preds = %308
  %317 = load ptr, ptr %4, align 8, !tbaa !5
  %318 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %317, i32 0, i32 3
  %319 = load i8, ptr %318, align 1, !tbaa !20
  %320 = zext i8 %319 to i32
  %321 = and i32 %320, 15
  %322 = icmp eq i32 13, %321
  br i1 %322, label %323, label %324

323:                                              ; preds = %316
  br label %346

324:                                              ; preds = %316
  %325 = load ptr, ptr %4, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %325, i32 0, i32 3
  %327 = load i8, ptr %326, align 1, !tbaa !20
  %328 = zext i8 %327 to i32
  %329 = and i32 %328, 15
  %330 = icmp eq i32 14, %329
  br i1 %330, label %331, label %332

331:                                              ; preds = %324
  br label %344

332:                                              ; preds = %324
  %333 = load ptr, ptr %4, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %333, i32 0, i32 3
  %335 = load i8, ptr %334, align 1, !tbaa !20
  %336 = zext i8 %335 to i32
  %337 = and i32 %336, 15
  %338 = icmp eq i32 15, %337
  br i1 %338, label %339, label %340

339:                                              ; preds = %332
  br label %342

340:                                              ; preds = %332
  call void @__assert_fail(ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 164, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_aarch64_reference_kernel) #10
  unreachable

341:                                              ; No predecessors!
  br label %342

342:                                              ; preds = %341, %339
  %343 = phi i32 [ 15, %339 ], [ 0, %341 ]
  br label %344

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

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

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

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

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

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

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

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

360:                                              ; preds = %358, %267
  %361 = phi i32 [ 6, %267 ], [ %359, %358 ]
  br label %362

362:                                              ; preds = %360, %259
  %363 = phi i32 [ 5, %259 ], [ %361, %360 ]
  br label %364

364:                                              ; preds = %362, %251
  %365 = phi i32 [ 4, %251 ], [ %363, %362 ]
  br label %366

366:                                              ; preds = %364, %243
  %367 = phi i32 [ 3, %243 ], [ %365, %364 ]
  br label %368

368:                                              ; preds = %366, %235
  %369 = phi i32 [ 2, %235 ], [ %367, %366 ]
  br label %370

370:                                              ; preds = %368, %227
  %371 = phi i32 [ 1, %227 ], [ %369, %368 ]
  br label %372

372:                                              ; preds = %370, %219
  %373 = phi i32 [ 0, %219 ], [ %371, %370 ]
  br label %380

374:                                              ; preds = %187
  %375 = load ptr, ptr %4, align 8, !tbaa !5
  %376 = getelementptr inbounds %struct.libxsmm_meqn_descriptor, ptr %375, i32 0, i32 3
  %377 = load i8, ptr %376, align 1, !tbaa !20
  %378 = zext i8 %377 to i32
  %379 = ashr i32 %378, 4
  br label %380

380:                                              ; preds = %374, %372
  %381 = phi i32 [ %373, %372 ], [ %379, %374 ]
  %382 = load ptr, ptr %15, align 8, !tbaa !5
  %383 = load i32, ptr %13, align 4, !tbaa !12
  %384 = mul i32 %383, 5
  %385 = add i32 %384, 0
  %386 = zext i32 %385 to i64
  %387 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %382, i64 %386
  %388 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %387, i32 0, i32 8
  %389 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %388, i32 0, i32 4
  store i32 %381, ptr %389, align 8, !tbaa !17
  br label %390

390:                                              ; preds = %380, %183
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #8
  br label %391

391:                                              ; preds = %390
  %392 = load i32, ptr %13, align 4, !tbaa !12
  %393 = add i32 %392, 1
  store i32 %393, ptr %13, align 4, !tbaa !12
  br label %91, !llvm.loop !21

394:                                              ; preds = %91
  %395 = load ptr, ptr %3, align 8, !tbaa !5
  %396 = load i32, ptr %10, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %395, i32 noundef 285212678, i32 noundef 63, i32 noundef %396, i32 noundef 0, i8 noundef zeroext 0)
  %397 = load ptr, ptr %3, align 8, !tbaa !5
  %398 = load i32, ptr %10, align 4, !tbaa !12
  %399 = load i32, ptr %6, align 4, !tbaa !12
  %400 = load i32, ptr %10, align 4, !tbaa !12
  %401 = load i64, ptr %16, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %397, i32 noundef 4097, i32 noundef %398, i32 noundef %399, i32 noundef %400, i64 noundef %401)
  %402 = load ptr, ptr %3, align 8, !tbaa !5
  %403 = load i32, ptr %10, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %402, i32 noundef 285212678, i32 noundef %403, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0)
  store i64 0, ptr %17, align 8, !tbaa !15
  br label %404

404:                                              ; preds = %439, %394
  %405 = load i64, ptr %17, align 8, !tbaa !15
  %406 = load i64, ptr %16, align 8, !tbaa !15
  %407 = udiv i64 %406, 32
  %408 = icmp ult i64 %405, %407
  br i1 %408, label %409, label %442

409:                                              ; preds = %404
  %410 = load ptr, ptr %3, align 8, !tbaa !5
  %411 = load i32, ptr %6, align 4, !tbaa !12
  %412 = load ptr, ptr %22, align 8, !tbaa !5
  %413 = getelementptr inbounds i64, ptr %412, i64 0
  %414 = load i64, ptr %413, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef %410, i32 noundef %411, i64 noundef %414)
  %415 = load ptr, ptr %3, align 8, !tbaa !5
  %416 = load i32, ptr %7, align 4, !tbaa !12
  %417 = load ptr, ptr %22, align 8, !tbaa !5
  %418 = getelementptr inbounds i64, ptr %417, i64 1
  %419 = load i64, ptr %418, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef %415, i32 noundef %416, i64 noundef %419)
  %420 = load ptr, ptr %3, align 8, !tbaa !5
  %421 = load i32, ptr %6, align 4, !tbaa !12
  %422 = load i32, ptr %7, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_pair_move(ptr noundef %420, i32 noundef 687865863, i32 noundef 63, i32 noundef 0, i32 noundef %421, i32 noundef %422)
  %423 = load ptr, ptr %3, align 8, !tbaa !5
  %424 = load i32, ptr %6, align 4, !tbaa !12
  %425 = load ptr, ptr %22, align 8, !tbaa !5
  %426 = getelementptr inbounds i64, ptr %425, i64 2
  %427 = load i64, ptr %426, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef %423, i32 noundef %424, i64 noundef %427)
  %428 = load ptr, ptr %3, align 8, !tbaa !5
  %429 = load i32, ptr %7, align 4, !tbaa !12
  %430 = load ptr, ptr %22, align 8, !tbaa !5
  %431 = getelementptr inbounds i64, ptr %430, i64 3
  %432 = load i64, ptr %431, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef %428, i32 noundef %429, i64 noundef %432)
  %433 = load ptr, ptr %3, align 8, !tbaa !5
  %434 = load i32, ptr %6, align 4, !tbaa !12
  %435 = load i32, ptr %7, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_pair_move(ptr noundef %433, i32 noundef 687865863, i32 noundef 63, i32 noundef 16, i32 noundef %434, i32 noundef %435)
  %436 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %436, i32 noundef 285212678, i32 noundef 63, i32 noundef 63, i32 noundef 32, i8 noundef zeroext 0)
  %437 = load ptr, ptr %22, align 8, !tbaa !5
  %438 = getelementptr inbounds i64, ptr %437, i64 4
  store ptr %438, ptr %22, align 8, !tbaa !5
  br label %439

439:                                              ; preds = %409
  %440 = load i64, ptr %17, align 8, !tbaa !15
  %441 = add i64 %440, 1
  store i64 %441, ptr %17, align 8, !tbaa !15
  br label %404, !llvm.loop !23

442:                                              ; preds = %404
  %443 = load ptr, ptr %3, align 8, !tbaa !5
  %444 = load i32, ptr %10, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %443, i32 noundef 285212678, i32 noundef 63, i32 noundef %444, i32 noundef 0, i8 noundef zeroext 0)
  %445 = load ptr, ptr %3, align 8, !tbaa !5
  %446 = load i32, ptr %10, align 4, !tbaa !12
  %447 = load i32, ptr %6, align 4, !tbaa !12
  %448 = load i32, ptr %10, align 4, !tbaa !12
  %449 = load i64, ptr %16, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %445, i32 noundef 4097, i32 noundef %446, i32 noundef %447, i32 noundef %448, i64 noundef %449)
  %450 = load ptr, ptr %3, align 8, !tbaa !5
  %451 = load i32, ptr %10, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %450, i32 noundef 285212678, i32 noundef %451, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0)
  %452 = load ptr, ptr %3, align 8, !tbaa !5
  %453 = load i32, ptr %6, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %452, i32 noundef 285212678, i32 noundef 63, i32 noundef %453, i32 noundef 0, i8 noundef zeroext 0)
  %454 = load i64, ptr %20, align 8, !tbaa !15
  %455 = urem i64 %454, 64
  %456 = icmp eq i64 %455, 0
  br i1 %456, label %457, label %459

457:                                              ; preds = %442
  %458 = load i64, ptr %20, align 8, !tbaa !15
  br label %464

459:                                              ; preds = %442
  %460 = load i64, ptr %20, align 8, !tbaa !15
  %461 = add i64 %460, 63
  %462 = udiv i64 %461, 64
  %463 = mul i64 %462, 64
  br label %464

464:                                              ; preds = %459, %457
  %465 = phi i64 [ %458, %457 ], [ %463, %459 ]
  store i64 %465, ptr %20, align 8, !tbaa !15
  %466 = load i64, ptr %20, align 8, !tbaa !15
  %467 = load i64, ptr %19, align 8, !tbaa !15
  %468 = mul i64 %466, %467
  store i64 %468, ptr %21, align 8, !tbaa !15
  %469 = load ptr, ptr %3, align 8, !tbaa !5
  %470 = load i32, ptr %10, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %469, i32 noundef 285212678, i32 noundef 63, i32 noundef %470, i32 noundef 0, i8 noundef zeroext 0)
  %471 = load ptr, ptr %3, align 8, !tbaa !5
  %472 = load i32, ptr %10, align 4, !tbaa !12
  %473 = load i32, ptr %7, align 4, !tbaa !12
  %474 = load i32, ptr %10, align 4, !tbaa !12
  %475 = load i64, ptr %21, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %471, i32 noundef 4097, i32 noundef %472, i32 noundef %473, i32 noundef %474, i64 noundef %475)
  %476 = load ptr, ptr %3, align 8, !tbaa !5
  %477 = load i32, ptr %10, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %476, i32 noundef 285212678, i32 noundef %477, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0)
  %478 = load ptr, ptr %3, align 8, !tbaa !5
  %479 = load i32, ptr %7, align 4, !tbaa !12
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %478, i32 noundef 285212678, i32 noundef 63, i32 noundef %479, i32 noundef 0, i8 noundef zeroext 0)
  %480 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !12
  %481 = icmp slt i32 %480, 0
  br i1 %481, label %482, label %490

482:                                              ; preds = %464
  %483 = load ptr, ptr @stderr, align 8, !tbaa !5
  %484 = load i64, ptr %19, align 8, !tbaa !15
  %485 = load i64, ptr %21, align 8, !tbaa !15
  %486 = uitofp i64 %485 to double
  %487 = fmul double 1.000000e+00, %486
  %488 = fdiv double %487, 1.024000e+03
  %489 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %483, ptr noundef @.str.3, i64 noundef %484, double noundef %488) #8
  br label %490

490:                                              ; preds = %482, %464
  %491 = load ptr, ptr %3, align 8, !tbaa !5
  %492 = load i32, ptr %8, align 4, !tbaa !12
  %493 = load i64, ptr %20, align 8, !tbaa !15
  call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef %491, i32 noundef %492, i64 noundef %493)
  store ptr @libxsmm_reference_matequation, ptr %23, align 8, !tbaa !17
  %494 = load ptr, ptr %3, align 8, !tbaa !5
  %495 = load i32, ptr %9, align 4, !tbaa !12
  %496 = load i64, ptr %23, align 8, !tbaa !17
  call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef %494, i32 noundef %495, i64 noundef %496)
  %497 = load ptr, ptr %5, align 8, !tbaa !5
  %498 = load ptr, ptr %3, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %498, i32 0, i32 2
  %500 = load i32, ptr %499, align 4, !tbaa !24
  %501 = add i32 %500, 1
  store i32 %501, ptr %499, align 4, !tbaa !24
  %502 = zext i32 %500 to i64
  %503 = getelementptr inbounds i8, ptr %497, i64 %502
  store i8 -128, ptr %503, align 1, !tbaa !17
  %504 = load ptr, ptr %5, align 8, !tbaa !5
  %505 = load ptr, ptr %3, align 8, !tbaa !5
  %506 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %505, i32 0, i32 2
  %507 = load i32, ptr %506, align 4, !tbaa !24
  %508 = add i32 %507, 1
  store i32 %508, ptr %506, align 4, !tbaa !24
  %509 = zext i32 %507 to i64
  %510 = getelementptr inbounds i8, ptr %504, i64 %509
  store i8 0, ptr %510, align 1, !tbaa !17
  %511 = load ptr, ptr %5, align 8, !tbaa !5
  %512 = load ptr, ptr %3, align 8, !tbaa !5
  %513 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %512, i32 0, i32 2
  %514 = load i32, ptr %513, align 4, !tbaa !24
  %515 = add i32 %514, 1
  store i32 %515, ptr %513, align 4, !tbaa !24
  %516 = zext i32 %514 to i64
  %517 = getelementptr inbounds i8, ptr %511, i64 %516
  store i8 63, ptr %517, align 1, !tbaa !17
  %518 = load ptr, ptr %5, align 8, !tbaa !5
  %519 = load ptr, ptr %3, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %519, i32 0, i32 2
  %521 = load i32, ptr %520, align 4, !tbaa !24
  %522 = add i32 %521, 1
  store i32 %522, ptr %520, align 4, !tbaa !24
  %523 = zext i32 %521 to i64
  %524 = getelementptr inbounds i8, ptr %518, i64 %523
  store i8 -42, ptr %524, align 1, !tbaa !17
  %525 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef %525, i32 noundef 285212678, i32 noundef 61, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0)
  %526 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libxsmm_aarch64_instruction_close_stream(ptr noundef %526, i16 noundef zeroext 3072)
  %527 = load ptr, ptr %15, align 8, !tbaa !5
  call void @free(ptr noundef %527) #8
  store i32 0, ptr %24, align 4
  br label %528

528:                                              ; preds = %490, %36
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  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 4, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 4, 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 4, 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
  %529 = load i32, ptr %24, align 4
  switch i32 %529, label %531 [
    i32 0, label %530
    i32 1, label %530
  ]

530:                                              ; preds = %528, %528
  ret void

531:                                              ; preds = %528
  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 = distinct !{!23, !22}
!24 = !{!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 = external hidden unnamed_addr constant [60 x i8], align 1
@libxsmm_verbosity = external local_unnamed_addr global i32, align 4
@.str.3 = external hidden unnamed_addr constant [90 x i8], align 1
@switch.table.libxsmm_generator_matequation_aarch64_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_aarch64_instruction_open_stream(ptr noundef, i16 noundef zeroext) local_unnamed_addr #1

declare void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef zeroext) local_unnamed_addr #1

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

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

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

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

declare void @libxsmm_aarch64_instruction_close_stream(ptr noundef, i16 noundef zeroext) 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_aarch64_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) #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_aarch64_instruction_open_stream(ptr noundef nonnull %0, i16 noundef zeroext 3072) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 61, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef nonnull %0, i32 noundef 33, i64 noundef -64) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 34, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_shifted_reg(ptr noundef nonnull %0, i32 noundef 167772167, i32 noundef 34, i32 noundef 33, i32 noundef 34, i32 noundef 0, i32 noundef 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 34, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0) #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
  %.0190 = 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 %.0190) #7
  %.not169 = icmp eq ptr %37, null
  br i1 %.not169, label %.critedge176, label %38

38:                                               ; preds = %35
  %39 = mul i32 %.0190, 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
  %.not170 = icmp eq ptr %42, null
  br i1 %.not170, 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
  %.not171 = icmp eq ptr %48, null
  br i1 %.not171, label %.critedge174, 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 %.critedge174

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

55:                                               ; preds = %.critedge174
  %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 %.critedge175

.critedge175:                                     ; preds = %.critedge174, %55
  %59 = getelementptr inbounds i8, ptr %37, i64 24
  %60 = load ptr, ptr %59, align 8, !tbaa !14
  %.not173 = icmp eq ptr %60, null
  br i1 %.not173, label %.critedge176, label %61

61:                                               ; preds = %.critedge175
  %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 %.critedge176

.critedge176:                                     ; preds = %35, %61, %.critedge175
  %65 = icmp eq i32 %.0190, %14
  br i1 %65, label %66, label %77

66:                                               ; preds = %.critedge176
  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
  %.not194 = icmp eq i8 %68, 15
  br i1 %.not194, 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_aarch64_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, %.critedge176
  %78 = add i32 %.0190, 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_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 37, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef nonnull %0, i32 noundef 4097, i32 noundef 37, i32 noundef 33, i32 noundef 37, i64 noundef %20) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 37, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0) #7
  %.not193 = icmp eq i64 %20, 0
  br i1 %.not193, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %79
  %83 = lshr exact i64 %20, 5
  %umax = tail call i64 @llvm.umax.i64(i64 %83, i64 1)
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %.0158192 = phi ptr [ %91, %.lr.ph ], [ %calloc, %.lr.ph.preheader ]
  %.0159191 = phi i64 [ %92, %.lr.ph ], [ 0, %.lr.ph.preheader ]
  %84 = load i64, ptr %.0158192, align 8, !tbaa !20
  tail call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef nonnull %0, i32 noundef 33, i64 noundef %84) #7
  %85 = getelementptr inbounds i8, ptr %.0158192, i64 8
  %86 = load i64, ptr %85, align 8, !tbaa !20
  tail call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef nonnull %0, i32 noundef 34, i64 noundef %86) #7
  tail call void @libxsmm_aarch64_instruction_alu_pair_move(ptr noundef nonnull %0, i32 noundef 687865863, i32 noundef 63, i32 noundef 0, i32 noundef 33, i32 noundef 34) #7
  %87 = getelementptr inbounds i8, ptr %.0158192, i64 16
  %88 = load i64, ptr %87, align 8, !tbaa !20
  tail call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef nonnull %0, i32 noundef 33, i64 noundef %88) #7
  %89 = getelementptr inbounds i8, ptr %.0158192, i64 24
  %90 = load i64, ptr %89, align 8, !tbaa !20
  tail call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef nonnull %0, i32 noundef 34, i64 noundef %90) #7
  tail call void @libxsmm_aarch64_instruction_alu_pair_move(ptr noundef nonnull %0, i32 noundef 687865863, i32 noundef 63, i32 noundef 16, i32 noundef 33, i32 noundef 34) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 63, i32 noundef 32, i8 noundef zeroext 0) #7
  %91 = getelementptr inbounds i8, ptr %.0158192, i64 32
  %92 = add nuw nsw i64 %.0159191, 1
  %exitcond.not = icmp eq i64 %92, %umax
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !22

._crit_edge:                                      ; preds = %.lr.ph, %79
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 37, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef nonnull %0, i32 noundef 4097, i32 noundef 37, i32 noundef 33, i32 noundef 37, i64 noundef %20) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 37, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 33, i32 noundef 0, i8 noundef zeroext 0) #7
  %.biased = add nsw i64 %82, 63
  %93 = and i64 %.biased, -64
  %94 = mul i64 %93, %81
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 37, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef nonnull %0, i32 noundef 4097, i32 noundef 37, i32 noundef 34, i32 noundef 37, i64 noundef %94) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 37, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 63, i32 noundef 34, i32 noundef 0, i8 noundef zeroext 0) #7
  %95 = load i32, ptr @libxsmm_verbosity, align 4, !tbaa !23
  %96 = icmp slt i32 %95, 0
  br i1 %96, label %97, label %102

97:                                               ; preds = %._crit_edge
  %98 = load ptr, ptr @stderr, align 8, !tbaa !13
  %99 = uitofp i64 %94 to double
  %100 = fmul double %99, 0x3F50000000000000
  %101 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %98, ptr noundef nonnull @.str.3, i64 noundef %81, double noundef %100) #8
  br label %102

102:                                              ; preds = %97, %._crit_edge
  tail call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef nonnull %0, i32 noundef 35, i64 noundef %93) #7
  tail call void @libxsmm_aarch64_instruction_alu_set_imm64(ptr noundef nonnull %0, i32 noundef 36, i64 noundef ptrtoint (ptr @libxsmm_reference_matequation to i64)) #7
  %103 = getelementptr inbounds i8, ptr %0, i64 12
  %104 = load i32, ptr %103, align 4, !tbaa !24
  %105 = add i32 %104, 1
  store i32 %105, ptr %103, align 4, !tbaa !24
  %106 = zext i32 %104 to i64
  %107 = getelementptr inbounds i8, ptr %3, i64 %106
  store i8 -128, ptr %107, align 1, !tbaa !14
  %108 = load i32, ptr %103, align 4, !tbaa !24
  %109 = add i32 %108, 1
  store i32 %109, ptr %103, align 4, !tbaa !24
  %110 = zext i32 %108 to i64
  %111 = getelementptr inbounds i8, ptr %3, i64 %110
  store i8 0, ptr %111, align 1, !tbaa !14
  %112 = load i32, ptr %103, align 4, !tbaa !24
  %113 = add i32 %112, 1
  store i32 %113, ptr %103, align 4, !tbaa !24
  %114 = zext i32 %112 to i64
  %115 = getelementptr inbounds i8, ptr %3, i64 %114
  store i8 63, ptr %115, align 1, !tbaa !14
  %116 = load i32, ptr %103, align 4, !tbaa !24
  %117 = add i32 %116, 1
  store i32 %117, ptr %103, align 4, !tbaa !24
  %118 = zext i32 %116 to i64
  %119 = getelementptr inbounds i8, ptr %3, i64 %118
  store i8 -42, ptr %119, align 1, !tbaa !14
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm12(ptr noundef nonnull %0, i32 noundef 285212678, i32 noundef 61, i32 noundef 63, i32 noundef 0, i8 noundef zeroext 0) #7
  tail call void @libxsmm_aarch64_instruction_close_stream(ptr noundef nonnull %0, i16 noundef zeroext 3072) #7
  tail call void @free(ptr noundef %calloc) #7
  br label %120

120:                                              ; preds = %102, %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 = !{!21, !21, i64 0}
!21 = !{!"long long", !8, i64 0}
!22 = distinct !{!22, !19}
!23 = !{!10, !10, i64 0}
!24 = !{!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