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

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.libxsmm_descriptor_blob = type { [96 x i8] }
%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 }
%struct.libxsmm_meltw_unary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }
%struct.libxsmm_matrix_op_arg = type { ptr, ptr, ptr, ptr }
%struct.libxsmm_matrix_arg = type { ptr, ptr, ptr, ptr, ptr, ptr }
%struct.libxsmm_meltw_binary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }
%struct.libxsmm_meltw_ternary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }
%struct.libxsmm_meqn_unary_op = type { i32, i32, i32, i32 }
%struct.libxsmm_meqn_binary_op = type { i32, i32, i32, i32, i32, i32 }
%struct.libxsmm_meqn_ternary_op = type { i32, i32, i32, i32, i32, i32 }

@.str.4 = external hidden unnamed_addr constant [394 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [92 x i8], align 1
@__PRETTY_FUNCTION__.libxsmm_reference_matequation = external hidden unnamed_addr constant [79 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [389 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [394 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [389 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [394 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [389 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef, ptr noundef, i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #0

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #0

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef) #2

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_reference_matequation(ptr noundef %0, ptr noundef %1, ptr noundef %2, i64 noundef %3) #0 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca %struct.libxsmm_descriptor_blob, align 1
  %12 = alloca ptr, align 8
  %13 = alloca %struct.libxsmm_meqn_elem, align 8
  %14 = alloca %struct.libxsmm_meqn_elem, align 8
  %15 = alloca i32, align 4
  %16 = alloca %struct.libxsmm_meltw_unary_param, align 8
  %17 = alloca %struct.libxsmm_meqn_elem, align 8
  %18 = alloca %struct.libxsmm_meltw_binary_param, align 8
  %19 = alloca %struct.libxsmm_meqn_elem, align 8
  %20 = alloca %struct.libxsmm_meqn_elem, align 8
  %21 = alloca i32, align 4
  %22 = alloca %struct.libxsmm_meltw_ternary_param, align 8
  %23 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  store i64 %3, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  store i32 0, ptr %9, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  %24 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %24, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 96, ptr %11) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  store ptr null, ptr %12, align 8, !tbaa !5
  store i32 0, ptr %9, align 4, !tbaa !11
  br label %25

25:                                               ; preds = %965, %4
  call void @llvm.lifetime.start.p0(i64 184, ptr %13) #5
  %26 = load ptr, ptr %10, align 8, !tbaa !5
  %27 = load i32, ptr %9, align 4, !tbaa !11
  %28 = mul nsw i32 5, %27
  %29 = add nsw i32 %28, 0
  %30 = sext i32 %29 to i64
  %31 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %26, i64 %30
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %13, ptr align 8 %31, i64 184, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 184, ptr %14) #5
  %32 = load ptr, ptr %10, align 8, !tbaa !5
  %33 = load i32, ptr %9, align 4, !tbaa !11
  %34 = mul nsw i32 5, %33
  %35 = add nsw i32 %34, 1
  %36 = sext i32 %35 to i64
  %37 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %32, i64 %36
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %14, ptr align 8 %37, i64 184, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #5
  %38 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 6
  %39 = load i32, ptr %38, align 8, !tbaa !14
  %40 = icmp eq i32 %39, -1
  %41 = zext i1 %40 to i64
  %42 = select i1 %40, i32 1, i32 0
  store i32 %42, ptr %15, align 4, !tbaa !11
  %43 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 4
  %44 = load i32, ptr %43, align 8, !tbaa !14
  %45 = icmp eq i32 %44, 1
  br i1 %45, label %46, label %429

46:                                               ; preds = %25
  call void @llvm.lifetime.start.p0(i64 128, ptr %16) #5
  %47 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %48 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %47, i32 0, i32 0
  %49 = load i32, ptr %48, align 4, !tbaa !14
  %50 = call i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef %49)
  %51 = icmp sgt i32 %50, 0
  br i1 %51, label %58, label %52

52:                                               ; preds = %46
  %53 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %54 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %53, i32 0, i32 0
  %55 = load i32, ptr %54, align 4, !tbaa !14
  %56 = call i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef %55)
  %57 = icmp sgt i32 %56, 0
  br i1 %57, label %58, label %167

58:                                               ; preds = %52, %46
  %59 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %60 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %59, i32 0, i32 4
  %61 = load i32, ptr %60, align 8, !tbaa !14
  %62 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %63 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %62, i32 0, i32 2
  %64 = load i32, ptr %63, align 4, !tbaa !14
  %65 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %66 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %65, i32 0, i32 4
  %67 = load i32, ptr %66, align 8, !tbaa !14
  %68 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %69 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %68, i32 0, i32 1
  %70 = load i32, ptr %69, align 4, !tbaa !14
  %71 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %72 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %71, i32 0, i32 2
  %73 = load i32, ptr %72, align 8, !tbaa !14
  %74 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %75 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %74, i32 0, i32 3
  %76 = load i32, ptr %75, align 4, !tbaa !14
  %77 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %78 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %77, i32 0, i32 3
  %79 = load i32, ptr %78, align 4, !tbaa !14
  %80 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %81 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %80, i32 0, i32 1
  %82 = load i32, ptr %81, align 4, !tbaa !14
  %83 = trunc i32 %82 to i16
  %84 = zext i16 %83 to i32
  %85 = icmp eq i32 0, %84
  br i1 %85, label %93, label %86

86:                                               ; preds = %58
  %87 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %88 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %87, i32 0, i32 1
  %89 = load i32, ptr %88, align 4, !tbaa !14
  %90 = trunc i32 %89 to i16
  %91 = zext i16 %90 to i32
  %92 = icmp slt i32 0, %91
  br i1 %92, label %93, label %117

93:                                               ; preds = %86, %58
  %94 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %95 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %94, i32 0, i32 1
  %96 = load i32, ptr %95, align 4, !tbaa !14
  %97 = zext i32 %96 to i64
  %98 = mul i64 1, %97
  %99 = icmp ult i64 %98, 65535
  br i1 %99, label %100, label %106

100:                                              ; preds = %93
  %101 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %102 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %101, i32 0, i32 1
  %103 = load i32, ptr %102, align 4, !tbaa !14
  %104 = zext i32 %103 to i64
  %105 = mul i64 1, %104
  br label %107

106:                                              ; preds = %93
  br label %107

107:                                              ; preds = %106, %100
  %108 = phi i64 [ %105, %100 ], [ 65535, %106 ]
  %109 = icmp ule i64 %108, 65535
  br i1 %109, label %110, label %117

110:                                              ; preds = %107
  %111 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %112 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %111, i32 0, i32 1
  %113 = load i32, ptr %112, align 4, !tbaa !14
  %114 = uitofp i32 %113 to double
  %115 = fcmp ole double 0.000000e+00, %114
  br i1 %115, label %116, label %117

116:                                              ; preds = %110
  br label %118

117:                                              ; preds = %110, %107, %86
  call void @__assert_fail(ptr noundef @.str.4, ptr noundef @.str.5, i32 noundef 119, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

118:                                              ; preds = %116
  %119 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %120 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %119, i32 0, i32 1
  %121 = load i32, ptr %120, align 4, !tbaa !14
  %122 = trunc i32 %121 to i16
  %123 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %124 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %123, i32 0, i32 0
  %125 = load i32, ptr %124, align 4, !tbaa !14
  %126 = trunc i32 %125 to i16
  %127 = zext i16 %126 to i32
  %128 = icmp eq i32 0, %127
  br i1 %128, label %136, label %129

129:                                              ; preds = %118
  %130 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %131 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %130, i32 0, i32 0
  %132 = load i32, ptr %131, align 4, !tbaa !14
  %133 = trunc i32 %132 to i16
  %134 = zext i16 %133 to i32
  %135 = icmp slt i32 0, %134
  br i1 %135, label %136, label %160

136:                                              ; preds = %129, %118
  %137 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %138 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %137, i32 0, i32 0
  %139 = load i32, ptr %138, align 4, !tbaa !14
  %140 = zext i32 %139 to i64
  %141 = mul i64 1, %140
  %142 = icmp ult i64 %141, 65535
  br i1 %142, label %143, label %149

143:                                              ; preds = %136
  %144 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %145 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %144, i32 0, i32 0
  %146 = load i32, ptr %145, align 4, !tbaa !14
  %147 = zext i32 %146 to i64
  %148 = mul i64 1, %147
  br label %150

149:                                              ; preds = %136
  br label %150

150:                                              ; preds = %149, %143
  %151 = phi i64 [ %148, %143 ], [ 65535, %149 ]
  %152 = icmp ule i64 %151, 65535
  br i1 %152, label %153, label %160

153:                                              ; preds = %150
  %154 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %155 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %154, i32 0, i32 0
  %156 = load i32, ptr %155, align 4, !tbaa !14
  %157 = uitofp i32 %156 to double
  %158 = fcmp ole double 0.000000e+00, %157
  br i1 %158, label %159, label %160

159:                                              ; preds = %153
  br label %161

160:                                              ; preds = %153, %150, %129
  call void @__assert_fail(ptr noundef @.str.6, ptr noundef @.str.5, i32 noundef 119, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

161:                                              ; preds = %159
  %162 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %163 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %162, i32 0, i32 0
  %164 = load i32, ptr %163, align 4, !tbaa !14
  %165 = trunc i32 %164 to i16
  %166 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %11, i32 noundef %61, i32 noundef 15, i32 noundef 15, i32 noundef %64, i32 noundef %67, i32 noundef %70, i32 noundef %73, i32 noundef %76, i32 noundef %79, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %122, i16 noundef zeroext %165, i8 noundef zeroext 1)
  store ptr %166, ptr %12, align 8, !tbaa !5
  br label %396

167:                                              ; preds = %52
  %168 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %169 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %168, i32 0, i32 0
  %170 = load i32, ptr %169, align 4, !tbaa !14
  %171 = icmp eq i32 %170, 1
  br i1 %171, label %172, label %286

172:                                              ; preds = %167
  %173 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %174 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %173, i32 0, i32 4
  %175 = load i32, ptr %174, align 8, !tbaa !14
  %176 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %177 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %176, i32 0, i32 4
  %178 = load i32, ptr %177, align 8, !tbaa !14
  %179 = icmp ne i32 %175, %178
  br i1 %179, label %180, label %286

180:                                              ; preds = %172
  %181 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %182 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %181, i32 0, i32 4
  %183 = load i32, ptr %182, align 8, !tbaa !14
  %184 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %185 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %184, i32 0, i32 4
  %186 = load i32, ptr %185, align 8, !tbaa !14
  %187 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %188 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %187, i32 0, i32 1
  %189 = load i32, ptr %188, align 4, !tbaa !14
  %190 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %191 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %190, i32 0, i32 2
  %192 = load i32, ptr %191, align 8, !tbaa !14
  %193 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %194 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %193, i32 0, i32 3
  %195 = load i32, ptr %194, align 4, !tbaa !14
  %196 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %197 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %196, i32 0, i32 3
  %198 = load i32, ptr %197, align 4, !tbaa !14
  %199 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %200 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %199, i32 0, i32 1
  %201 = load i32, ptr %200, align 4, !tbaa !14
  %202 = trunc i32 %201 to i16
  %203 = zext i16 %202 to i32
  %204 = icmp eq i32 0, %203
  br i1 %204, label %212, label %205

205:                                              ; preds = %180
  %206 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %207 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %206, i32 0, i32 1
  %208 = load i32, ptr %207, align 4, !tbaa !14
  %209 = trunc i32 %208 to i16
  %210 = zext i16 %209 to i32
  %211 = icmp slt i32 0, %210
  br i1 %211, label %212, label %236

212:                                              ; preds = %205, %180
  %213 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %214 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %213, i32 0, i32 1
  %215 = load i32, ptr %214, align 4, !tbaa !14
  %216 = zext i32 %215 to i64
  %217 = mul i64 1, %216
  %218 = icmp ult i64 %217, 65535
  br i1 %218, label %219, label %225

219:                                              ; preds = %212
  %220 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %221 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %220, i32 0, i32 1
  %222 = load i32, ptr %221, align 4, !tbaa !14
  %223 = zext i32 %222 to i64
  %224 = mul i64 1, %223
  br label %226

225:                                              ; preds = %212
  br label %226

226:                                              ; preds = %225, %219
  %227 = phi i64 [ %224, %219 ], [ 65535, %225 ]
  %228 = icmp ule i64 %227, 65535
  br i1 %228, label %229, label %236

229:                                              ; preds = %226
  %230 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %231 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %230, i32 0, i32 1
  %232 = load i32, ptr %231, align 4, !tbaa !14
  %233 = uitofp i32 %232 to double
  %234 = fcmp ole double 0.000000e+00, %233
  br i1 %234, label %235, label %236

235:                                              ; preds = %229
  br label %237

236:                                              ; preds = %229, %226, %205
  call void @__assert_fail(ptr noundef @.str.4, ptr noundef @.str.5, i32 noundef 124, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

237:                                              ; preds = %235
  %238 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %239 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %238, i32 0, i32 1
  %240 = load i32, ptr %239, align 4, !tbaa !14
  %241 = trunc i32 %240 to i16
  %242 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %243 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %242, i32 0, i32 0
  %244 = load i32, ptr %243, align 4, !tbaa !14
  %245 = trunc i32 %244 to i16
  %246 = zext i16 %245 to i32
  %247 = icmp eq i32 0, %246
  br i1 %247, label %255, label %248

248:                                              ; preds = %237
  %249 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %250 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %249, i32 0, i32 0
  %251 = load i32, ptr %250, align 4, !tbaa !14
  %252 = trunc i32 %251 to i16
  %253 = zext i16 %252 to i32
  %254 = icmp slt i32 0, %253
  br i1 %254, label %255, label %279

255:                                              ; preds = %248, %237
  %256 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %257 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %256, i32 0, i32 0
  %258 = load i32, ptr %257, align 4, !tbaa !14
  %259 = zext i32 %258 to i64
  %260 = mul i64 1, %259
  %261 = icmp ult i64 %260, 65535
  br i1 %261, label %262, label %268

262:                                              ; preds = %255
  %263 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %264 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %263, i32 0, i32 0
  %265 = load i32, ptr %264, align 4, !tbaa !14
  %266 = zext i32 %265 to i64
  %267 = mul i64 1, %266
  br label %269

268:                                              ; preds = %255
  br label %269

269:                                              ; preds = %268, %262
  %270 = phi i64 [ %267, %262 ], [ 65535, %268 ]
  %271 = icmp ule i64 %270, 65535
  br i1 %271, label %272, label %279

272:                                              ; preds = %269
  %273 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %274 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %273, i32 0, i32 0
  %275 = load i32, ptr %274, align 4, !tbaa !14
  %276 = uitofp i32 %275 to double
  %277 = fcmp ole double 0.000000e+00, %276
  br i1 %277, label %278, label %279

278:                                              ; preds = %272
  br label %280

279:                                              ; preds = %272, %269, %248
  call void @__assert_fail(ptr noundef @.str.6, ptr noundef @.str.5, i32 noundef 124, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

280:                                              ; preds = %278
  %281 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %282 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %281, i32 0, i32 0
  %283 = load i32, ptr %282, align 4, !tbaa !14
  %284 = trunc i32 %283 to i16
  %285 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %11, i32 noundef %183, i32 noundef 15, i32 noundef 15, i32 noundef 1, i32 noundef %186, i32 noundef %189, i32 noundef %192, i32 noundef %195, i32 noundef %198, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %241, i16 noundef zeroext %284, i8 noundef zeroext 1)
  store ptr %285, ptr %12, align 8, !tbaa !5
  br label %395

286:                                              ; preds = %172, %167
  %287 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %288 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %287, i32 0, i32 4
  %289 = load i32, ptr %288, align 8, !tbaa !14
  %290 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %291 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %290, i32 0, i32 2
  %292 = load i32, ptr %291, align 4, !tbaa !14
  %293 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %294 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %293, i32 0, i32 4
  %295 = load i32, ptr %294, align 8, !tbaa !14
  %296 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %297 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %296, i32 0, i32 1
  %298 = load i32, ptr %297, align 4, !tbaa !14
  %299 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %300 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %299, i32 0, i32 2
  %301 = load i32, ptr %300, align 8, !tbaa !14
  %302 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %303 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %302, i32 0, i32 3
  %304 = load i32, ptr %303, align 4, !tbaa !14
  %305 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %306 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %305, i32 0, i32 3
  %307 = load i32, ptr %306, align 4, !tbaa !14
  %308 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %309 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %308, i32 0, i32 1
  %310 = load i32, ptr %309, align 4, !tbaa !14
  %311 = trunc i32 %310 to i16
  %312 = zext i16 %311 to i32
  %313 = icmp eq i32 0, %312
  br i1 %313, label %321, label %314

314:                                              ; preds = %286
  %315 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %316 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %315, i32 0, i32 1
  %317 = load i32, ptr %316, align 4, !tbaa !14
  %318 = trunc i32 %317 to i16
  %319 = zext i16 %318 to i32
  %320 = icmp slt i32 0, %319
  br i1 %320, label %321, label %345

321:                                              ; preds = %314, %286
  %322 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %323 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %322, i32 0, i32 1
  %324 = load i32, ptr %323, align 4, !tbaa !14
  %325 = zext i32 %324 to i64
  %326 = mul i64 1, %325
  %327 = icmp ult i64 %326, 65535
  br i1 %327, label %328, label %334

328:                                              ; preds = %321
  %329 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %330 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %329, i32 0, i32 1
  %331 = load i32, ptr %330, align 4, !tbaa !14
  %332 = zext i32 %331 to i64
  %333 = mul i64 1, %332
  br label %335

334:                                              ; preds = %321
  br label %335

335:                                              ; preds = %334, %328
  %336 = phi i64 [ %333, %328 ], [ 65535, %334 ]
  %337 = icmp ule i64 %336, 65535
  br i1 %337, label %338, label %345

338:                                              ; preds = %335
  %339 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %340 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %339, i32 0, i32 1
  %341 = load i32, ptr %340, align 4, !tbaa !14
  %342 = uitofp i32 %341 to double
  %343 = fcmp ole double 0.000000e+00, %342
  br i1 %343, label %344, label %345

344:                                              ; preds = %338
  br label %346

345:                                              ; preds = %338, %335, %314
  call void @__assert_fail(ptr noundef @.str.4, ptr noundef @.str.5, i32 noundef 128, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

346:                                              ; preds = %344
  %347 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %348 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %347, i32 0, i32 1
  %349 = load i32, ptr %348, align 4, !tbaa !14
  %350 = trunc i32 %349 to i16
  %351 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %352 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %351, i32 0, i32 0
  %353 = load i32, ptr %352, align 4, !tbaa !14
  %354 = trunc i32 %353 to i16
  %355 = zext i16 %354 to i32
  %356 = icmp eq i32 0, %355
  br i1 %356, label %364, label %357

357:                                              ; preds = %346
  %358 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %359 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %358, i32 0, i32 0
  %360 = load i32, ptr %359, align 4, !tbaa !14
  %361 = trunc i32 %360 to i16
  %362 = zext i16 %361 to i32
  %363 = icmp slt i32 0, %362
  br i1 %363, label %364, label %388

364:                                              ; preds = %357, %346
  %365 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %366 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %365, i32 0, i32 0
  %367 = load i32, ptr %366, align 4, !tbaa !14
  %368 = zext i32 %367 to i64
  %369 = mul i64 1, %368
  %370 = icmp ult i64 %369, 65535
  br i1 %370, label %371, label %377

371:                                              ; preds = %364
  %372 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %373 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %372, i32 0, i32 0
  %374 = load i32, ptr %373, align 4, !tbaa !14
  %375 = zext i32 %374 to i64
  %376 = mul i64 1, %375
  br label %378

377:                                              ; preds = %364
  br label %378

378:                                              ; preds = %377, %371
  %379 = phi i64 [ %376, %371 ], [ 65535, %377 ]
  %380 = icmp ule i64 %379, 65535
  br i1 %380, label %381, label %388

381:                                              ; preds = %378
  %382 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %383 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %382, i32 0, i32 0
  %384 = load i32, ptr %383, align 4, !tbaa !14
  %385 = uitofp i32 %384 to double
  %386 = fcmp ole double 0.000000e+00, %385
  br i1 %386, label %387, label %388

387:                                              ; preds = %381
  br label %389

388:                                              ; preds = %381, %378, %357
  call void @__assert_fail(ptr noundef @.str.6, ptr noundef @.str.5, i32 noundef 128, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

389:                                              ; preds = %387
  %390 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %391 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %390, i32 0, i32 0
  %392 = load i32, ptr %391, align 4, !tbaa !14
  %393 = trunc i32 %392 to i16
  %394 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %11, i32 noundef %289, i32 noundef 15, i32 noundef 15, i32 noundef %292, i32 noundef %295, i32 noundef %298, i32 noundef %301, i32 noundef %304, i32 noundef %307, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %350, i16 noundef zeroext %393, i8 noundef zeroext 1)
  store ptr %394, ptr %12, align 8, !tbaa !5
  br label %395

395:                                              ; preds = %389, %280
  br label %396

396:                                              ; preds = %395, %161
  %397 = load ptr, ptr %5, align 8, !tbaa !5
  %398 = load ptr, ptr %7, align 8, !tbaa !5
  %399 = load i64, ptr %8, align 8, !tbaa !9
  %400 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 1
  %401 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %400, i32 0, i32 0
  %402 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 1
  %403 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %402, i32 0, i32 1
  %404 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 1
  %405 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %404, i32 0, i32 2
  %406 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 1
  %407 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %406, i32 0, i32 3
  %408 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 1
  %409 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %408, i32 0, i32 4
  %410 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 1
  %411 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %410, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef %14, ptr noundef %13, ptr noundef %397, ptr noundef %398, i64 noundef %399, ptr noundef %401, ptr noundef %403, ptr noundef %405, ptr noundef %407, ptr noundef %409, ptr noundef %411)
  %412 = load ptr, ptr %5, align 8, !tbaa !5
  %413 = load i32, ptr %15, align 4, !tbaa !11
  %414 = load ptr, ptr %7, align 8, !tbaa !5
  %415 = load i64, ptr %8, align 8, !tbaa !9
  %416 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 2
  %417 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %416, i32 0, i32 0
  %418 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 2
  %419 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %418, i32 0, i32 1
  %420 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 2
  %421 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %420, i32 0, i32 2
  %422 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 2
  %423 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %422, i32 0, i32 3
  %424 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 2
  %425 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %424, i32 0, i32 4
  %426 = getelementptr inbounds %struct.libxsmm_meltw_unary_param, ptr %16, i32 0, i32 2
  %427 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %426, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef %13, ptr noundef %412, i32 noundef %413, ptr noundef %414, i64 noundef %415, ptr noundef %417, ptr noundef %419, ptr noundef %421, ptr noundef %423, ptr noundef %425, ptr noundef %427)
  %428 = load ptr, ptr %12, align 8, !tbaa !5
  call void @libxsmm_reference_elementwise(ptr noundef %16, ptr noundef %428)
  call void @llvm.lifetime.end.p0(i64 128, ptr %16) #5
  br label %956

429:                                              ; preds = %25
  %430 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 4
  %431 = load i32, ptr %430, align 8, !tbaa !14
  %432 = icmp eq i32 %431, 2
  br i1 %432, label %433, label %751

433:                                              ; preds = %429
  call void @llvm.lifetime.start.p0(i64 184, ptr %17) #5
  %434 = load ptr, ptr %10, align 8, !tbaa !5
  %435 = load i32, ptr %9, align 4, !tbaa !11
  %436 = mul nsw i32 5, %435
  %437 = add nsw i32 %436, 2
  %438 = sext i32 %437 to i64
  %439 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %434, i64 %438
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %17, ptr align 8 %439, i64 184, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 176, ptr %18) #5
  %440 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %441 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %440, i32 0, i32 0
  %442 = load i32, ptr %441, align 4, !tbaa !14
  %443 = call i32 @libxsmm_meqn_is_binary_opcode_reduce_to_scalar(i32 noundef %442)
  %444 = icmp sgt i32 %443, 0
  br i1 %444, label %445, label %588

445:                                              ; preds = %433
  %446 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %447 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %446, i32 0, i32 4
  %448 = load i32, ptr %447, align 8, !tbaa !14
  %449 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %450 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %449, i32 0, i32 4
  %451 = load i32, ptr %450, align 8, !tbaa !14
  %452 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %453 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %452, i32 0, i32 2
  %454 = load i32, ptr %453, align 4, !tbaa !14
  %455 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %456 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %455, i32 0, i32 4
  %457 = load i32, ptr %456, align 8, !tbaa !14
  %458 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %459 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %458, i32 0, i32 1
  %460 = load i32, ptr %459, align 4, !tbaa !14
  %461 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %462 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %461, i32 0, i32 1
  %463 = load i32, ptr %462, align 4, !tbaa !14
  %464 = icmp slt i32 %460, %463
  br i1 %464, label %465, label %469

465:                                              ; preds = %445
  %466 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %467 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %466, i32 0, i32 1
  %468 = load i32, ptr %467, align 4, !tbaa !14
  br label %473

469:                                              ; preds = %445
  %470 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %471 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %470, i32 0, i32 1
  %472 = load i32, ptr %471, align 4, !tbaa !14
  br label %473

473:                                              ; preds = %469, %465
  %474 = phi i32 [ %468, %465 ], [ %472, %469 ]
  %475 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %476 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %475, i32 0, i32 2
  %477 = load i32, ptr %476, align 8, !tbaa !14
  %478 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %479 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %478, i32 0, i32 2
  %480 = load i32, ptr %479, align 8, !tbaa !14
  %481 = icmp slt i32 %477, %480
  br i1 %481, label %482, label %486

482:                                              ; preds = %473
  %483 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %484 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %483, i32 0, i32 2
  %485 = load i32, ptr %484, align 8, !tbaa !14
  br label %490

486:                                              ; preds = %473
  %487 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %488 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %487, i32 0, i32 2
  %489 = load i32, ptr %488, align 8, !tbaa !14
  br label %490

490:                                              ; preds = %486, %482
  %491 = phi i32 [ %485, %482 ], [ %489, %486 ]
  %492 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %493 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %492, i32 0, i32 3
  %494 = load i32, ptr %493, align 4, !tbaa !14
  %495 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %496 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %495, i32 0, i32 3
  %497 = load i32, ptr %496, align 4, !tbaa !14
  %498 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %499 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %498, i32 0, i32 3
  %500 = load i32, ptr %499, align 4, !tbaa !14
  %501 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %502 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %501, i32 0, i32 1
  %503 = load i32, ptr %502, align 4, !tbaa !14
  %504 = trunc i32 %503 to i16
  %505 = zext i16 %504 to i32
  %506 = icmp eq i32 0, %505
  br i1 %506, label %514, label %507

507:                                              ; preds = %490
  %508 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %509 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %508, i32 0, i32 1
  %510 = load i32, ptr %509, align 4, !tbaa !14
  %511 = trunc i32 %510 to i16
  %512 = zext i16 %511 to i32
  %513 = icmp slt i32 0, %512
  br i1 %513, label %514, label %538

514:                                              ; preds = %507, %490
  %515 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %516 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %515, i32 0, i32 1
  %517 = load i32, ptr %516, align 4, !tbaa !14
  %518 = zext i32 %517 to i64
  %519 = mul i64 1, %518
  %520 = icmp ult i64 %519, 65535
  br i1 %520, label %521, label %527

521:                                              ; preds = %514
  %522 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %523 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %522, i32 0, i32 1
  %524 = load i32, ptr %523, align 4, !tbaa !14
  %525 = zext i32 %524 to i64
  %526 = mul i64 1, %525
  br label %528

527:                                              ; preds = %514
  br label %528

528:                                              ; preds = %527, %521
  %529 = phi i64 [ %526, %521 ], [ 65535, %527 ]
  %530 = icmp ule i64 %529, 65535
  br i1 %530, label %531, label %538

531:                                              ; preds = %528
  %532 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %533 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %532, i32 0, i32 1
  %534 = load i32, ptr %533, align 4, !tbaa !14
  %535 = uitofp i32 %534 to double
  %536 = fcmp ole double 0.000000e+00, %535
  br i1 %536, label %537, label %538

537:                                              ; preds = %531
  br label %539

538:                                              ; preds = %531, %528, %507
  call void @__assert_fail(ptr noundef @.str.7, ptr noundef @.str.5, i32 noundef 152, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

539:                                              ; preds = %537
  %540 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %541 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %540, i32 0, i32 1
  %542 = load i32, ptr %541, align 4, !tbaa !14
  %543 = trunc i32 %542 to i16
  %544 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %545 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %544, i32 0, i32 0
  %546 = load i32, ptr %545, align 4, !tbaa !14
  %547 = trunc i32 %546 to i16
  %548 = zext i16 %547 to i32
  %549 = icmp eq i32 0, %548
  br i1 %549, label %557, label %550

550:                                              ; preds = %539
  %551 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %552 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %551, i32 0, i32 0
  %553 = load i32, ptr %552, align 4, !tbaa !14
  %554 = trunc i32 %553 to i16
  %555 = zext i16 %554 to i32
  %556 = icmp slt i32 0, %555
  br i1 %556, label %557, label %581

557:                                              ; preds = %550, %539
  %558 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %559 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %558, i32 0, i32 0
  %560 = load i32, ptr %559, align 4, !tbaa !14
  %561 = zext i32 %560 to i64
  %562 = mul i64 1, %561
  %563 = icmp ult i64 %562, 65535
  br i1 %563, label %564, label %570

564:                                              ; preds = %557
  %565 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %566 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %565, i32 0, i32 0
  %567 = load i32, ptr %566, align 4, !tbaa !14
  %568 = zext i32 %567 to i64
  %569 = mul i64 1, %568
  br label %571

570:                                              ; preds = %557
  br label %571

571:                                              ; preds = %570, %564
  %572 = phi i64 [ %569, %564 ], [ 65535, %570 ]
  %573 = icmp ule i64 %572, 65535
  br i1 %573, label %574, label %581

574:                                              ; preds = %571
  %575 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %576 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %575, i32 0, i32 0
  %577 = load i32, ptr %576, align 4, !tbaa !14
  %578 = uitofp i32 %577 to double
  %579 = fcmp ole double 0.000000e+00, %578
  br i1 %579, label %580, label %581

580:                                              ; preds = %574
  br label %582

581:                                              ; preds = %574, %571, %550
  call void @__assert_fail(ptr noundef @.str.8, ptr noundef @.str.5, i32 noundef 152, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

582:                                              ; preds = %580
  %583 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %584 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %583, i32 0, i32 0
  %585 = load i32, ptr %584, align 4, !tbaa !14
  %586 = trunc i32 %585 to i16
  %587 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %11, i32 noundef %448, i32 noundef %451, i32 noundef 15, i32 noundef %454, i32 noundef %457, i32 noundef %474, i32 noundef %491, i32 noundef %494, i32 noundef %497, i32 noundef %500, i32 noundef 0, i16 noundef zeroext %543, i16 noundef zeroext %586, i8 noundef zeroext 2)
  store ptr %587, ptr %12, align 8, !tbaa !5
  br label %703

588:                                              ; preds = %433
  %589 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %590 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %589, i32 0, i32 4
  %591 = load i32, ptr %590, align 8, !tbaa !14
  %592 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %593 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %592, i32 0, i32 4
  %594 = load i32, ptr %593, align 8, !tbaa !14
  %595 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %596 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %595, i32 0, i32 2
  %597 = load i32, ptr %596, align 4, !tbaa !14
  %598 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %599 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %598, i32 0, i32 4
  %600 = load i32, ptr %599, align 8, !tbaa !14
  %601 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %602 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %601, i32 0, i32 1
  %603 = load i32, ptr %602, align 4, !tbaa !14
  %604 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %605 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %604, i32 0, i32 2
  %606 = load i32, ptr %605, align 8, !tbaa !14
  %607 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %608 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %607, i32 0, i32 3
  %609 = load i32, ptr %608, align 4, !tbaa !14
  %610 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %611 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %610, i32 0, i32 3
  %612 = load i32, ptr %611, align 4, !tbaa !14
  %613 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %17, i32 0, i32 8
  %614 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %613, i32 0, i32 3
  %615 = load i32, ptr %614, align 4, !tbaa !14
  %616 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %617 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %616, i32 0, i32 1
  %618 = load i32, ptr %617, align 4, !tbaa !14
  %619 = trunc i32 %618 to i16
  %620 = zext i16 %619 to i32
  %621 = icmp eq i32 0, %620
  br i1 %621, label %629, label %622

622:                                              ; preds = %588
  %623 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %624 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %623, i32 0, i32 1
  %625 = load i32, ptr %624, align 4, !tbaa !14
  %626 = trunc i32 %625 to i16
  %627 = zext i16 %626 to i32
  %628 = icmp slt i32 0, %627
  br i1 %628, label %629, label %653

629:                                              ; preds = %622, %588
  %630 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %631 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %630, i32 0, i32 1
  %632 = load i32, ptr %631, align 4, !tbaa !14
  %633 = zext i32 %632 to i64
  %634 = mul i64 1, %633
  %635 = icmp ult i64 %634, 65535
  br i1 %635, label %636, label %642

636:                                              ; preds = %629
  %637 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %638 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %637, i32 0, i32 1
  %639 = load i32, ptr %638, align 4, !tbaa !14
  %640 = zext i32 %639 to i64
  %641 = mul i64 1, %640
  br label %643

642:                                              ; preds = %629
  br label %643

643:                                              ; preds = %642, %636
  %644 = phi i64 [ %641, %636 ], [ 65535, %642 ]
  %645 = icmp ule i64 %644, 65535
  br i1 %645, label %646, label %653

646:                                              ; preds = %643
  %647 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %648 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %647, i32 0, i32 1
  %649 = load i32, ptr %648, align 4, !tbaa !14
  %650 = uitofp i32 %649 to double
  %651 = fcmp ole double 0.000000e+00, %650
  br i1 %651, label %652, label %653

652:                                              ; preds = %646
  br label %654

653:                                              ; preds = %646, %643, %622
  call void @__assert_fail(ptr noundef @.str.7, ptr noundef @.str.5, i32 noundef 156, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

654:                                              ; preds = %652
  %655 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %656 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %655, i32 0, i32 1
  %657 = load i32, ptr %656, align 4, !tbaa !14
  %658 = trunc i32 %657 to i16
  %659 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %660 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %659, i32 0, i32 0
  %661 = load i32, ptr %660, align 4, !tbaa !14
  %662 = trunc i32 %661 to i16
  %663 = zext i16 %662 to i32
  %664 = icmp eq i32 0, %663
  br i1 %664, label %672, label %665

665:                                              ; preds = %654
  %666 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %667 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %666, i32 0, i32 0
  %668 = load i32, ptr %667, align 4, !tbaa !14
  %669 = trunc i32 %668 to i16
  %670 = zext i16 %669 to i32
  %671 = icmp slt i32 0, %670
  br i1 %671, label %672, label %696

672:                                              ; preds = %665, %654
  %673 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %674 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %673, i32 0, i32 0
  %675 = load i32, ptr %674, align 4, !tbaa !14
  %676 = zext i32 %675 to i64
  %677 = mul i64 1, %676
  %678 = icmp ult i64 %677, 65535
  br i1 %678, label %679, label %685

679:                                              ; preds = %672
  %680 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %681 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %680, i32 0, i32 0
  %682 = load i32, ptr %681, align 4, !tbaa !14
  %683 = zext i32 %682 to i64
  %684 = mul i64 1, %683
  br label %686

685:                                              ; preds = %672
  br label %686

686:                                              ; preds = %685, %679
  %687 = phi i64 [ %684, %679 ], [ 65535, %685 ]
  %688 = icmp ule i64 %687, 65535
  br i1 %688, label %689, label %696

689:                                              ; preds = %686
  %690 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %691 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %690, i32 0, i32 0
  %692 = load i32, ptr %691, align 4, !tbaa !14
  %693 = uitofp i32 %692 to double
  %694 = fcmp ole double 0.000000e+00, %693
  br i1 %694, label %695, label %696

695:                                              ; preds = %689
  br label %697

696:                                              ; preds = %689, %686, %665
  call void @__assert_fail(ptr noundef @.str.8, ptr noundef @.str.5, i32 noundef 156, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

697:                                              ; preds = %695
  %698 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %699 = getelementptr inbounds %struct.libxsmm_meqn_binary_op, ptr %698, i32 0, i32 0
  %700 = load i32, ptr %699, align 4, !tbaa !14
  %701 = trunc i32 %700 to i16
  %702 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %11, i32 noundef %591, i32 noundef %594, i32 noundef 15, i32 noundef %597, i32 noundef %600, i32 noundef %603, i32 noundef %606, i32 noundef %609, i32 noundef %612, i32 noundef %615, i32 noundef 0, i16 noundef zeroext %658, i16 noundef zeroext %701, i8 noundef zeroext 2)
  store ptr %702, ptr %12, align 8, !tbaa !5
  br label %703

703:                                              ; preds = %697, %582
  %704 = load ptr, ptr %5, align 8, !tbaa !5
  %705 = load ptr, ptr %7, align 8, !tbaa !5
  %706 = load i64, ptr %8, align 8, !tbaa !9
  %707 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 1
  %708 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %707, i32 0, i32 0
  %709 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 1
  %710 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %709, i32 0, i32 1
  %711 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 1
  %712 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %711, i32 0, i32 2
  %713 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 1
  %714 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %713, i32 0, i32 3
  %715 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 1
  %716 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %715, i32 0, i32 4
  %717 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 1
  %718 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %717, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef %14, ptr noundef %13, ptr noundef %704, ptr noundef %705, i64 noundef %706, ptr noundef %708, ptr noundef %710, ptr noundef %712, ptr noundef %714, ptr noundef %716, ptr noundef %718)
  %719 = load ptr, ptr %5, align 8, !tbaa !5
  %720 = load ptr, ptr %7, align 8, !tbaa !5
  %721 = load i64, ptr %8, align 8, !tbaa !9
  %722 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 2
  %723 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %722, i32 0, i32 0
  %724 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 2
  %725 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %724, i32 0, i32 1
  %726 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 2
  %727 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %726, i32 0, i32 2
  %728 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 2
  %729 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %728, i32 0, i32 3
  %730 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 2
  %731 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %730, i32 0, i32 4
  %732 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 2
  %733 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %732, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef %17, ptr noundef %13, ptr noundef %719, ptr noundef %720, i64 noundef %721, ptr noundef %723, ptr noundef %725, ptr noundef %727, ptr noundef %729, ptr noundef %731, ptr noundef %733)
  %734 = load ptr, ptr %5, align 8, !tbaa !5
  %735 = load i32, ptr %15, align 4, !tbaa !11
  %736 = load ptr, ptr %7, align 8, !tbaa !5
  %737 = load i64, ptr %8, align 8, !tbaa !9
  %738 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 3
  %739 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %738, i32 0, i32 0
  %740 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 3
  %741 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %740, i32 0, i32 1
  %742 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 3
  %743 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %742, i32 0, i32 2
  %744 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 3
  %745 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %744, i32 0, i32 3
  %746 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 3
  %747 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %746, i32 0, i32 4
  %748 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %18, i32 0, i32 3
  %749 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %748, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef %13, ptr noundef %734, i32 noundef %735, ptr noundef %736, i64 noundef %737, ptr noundef %739, ptr noundef %741, ptr noundef %743, ptr noundef %745, ptr noundef %747, ptr noundef %749)
  %750 = load ptr, ptr %12, align 8, !tbaa !5
  call void @libxsmm_reference_elementwise(ptr noundef %18, ptr noundef %750)
  call void @llvm.lifetime.end.p0(i64 176, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr %17) #5
  br label %955

751:                                              ; preds = %429
  call void @llvm.lifetime.start.p0(i64 184, ptr %19) #5
  %752 = load ptr, ptr %10, align 8, !tbaa !5
  %753 = load i32, ptr %9, align 4, !tbaa !11
  %754 = mul nsw i32 5, %753
  %755 = add nsw i32 %754, 2
  %756 = sext i32 %755 to i64
  %757 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %752, i64 %756
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %19, ptr align 8 %757, i64 184, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 184, ptr %20) #5
  %758 = load ptr, ptr %10, align 8, !tbaa !5
  %759 = load i32, ptr %9, align 4, !tbaa !11
  %760 = mul nsw i32 5, %759
  %761 = add nsw i32 %760, 3
  %762 = sext i32 %761 to i64
  %763 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %758, i64 %762
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %20, ptr align 8 %763, i64 184, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #5
  %764 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %765 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %764, i32 0, i32 0
  %766 = load i32, ptr %765, align 4, !tbaa !14
  %767 = icmp eq i32 %766, 3
  br i1 %767, label %768, label %769

768:                                              ; preds = %751
  br label %773

769:                                              ; preds = %751
  %770 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %20, i32 0, i32 8
  %771 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %770, i32 0, i32 4
  %772 = load i32, ptr %771, align 8, !tbaa !14
  br label %773

773:                                              ; preds = %769, %768
  %774 = phi i32 [ 14, %768 ], [ %772, %769 ]
  store i32 %774, ptr %21, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 224, ptr %22) #5
  %775 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %776 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %775, i32 0, i32 4
  %777 = load i32, ptr %776, align 8, !tbaa !14
  %778 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %19, i32 0, i32 8
  %779 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %778, i32 0, i32 4
  %780 = load i32, ptr %779, align 8, !tbaa !14
  %781 = load i32, ptr %21, align 4, !tbaa !11
  %782 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %783 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %782, i32 0, i32 2
  %784 = load i32, ptr %783, align 4, !tbaa !14
  %785 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %786 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %785, i32 0, i32 4
  %787 = load i32, ptr %786, align 8, !tbaa !14
  %788 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %789 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %788, i32 0, i32 1
  %790 = load i32, ptr %789, align 4, !tbaa !14
  %791 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %792 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %791, i32 0, i32 2
  %793 = load i32, ptr %792, align 8, !tbaa !14
  %794 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %14, i32 0, i32 8
  %795 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %794, i32 0, i32 3
  %796 = load i32, ptr %795, align 4, !tbaa !14
  %797 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 8
  %798 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %797, i32 0, i32 3
  %799 = load i32, ptr %798, align 4, !tbaa !14
  %800 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %19, i32 0, i32 8
  %801 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %800, i32 0, i32 3
  %802 = load i32, ptr %801, align 4, !tbaa !14
  %803 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %20, i32 0, i32 8
  %804 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %803, i32 0, i32 3
  %805 = load i32, ptr %804, align 4, !tbaa !14
  %806 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %807 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %806, i32 0, i32 1
  %808 = load i32, ptr %807, align 4, !tbaa !14
  %809 = trunc i32 %808 to i16
  %810 = zext i16 %809 to i32
  %811 = icmp eq i32 0, %810
  br i1 %811, label %819, label %812

812:                                              ; preds = %773
  %813 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %814 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %813, i32 0, i32 1
  %815 = load i32, ptr %814, align 4, !tbaa !14
  %816 = trunc i32 %815 to i16
  %817 = zext i16 %816 to i32
  %818 = icmp slt i32 0, %817
  br i1 %818, label %819, label %843

819:                                              ; preds = %812, %773
  %820 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %821 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %820, i32 0, i32 1
  %822 = load i32, ptr %821, align 4, !tbaa !14
  %823 = zext i32 %822 to i64
  %824 = mul i64 1, %823
  %825 = icmp ult i64 %824, 65535
  br i1 %825, label %826, label %832

826:                                              ; preds = %819
  %827 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %828 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %827, i32 0, i32 1
  %829 = load i32, ptr %828, align 4, !tbaa !14
  %830 = zext i32 %829 to i64
  %831 = mul i64 1, %830
  br label %833

832:                                              ; preds = %819
  br label %833

833:                                              ; preds = %832, %826
  %834 = phi i64 [ %831, %826 ], [ 65535, %832 ]
  %835 = icmp ule i64 %834, 65535
  br i1 %835, label %836, label %843

836:                                              ; preds = %833
  %837 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %838 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %837, i32 0, i32 1
  %839 = load i32, ptr %838, align 4, !tbaa !14
  %840 = uitofp i32 %839 to double
  %841 = fcmp ole double 0.000000e+00, %840
  br i1 %841, label %842, label %843

842:                                              ; preds = %836
  br label %844

843:                                              ; preds = %836, %833, %812
  call void @__assert_fail(ptr noundef @.str.9, ptr noundef @.str.5, i32 noundef 188, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

844:                                              ; preds = %842
  %845 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %846 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %845, i32 0, i32 1
  %847 = load i32, ptr %846, align 4, !tbaa !14
  %848 = trunc i32 %847 to i16
  %849 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %850 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %849, i32 0, i32 0
  %851 = load i32, ptr %850, align 4, !tbaa !14
  %852 = trunc i32 %851 to i16
  %853 = zext i16 %852 to i32
  %854 = icmp eq i32 0, %853
  br i1 %854, label %862, label %855

855:                                              ; preds = %844
  %856 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %857 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %856, i32 0, i32 0
  %858 = load i32, ptr %857, align 4, !tbaa !14
  %859 = trunc i32 %858 to i16
  %860 = zext i16 %859 to i32
  %861 = icmp slt i32 0, %860
  br i1 %861, label %862, label %886

862:                                              ; preds = %855, %844
  %863 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %864 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %863, i32 0, i32 0
  %865 = load i32, ptr %864, align 4, !tbaa !14
  %866 = zext i32 %865 to i64
  %867 = mul i64 1, %866
  %868 = icmp ult i64 %867, 65535
  br i1 %868, label %869, label %875

869:                                              ; preds = %862
  %870 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %871 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %870, i32 0, i32 0
  %872 = load i32, ptr %871, align 4, !tbaa !14
  %873 = zext i32 %872 to i64
  %874 = mul i64 1, %873
  br label %876

875:                                              ; preds = %862
  br label %876

876:                                              ; preds = %875, %869
  %877 = phi i64 [ %874, %869 ], [ 65535, %875 ]
  %878 = icmp ule i64 %877, 65535
  br i1 %878, label %879, label %886

879:                                              ; preds = %876
  %880 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %881 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %880, i32 0, i32 0
  %882 = load i32, ptr %881, align 4, !tbaa !14
  %883 = uitofp i32 %882 to double
  %884 = fcmp ole double 0.000000e+00, %883
  br i1 %884, label %885, label %886

885:                                              ; preds = %879
  br label %887

886:                                              ; preds = %879, %876, %855
  call void @__assert_fail(ptr noundef @.str.10, ptr noundef @.str.5, i32 noundef 188, ptr noundef @__PRETTY_FUNCTION__.libxsmm_reference_matequation) #6
  unreachable

887:                                              ; preds = %885
  %888 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %13, i32 0, i32 5
  %889 = getelementptr inbounds %struct.libxsmm_meqn_ternary_op, ptr %888, i32 0, i32 0
  %890 = load i32, ptr %889, align 4, !tbaa !14
  %891 = trunc i32 %890 to i16
  %892 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %11, i32 noundef %777, i32 noundef %780, i32 noundef %781, i32 noundef %784, i32 noundef %787, i32 noundef %790, i32 noundef %793, i32 noundef %796, i32 noundef %799, i32 noundef %802, i32 noundef %805, i16 noundef zeroext %848, i16 noundef zeroext %891, i8 noundef zeroext 3)
  store ptr %892, ptr %12, align 8, !tbaa !5
  %893 = load ptr, ptr %5, align 8, !tbaa !5
  %894 = load ptr, ptr %7, align 8, !tbaa !5
  %895 = load i64, ptr %8, align 8, !tbaa !9
  %896 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 1
  %897 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %896, i32 0, i32 0
  %898 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 1
  %899 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %898, i32 0, i32 1
  %900 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 1
  %901 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %900, i32 0, i32 2
  %902 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 1
  %903 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %902, i32 0, i32 3
  %904 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 1
  %905 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %904, i32 0, i32 4
  %906 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 1
  %907 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %906, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef %14, ptr noundef %13, ptr noundef %893, ptr noundef %894, i64 noundef %895, ptr noundef %897, ptr noundef %899, ptr noundef %901, ptr noundef %903, ptr noundef %905, ptr noundef %907)
  %908 = load ptr, ptr %5, align 8, !tbaa !5
  %909 = load ptr, ptr %7, align 8, !tbaa !5
  %910 = load i64, ptr %8, align 8, !tbaa !9
  %911 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 2
  %912 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %911, i32 0, i32 0
  %913 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 2
  %914 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %913, i32 0, i32 1
  %915 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 2
  %916 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %915, i32 0, i32 2
  %917 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 2
  %918 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %917, i32 0, i32 3
  %919 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 2
  %920 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %919, i32 0, i32 4
  %921 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 2
  %922 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %921, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef %19, ptr noundef %13, ptr noundef %908, ptr noundef %909, i64 noundef %910, ptr noundef %912, ptr noundef %914, ptr noundef %916, ptr noundef %918, ptr noundef %920, ptr noundef %922)
  %923 = load ptr, ptr %5, align 8, !tbaa !5
  %924 = load ptr, ptr %7, align 8, !tbaa !5
  %925 = load i64, ptr %8, align 8, !tbaa !9
  %926 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 3
  %927 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %926, i32 0, i32 0
  %928 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 3
  %929 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %928, i32 0, i32 1
  %930 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 3
  %931 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %930, i32 0, i32 2
  %932 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 3
  %933 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %932, i32 0, i32 3
  %934 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 3
  %935 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %934, i32 0, i32 4
  %936 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 3
  %937 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %936, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef %20, ptr noundef %13, ptr noundef %923, ptr noundef %924, i64 noundef %925, ptr noundef %927, ptr noundef %929, ptr noundef %931, ptr noundef %933, ptr noundef %935, ptr noundef %937)
  %938 = load ptr, ptr %5, align 8, !tbaa !5
  %939 = load i32, ptr %15, align 4, !tbaa !11
  %940 = load ptr, ptr %7, align 8, !tbaa !5
  %941 = load i64, ptr %8, align 8, !tbaa !9
  %942 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 4
  %943 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %942, i32 0, i32 0
  %944 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 4
  %945 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %944, i32 0, i32 1
  %946 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 4
  %947 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %946, i32 0, i32 2
  %948 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 4
  %949 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %948, i32 0, i32 3
  %950 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 4
  %951 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %950, i32 0, i32 4
  %952 = getelementptr inbounds %struct.libxsmm_meltw_ternary_param, ptr %22, i32 0, i32 4
  %953 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %952, i32 0, i32 5
  call void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef %13, ptr noundef %938, i32 noundef %939, ptr noundef %940, i64 noundef %941, ptr noundef %943, ptr noundef %945, ptr noundef %947, ptr noundef %949, ptr noundef %951, ptr noundef %953)
  %954 = load ptr, ptr %12, align 8, !tbaa !5
  call void @libxsmm_reference_elementwise(ptr noundef %22, ptr noundef %954)
  call void @llvm.lifetime.end.p0(i64 224, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr %19) #5
  br label %955

955:                                              ; preds = %887, %703
  br label %956

956:                                              ; preds = %955, %396
  %957 = load i32, ptr %9, align 4, !tbaa !11
  %958 = add nsw i32 %957, 1
  store i32 %958, ptr %9, align 4, !tbaa !11
  %959 = load i32, ptr %15, align 4, !tbaa !11
  %960 = icmp ugt i32 %959, 0
  br i1 %960, label %961, label %962

961:                                              ; preds = %956
  store i32 2, ptr %23, align 4
  br label %963

962:                                              ; preds = %956
  store i32 0, ptr %23, align 4
  br label %963

963:                                              ; preds = %962, %961
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr %13) #5
  %964 = load i32, ptr %23, align 4
  switch i32 %964, label %967 [
    i32 0, label %965
    i32 2, label %966
  ]

965:                                              ; preds = %963
  br label %25

966:                                              ; preds = %963
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 96, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  ret void

967:                                              ; preds = %963
  unreachable
}

; 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

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef) #2

declare ptr @libxsmm_meltw_descriptor_init2(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i16 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) #2

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

declare void @libxsmm_reference_elementwise(ptr noundef, ptr noundef) #2

declare i32 @libxsmm_meqn_is_binary_opcode_reduce_to_scalar(i32 noundef) #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { nounwind }
attributes #6 = { 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, !10, i64 0}
!10 = !{!"long long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{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}
!14 = !{!7, !7, i64 0}


; 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_descriptor_blob = type { [96 x i8] }
%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 }
%struct.libxsmm_meltw_unary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }
%struct.libxsmm_matrix_op_arg = type { ptr, ptr, ptr, ptr }
%struct.libxsmm_matrix_arg = type { ptr, ptr, ptr, ptr, ptr, ptr }
%struct.libxsmm_meltw_binary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }
%struct.libxsmm_meltw_ternary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef, ptr noundef, i32 noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_reference_matequation(ptr noundef %0, ptr nocapture noundef readonly %1, ptr noundef %2, i64 noundef %3) local_unnamed_addr #0 {
  %5 = alloca %struct.libxsmm_descriptor_blob, align 1
  %6 = alloca %struct.libxsmm_meqn_elem, align 8
  %7 = alloca %struct.libxsmm_meqn_elem, align 8
  %8 = alloca %struct.libxsmm_meltw_unary_param, align 8
  %9 = alloca %struct.libxsmm_meqn_elem, align 8
  %10 = alloca %struct.libxsmm_meltw_binary_param, align 8
  %11 = alloca %struct.libxsmm_meqn_elem, align 8
  %12 = alloca %struct.libxsmm_meqn_elem, align 8
  %13 = alloca %struct.libxsmm_meltw_ternary_param, align 8
  call void @llvm.lifetime.start.p0(i64 96, ptr nonnull %5) #5
  %14 = getelementptr inbounds i8, ptr %6, i64 80
  %15 = getelementptr inbounds i8, ptr %6, i64 32
  %16 = getelementptr inbounds i8, ptr %6, i64 36
  %17 = getelementptr inbounds i8, ptr %7, i64 104
  %18 = getelementptr inbounds i8, ptr %9, i64 104
  %19 = getelementptr inbounds i8, ptr %6, i64 44
  %20 = getelementptr inbounds i8, ptr %6, i64 104
  %21 = getelementptr inbounds i8, ptr %6, i64 92
  %22 = getelementptr inbounds i8, ptr %6, i64 96
  %23 = getelementptr inbounds i8, ptr %7, i64 100
  %24 = getelementptr inbounds i8, ptr %6, i64 100
  %25 = getelementptr inbounds i8, ptr %9, i64 100
  %26 = getelementptr inbounds i8, ptr %6, i64 40
  %27 = getelementptr inbounds i8, ptr %7, i64 92
  %28 = getelementptr inbounds i8, ptr %9, i64 92
  %29 = getelementptr inbounds i8, ptr %7, i64 96
  %30 = getelementptr inbounds i8, ptr %9, i64 96
  %31 = getelementptr inbounds i8, ptr %10, i64 32
  %32 = getelementptr inbounds i8, ptr %10, i64 40
  %33 = getelementptr inbounds i8, ptr %10, i64 48
  %34 = getelementptr inbounds i8, ptr %10, i64 56
  %35 = getelementptr inbounds i8, ptr %10, i64 64
  %36 = getelementptr inbounds i8, ptr %10, i64 72
  %37 = getelementptr inbounds i8, ptr %10, i64 80
  %38 = getelementptr inbounds i8, ptr %10, i64 88
  %39 = getelementptr inbounds i8, ptr %10, i64 96
  %40 = getelementptr inbounds i8, ptr %10, i64 104
  %41 = getelementptr inbounds i8, ptr %10, i64 112
  %42 = getelementptr inbounds i8, ptr %10, i64 120
  %43 = getelementptr inbounds i8, ptr %10, i64 128
  %44 = getelementptr inbounds i8, ptr %10, i64 136
  %45 = getelementptr inbounds i8, ptr %10, i64 144
  %46 = getelementptr inbounds i8, ptr %10, i64 152
  %47 = getelementptr inbounds i8, ptr %10, i64 160
  %48 = getelementptr inbounds i8, ptr %10, i64 168
  %49 = getelementptr inbounds i8, ptr %8, i64 32
  %50 = getelementptr inbounds i8, ptr %8, i64 40
  %51 = getelementptr inbounds i8, ptr %8, i64 48
  %52 = getelementptr inbounds i8, ptr %8, i64 56
  %53 = getelementptr inbounds i8, ptr %8, i64 64
  %54 = getelementptr inbounds i8, ptr %8, i64 72
  %55 = getelementptr inbounds i8, ptr %8, i64 80
  %56 = getelementptr inbounds i8, ptr %8, i64 88
  %57 = getelementptr inbounds i8, ptr %8, i64 96
  %58 = getelementptr inbounds i8, ptr %8, i64 104
  %59 = getelementptr inbounds i8, ptr %8, i64 112
  %60 = getelementptr inbounds i8, ptr %8, i64 120
  %61 = getelementptr inbounds i8, ptr %12, i64 104
  %62 = getelementptr inbounds i8, ptr %11, i64 104
  %63 = getelementptr inbounds i8, ptr %11, i64 100
  %64 = getelementptr inbounds i8, ptr %12, i64 100
  %65 = getelementptr inbounds i8, ptr %13, i64 32
  %66 = getelementptr inbounds i8, ptr %13, i64 40
  %67 = getelementptr inbounds i8, ptr %13, i64 48
  %68 = getelementptr inbounds i8, ptr %13, i64 56
  %69 = getelementptr inbounds i8, ptr %13, i64 64
  %70 = getelementptr inbounds i8, ptr %13, i64 72
  %71 = getelementptr inbounds i8, ptr %13, i64 80
  %72 = getelementptr inbounds i8, ptr %13, i64 88
  %73 = getelementptr inbounds i8, ptr %13, i64 96
  %74 = getelementptr inbounds i8, ptr %13, i64 104
  %75 = getelementptr inbounds i8, ptr %13, i64 112
  %76 = getelementptr inbounds i8, ptr %13, i64 120
  %77 = getelementptr inbounds i8, ptr %13, i64 128
  %78 = getelementptr inbounds i8, ptr %13, i64 136
  %79 = getelementptr inbounds i8, ptr %13, i64 144
  %80 = getelementptr inbounds i8, ptr %13, i64 152
  %81 = getelementptr inbounds i8, ptr %13, i64 160
  %82 = getelementptr inbounds i8, ptr %13, i64 168
  %83 = getelementptr inbounds i8, ptr %13, i64 176
  %84 = getelementptr inbounds i8, ptr %13, i64 184
  %85 = getelementptr inbounds i8, ptr %13, i64 192
  %86 = getelementptr inbounds i8, ptr %13, i64 200
  %87 = getelementptr inbounds i8, ptr %13, i64 208
  %88 = getelementptr inbounds i8, ptr %13, i64 216
  br label %89

89:                                               ; preds = %196, %4
  %indvars.iv = phi i64 [ %indvars.iv.next, %196 ], [ 0, %4 ]
  call void @llvm.lifetime.start.p0(i64 184, ptr nonnull %6) #5
  %.idx = mul i64 %indvars.iv, 920
  %90 = getelementptr inbounds i8, ptr %1, i64 %.idx
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %6, ptr noundef nonnull align 8 dereferenceable(184) %90, i64 184, i1 false), !tbaa.struct !5
  call void @llvm.lifetime.start.p0(i64 184, ptr nonnull %7) #5
  %91 = getelementptr inbounds i8, ptr %90, i64 184
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %7, ptr noundef nonnull align 8 dereferenceable(184) %91, i64 184, i1 false), !tbaa.struct !5
  %92 = load i32, ptr %14, align 8, !tbaa !6
  %93 = icmp eq i32 %92, -1
  %94 = zext i1 %93 to i32
  %95 = load i32, ptr %15, align 8, !tbaa !6
  switch i32 %95, label %175 [
    i32 1, label %96
    i32 2, label %139
  ]

96:                                               ; preds = %89
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %8) #5
  %97 = load i32, ptr %16, align 4, !tbaa !6
  %98 = call i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef %97) #5
  %99 = icmp sgt i32 %98, 0
  br i1 %99, label %104, label %100

100:                                              ; preds = %96
  %101 = load i32, ptr %16, align 4, !tbaa !6
  %102 = call i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef %101) #5
  %103 = icmp sgt i32 %102, 0
  br i1 %103, label %104, label %117

104:                                              ; preds = %100, %96
  %105 = load i32, ptr %17, align 8, !tbaa !6
  %106 = load i32, ptr %19, align 4, !tbaa !6
  %107 = load i32, ptr %20, align 8, !tbaa !6
  %108 = load i32, ptr %27, align 4, !tbaa !6
  %109 = load i32, ptr %29, align 8, !tbaa !6
  %110 = load i32, ptr %23, align 4, !tbaa !6
  %111 = load i32, ptr %24, align 4, !tbaa !6
  %112 = load i32, ptr %26, align 8
  %113 = trunc i32 %112 to i16
  %114 = load i32, ptr %16, align 4
  %115 = trunc i32 %114 to i16
  %116 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef nonnull %5, i32 noundef %105, i32 noundef 15, i32 noundef 15, i32 noundef %106, i32 noundef %107, i32 noundef %108, i32 noundef %109, i32 noundef %110, i32 noundef %111, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %113, i16 noundef zeroext %115, i8 noundef zeroext 1) #5
  br label %138

117:                                              ; preds = %100
  %118 = load i32, ptr %16, align 4
  %119 = icmp ne i32 %118, 1
  %.pre = load i32, ptr %17, align 8, !tbaa !6
  %.pre53 = load i32, ptr %20, align 8, !tbaa !6
  %.not = icmp eq i32 %.pre, %.pre53
  %or.cond = select i1 %119, i1 true, i1 %.not
  br i1 %or.cond, label %128, label %120

120:                                              ; preds = %117
  %121 = load i32, ptr %21, align 4, !tbaa !6
  %122 = load i32, ptr %22, align 8, !tbaa !6
  %123 = load i32, ptr %23, align 4, !tbaa !6
  %124 = load i32, ptr %24, align 4, !tbaa !6
  %125 = load i32, ptr %26, align 8
  %126 = trunc i32 %125 to i16
  %127 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef nonnull %5, i32 noundef %.pre, i32 noundef 15, i32 noundef 15, i32 noundef 1, i32 noundef %.pre53, i32 noundef %121, i32 noundef %122, i32 noundef %123, i32 noundef %124, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %126, i16 noundef zeroext 1, i8 noundef zeroext 1) #5
  br label %138

128:                                              ; preds = %117
  %129 = load i32, ptr %19, align 4, !tbaa !6
  %130 = load i32, ptr %21, align 4, !tbaa !6
  %131 = load i32, ptr %22, align 8, !tbaa !6
  %132 = load i32, ptr %23, align 4, !tbaa !6
  %133 = load i32, ptr %24, align 4, !tbaa !6
  %134 = load i32, ptr %26, align 8
  %135 = trunc i32 %134 to i16
  %136 = trunc i32 %118 to i16
  %137 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef nonnull %5, i32 noundef %.pre, i32 noundef 15, i32 noundef 15, i32 noundef %129, i32 noundef %.pre53, i32 noundef %130, i32 noundef %131, i32 noundef %132, i32 noundef %133, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %135, i16 noundef zeroext %136, i8 noundef zeroext 1) #5
  br label %138

138:                                              ; preds = %120, %128, %104
  %.048 = phi ptr [ %116, %104 ], [ %127, %120 ], [ %137, %128 ]
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef nonnull %7, ptr noundef nonnull %6, ptr noundef %0, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %49, ptr noundef nonnull %50, ptr noundef nonnull %51, ptr noundef nonnull %52, ptr noundef nonnull %53, ptr noundef nonnull %54)
  call void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef nonnull %6, ptr noundef %0, i32 noundef %94, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %55, ptr noundef nonnull %56, ptr noundef nonnull %57, ptr noundef nonnull %58, ptr noundef nonnull %59, ptr noundef nonnull %60)
  call void @libxsmm_reference_elementwise(ptr noundef nonnull %8, ptr noundef %.048) #5
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %8) #5
  br label %196

139:                                              ; preds = %89
  call void @llvm.lifetime.start.p0(i64 184, ptr nonnull %9) #5
  %140 = getelementptr inbounds i8, ptr %90, i64 368
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %9, ptr noundef nonnull align 8 dereferenceable(184) %140, i64 184, i1 false), !tbaa.struct !5
  call void @llvm.lifetime.start.p0(i64 176, ptr nonnull %10) #5
  %141 = load i32, ptr %16, align 4, !tbaa !6
  %142 = call i32 @libxsmm_meqn_is_binary_opcode_reduce_to_scalar(i32 noundef %141) #5
  %143 = icmp sgt i32 %142, 0
  %144 = load i32, ptr %17, align 8, !tbaa !6
  %145 = load i32, ptr %18, align 8, !tbaa !6
  %146 = load i32, ptr %19, align 4, !tbaa !6
  %147 = load i32, ptr %20, align 8, !tbaa !6
  br i1 %143, label %148, label %163

148:                                              ; preds = %139
  %149 = load i32, ptr %27, align 4
  %150 = load i32, ptr %28, align 4
  %151 = call i32 @llvm.smax.i32(i32 %149, i32 %150)
  %152 = load i32, ptr %29, align 8
  %153 = load i32, ptr %30, align 8
  %154 = call i32 @llvm.smax.i32(i32 %152, i32 %153)
  %155 = load i32, ptr %23, align 4, !tbaa !6
  %156 = load i32, ptr %24, align 4, !tbaa !6
  %157 = load i32, ptr %25, align 4, !tbaa !6
  %158 = load i32, ptr %26, align 8
  %159 = trunc i32 %158 to i16
  %160 = load i32, ptr %16, align 4
  %161 = trunc i32 %160 to i16
  %162 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef nonnull %5, i32 noundef %144, i32 noundef %145, i32 noundef 15, i32 noundef %146, i32 noundef %147, i32 noundef %151, i32 noundef %154, i32 noundef %155, i32 noundef %156, i32 noundef %157, i32 noundef 0, i16 noundef zeroext %159, i16 noundef zeroext %161, i8 noundef zeroext 2) #5
  br label %174

163:                                              ; preds = %139
  %164 = load i32, ptr %21, align 4, !tbaa !6
  %165 = load i32, ptr %22, align 8, !tbaa !6
  %166 = load i32, ptr %23, align 4, !tbaa !6
  %167 = load i32, ptr %24, align 4, !tbaa !6
  %168 = load i32, ptr %25, align 4, !tbaa !6
  %169 = load i32, ptr %26, align 8
  %170 = trunc i32 %169 to i16
  %171 = load i32, ptr %16, align 4
  %172 = trunc i32 %171 to i16
  %173 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef nonnull %5, i32 noundef %144, i32 noundef %145, i32 noundef 15, i32 noundef %146, i32 noundef %147, i32 noundef %164, i32 noundef %165, i32 noundef %166, i32 noundef %167, i32 noundef %168, i32 noundef 0, i16 noundef zeroext %170, i16 noundef zeroext %172, i8 noundef zeroext 2) #5
  br label %174

174:                                              ; preds = %163, %148
  %.1 = phi ptr [ %162, %148 ], [ %173, %163 ]
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef nonnull %7, ptr noundef nonnull %6, ptr noundef %0, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %31, ptr noundef nonnull %32, ptr noundef nonnull %33, ptr noundef nonnull %34, ptr noundef nonnull %35, ptr noundef nonnull %36)
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef nonnull %9, ptr noundef nonnull %6, ptr noundef %0, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %37, ptr noundef nonnull %38, ptr noundef nonnull %39, ptr noundef nonnull %40, ptr noundef nonnull %41, ptr noundef nonnull %42)
  call void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef nonnull %6, ptr noundef %0, i32 noundef %94, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %43, ptr noundef nonnull %44, ptr noundef nonnull %45, ptr noundef nonnull %46, ptr noundef nonnull %47, ptr noundef nonnull %48)
  call void @libxsmm_reference_elementwise(ptr noundef nonnull %10, ptr noundef %.1) #5
  call void @llvm.lifetime.end.p0(i64 176, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr nonnull %9) #5
  br label %196

175:                                              ; preds = %89
  call void @llvm.lifetime.start.p0(i64 184, ptr nonnull %11) #5
  %176 = getelementptr inbounds i8, ptr %90, i64 368
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %11, ptr noundef nonnull align 8 dereferenceable(184) %176, i64 184, i1 false), !tbaa.struct !5
  call void @llvm.lifetime.start.p0(i64 184, ptr nonnull %12) #5
  %177 = getelementptr inbounds i8, ptr %90, i64 552
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(184) %12, ptr noundef nonnull align 8 dereferenceable(184) %177, i64 184, i1 false), !tbaa.struct !5
  %178 = load i32, ptr %16, align 4
  %179 = icmp eq i32 %178, 3
  %180 = load i32, ptr %61, align 8
  %181 = select i1 %179, i32 14, i32 %180
  call void @llvm.lifetime.start.p0(i64 224, ptr nonnull %13) #5
  %182 = load i32, ptr %17, align 8, !tbaa !6
  %183 = load i32, ptr %62, align 8, !tbaa !6
  %184 = load i32, ptr %19, align 4, !tbaa !6
  %185 = load i32, ptr %20, align 8, !tbaa !6
  %186 = load i32, ptr %21, align 4, !tbaa !6
  %187 = load i32, ptr %22, align 8, !tbaa !6
  %188 = load i32, ptr %23, align 4, !tbaa !6
  %189 = load i32, ptr %24, align 4, !tbaa !6
  %190 = load i32, ptr %63, align 4, !tbaa !6
  %191 = load i32, ptr %64, align 4, !tbaa !6
  %192 = load i32, ptr %26, align 8
  %193 = trunc i32 %192 to i16
  %194 = trunc i32 %178 to i16
  %195 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef nonnull %5, i32 noundef %182, i32 noundef %183, i32 noundef %181, i32 noundef %184, i32 noundef %185, i32 noundef %186, i32 noundef %187, i32 noundef %188, i32 noundef %189, i32 noundef %190, i32 noundef %191, i16 noundef zeroext %193, i16 noundef zeroext %194, i8 noundef zeroext 3) #5
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef nonnull %7, ptr noundef nonnull %6, ptr noundef %0, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %65, ptr noundef nonnull %66, ptr noundef nonnull %67, ptr noundef nonnull %68, ptr noundef nonnull %69, ptr noundef nonnull %70)
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef nonnull %11, ptr noundef nonnull %6, ptr noundef %0, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %71, ptr noundef nonnull %72, ptr noundef nonnull %73, ptr noundef nonnull %74, ptr noundef nonnull %75, ptr noundef nonnull %76)
  call void @libxsmm_generator_matequation_setup_inp_ptrs(ptr noundef nonnull %12, ptr noundef nonnull %6, ptr noundef %0, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %77, ptr noundef nonnull %78, ptr noundef nonnull %79, ptr noundef nonnull %80, ptr noundef nonnull %81, ptr noundef nonnull %82)
  call void @libxsmm_generator_matequation_setup_out_ptrs(ptr noundef nonnull %6, ptr noundef %0, i32 noundef %94, ptr noundef %2, i64 noundef %3, ptr noundef nonnull %83, ptr noundef nonnull %84, ptr noundef nonnull %85, ptr noundef nonnull %86, ptr noundef nonnull %87, ptr noundef nonnull %88)
  call void @libxsmm_reference_elementwise(ptr noundef nonnull %13, ptr noundef %195) #5
  call void @llvm.lifetime.end.p0(i64 224, ptr nonnull %13) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr nonnull %12) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr nonnull %11) #5
  br label %196

196:                                              ; preds = %174, %175, %138
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  call void @llvm.lifetime.end.p0(i64 184, ptr nonnull %7) #5
  call void @llvm.lifetime.end.p0(i64 184, ptr nonnull %6) #5
  br i1 %93, label %197, label %89

197:                                              ; preds = %196
  call void @llvm.lifetime.end.p0(i64 96, ptr nonnull %5) #5
  ret void
}

; 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) #3

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef) local_unnamed_addr #2

declare ptr @libxsmm_meltw_descriptor_init2(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i16 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #2

declare void @libxsmm_reference_elementwise(ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @libxsmm_meqn_is_binary_opcode_reduce_to_scalar(i32 noundef) local_unnamed_addr #2

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { 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 = !{i64 0, i64 8, !6, i64 8, i64 8, !6, i64 16, i64 8, !6, i64 24, i64 8, !6, i64 32, i64 4, !6, i64 36, i64 44, !6, i64 80, i64 4, !6, i64 84, i64 4, !6, i64 88, i64 4, !6, i64 92, i64 4, !6, i64 96, i64 4, !6, i64 100, i64 4, !6, i64 104, i64 4, !6, i64 108, i64 4, !6, i64 112, i64 4, !6, i64 116, i64 4, !6, i64 120, i64 4, !6, i64 124, i64 4, !6, i64 128, i64 4, !6, i64 132, i64 4, !6, i64 136, i64 4, !6, i64 140, i64 4, !6, i64 144, i64 4, !6, i64 148, i64 4, !6, i64 152, i64 4, !6, i64 156, i64 4, !6, i64 160, i64 4, !6, i64 164, i64 20, !6}
!6 = !{!7, !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,LICMPass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass