; LLVM IR from libxsmm/libxsmm :: src (generator_mateltwise_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"

%union.libxsmm_bfloat16_f32 = type { float }
%struct.libxsmm_meltw_descriptor = type <{ i32, i32, i32, i32, i32, i32, i8, i8, i8, i16, i16, i8 }>
%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_matrix_op_arg = type { ptr, ptr, ptr, ptr }
%struct.libxsmm_matrix_arg = type { ptr, ptr, ptr, ptr, ptr, ptr }

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #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 i32 @libxsmm_is_cmp_op(i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_set_bit(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_zero_bit(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local float @libxsmm_fp32_binary_compute(float noundef, float noundef, float noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local double @libxsmm_fp64_binary_compute(double noundef, double noundef, double noundef, i32 noundef) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #0

; Function Attrs: nounwind uwtable
declare dso_local i32 @libxsmm_elementwise_get_index(i32 noundef, i32 noundef, i32 noundef, ptr noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local float @libxsmm_elementwise_get_float_value(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_elementwise_store_value(ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, i32 noundef) #2

declare i32 @libxsmm_meltw_getenum_precision(ptr noundef, i32 noundef) #3

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_reference_binary_elementwise(ptr noundef %0, ptr noundef %1) #2 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca float, align 4
  %23 = alloca double, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca float, align 4
  %29 = alloca float, align 4
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca %union.libxsmm_bfloat16_f32, align 4
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca double, align 8
  %39 = alloca double, align 8
  %40 = alloca float, align 4
  %41 = alloca float, align 4
  %42 = alloca i32, align 4
  %43 = alloca float, align 4
  %44 = alloca i8, align 1
  %45 = alloca float, align 4
  %46 = alloca float, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  store ptr %1, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #4
  %47 = load ptr, ptr %4, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %47, i32 0, i32 0
  %49 = load i32, ptr %48, align 1, !tbaa !9
  store i32 %49, ptr %7, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #4
  %50 = load ptr, ptr %4, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %50, i32 0, i32 1
  %52 = load i32, ptr %51, align 1, !tbaa !14
  store i32 %52, ptr %8, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  %53 = load ptr, ptr %4, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %53, i32 0, i32 2
  %55 = load i32, ptr %54, align 1, !tbaa !15
  store i32 %55, ptr %9, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  %56 = load ptr, ptr %4, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %56, i32 0, i32 4
  %58 = load i32, ptr %57, align 1, !tbaa !16
  store i32 %58, ptr %10, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  %59 = load ptr, ptr %4, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %59, i32 0, i32 3
  %61 = load i32, ptr %60, align 1, !tbaa !17
  store i32 %61, ptr %11, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  %62 = load ptr, ptr %4, align 8, !tbaa !5
  %63 = call i32 @libxsmm_meltw_getenum_precision(ptr noundef %62, i32 noundef 0)
  store i32 %63, ptr %12, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  %64 = load ptr, ptr %4, align 8, !tbaa !5
  %65 = call i32 @libxsmm_meltw_getenum_precision(ptr noundef %64, i32 noundef 1)
  store i32 %65, ptr %13, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  %66 = load ptr, ptr %4, align 8, !tbaa !5
  %67 = call i32 @libxsmm_meltw_getenum_precision(ptr noundef %66, i32 noundef 3)
  store i32 %67, ptr %14, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  %68 = load ptr, ptr %4, align 8, !tbaa !5
  %69 = call i32 @libxsmm_meltw_getenum_precision(ptr noundef %68, i32 noundef 4)
  store i32 %69, ptr %15, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #4
  %70 = load ptr, ptr %4, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %70, i32 0, i32 9
  %72 = load i16, ptr %71, align 1, !tbaa !18
  %73 = zext i16 %72 to i32
  store i32 %73, ptr %16, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %74 = load ptr, ptr %3, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %74, i32 0, i32 0
  %76 = getelementptr inbounds %struct.libxsmm_matrix_op_arg, ptr %75, i32 0, i32 1
  %77 = load ptr, ptr %76, align 8, !tbaa !19
  store ptr %77, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %78 = load ptr, ptr %3, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %78, i32 0, i32 1
  %80 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %79, i32 0, i32 0
  %81 = load ptr, ptr %80, align 8, !tbaa !23
  store ptr %81, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %82 = load ptr, ptr %3, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %82, i32 0, i32 2
  %84 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %83, i32 0, i32 0
  %85 = load ptr, ptr %84, align 8, !tbaa !24
  store ptr %85, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %86 = load ptr, ptr %3, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.libxsmm_meltw_binary_param, ptr %86, i32 0, i32 3
  %88 = getelementptr inbounds %struct.libxsmm_matrix_arg, ptr %87, i32 0, i32 0
  %89 = load ptr, ptr %88, align 8, !tbaa !25
  store ptr %89, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  store i32 0, ptr %21, align 4, !tbaa !13
  %90 = load ptr, ptr %4, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %90, i32 0, i32 10
  %92 = load i16, ptr %91, align 1, !tbaa !26
  %93 = zext i16 %92 to i32
  %94 = icmp eq i32 %93, 7
  br i1 %94, label %95, label %191

95:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  store float 0.000000e+00, ptr %22, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  store double 0.000000e+00, ptr %23, align 8, !tbaa !29
  store i32 0, ptr %6, align 4, !tbaa !13
  br label %96

96:                                               ; preds = %166, %95
  %97 = load i32, ptr %6, align 4, !tbaa !13
  %98 = load i32, ptr %8, align 4, !tbaa !13
  %99 = icmp slt i32 %97, %98
  br i1 %99, label %100, label %169

100:                                              ; preds = %96
  store i32 0, ptr %5, align 4, !tbaa !13
  br label %101

101:                                              ; preds = %162, %100
  %102 = load i32, ptr %5, align 4, !tbaa !13
  %103 = load i32, ptr %7, align 4, !tbaa !13
  %104 = icmp slt i32 %102, %103
  br i1 %104, label %105, label %165

105:                                              ; preds = %101
  %106 = load i32, ptr %12, align 4, !tbaa !13
  %107 = icmp eq i32 %106, 0
  br i1 %107, label %108, label %142

108:                                              ; preds = %105
  %109 = load i32, ptr %13, align 4, !tbaa !13
  %110 = icmp eq i32 %109, 0
  br i1 %110, label %111, label %142

111:                                              ; preds = %108
  %112 = load i32, ptr %14, align 4, !tbaa !13
  %113 = icmp eq i32 %112, 0
  br i1 %113, label %114, label %142

114:                                              ; preds = %111
  %115 = load i32, ptr %15, align 4, !tbaa !13
  %116 = icmp eq i32 %115, 0
  br i1 %116, label %117, label %142

117:                                              ; preds = %114
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  %118 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %118, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %119 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %119, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  %120 = load ptr, ptr %24, align 8, !tbaa !5
  %121 = load i32, ptr %5, align 4, !tbaa !13
  %122 = load i32, ptr %6, align 4, !tbaa !13
  %123 = load i32, ptr %9, align 4, !tbaa !13
  %124 = load ptr, ptr %4, align 8, !tbaa !5
  %125 = call i32 @libxsmm_elementwise_get_index(i32 noundef %121, i32 noundef %122, i32 noundef %123, ptr noundef %124, i32 noundef 0)
  %126 = sext i32 %125 to i64
  %127 = getelementptr inbounds double, ptr %120, i64 %126
  %128 = load double, ptr %127, align 8, !tbaa !29
  store double %128, ptr %26, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  %129 = load ptr, ptr %25, align 8, !tbaa !5
  %130 = load i32, ptr %5, align 4, !tbaa !13
  %131 = load i32, ptr %6, align 4, !tbaa !13
  %132 = load i32, ptr %10, align 4, !tbaa !13
  %133 = load ptr, ptr %4, align 8, !tbaa !5
  %134 = call i32 @libxsmm_elementwise_get_index(i32 noundef %130, i32 noundef %131, i32 noundef %132, ptr noundef %133, i32 noundef 1)
  %135 = sext i32 %134 to i64
  %136 = getelementptr inbounds double, ptr %129, i64 %135
  %137 = load double, ptr %136, align 8, !tbaa !29
  store double %137, ptr %27, align 8, !tbaa !29
  %138 = load double, ptr %26, align 8, !tbaa !29
  %139 = load double, ptr %27, align 8, !tbaa !29
  %140 = load double, ptr %23, align 8, !tbaa !29
  %141 = call double @llvm.fmuladd.f64(double %138, double %139, double %140)
  store double %141, ptr %23, align 8, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  br label %161

142:                                              ; preds = %114, %111, %108, %105
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %143 = load ptr, ptr %18, align 8, !tbaa !5
  %144 = load i32, ptr %5, align 4, !tbaa !13
  %145 = load i32, ptr %6, align 4, !tbaa !13
  %146 = load i32, ptr %9, align 4, !tbaa !13
  %147 = load i32, ptr %12, align 4, !tbaa !13
  %148 = load ptr, ptr %4, align 8, !tbaa !5
  %149 = call float @libxsmm_elementwise_get_float_value(ptr noundef %143, i32 noundef %144, i32 noundef %145, i32 noundef %146, i32 noundef %147, ptr noundef %148, i32 noundef 0)
  store float %149, ptr %28, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  %150 = load ptr, ptr %19, align 8, !tbaa !5
  %151 = load i32, ptr %5, align 4, !tbaa !13
  %152 = load i32, ptr %6, align 4, !tbaa !13
  %153 = load i32, ptr %10, align 4, !tbaa !13
  %154 = load i32, ptr %13, align 4, !tbaa !13
  %155 = load ptr, ptr %4, align 8, !tbaa !5
  %156 = call float @libxsmm_elementwise_get_float_value(ptr noundef %150, i32 noundef %151, i32 noundef %152, i32 noundef %153, i32 noundef %154, ptr noundef %155, i32 noundef 1)
  store float %156, ptr %29, align 4, !tbaa !27
  %157 = load float, ptr %28, align 4, !tbaa !27
  %158 = load float, ptr %29, align 4, !tbaa !27
  %159 = load float, ptr %22, align 4, !tbaa !27
  %160 = call float @llvm.fmuladd.f32(float %157, float %158, float %159)
  store float %160, ptr %22, align 4, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  br label %161

161:                                              ; preds = %142, %117
  br label %162

162:                                              ; preds = %161
  %163 = load i32, ptr %5, align 4, !tbaa !13
  %164 = add nsw i32 %163, 1
  store i32 %164, ptr %5, align 4, !tbaa !13
  br label %101, !llvm.loop !31

165:                                              ; preds = %101
  br label %166

166:                                              ; preds = %165
  %167 = load i32, ptr %6, align 4, !tbaa !13
  %168 = add nsw i32 %167, 1
  store i32 %168, ptr %6, align 4, !tbaa !13
  br label %96, !llvm.loop !33

169:                                              ; preds = %96
  %170 = load i32, ptr %12, align 4, !tbaa !13
  %171 = icmp eq i32 %170, 0
  br i1 %171, label %172, label %186

172:                                              ; preds = %169
  %173 = load i32, ptr %13, align 4, !tbaa !13
  %174 = icmp eq i32 %173, 0
  br i1 %174, label %175, label %186

175:                                              ; preds = %172
  %176 = load i32, ptr %14, align 4, !tbaa !13
  %177 = icmp eq i32 %176, 0
  br i1 %177, label %178, label %186

178:                                              ; preds = %175
  %179 = load i32, ptr %15, align 4, !tbaa !13
  %180 = icmp eq i32 %179, 0
  br i1 %180, label %181, label %186

181:                                              ; preds = %178
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  %182 = load ptr, ptr %20, align 8, !tbaa !5
  store ptr %182, ptr %30, align 8, !tbaa !5
  %183 = load double, ptr %23, align 8, !tbaa !29
  %184 = load ptr, ptr %30, align 8, !tbaa !5
  %185 = getelementptr inbounds double, ptr %184, i64 0
  store double %183, ptr %185, align 8, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #4
  br label %190

186:                                              ; preds = %178, %175, %172, %169
  %187 = load ptr, ptr %20, align 8, !tbaa !5
  %188 = load i32, ptr %11, align 4, !tbaa !13
  %189 = load i32, ptr %14, align 4, !tbaa !13
  call void @libxsmm_elementwise_store_value(ptr noundef %187, ptr noundef %22, i32 noundef 0, i32 noundef 0, i32 noundef %188, i32 noundef 0, i32 noundef %189, ptr noundef null, i32 noundef 0)
  br label %190

190:                                              ; preds = %186, %181
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  br label %409

191:                                              ; preds = %2
  %192 = load ptr, ptr %4, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %192, i32 0, i32 10
  %194 = load i16, ptr %193, align 1, !tbaa !26
  %195 = zext i16 %194 to i32
  %196 = icmp eq i32 %195, 26
  br i1 %196, label %197, label %248

197:                                              ; preds = %191
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  %198 = load ptr, ptr %20, align 8, !tbaa !5
  store ptr %198, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %199 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %199, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #4
  %200 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %200, ptr %33, align 8, !tbaa !5
  store i32 0, ptr %6, align 4, !tbaa !13
  br label %201

201:                                              ; preds = %244, %197
  %202 = load i32, ptr %6, align 4, !tbaa !13
  %203 = load i32, ptr %8, align 4, !tbaa !13
  %204 = icmp slt i32 %202, %203
  br i1 %204, label %205, label %247

205:                                              ; preds = %201
  store i32 0, ptr %5, align 4, !tbaa !13
  br label %206

206:                                              ; preds = %240, %205
  %207 = load i32, ptr %5, align 4, !tbaa !13
  %208 = load i32, ptr %7, align 4, !tbaa !13
  %209 = icmp slt i32 %207, %208
  br i1 %209, label %210, label %243

210:                                              ; preds = %206
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #4
  %211 = load ptr, ptr %32, align 8, !tbaa !5
  %212 = load i32, ptr %5, align 4, !tbaa !13
  %213 = load i32, ptr %6, align 4, !tbaa !13
  %214 = load i32, ptr %9, align 4, !tbaa !13
  %215 = load ptr, ptr %4, align 8, !tbaa !5
  %216 = call i32 @libxsmm_elementwise_get_index(i32 noundef %212, i32 noundef %213, i32 noundef %214, ptr noundef %215, i32 noundef 0)
  %217 = sext i32 %216 to i64
  %218 = getelementptr inbounds i16, ptr %211, i64 %217
  %219 = load i16, ptr %218, align 2, !tbaa !34
  %220 = getelementptr inbounds [2 x i16], ptr %34, i64 0, i64 0
  store i16 %219, ptr %220, align 4, !tbaa !35
  %221 = load ptr, ptr %33, align 8, !tbaa !5
  %222 = load i32, ptr %5, align 4, !tbaa !13
  %223 = load i32, ptr %6, align 4, !tbaa !13
  %224 = load i32, ptr %10, align 4, !tbaa !13
  %225 = load ptr, ptr %4, align 8, !tbaa !5
  %226 = call i32 @libxsmm_elementwise_get_index(i32 noundef %222, i32 noundef %223, i32 noundef %224, ptr noundef %225, i32 noundef 1)
  %227 = sext i32 %226 to i64
  %228 = getelementptr inbounds i16, ptr %221, i64 %227
  %229 = load i16, ptr %228, align 2, !tbaa !34
  %230 = getelementptr inbounds [2 x i16], ptr %34, i64 0, i64 1
  store i16 %229, ptr %230, align 2, !tbaa !35
  %231 = load float, ptr %34, align 4, !tbaa !35
  %232 = load ptr, ptr %31, align 8, !tbaa !5
  %233 = load i32, ptr %6, align 4, !tbaa !13
  %234 = load i32, ptr %11, align 4, !tbaa !13
  %235 = mul nsw i32 %233, %234
  %236 = load i32, ptr %5, align 4, !tbaa !13
  %237 = add nsw i32 %235, %236
  %238 = sext i32 %237 to i64
  %239 = getelementptr inbounds float, ptr %232, i64 %238
  store float %231, ptr %239, align 4, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #4
  br label %240

240:                                              ; preds = %210
  %241 = load i32, ptr %5, align 4, !tbaa !13
  %242 = add nsw i32 %241, 1
  store i32 %242, ptr %5, align 4, !tbaa !13
  br label %206, !llvm.loop !36

243:                                              ; preds = %206
  br label %244

244:                                              ; preds = %243
  %245 = load i32, ptr %6, align 4, !tbaa !13
  %246 = add nsw i32 %245, 1
  store i32 %246, ptr %6, align 4, !tbaa !13
  br label %201, !llvm.loop !37

247:                                              ; preds = %201
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  br label %408

248:                                              ; preds = %191
  store i32 0, ptr %6, align 4, !tbaa !13
  br label %249

249:                                              ; preds = %404, %248
  %250 = load i32, ptr %6, align 4, !tbaa !13
  %251 = load i32, ptr %8, align 4, !tbaa !13
  %252 = icmp slt i32 %250, %251
  br i1 %252, label %253, label %407

253:                                              ; preds = %249
  store i32 0, ptr %5, align 4, !tbaa !13
  br label %254

254:                                              ; preds = %400, %253
  %255 = load i32, ptr %5, align 4, !tbaa !13
  %256 = load i32, ptr %7, align 4, !tbaa !13
  %257 = icmp slt i32 %255, %256
  br i1 %257, label %258, label %403

258:                                              ; preds = %254
  %259 = load i32, ptr %12, align 4, !tbaa !13
  %260 = icmp eq i32 %259, 0
  br i1 %260, label %261, label %316

261:                                              ; preds = %258
  %262 = load i32, ptr %13, align 4, !tbaa !13
  %263 = icmp eq i32 %262, 0
  br i1 %263, label %264, label %316

264:                                              ; preds = %261
  %265 = load i32, ptr %14, align 4, !tbaa !13
  %266 = icmp eq i32 %265, 0
  br i1 %266, label %267, label %316

267:                                              ; preds = %264
  %268 = load i32, ptr %15, align 4, !tbaa !13
  %269 = icmp eq i32 %268, 0
  br i1 %269, label %270, label %316

270:                                              ; preds = %267
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #4
  %271 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %271, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  %272 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %272, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  %273 = load ptr, ptr %20, align 8, !tbaa !5
  store ptr %273, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  %274 = load ptr, ptr %35, align 8, !tbaa !5
  %275 = load i32, ptr %5, align 4, !tbaa !13
  %276 = load i32, ptr %6, align 4, !tbaa !13
  %277 = load i32, ptr %9, align 4, !tbaa !13
  %278 = load ptr, ptr %4, align 8, !tbaa !5
  %279 = call i32 @libxsmm_elementwise_get_index(i32 noundef %275, i32 noundef %276, i32 noundef %277, ptr noundef %278, i32 noundef 0)
  %280 = sext i32 %279 to i64
  %281 = getelementptr inbounds double, ptr %274, i64 %280
  %282 = load double, ptr %281, align 8, !tbaa !29
  store double %282, ptr %38, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  %283 = load ptr, ptr %36, align 8, !tbaa !5
  %284 = load i32, ptr %5, align 4, !tbaa !13
  %285 = load i32, ptr %6, align 4, !tbaa !13
  %286 = load i32, ptr %10, align 4, !tbaa !13
  %287 = load ptr, ptr %4, align 8, !tbaa !5
  %288 = call i32 @libxsmm_elementwise_get_index(i32 noundef %284, i32 noundef %285, i32 noundef %286, ptr noundef %287, i32 noundef 1)
  %289 = sext i32 %288 to i64
  %290 = getelementptr inbounds double, ptr %283, i64 %289
  %291 = load double, ptr %290, align 8, !tbaa !29
  store double %291, ptr %39, align 8, !tbaa !29
  %292 = load double, ptr %38, align 8, !tbaa !29
  %293 = load double, ptr %39, align 8, !tbaa !29
  %294 = load ptr, ptr %37, align 8, !tbaa !5
  %295 = load i32, ptr %5, align 4, !tbaa !13
  %296 = load i32, ptr %6, align 4, !tbaa !13
  %297 = load i32, ptr %11, align 4, !tbaa !13
  %298 = mul nsw i32 %296, %297
  %299 = add nsw i32 %295, %298
  %300 = sext i32 %299 to i64
  %301 = getelementptr inbounds double, ptr %294, i64 %300
  %302 = load double, ptr %301, align 8, !tbaa !29
  %303 = load ptr, ptr %4, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %303, i32 0, i32 10
  %305 = load i16, ptr %304, align 1, !tbaa !26
  %306 = zext i16 %305 to i32
  %307 = call double @libxsmm_fp64_binary_compute(double noundef %292, double noundef %293, double noundef %302, i32 noundef %306)
  %308 = load ptr, ptr %37, align 8, !tbaa !5
  %309 = load i32, ptr %5, align 4, !tbaa !13
  %310 = load i32, ptr %6, align 4, !tbaa !13
  %311 = load i32, ptr %11, align 4, !tbaa !13
  %312 = mul nsw i32 %310, %311
  %313 = add nsw i32 %309, %312
  %314 = sext i32 %313 to i64
  %315 = getelementptr inbounds double, ptr %308, i64 %314
  store double %307, ptr %315, align 8, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #4
  br label %399

316:                                              ; preds = %267, %264, %261, %258
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #4
  %317 = load ptr, ptr %18, align 8, !tbaa !5
  %318 = load i32, ptr %5, align 4, !tbaa !13
  %319 = load i32, ptr %6, align 4, !tbaa !13
  %320 = load i32, ptr %9, align 4, !tbaa !13
  %321 = load i32, ptr %12, align 4, !tbaa !13
  %322 = load ptr, ptr %4, align 8, !tbaa !5
  %323 = call float @libxsmm_elementwise_get_float_value(ptr noundef %317, i32 noundef %318, i32 noundef %319, i32 noundef %320, i32 noundef %321, ptr noundef %322, i32 noundef 0)
  store float %323, ptr %40, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #4
  %324 = load ptr, ptr %19, align 8, !tbaa !5
  %325 = load i32, ptr %5, align 4, !tbaa !13
  %326 = load i32, ptr %6, align 4, !tbaa !13
  %327 = load i32, ptr %10, align 4, !tbaa !13
  %328 = load i32, ptr %13, align 4, !tbaa !13
  %329 = load ptr, ptr %4, align 8, !tbaa !5
  %330 = call float @libxsmm_elementwise_get_float_value(ptr noundef %324, i32 noundef %325, i32 noundef %326, i32 noundef %327, i32 noundef %328, ptr noundef %329, i32 noundef 1)
  store float %330, ptr %41, align 4, !tbaa !27
  %331 = load ptr, ptr %4, align 8, !tbaa !5
  %332 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %331, i32 0, i32 10
  %333 = load i16, ptr %332, align 1, !tbaa !26
  %334 = zext i16 %333 to i32
  %335 = call i32 @libxsmm_is_cmp_op(i32 noundef %334)
  %336 = icmp sgt i32 %335, 0
  br i1 %336, label %337, label %369

337:                                              ; preds = %316
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #4
  %338 = load i32, ptr %11, align 4, !tbaa !13
  %339 = add nsw i32 %338, 15
  %340 = sdiv i32 %339, 16
  %341 = mul nsw i32 %340, 16
  store i32 %341, ptr %42, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #4
  %342 = load float, ptr %40, align 4, !tbaa !27
  %343 = load float, ptr %41, align 4, !tbaa !27
  %344 = load ptr, ptr %4, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %344, i32 0, i32 10
  %346 = load i16, ptr %345, align 1, !tbaa !26
  %347 = zext i16 %346 to i32
  %348 = call float @libxsmm_fp32_binary_compute(float noundef %342, float noundef %343, float noundef 0.000000e+00, i32 noundef %347)
  store float %348, ptr %43, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 1, ptr %44) #4
  %349 = load float, ptr %43, align 4, !tbaa !27
  %350 = fpext float %349 to double
  %351 = fcmp ogt double %350, 1.000000e-01
  %352 = zext i1 %351 to i64
  %353 = select i1 %351, i32 1, i32 0
  %354 = trunc i32 %353 to i8
  store i8 %354, ptr %44, align 1, !tbaa !35
  %355 = load i8, ptr %44, align 1, !tbaa !35
  %356 = zext i8 %355 to i32
  %357 = icmp sgt i32 %356, 0
  br i1 %357, label %358, label %363

358:                                              ; preds = %337
  %359 = load ptr, ptr %20, align 8, !tbaa !5
  %360 = load i32, ptr %5, align 4, !tbaa !13
  %361 = load i32, ptr %6, align 4, !tbaa !13
  %362 = load i32, ptr %42, align 4, !tbaa !13
  call void @libxsmm_set_bit(ptr noundef %359, i32 noundef %360, i32 noundef %361, i32 noundef %362)
  br label %368

363:                                              ; preds = %337
  %364 = load ptr, ptr %20, align 8, !tbaa !5
  %365 = load i32, ptr %5, align 4, !tbaa !13
  %366 = load i32, ptr %6, align 4, !tbaa !13
  %367 = load i32, ptr %42, align 4, !tbaa !13
  call void @libxsmm_zero_bit(ptr noundef %364, i32 noundef %365, i32 noundef %366, i32 noundef %367)
  br label %368

368:                                              ; preds = %363, %358
  call void @llvm.lifetime.end.p0(i64 1, ptr %44) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #4
  br label %396

369:                                              ; preds = %316
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #4
  %370 = load ptr, ptr %20, align 8, !tbaa !5
  %371 = load i32, ptr %5, align 4, !tbaa !13
  %372 = load i32, ptr %6, align 4, !tbaa !13
  %373 = load i32, ptr %11, align 4, !tbaa !13
  %374 = load i32, ptr %14, align 4, !tbaa !13
  %375 = load ptr, ptr %4, align 8, !tbaa !5
  %376 = call float @libxsmm_elementwise_get_float_value(ptr noundef %370, i32 noundef %371, i32 noundef %372, i32 noundef %373, i32 noundef %374, ptr noundef %375, i32 noundef 3)
  store float %376, ptr %45, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #4
  %377 = load float, ptr %40, align 4, !tbaa !27
  %378 = load float, ptr %41, align 4, !tbaa !27
  %379 = load float, ptr %45, align 4, !tbaa !27
  %380 = load ptr, ptr %4, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %380, i32 0, i32 10
  %382 = load i16, ptr %381, align 1, !tbaa !26
  %383 = zext i16 %382 to i32
  %384 = call float @libxsmm_fp32_binary_compute(float noundef %377, float noundef %378, float noundef %379, i32 noundef %383)
  store float %384, ptr %46, align 4, !tbaa !27
  %385 = load ptr, ptr %20, align 8, !tbaa !5
  %386 = load i32, ptr %5, align 4, !tbaa !13
  %387 = load i32, ptr %6, align 4, !tbaa !13
  %388 = load i32, ptr %11, align 4, !tbaa !13
  %389 = load i32, ptr %16, align 4, !tbaa !13
  %390 = and i32 %389, 64
  %391 = icmp ugt i32 %390, 0
  %392 = zext i1 %391 to i32
  %393 = load i32, ptr %14, align 4, !tbaa !13
  %394 = load ptr, ptr %17, align 8, !tbaa !5
  %395 = load i32, ptr %21, align 4, !tbaa !13
  call void @libxsmm_elementwise_store_value(ptr noundef %385, ptr noundef %46, i32 noundef %386, i32 noundef %387, i32 noundef %388, i32 noundef %392, i32 noundef %393, ptr noundef %394, i32 noundef %395)
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #4
  br label %396

396:                                              ; preds = %369, %368
  %397 = load i32, ptr %21, align 4, !tbaa !13
  %398 = add i32 %397, 1
  store i32 %398, ptr %21, align 4, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #4
  br label %399

399:                                              ; preds = %396, %270
  br label %400

400:                                              ; preds = %399
  %401 = load i32, ptr %5, align 4, !tbaa !13
  %402 = add nsw i32 %401, 1
  store i32 %402, ptr %5, align 4, !tbaa !13
  br label %254, !llvm.loop !38

403:                                              ; preds = %254
  br label %404

404:                                              ; preds = %403
  %405 = load i32, ptr %6, align 4, !tbaa !13
  %406 = add nsw i32 %405, 1
  store i32 %406, ptr %6, align 4, !tbaa !13
  br label %249, !llvm.loop !39

407:                                              ; preds = %249
  br label %408

408:                                              ; preds = %407, %247
  br label %409

409:                                              ; preds = %408, %190
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #4
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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, !11, i64 0}
!10 = !{!"libxsmm_meltw_descriptor", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !12, i64 27, !12, i64 29, !7, i64 31}
!11 = !{!"int", !7, i64 0}
!12 = !{!"short", !7, i64 0}
!13 = !{!11, !11, i64 0}
!14 = !{!10, !11, i64 4}
!15 = !{!10, !11, i64 8}
!16 = !{!10, !11, i64 16}
!17 = !{!10, !11, i64 12}
!18 = !{!10, !12, i64 27}
!19 = !{!20, !6, i64 8}
!20 = !{!"libxsmm_meltw_binary_param", !21, i64 0, !22, i64 32, !22, i64 80, !22, i64 128}
!21 = !{!"libxsmm_matrix_op_arg", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!22 = !{!"libxsmm_matrix_arg", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40}
!23 = !{!20, !6, i64 32}
!24 = !{!20, !6, i64 80}
!25 = !{!20, !6, i64 128}
!26 = !{!10, !12, i64 29}
!27 = !{!28, !28, i64 0}
!28 = !{!"float", !7, i64 0}
!29 = !{!30, !30, i64 0}
!30 = !{!"double", !7, i64 0}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = distinct !{!33, !32}
!34 = !{!12, !12, i64 0}
!35 = !{!7, !7, i64 0}
!36 = distinct !{!36, !32}
!37 = distinct !{!37, !32}
!38 = distinct !{!38, !32}
!39 = distinct !{!39, !32}


; 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: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #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 i32 @libxsmm_is_cmp_op(i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_set_bit(ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_zero_bit(ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local float @libxsmm_fp32_binary_compute(float noundef, float noundef, float noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local double @libxsmm_fp64_binary_compute(double noundef, double noundef, double noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #0

; Function Attrs: nounwind uwtable
declare dso_local i32 @libxsmm_elementwise_get_index(i32 noundef, i32 noundef, i32 noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local float @libxsmm_elementwise_get_float_value(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local void @libxsmm_elementwise_store_value(ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

declare i32 @libxsmm_meltw_getenum_precision(ptr noundef, i32 noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_reference_binary_elementwise(ptr nocapture noundef readonly %0, ptr noundef %1) local_unnamed_addr #2 {
  %3 = alloca float, align 4
  %4 = alloca float, align 4
  %5 = load i32, ptr %1, align 1, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %1, i64 4
  %7 = load i32, ptr %6, align 1, !tbaa !11
  %8 = getelementptr inbounds i8, ptr %1, i64 8
  %9 = load i32, ptr %8, align 1, !tbaa !12
  %10 = getelementptr inbounds i8, ptr %1, i64 16
  %11 = load i32, ptr %10, align 1, !tbaa !13
  %12 = getelementptr inbounds i8, ptr %1, i64 12
  %13 = load i32, ptr %12, align 1, !tbaa !14
  %14 = tail call i32 @libxsmm_meltw_getenum_precision(ptr noundef nonnull %1, i32 noundef 0) #4
  %15 = tail call i32 @libxsmm_meltw_getenum_precision(ptr noundef nonnull %1, i32 noundef 1) #4
  %16 = tail call i32 @libxsmm_meltw_getenum_precision(ptr noundef nonnull %1, i32 noundef 3) #4
  %17 = tail call i32 @libxsmm_meltw_getenum_precision(ptr noundef nonnull %1, i32 noundef 4) #4
  %18 = getelementptr inbounds i8, ptr %1, i64 27
  %19 = load i16, ptr %18, align 1, !tbaa !15
  %20 = getelementptr inbounds i8, ptr %0, i64 8
  %21 = load ptr, ptr %20, align 8, !tbaa !16
  %22 = getelementptr inbounds i8, ptr %0, i64 32
  %23 = load ptr, ptr %22, align 8, !tbaa !21
  %24 = getelementptr inbounds i8, ptr %0, i64 80
  %25 = load ptr, ptr %24, align 8, !tbaa !22
  %26 = getelementptr inbounds i8, ptr %0, i64 128
  %27 = load ptr, ptr %26, align 8, !tbaa !23
  %28 = getelementptr inbounds i8, ptr %1, i64 29
  %29 = load i16, ptr %28, align 1, !tbaa !24
  switch i16 %29, label %.preheader194 [
    i16 7, label %97
    i16 26, label %.preheader197
  ]

.preheader197:                                    ; preds = %2
  %30 = icmp sgt i32 %7, 0
  %31 = icmp sgt i32 %5, 0
  %or.cond271 = select i1 %30, i1 %31, i1 false
  br i1 %or.cond271, label %.preheader196.us.preheader, label %.loopexit

.preheader196.us.preheader:                       ; preds = %.preheader197
  %32 = sext i32 %13 to i64
  %wide.trip.count246 = zext nneg i32 %7 to i64
  %wide.trip.count = zext nneg i32 %5 to i64
  br label %.preheader196.us

.preheader196.us:                                 ; preds = %.preheader196.us.preheader, %._crit_edge.us
  %indvars.iv243 = phi i64 [ 0, %.preheader196.us.preheader ], [ %indvars.iv.next244, %._crit_edge.us ]
  %33 = mul nsw i64 %indvars.iv243, %32
  %34 = trunc nuw nsw i64 %indvars.iv243 to i32
  %invariant.gep = getelementptr float, ptr %27, i64 %33
  br label %35

35:                                               ; preds = %.preheader196.us, %35
  %indvars.iv = phi i64 [ 0, %.preheader196.us ], [ %indvars.iv.next, %35 ]
  %36 = trunc nuw nsw i64 %indvars.iv to i32
  %37 = tail call i32 @libxsmm_elementwise_get_index(i32 noundef %36, i32 noundef %34, i32 noundef %9, ptr noundef nonnull %1, i32 noundef 0)
  %38 = sext i32 %37 to i64
  %39 = getelementptr inbounds i16, ptr %23, i64 %38
  %40 = load i16, ptr %39, align 2, !tbaa !25
  %.sroa.0.0.insert.ext.us = zext i16 %40 to i32
  %41 = tail call i32 @libxsmm_elementwise_get_index(i32 noundef %36, i32 noundef %34, i32 noundef %11, ptr noundef nonnull %1, i32 noundef 1)
  %42 = sext i32 %41 to i64
  %43 = getelementptr inbounds i16, ptr %25, i64 %42
  %44 = load i16, ptr %43, align 2, !tbaa !25
  %.sroa.0.2.insert.ext.us = zext i16 %44 to i32
  %.sroa.0.2.insert.shift.us = shl nuw i32 %.sroa.0.2.insert.ext.us, 16
  %.sroa.0.2.insert.insert.us = or disjoint i32 %.sroa.0.2.insert.shift.us, %.sroa.0.0.insert.ext.us
  %gep = getelementptr float, ptr %invariant.gep, i64 %indvars.iv
  store i32 %.sroa.0.2.insert.insert.us, ptr %gep, align 4, !tbaa !26
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge.us, label %35, !llvm.loop !28

._crit_edge.us:                                   ; preds = %35
  %indvars.iv.next244 = add nuw nsw i64 %indvars.iv243, 1
  %exitcond247.not = icmp eq i64 %indvars.iv.next244, %wide.trip.count246
  br i1 %exitcond247.not, label %.loopexit, label %.preheader196.us, !llvm.loop !30

.preheader194:                                    ; preds = %2
  %45 = icmp sgt i32 %7, 0
  br i1 %45, label %.preheader.lr.ph, label %.loopexit

.preheader.lr.ph:                                 ; preds = %.preheader194
  %46 = icmp sgt i32 %5, 0
  %47 = lshr i16 %19, 6
  %.lobit = and i16 %47, 1
  %48 = zext nneg i16 %.lobit to i32
  %49 = add nsw i32 %13, 15
  %50 = sdiv i32 %49, 16
  %51 = shl nsw i32 %50, 4
  br i1 %46, label %.preheader.lr.ph.split.us, label %.loopexit

.preheader.lr.ph.split.us:                        ; preds = %.preheader.lr.ph
  %52 = icmp eq i32 %14, 0
  %53 = icmp eq i32 %15, 0
  %or.cond13 = select i1 %52, i1 %53, i1 false
  %54 = icmp eq i32 %16, 0
  %or.cond15 = select i1 %or.cond13, i1 %54, i1 false
  %55 = icmp eq i32 %17, 0
  %or.cond17 = select i1 %or.cond15, i1 %55, i1 false
  br i1 %or.cond17, label %.preheader.us.us.preheader, label %.preheader.us

.preheader.us.us.preheader:                       ; preds = %.preheader.lr.ph.split.us
  %56 = sext i32 %13 to i64
  %wide.trip.count262 = zext nneg i32 %7 to i64
  %wide.trip.count257 = zext nneg i32 %5 to i64
  br label %.preheader.us.us

.preheader.us.us:                                 ; preds = %.preheader.us.us.preheader, %._crit_edge.split.us.us.us233
  %indvars.iv259 = phi i64 [ 0, %.preheader.us.us.preheader ], [ %indvars.iv.next260, %._crit_edge.split.us.us.us233 ]
  %57 = mul nsw i64 %indvars.iv259, %56
  %58 = trunc nuw nsw i64 %indvars.iv259 to i32
  %invariant.gep269 = getelementptr double, ptr %27, i64 %57
  br label %59

59:                                               ; preds = %59, %.preheader.us.us
  %indvars.iv254 = phi i64 [ %indvars.iv.next255, %59 ], [ 0, %.preheader.us.us ]
  %60 = trunc nuw nsw i64 %indvars.iv254 to i32
  %61 = tail call i32 @libxsmm_elementwise_get_index(i32 noundef %60, i32 noundef %58, i32 noundef %9, ptr noundef nonnull %1, i32 noundef 0)
  %62 = sext i32 %61 to i64
  %63 = getelementptr inbounds double, ptr %23, i64 %62
  %64 = load double, ptr %63, align 8, !tbaa !31
  %65 = tail call i32 @libxsmm_elementwise_get_index(i32 noundef %60, i32 noundef %58, i32 noundef %11, ptr noundef nonnull %1, i32 noundef 1)
  %66 = sext i32 %65 to i64
  %67 = getelementptr inbounds double, ptr %25, i64 %66
  %68 = load double, ptr %67, align 8, !tbaa !31
  %gep270 = getelementptr double, ptr %invariant.gep269, i64 %indvars.iv254
  %69 = load double, ptr %gep270, align 8, !tbaa !31
  %70 = load i16, ptr %28, align 1, !tbaa !24
  %71 = zext i16 %70 to i32
  %72 = tail call double @libxsmm_fp64_binary_compute(double noundef %64, double noundef %68, double noundef %69, i32 noundef %71)
  store double %72, ptr %gep270, align 8, !tbaa !31
  %indvars.iv.next255 = add nuw nsw i64 %indvars.iv254, 1
  %exitcond258.not = icmp eq i64 %indvars.iv.next255, %wide.trip.count257
  br i1 %exitcond258.not, label %._crit_edge.split.us.us.us233, label %59, !llvm.loop !33

._crit_edge.split.us.us.us233:                    ; preds = %59
  %indvars.iv.next260 = add nuw nsw i64 %indvars.iv259, 1
  %exitcond263.not = icmp eq i64 %indvars.iv.next260, %wide.trip.count262
  br i1 %exitcond263.not, label %.loopexit, label %.preheader.us.us, !llvm.loop !34

.preheader.us:                                    ; preds = %.preheader.lr.ph.split.us, %._crit_edge.split.us229
  %.2186226.us = phi i32 [ %96, %._crit_edge.split.us229 ], [ 0, %.preheader.lr.ph.split.us ]
  %.0187225.us = phi i32 [ %94, %._crit_edge.split.us229 ], [ 0, %.preheader.lr.ph.split.us ]
  br label %73

73:                                               ; preds = %.preheader.us, %93
  %.2222.us228 = phi i32 [ 0, %.preheader.us ], [ %95, %93 ]
  %.1188221.us = phi i32 [ %.0187225.us, %.preheader.us ], [ %94, %93 ]
  %74 = call float @libxsmm_elementwise_get_float_value(ptr noundef %23, i32 noundef %.2222.us228, i32 noundef %.2186226.us, i32 noundef %9, i32 noundef %14, ptr noundef nonnull %1, i32 noundef 0)
  %75 = call float @libxsmm_elementwise_get_float_value(ptr noundef %25, i32 noundef %.2222.us228, i32 noundef %.2186226.us, i32 noundef %11, i32 noundef %15, ptr noundef nonnull %1, i32 noundef 1)
  %76 = load i16, ptr %28, align 1, !tbaa !24
  %77 = zext i16 %76 to i32
  %78 = call i32 @libxsmm_is_cmp_op(i32 noundef %77)
  %79 = icmp sgt i32 %78, 0
  br i1 %79, label %85, label %80

80:                                               ; preds = %73
  %81 = call float @libxsmm_elementwise_get_float_value(ptr noundef %27, i32 noundef %.2222.us228, i32 noundef %.2186226.us, i32 noundef %13, i32 noundef %16, ptr noundef nonnull %1, i32 noundef 3)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #4
  %82 = load i16, ptr %28, align 1, !tbaa !24
  %83 = zext i16 %82 to i32
  %84 = call float @libxsmm_fp32_binary_compute(float noundef %74, float noundef %75, float noundef %81, i32 noundef %83)
  store float %84, ptr %4, align 4, !tbaa !26
  call void @libxsmm_elementwise_store_value(ptr noundef %27, ptr noundef nonnull %4, i32 noundef %.2222.us228, i32 noundef %.2186226.us, i32 noundef %13, i32 noundef %48, i32 noundef %16, ptr noundef %21, i32 noundef %.1188221.us)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #4
  br label %93

85:                                               ; preds = %73
  %86 = load i16, ptr %28, align 1, !tbaa !24
  %87 = zext i16 %86 to i32
  %88 = call float @libxsmm_fp32_binary_compute(float noundef %74, float noundef %75, float noundef 0.000000e+00, i32 noundef %87)
  %89 = fpext float %88 to double
  %90 = fcmp ogt double %89, 1.000000e-01
  br i1 %90, label %92, label %91

91:                                               ; preds = %85
  call void @libxsmm_zero_bit(ptr noundef %27, i32 noundef %.2222.us228, i32 noundef %.2186226.us, i32 noundef %51)
  br label %93

92:                                               ; preds = %85
  call void @libxsmm_set_bit(ptr noundef %27, i32 noundef %.2222.us228, i32 noundef %.2186226.us, i32 noundef %51)
  br label %93

93:                                               ; preds = %92, %91, %80
  %94 = add i32 %.1188221.us, 1
  %95 = add nuw nsw i32 %.2222.us228, 1
  %exitcond252.not = icmp eq i32 %95, %5
  br i1 %exitcond252.not, label %._crit_edge.split.us229, label %73, !llvm.loop !33

._crit_edge.split.us229:                          ; preds = %93
  %96 = add nuw nsw i32 %.2186226.us, 1
  %exitcond253.not = icmp eq i32 %96, %7
  br i1 %exitcond253.not, label %.loopexit, label %.preheader.us, !llvm.loop !34

97:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #4
  %98 = icmp sgt i32 %7, 0
  %99 = icmp sgt i32 %5, 0
  %or.cond272 = select i1 %98, i1 %99, i1 false
  br i1 %or.cond272, label %.preheader195.lr.ph.split.us, label %._crit_edge211

.preheader195.lr.ph.split.us:                     ; preds = %97
  %100 = icmp eq i32 %14, 0
  %101 = icmp eq i32 %15, 0
  %or.cond = select i1 %100, i1 %101, i1 false
  %102 = icmp eq i32 %16, 0
  %or.cond3 = select i1 %or.cond, i1 %102, i1 false
  %103 = icmp eq i32 %17, 0
  %or.cond5 = select i1 %or.cond3, i1 %103, i1 false
  br i1 %or.cond5, label %.preheader195.us.us, label %.preheader195.us

.preheader195.us.us:                              ; preds = %.preheader195.lr.ph.split.us, %._crit_edge.split.us.us.us
  %.0184209.us.us = phi i32 [ %115, %._crit_edge.split.us.us.us ], [ 0, %.preheader195.lr.ph.split.us ]
  %.0190208.us.us = phi double [ %113, %._crit_edge.split.us.us.us ], [ 0.000000e+00, %.preheader195.lr.ph.split.us ]
  br label %104

104:                                              ; preds = %104, %.preheader195.us.us
  %.0202.us.us.us = phi i32 [ 0, %.preheader195.us.us ], [ %114, %104 ]
  %.1191201.us.us.us = phi double [ %.0190208.us.us, %.preheader195.us.us ], [ %113, %104 ]
  %105 = tail call i32 @libxsmm_elementwise_get_index(i32 noundef %.0202.us.us.us, i32 noundef %.0184209.us.us, i32 noundef %9, ptr noundef nonnull %1, i32 noundef 0)
  %106 = sext i32 %105 to i64
  %107 = getelementptr inbounds double, ptr %23, i64 %106
  %108 = load double, ptr %107, align 8, !tbaa !31
  %109 = tail call i32 @libxsmm_elementwise_get_index(i32 noundef %.0202.us.us.us, i32 noundef %.0184209.us.us, i32 noundef %11, ptr noundef nonnull %1, i32 noundef 1)
  %110 = sext i32 %109 to i64
  %111 = getelementptr inbounds double, ptr %25, i64 %110
  %112 = load double, ptr %111, align 8, !tbaa !31
  %113 = tail call double @llvm.fmuladd.f64(double %108, double %112, double %.1191201.us.us.us)
  %114 = add nuw nsw i32 %.0202.us.us.us, 1
  %exitcond250.not = icmp eq i32 %114, %5
  br i1 %exitcond250.not, label %._crit_edge.split.us.us.us, label %104, !llvm.loop !35

._crit_edge.split.us.us.us:                       ; preds = %104
  %115 = add nuw nsw i32 %.0184209.us.us, 1
  %exitcond251.not = icmp eq i32 %115, %7
  br i1 %exitcond251.not, label %._crit_edge211, label %.preheader195.us.us, !llvm.loop !36

.preheader195.us:                                 ; preds = %.preheader195.lr.ph.split.us, %._crit_edge.split.us215
  %.0184209.us = phi i32 [ %122, %._crit_edge.split.us215 ], [ 0, %.preheader195.lr.ph.split.us ]
  %.lcssa206207.us = phi float [ %120, %._crit_edge.split.us215 ], [ 0.000000e+00, %.preheader195.lr.ph.split.us ]
  br label %116

116:                                              ; preds = %.preheader195.us, %116
  %.0202.us214 = phi i32 [ 0, %.preheader195.us ], [ %121, %116 ]
  %117 = phi float [ %.lcssa206207.us, %.preheader195.us ], [ %120, %116 ]
  %118 = tail call float @libxsmm_elementwise_get_float_value(ptr noundef %23, i32 noundef %.0202.us214, i32 noundef %.0184209.us, i32 noundef %9, i32 noundef %14, ptr noundef nonnull %1, i32 noundef 0)
  %119 = tail call float @libxsmm_elementwise_get_float_value(ptr noundef %25, i32 noundef %.0202.us214, i32 noundef %.0184209.us, i32 noundef %11, i32 noundef %15, ptr noundef nonnull %1, i32 noundef 1)
  %120 = tail call float @llvm.fmuladd.f32(float %118, float %119, float %117)
  %121 = add nuw nsw i32 %.0202.us214, 1
  %exitcond248.not = icmp eq i32 %121, %5
  br i1 %exitcond248.not, label %._crit_edge.split.us215, label %116, !llvm.loop !35

._crit_edge.split.us215:                          ; preds = %116
  %122 = add nuw nsw i32 %.0184209.us, 1
  %exitcond249.not = icmp eq i32 %122, %7
  br i1 %exitcond249.not, label %._crit_edge211, label %.preheader195.us, !llvm.loop !36

._crit_edge211:                                   ; preds = %._crit_edge.split.us215, %._crit_edge.split.us.us.us, %97
  %.lcssa206.lcssa = phi float [ 0.000000e+00, %97 ], [ 0.000000e+00, %._crit_edge.split.us.us.us ], [ %120, %._crit_edge.split.us215 ]
  %.0190.lcssa = phi double [ 0.000000e+00, %97 ], [ %113, %._crit_edge.split.us.us.us ], [ 0.000000e+00, %._crit_edge.split.us215 ]
  store float %.lcssa206.lcssa, ptr %3, align 4, !tbaa !26
  %123 = icmp eq i32 %14, 0
  %124 = icmp eq i32 %15, 0
  %or.cond7 = select i1 %123, i1 %124, i1 false
  %125 = icmp eq i32 %16, 0
  %or.cond9 = select i1 %or.cond7, i1 %125, i1 false
  %126 = icmp eq i32 %17, 0
  %or.cond11 = select i1 %or.cond9, i1 %126, i1 false
  br i1 %or.cond11, label %127, label %128

127:                                              ; preds = %._crit_edge211
  store double %.0190.lcssa, ptr %27, align 8, !tbaa !31
  br label %129

128:                                              ; preds = %._crit_edge211
  call void @libxsmm_elementwise_store_value(ptr noundef %27, ptr noundef nonnull %3, i32 noundef 0, i32 noundef 0, i32 noundef %13, i32 noundef 0, i32 noundef %16, ptr noundef null, i32 noundef 0)
  br label %129

129:                                              ; preds = %128, %127
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3) #4
  br label %.loopexit

.loopexit:                                        ; preds = %._crit_edge.us, %._crit_edge.split.us229, %._crit_edge.split.us.us.us233, %.preheader.lr.ph, %.preheader197, %.preheader194, %129
  ret void
}

attributes #0 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"libxsmm_meltw_descriptor", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !8, i64 24, !8, i64 25, !8, i64 26, !10, i64 27, !10, i64 29, !8, i64 31}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"short", !8, i64 0}
!11 = !{!6, !7, i64 4}
!12 = !{!6, !7, i64 8}
!13 = !{!6, !7, i64 16}
!14 = !{!6, !7, i64 12}
!15 = !{!6, !10, i64 27}
!16 = !{!17, !19, i64 8}
!17 = !{!"libxsmm_meltw_binary_param", !18, i64 0, !20, i64 32, !20, i64 80, !20, i64 128}
!18 = !{!"libxsmm_matrix_op_arg", !19, i64 0, !19, i64 8, !19, i64 16, !19, i64 24}
!19 = !{!"any pointer", !8, i64 0}
!20 = !{!"libxsmm_matrix_arg", !19, i64 0, !19, i64 8, !19, i64 16, !19, i64 24, !19, i64 32, !19, i64 40}
!21 = !{!17, !19, i64 32}
!22 = !{!17, !19, i64 80}
!23 = !{!17, !19, i64 128}
!24 = !{!6, !10, i64 29}
!25 = !{!10, !10, i64 0}
!26 = !{!27, !27, i64 0}
!27 = !{!"float", !8, i64 0}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = distinct !{!30, !29}
!31 = !{!32, !32, i64 0}
!32 = !{!"double", !8, i64 0}
!33 = distinct !{!33, !29}
!34 = distinct !{!34, !29}
!35 = distinct !{!35, !29}
!36 = distinct !{!36, !29}


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass