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

; 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_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_meqn_unary_op = type { i32, i32, i32, i32 }

@.str = external hidden unnamed_addr constant [369 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [96 x i8], align 1
@__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor = external hidden unnamed_addr constant [172 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [364 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_matequation_create_unary_descriptor(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4) #0 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !9
  store i32 %4, ptr %10, align 4, !tbaa !9
  %11 = load ptr, ptr %7, align 8, !tbaa !5
  %12 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %11, i32 0, i32 5
  %13 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %12, i32 0, i32 0
  %14 = load i32, ptr %13, align 4, !tbaa !11
  %15 = call i32 @libxsmm_meqn_is_unary_opcode_transform_kernel(i32 noundef %14)
  %16 = icmp sgt i32 %15, 0
  br i1 %16, label %17, label %147

17:                                               ; preds = %5
  %18 = load ptr, ptr %6, align 8, !tbaa !5
  %19 = load i32, ptr %9, align 4, !tbaa !9
  %20 = load ptr, ptr %7, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %20, i32 0, i32 5
  %22 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %21, i32 0, i32 2
  %23 = load i32, ptr %22, align 4, !tbaa !11
  %24 = load i32, ptr %10, align 4, !tbaa !9
  %25 = load ptr, ptr %7, align 8, !tbaa !5
  %26 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %25, i32 0, i32 0
  %27 = load ptr, ptr %26, align 8, !tbaa !11
  %28 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %27, i32 0, i32 8
  %29 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %28, i32 0, i32 1
  %30 = load i32, ptr %29, align 4, !tbaa !11
  %31 = load ptr, ptr %7, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %31, i32 0, i32 0
  %33 = load ptr, ptr %32, align 8, !tbaa !11
  %34 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %33, i32 0, i32 8
  %35 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %34, i32 0, i32 2
  %36 = load i32, ptr %35, align 8, !tbaa !11
  %37 = load ptr, ptr %7, align 8, !tbaa !5
  %38 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %37, i32 0, i32 0
  %39 = load ptr, ptr %38, align 8, !tbaa !11
  %40 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %39, i32 0, i32 8
  %41 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %40, i32 0, i32 3
  %42 = load i32, ptr %41, align 4, !tbaa !11
  %43 = load ptr, ptr %7, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %43, i32 0, i32 8
  %45 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %44, i32 0, i32 3
  %46 = load i32, ptr %45, align 4, !tbaa !11
  %47 = load ptr, ptr %7, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %47, i32 0, i32 5
  %49 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %48, i32 0, i32 1
  %50 = load i32, ptr %49, align 4, !tbaa !11
  %51 = trunc i32 %50 to i16
  %52 = zext i16 %51 to i32
  %53 = icmp eq i32 0, %52
  br i1 %53, label %62, label %54

54:                                               ; preds = %17
  %55 = load ptr, ptr %7, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %55, i32 0, i32 5
  %57 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %56, i32 0, i32 1
  %58 = load i32, ptr %57, align 4, !tbaa !11
  %59 = trunc i32 %58 to i16
  %60 = zext i16 %59 to i32
  %61 = icmp slt i32 0, %60
  br i1 %61, label %62, label %89

62:                                               ; preds = %54, %17
  %63 = load ptr, ptr %7, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %63, i32 0, i32 5
  %65 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %64, i32 0, i32 1
  %66 = load i32, ptr %65, align 4, !tbaa !11
  %67 = zext i32 %66 to i64
  %68 = mul i64 1, %67
  %69 = icmp ult i64 %68, 65535
  br i1 %69, label %70, label %77

70:                                               ; preds = %62
  %71 = load ptr, ptr %7, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %71, i32 0, i32 5
  %73 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %72, i32 0, i32 1
  %74 = load i32, ptr %73, align 4, !tbaa !11
  %75 = zext i32 %74 to i64
  %76 = mul i64 1, %75
  br label %78

77:                                               ; preds = %62
  br label %78

78:                                               ; preds = %77, %70
  %79 = phi i64 [ %76, %70 ], [ 65535, %77 ]
  %80 = icmp ule i64 %79, 65535
  br i1 %80, label %81, label %89

81:                                               ; preds = %78
  %82 = load ptr, ptr %7, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %82, i32 0, i32 5
  %84 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %83, i32 0, i32 1
  %85 = load i32, ptr %84, align 4, !tbaa !11
  %86 = uitofp i32 %85 to double
  %87 = fcmp ole double 0.000000e+00, %86
  br i1 %87, label %88, label %89

88:                                               ; preds = %81
  br label %90

89:                                               ; preds = %81, %78, %54
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 29, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

90:                                               ; preds = %88
  %91 = load ptr, ptr %7, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %91, i32 0, i32 5
  %93 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %92, i32 0, i32 1
  %94 = load i32, ptr %93, align 4, !tbaa !11
  %95 = trunc i32 %94 to i16
  %96 = load ptr, ptr %7, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %96, i32 0, i32 5
  %98 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %97, i32 0, i32 0
  %99 = load i32, ptr %98, align 4, !tbaa !11
  %100 = trunc i32 %99 to i16
  %101 = zext i16 %100 to i32
  %102 = icmp eq i32 0, %101
  br i1 %102, label %111, label %103

103:                                              ; preds = %90
  %104 = load ptr, ptr %7, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %104, i32 0, i32 5
  %106 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %105, i32 0, i32 0
  %107 = load i32, ptr %106, align 4, !tbaa !11
  %108 = trunc i32 %107 to i16
  %109 = zext i16 %108 to i32
  %110 = icmp slt i32 0, %109
  br i1 %110, label %111, label %138

111:                                              ; preds = %103, %90
  %112 = load ptr, ptr %7, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %112, i32 0, i32 5
  %114 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %113, i32 0, i32 0
  %115 = load i32, ptr %114, align 4, !tbaa !11
  %116 = zext i32 %115 to i64
  %117 = mul i64 1, %116
  %118 = icmp ult i64 %117, 65535
  br i1 %118, label %119, label %126

119:                                              ; preds = %111
  %120 = load ptr, ptr %7, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %120, i32 0, i32 5
  %122 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %121, i32 0, i32 0
  %123 = load i32, ptr %122, align 4, !tbaa !11
  %124 = zext i32 %123 to i64
  %125 = mul i64 1, %124
  br label %127

126:                                              ; preds = %111
  br label %127

127:                                              ; preds = %126, %119
  %128 = phi i64 [ %125, %119 ], [ 65535, %126 ]
  %129 = icmp ule i64 %128, 65535
  br i1 %129, label %130, label %138

130:                                              ; preds = %127
  %131 = load ptr, ptr %7, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %131, i32 0, i32 5
  %133 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %132, i32 0, i32 0
  %134 = load i32, ptr %133, align 4, !tbaa !11
  %135 = uitofp i32 %134 to double
  %136 = fcmp ole double 0.000000e+00, %135
  br i1 %136, label %137, label %138

137:                                              ; preds = %130
  br label %139

138:                                              ; preds = %130, %127, %103
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str.1, i32 noundef 29, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

139:                                              ; preds = %137
  %140 = load ptr, ptr %7, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %140, i32 0, i32 5
  %142 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %141, i32 0, i32 0
  %143 = load i32, ptr %142, align 4, !tbaa !11
  %144 = trunc i32 %143 to i16
  %145 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %18, i32 noundef %19, i32 noundef 15, i32 noundef 15, i32 noundef %23, i32 noundef %24, i32 noundef %30, i32 noundef %36, i32 noundef %42, i32 noundef %46, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %95, i16 noundef zeroext %144, i8 noundef zeroext 1)
  %146 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %145, ptr %146, align 8, !tbaa !5
  br label %551

147:                                              ; preds = %5
  %148 = load ptr, ptr %7, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %148, i32 0, i32 5
  %150 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %149, i32 0, i32 0
  %151 = load i32, ptr %150, align 4, !tbaa !11
  %152 = call i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef %151)
  %153 = icmp sgt i32 %152, 0
  br i1 %153, label %161, label %154

154:                                              ; preds = %147
  %155 = load ptr, ptr %7, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %155, i32 0, i32 5
  %157 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %156, i32 0, i32 0
  %158 = load i32, ptr %157, align 4, !tbaa !11
  %159 = call i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef %158)
  %160 = icmp sgt i32 %159, 0
  br i1 %160, label %161, label %291

161:                                              ; preds = %154, %147
  %162 = load ptr, ptr %6, align 8, !tbaa !5
  %163 = load i32, ptr %9, align 4, !tbaa !9
  %164 = load ptr, ptr %7, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %164, i32 0, i32 5
  %166 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %165, i32 0, i32 2
  %167 = load i32, ptr %166, align 4, !tbaa !11
  %168 = load i32, ptr %10, align 4, !tbaa !9
  %169 = load ptr, ptr %7, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %169, i32 0, i32 0
  %171 = load ptr, ptr %170, align 8, !tbaa !11
  %172 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %171, i32 0, i32 8
  %173 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %172, i32 0, i32 1
  %174 = load i32, ptr %173, align 4, !tbaa !11
  %175 = load ptr, ptr %7, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %175, i32 0, i32 0
  %177 = load ptr, ptr %176, align 8, !tbaa !11
  %178 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %177, i32 0, i32 8
  %179 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %178, i32 0, i32 2
  %180 = load i32, ptr %179, align 8, !tbaa !11
  %181 = load ptr, ptr %7, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %181, i32 0, i32 0
  %183 = load ptr, ptr %182, align 8, !tbaa !11
  %184 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %183, i32 0, i32 8
  %185 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %184, i32 0, i32 3
  %186 = load i32, ptr %185, align 4, !tbaa !11
  %187 = load ptr, ptr %7, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %187, i32 0, i32 8
  %189 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %188, i32 0, i32 3
  %190 = load i32, ptr %189, align 4, !tbaa !11
  %191 = load ptr, ptr %7, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %191, i32 0, i32 5
  %193 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %192, i32 0, i32 1
  %194 = load i32, ptr %193, align 4, !tbaa !11
  %195 = trunc i32 %194 to i16
  %196 = zext i16 %195 to i32
  %197 = icmp eq i32 0, %196
  br i1 %197, label %206, label %198

198:                                              ; preds = %161
  %199 = load ptr, ptr %7, align 8, !tbaa !5
  %200 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %199, i32 0, i32 5
  %201 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %200, i32 0, i32 1
  %202 = load i32, ptr %201, align 4, !tbaa !11
  %203 = trunc i32 %202 to i16
  %204 = zext i16 %203 to i32
  %205 = icmp slt i32 0, %204
  br i1 %205, label %206, label %233

206:                                              ; preds = %198, %161
  %207 = load ptr, ptr %7, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %207, i32 0, i32 5
  %209 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %208, i32 0, i32 1
  %210 = load i32, ptr %209, align 4, !tbaa !11
  %211 = zext i32 %210 to i64
  %212 = mul i64 1, %211
  %213 = icmp ult i64 %212, 65535
  br i1 %213, label %214, label %221

214:                                              ; preds = %206
  %215 = load ptr, ptr %7, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %215, i32 0, i32 5
  %217 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %216, i32 0, i32 1
  %218 = load i32, ptr %217, align 4, !tbaa !11
  %219 = zext i32 %218 to i64
  %220 = mul i64 1, %219
  br label %222

221:                                              ; preds = %206
  br label %222

222:                                              ; preds = %221, %214
  %223 = phi i64 [ %220, %214 ], [ 65535, %221 ]
  %224 = icmp ule i64 %223, 65535
  br i1 %224, label %225, label %233

225:                                              ; preds = %222
  %226 = load ptr, ptr %7, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %226, i32 0, i32 5
  %228 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %227, i32 0, i32 1
  %229 = load i32, ptr %228, align 4, !tbaa !11
  %230 = uitofp i32 %229 to double
  %231 = fcmp ole double 0.000000e+00, %230
  br i1 %231, label %232, label %233

232:                                              ; preds = %225
  br label %234

233:                                              ; preds = %225, %222, %198
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 33, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

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

247:                                              ; preds = %234
  %248 = load ptr, ptr %7, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %248, 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 !11
  %252 = trunc i32 %251 to i16
  %253 = zext i16 %252 to i32
  %254 = icmp slt i32 0, %253
  br i1 %254, label %255, label %282

255:                                              ; preds = %247, %234
  %256 = load ptr, ptr %7, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %256, i32 0, i32 5
  %258 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %257, i32 0, i32 0
  %259 = load i32, ptr %258, align 4, !tbaa !11
  %260 = zext i32 %259 to i64
  %261 = mul i64 1, %260
  %262 = icmp ult i64 %261, 65535
  br i1 %262, label %263, label %270

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

270:                                              ; preds = %255
  br label %271

271:                                              ; preds = %270, %263
  %272 = phi i64 [ %269, %263 ], [ 65535, %270 ]
  %273 = icmp ule i64 %272, 65535
  br i1 %273, label %274, label %282

274:                                              ; preds = %271
  %275 = load ptr, ptr %7, align 8, !tbaa !5
  %276 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %275, i32 0, i32 5
  %277 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %276, i32 0, i32 0
  %278 = load i32, ptr %277, align 4, !tbaa !11
  %279 = uitofp i32 %278 to double
  %280 = fcmp ole double 0.000000e+00, %279
  br i1 %280, label %281, label %282

281:                                              ; preds = %274
  br label %283

282:                                              ; preds = %274, %271, %247
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str.1, i32 noundef 33, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

283:                                              ; preds = %281
  %284 = load ptr, ptr %7, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %284, i32 0, i32 5
  %286 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %285, i32 0, i32 0
  %287 = load i32, ptr %286, align 4, !tbaa !11
  %288 = trunc i32 %287 to i16
  %289 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %162, i32 noundef %163, i32 noundef 15, i32 noundef 15, i32 noundef %167, i32 noundef %168, i32 noundef %174, i32 noundef %180, i32 noundef %186, i32 noundef %190, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %239, i16 noundef zeroext %288, i8 noundef zeroext 1)
  %290 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %289, ptr %290, align 8, !tbaa !5
  br label %550

291:                                              ; preds = %154
  %292 = load ptr, ptr %7, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %292, i32 0, i32 5
  %294 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %293, i32 0, i32 0
  %295 = load i32, ptr %294, align 4, !tbaa !11
  %296 = icmp eq i32 %295, 1
  br i1 %296, label %297, label %423

297:                                              ; preds = %291
  %298 = load i32, ptr %9, align 4, !tbaa !9
  %299 = load i32, ptr %10, align 4, !tbaa !9
  %300 = icmp ne i32 %298, %299
  br i1 %300, label %301, label %423

301:                                              ; preds = %297
  %302 = load ptr, ptr %6, align 8, !tbaa !5
  %303 = load i32, ptr %9, align 4, !tbaa !9
  %304 = load i32, ptr %10, align 4, !tbaa !9
  %305 = load ptr, ptr %7, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %305, i32 0, i32 8
  %307 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %306, i32 0, i32 1
  %308 = load i32, ptr %307, align 4, !tbaa !11
  %309 = load ptr, ptr %7, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %309, i32 0, i32 8
  %311 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %310, i32 0, i32 2
  %312 = load i32, ptr %311, align 8, !tbaa !11
  %313 = load ptr, ptr %7, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %313, i32 0, i32 0
  %315 = load ptr, ptr %314, align 8, !tbaa !11
  %316 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %315, i32 0, i32 8
  %317 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %316, i32 0, i32 3
  %318 = load i32, ptr %317, align 4, !tbaa !11
  %319 = load ptr, ptr %7, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %319, i32 0, i32 8
  %321 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %320, i32 0, i32 3
  %322 = load i32, ptr %321, align 4, !tbaa !11
  %323 = load ptr, ptr %7, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %323, i32 0, i32 5
  %325 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %324, i32 0, i32 1
  %326 = load i32, ptr %325, align 4, !tbaa !11
  %327 = trunc i32 %326 to i16
  %328 = zext i16 %327 to i32
  %329 = icmp eq i32 0, %328
  br i1 %329, label %338, label %330

330:                                              ; preds = %301
  %331 = load ptr, ptr %7, align 8, !tbaa !5
  %332 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %331, i32 0, i32 5
  %333 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %332, i32 0, i32 1
  %334 = load i32, ptr %333, align 4, !tbaa !11
  %335 = trunc i32 %334 to i16
  %336 = zext i16 %335 to i32
  %337 = icmp slt i32 0, %336
  br i1 %337, label %338, label %365

338:                                              ; preds = %330, %301
  %339 = load ptr, ptr %7, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %339, i32 0, i32 5
  %341 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %340, i32 0, i32 1
  %342 = load i32, ptr %341, align 4, !tbaa !11
  %343 = zext i32 %342 to i64
  %344 = mul i64 1, %343
  %345 = icmp ult i64 %344, 65535
  br i1 %345, label %346, label %353

346:                                              ; preds = %338
  %347 = load ptr, ptr %7, align 8, !tbaa !5
  %348 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %347, i32 0, i32 5
  %349 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %348, i32 0, i32 1
  %350 = load i32, ptr %349, align 4, !tbaa !11
  %351 = zext i32 %350 to i64
  %352 = mul i64 1, %351
  br label %354

353:                                              ; preds = %338
  br label %354

354:                                              ; preds = %353, %346
  %355 = phi i64 [ %352, %346 ], [ 65535, %353 ]
  %356 = icmp ule i64 %355, 65535
  br i1 %356, label %357, label %365

357:                                              ; preds = %354
  %358 = load ptr, ptr %7, align 8, !tbaa !5
  %359 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %358, i32 0, i32 5
  %360 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %359, i32 0, i32 1
  %361 = load i32, ptr %360, align 4, !tbaa !11
  %362 = uitofp i32 %361 to double
  %363 = fcmp ole double 0.000000e+00, %362
  br i1 %363, label %364, label %365

364:                                              ; preds = %357
  br label %366

365:                                              ; preds = %357, %354, %330
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 38, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

366:                                              ; preds = %364
  %367 = load ptr, ptr %7, align 8, !tbaa !5
  %368 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %367, i32 0, i32 5
  %369 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %368, i32 0, i32 1
  %370 = load i32, ptr %369, align 4, !tbaa !11
  %371 = trunc i32 %370 to i16
  %372 = load ptr, ptr %7, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %372, i32 0, i32 5
  %374 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %373, i32 0, i32 0
  %375 = load i32, ptr %374, align 4, !tbaa !11
  %376 = trunc i32 %375 to i16
  %377 = zext i16 %376 to i32
  %378 = icmp eq i32 0, %377
  br i1 %378, label %387, label %379

379:                                              ; preds = %366
  %380 = load ptr, ptr %7, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %380, i32 0, i32 5
  %382 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %381, i32 0, i32 0
  %383 = load i32, ptr %382, align 4, !tbaa !11
  %384 = trunc i32 %383 to i16
  %385 = zext i16 %384 to i32
  %386 = icmp slt i32 0, %385
  br i1 %386, label %387, label %414

387:                                              ; preds = %379, %366
  %388 = load ptr, ptr %7, align 8, !tbaa !5
  %389 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %388, i32 0, i32 5
  %390 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %389, i32 0, i32 0
  %391 = load i32, ptr %390, align 4, !tbaa !11
  %392 = zext i32 %391 to i64
  %393 = mul i64 1, %392
  %394 = icmp ult i64 %393, 65535
  br i1 %394, label %395, label %402

395:                                              ; preds = %387
  %396 = load ptr, ptr %7, align 8, !tbaa !5
  %397 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %396, i32 0, i32 5
  %398 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %397, i32 0, i32 0
  %399 = load i32, ptr %398, align 4, !tbaa !11
  %400 = zext i32 %399 to i64
  %401 = mul i64 1, %400
  br label %403

402:                                              ; preds = %387
  br label %403

403:                                              ; preds = %402, %395
  %404 = phi i64 [ %401, %395 ], [ 65535, %402 ]
  %405 = icmp ule i64 %404, 65535
  br i1 %405, label %406, label %414

406:                                              ; preds = %403
  %407 = load ptr, ptr %7, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %407, i32 0, i32 5
  %409 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %408, i32 0, i32 0
  %410 = load i32, ptr %409, align 4, !tbaa !11
  %411 = uitofp i32 %410 to double
  %412 = fcmp ole double 0.000000e+00, %411
  br i1 %412, label %413, label %414

413:                                              ; preds = %406
  br label %415

414:                                              ; preds = %406, %403, %379
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str.1, i32 noundef 38, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

415:                                              ; preds = %413
  %416 = load ptr, ptr %7, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %416, i32 0, i32 5
  %418 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %417, i32 0, i32 0
  %419 = load i32, ptr %418, align 4, !tbaa !11
  %420 = trunc i32 %419 to i16
  %421 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %302, i32 noundef %303, i32 noundef 15, i32 noundef 15, i32 noundef 1, i32 noundef %304, i32 noundef %308, i32 noundef %312, i32 noundef %318, i32 noundef %322, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %371, i16 noundef zeroext %420, i8 noundef zeroext 1)
  %422 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %421, ptr %422, align 8, !tbaa !5
  br label %549

423:                                              ; preds = %297, %291
  %424 = load ptr, ptr %6, align 8, !tbaa !5
  %425 = load i32, ptr %9, align 4, !tbaa !9
  %426 = load ptr, ptr %7, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %426, i32 0, i32 5
  %428 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %427, i32 0, i32 2
  %429 = load i32, ptr %428, align 4, !tbaa !11
  %430 = load i32, ptr %10, align 4, !tbaa !9
  %431 = load ptr, ptr %7, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %431, i32 0, i32 8
  %433 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %432, i32 0, i32 1
  %434 = load i32, ptr %433, align 4, !tbaa !11
  %435 = load ptr, ptr %7, align 8, !tbaa !5
  %436 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %435, i32 0, i32 8
  %437 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %436, i32 0, i32 2
  %438 = load i32, ptr %437, align 8, !tbaa !11
  %439 = load ptr, ptr %7, align 8, !tbaa !5
  %440 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %439, i32 0, i32 0
  %441 = load ptr, ptr %440, align 8, !tbaa !11
  %442 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %441, i32 0, i32 8
  %443 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %442, i32 0, i32 3
  %444 = load i32, ptr %443, align 4, !tbaa !11
  %445 = load ptr, ptr %7, align 8, !tbaa !5
  %446 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %445, i32 0, i32 8
  %447 = getelementptr inbounds %struct.libxsmm_meqn_tmp_info, ptr %446, i32 0, i32 3
  %448 = load i32, ptr %447, align 4, !tbaa !11
  %449 = load ptr, ptr %7, align 8, !tbaa !5
  %450 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %449, i32 0, i32 5
  %451 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %450, i32 0, i32 1
  %452 = load i32, ptr %451, align 4, !tbaa !11
  %453 = trunc i32 %452 to i16
  %454 = zext i16 %453 to i32
  %455 = icmp eq i32 0, %454
  br i1 %455, label %464, label %456

456:                                              ; preds = %423
  %457 = load ptr, ptr %7, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %457, i32 0, i32 5
  %459 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %458, i32 0, i32 1
  %460 = load i32, ptr %459, align 4, !tbaa !11
  %461 = trunc i32 %460 to i16
  %462 = zext i16 %461 to i32
  %463 = icmp slt i32 0, %462
  br i1 %463, label %464, label %491

464:                                              ; preds = %456, %423
  %465 = load ptr, ptr %7, align 8, !tbaa !5
  %466 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %465, i32 0, i32 5
  %467 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %466, i32 0, i32 1
  %468 = load i32, ptr %467, align 4, !tbaa !11
  %469 = zext i32 %468 to i64
  %470 = mul i64 1, %469
  %471 = icmp ult i64 %470, 65535
  br i1 %471, label %472, label %479

472:                                              ; preds = %464
  %473 = load ptr, ptr %7, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %473, i32 0, i32 5
  %475 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %474, i32 0, i32 1
  %476 = load i32, ptr %475, align 4, !tbaa !11
  %477 = zext i32 %476 to i64
  %478 = mul i64 1, %477
  br label %480

479:                                              ; preds = %464
  br label %480

480:                                              ; preds = %479, %472
  %481 = phi i64 [ %478, %472 ], [ 65535, %479 ]
  %482 = icmp ule i64 %481, 65535
  br i1 %482, label %483, label %491

483:                                              ; preds = %480
  %484 = load ptr, ptr %7, align 8, !tbaa !5
  %485 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %484, i32 0, i32 5
  %486 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %485, i32 0, i32 1
  %487 = load i32, ptr %486, align 4, !tbaa !11
  %488 = uitofp i32 %487 to double
  %489 = fcmp ole double 0.000000e+00, %488
  br i1 %489, label %490, label %491

490:                                              ; preds = %483
  br label %492

491:                                              ; preds = %483, %480, %456
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 42, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

492:                                              ; preds = %490
  %493 = load ptr, ptr %7, align 8, !tbaa !5
  %494 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %493, i32 0, i32 5
  %495 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %494, i32 0, i32 1
  %496 = load i32, ptr %495, align 4, !tbaa !11
  %497 = trunc i32 %496 to i16
  %498 = load ptr, ptr %7, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %498, i32 0, i32 5
  %500 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %499, i32 0, i32 0
  %501 = load i32, ptr %500, align 4, !tbaa !11
  %502 = trunc i32 %501 to i16
  %503 = zext i16 %502 to i32
  %504 = icmp eq i32 0, %503
  br i1 %504, label %513, label %505

505:                                              ; preds = %492
  %506 = load ptr, ptr %7, align 8, !tbaa !5
  %507 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %506, i32 0, i32 5
  %508 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %507, i32 0, i32 0
  %509 = load i32, ptr %508, align 4, !tbaa !11
  %510 = trunc i32 %509 to i16
  %511 = zext i16 %510 to i32
  %512 = icmp slt i32 0, %511
  br i1 %512, label %513, label %540

513:                                              ; preds = %505, %492
  %514 = load ptr, ptr %7, align 8, !tbaa !5
  %515 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %514, i32 0, i32 5
  %516 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %515, i32 0, i32 0
  %517 = load i32, ptr %516, align 4, !tbaa !11
  %518 = zext i32 %517 to i64
  %519 = mul i64 1, %518
  %520 = icmp ult i64 %519, 65535
  br i1 %520, label %521, label %528

521:                                              ; preds = %513
  %522 = load ptr, ptr %7, align 8, !tbaa !5
  %523 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %522, i32 0, i32 5
  %524 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %523, i32 0, i32 0
  %525 = load i32, ptr %524, align 4, !tbaa !11
  %526 = zext i32 %525 to i64
  %527 = mul i64 1, %526
  br label %529

528:                                              ; preds = %513
  br label %529

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

532:                                              ; preds = %529
  %533 = load ptr, ptr %7, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %533, i32 0, i32 5
  %535 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %534, i32 0, i32 0
  %536 = load i32, ptr %535, align 4, !tbaa !11
  %537 = uitofp i32 %536 to double
  %538 = fcmp ole double 0.000000e+00, %537
  br i1 %538, label %539, label %540

539:                                              ; preds = %532
  br label %541

540:                                              ; preds = %532, %529, %505
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str.1, i32 noundef 42, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_matequation_create_unary_descriptor) #3
  unreachable

541:                                              ; preds = %539
  %542 = load ptr, ptr %7, align 8, !tbaa !5
  %543 = getelementptr inbounds %struct.libxsmm_meqn_elem, ptr %542, i32 0, i32 5
  %544 = getelementptr inbounds %struct.libxsmm_meqn_unary_op, ptr %543, i32 0, i32 0
  %545 = load i32, ptr %544, align 4, !tbaa !11
  %546 = trunc i32 %545 to i16
  %547 = call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %424, i32 noundef %425, i32 noundef 15, i32 noundef 15, i32 noundef %429, i32 noundef %430, i32 noundef %434, i32 noundef %438, i32 noundef %444, i32 noundef %448, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %497, i16 noundef zeroext %546, i8 noundef zeroext 1)
  %548 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %547, ptr %548, align 8, !tbaa !5
  br label %549

549:                                              ; preds = %541, %415
  br label %550

550:                                              ; preds = %549, %283
  br label %551

551:                                              ; preds = %550, %139
  ret void
}

declare i32 @libxsmm_meqn_is_unary_opcode_transform_kernel(i32 noundef) #1

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

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

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef) #1

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef) #1

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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { 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 #3 = { 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 = !{!"int", !7, i64 0}
!11 = !{!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"

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_matequation_create_unary_descriptor(ptr noundef %0, ptr nocapture noundef readonly %1, ptr nocapture noundef writeonly %2, i32 noundef %3, i32 noundef %4) local_unnamed_addr #0 {
  %6 = getelementptr inbounds i8, ptr %1, i64 36
  %7 = load i32, ptr %6, align 4, !tbaa !5
  %8 = tail call i32 @libxsmm_meqn_is_unary_opcode_transform_kernel(i32 noundef %7) #2
  %9 = icmp sgt i32 %8, 0
  br i1 %9, label %10, label %28

10:                                               ; preds = %5
  %11 = getelementptr inbounds i8, ptr %1, i64 44
  %12 = load i32, ptr %11, align 4, !tbaa !5
  %13 = load ptr, ptr %1, align 8, !tbaa !5
  %14 = getelementptr inbounds i8, ptr %13, i64 92
  %15 = load i32, ptr %14, align 4, !tbaa !5
  %16 = getelementptr inbounds i8, ptr %13, i64 96
  %17 = load i32, ptr %16, align 8, !tbaa !5
  %18 = getelementptr inbounds i8, ptr %13, i64 100
  %19 = load i32, ptr %18, align 4, !tbaa !5
  %20 = getelementptr inbounds i8, ptr %1, i64 100
  %21 = load i32, ptr %20, align 4, !tbaa !5
  %22 = getelementptr inbounds i8, ptr %1, i64 40
  %23 = load i32, ptr %22, align 4, !tbaa !5
  %24 = trunc i32 %23 to i16
  %25 = load i32, ptr %6, align 4, !tbaa !5
  %26 = trunc i32 %25 to i16
  %27 = tail call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %0, i32 noundef %3, i32 noundef 15, i32 noundef 15, i32 noundef %12, i32 noundef %4, i32 noundef %15, i32 noundef %17, i32 noundef %19, i32 noundef %21, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %24, i16 noundef zeroext %26, i8 noundef zeroext 1) #2
  br label %88

28:                                               ; preds = %5
  %29 = load i32, ptr %6, align 4, !tbaa !5
  %30 = tail call i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef %29) #2
  %31 = icmp sgt i32 %30, 0
  br i1 %31, label %36, label %32

32:                                               ; preds = %28
  %33 = load i32, ptr %6, align 4, !tbaa !5
  %34 = tail call i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef %33) #2
  %35 = icmp sgt i32 %34, 0
  br i1 %35, label %36, label %54

36:                                               ; preds = %32, %28
  %37 = getelementptr inbounds i8, ptr %1, i64 44
  %38 = load i32, ptr %37, align 4, !tbaa !5
  %39 = load ptr, ptr %1, align 8, !tbaa !5
  %40 = getelementptr inbounds i8, ptr %39, i64 92
  %41 = load i32, ptr %40, align 4, !tbaa !5
  %42 = getelementptr inbounds i8, ptr %39, i64 96
  %43 = load i32, ptr %42, align 8, !tbaa !5
  %44 = getelementptr inbounds i8, ptr %39, i64 100
  %45 = load i32, ptr %44, align 4, !tbaa !5
  %46 = getelementptr inbounds i8, ptr %1, i64 100
  %47 = load i32, ptr %46, align 4, !tbaa !5
  %48 = getelementptr inbounds i8, ptr %1, i64 40
  %49 = load i32, ptr %48, align 4, !tbaa !5
  %50 = trunc i32 %49 to i16
  %51 = load i32, ptr %6, align 4, !tbaa !5
  %52 = trunc i32 %51 to i16
  %53 = tail call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %0, i32 noundef %3, i32 noundef 15, i32 noundef 15, i32 noundef %38, i32 noundef %4, i32 noundef %41, i32 noundef %43, i32 noundef %45, i32 noundef %47, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %50, i16 noundef zeroext %52, i8 noundef zeroext 1) #2
  br label %88

54:                                               ; preds = %32
  %55 = load i32, ptr %6, align 4, !tbaa !5
  %56 = icmp ne i32 %55, 1
  %.not = icmp eq i32 %3, %4
  %or.cond = or i1 %.not, %56
  br i1 %or.cond, label %71, label %57

57:                                               ; preds = %54
  %58 = getelementptr inbounds i8, ptr %1, i64 92
  %59 = load i32, ptr %58, align 4, !tbaa !5
  %60 = getelementptr inbounds i8, ptr %1, i64 96
  %61 = load i32, ptr %60, align 8, !tbaa !5
  %62 = load ptr, ptr %1, align 8, !tbaa !5
  %63 = getelementptr inbounds i8, ptr %62, i64 100
  %64 = load i32, ptr %63, align 4, !tbaa !5
  %65 = getelementptr inbounds i8, ptr %1, i64 100
  %66 = load i32, ptr %65, align 4, !tbaa !5
  %67 = getelementptr inbounds i8, ptr %1, i64 40
  %68 = load i32, ptr %67, align 4, !tbaa !5
  %69 = trunc i32 %68 to i16
  %70 = tail call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %0, i32 noundef %3, i32 noundef 15, i32 noundef 15, i32 noundef 1, i32 noundef %4, i32 noundef %59, i32 noundef %61, i32 noundef %64, i32 noundef %66, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %69, i16 noundef zeroext 1, i8 noundef zeroext 1) #2
  br label %88

71:                                               ; preds = %54
  %72 = getelementptr inbounds i8, ptr %1, i64 44
  %73 = load i32, ptr %72, align 4, !tbaa !5
  %74 = getelementptr inbounds i8, ptr %1, i64 92
  %75 = load i32, ptr %74, align 4, !tbaa !5
  %76 = getelementptr inbounds i8, ptr %1, i64 96
  %77 = load i32, ptr %76, align 8, !tbaa !5
  %78 = load ptr, ptr %1, align 8, !tbaa !5
  %79 = getelementptr inbounds i8, ptr %78, i64 100
  %80 = load i32, ptr %79, align 4, !tbaa !5
  %81 = getelementptr inbounds i8, ptr %1, i64 100
  %82 = load i32, ptr %81, align 4, !tbaa !5
  %83 = getelementptr inbounds i8, ptr %1, i64 40
  %84 = load i32, ptr %83, align 4, !tbaa !5
  %85 = trunc i32 %84 to i16
  %86 = trunc i32 %55 to i16
  %87 = tail call ptr @libxsmm_meltw_descriptor_init2(ptr noundef %0, i32 noundef %3, i32 noundef 15, i32 noundef 15, i32 noundef %73, i32 noundef %4, i32 noundef %75, i32 noundef %77, i32 noundef %80, i32 noundef %82, i32 noundef 0, i32 noundef 0, i16 noundef zeroext %85, i16 noundef zeroext %86, i8 noundef zeroext 1) #2
  br label %88

88:                                               ; preds = %36, %71, %57, %10
  %.sink = phi ptr [ %53, %36 ], [ %87, %71 ], [ %70, %57 ], [ %27, %10 ]
  store ptr %.sink, ptr %2, align 8, !tbaa !8
  ret void
}

declare i32 @libxsmm_meqn_is_unary_opcode_transform_kernel(i32 noundef) local_unnamed_addr #1

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 #1

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_kernel(i32 noundef) local_unnamed_addr #1

declare i32 @libxsmm_meqn_is_unary_opcode_reduce_cols_idx_kernel(i32 noundef) local_unnamed_addr #1

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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = !{!9, !9, i64 0}
!9 = !{!"any pointer", !6, i64 0}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InstCombinePass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass