; LLVM IR from libxsmm/libxsmm :: samples/equation (equation_layernorm)

; 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_kernel_info = type { i32, i32, i64, i32 }
%struct.libxsmm_meltw_unary_shape = type { i32, i32, i32, i32, i32, i32, i32 }
%struct.libxsmm_matdiff_info = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i32, i32, i32, i32 }
%struct.libxsmm_meqn_arg_metadata = type { i32, i32 }
%struct.libxsmm_meqn_op_metadata = type { i32, i32 }
%struct.libxsmm_meqn_arg_shape = type { i32, i32, i32, i32 }
%struct.libxsmm_matrix_arg_attributes = type { i32, i32, i32, i32 }

@is_reference_kernel = external dso_local global i32, align 4
@.str = external hidden unnamed_addr constant [52 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [16 x i8], align 1
@main.matdiff_ext = external hidden global [1024 x i8], align 16
@.str.2 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [87 x i8], align 1
@__PRETTY_FUNCTION__.main = external hidden unnamed_addr constant [23 x i8], align 1
@info = external dso_local global %struct.libxsmm_kernel_info, align 8
@stderr = external global ptr, align 8
@.str.5 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [35 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local i32 @libxsmm_return_success_code(i32 noundef) #0

; Function Attrs: nounwind uwtable
define dso_local i32 @main(i32 noundef %0, ptr noundef %1) #0 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca double, align 8
  %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 ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca %struct.libxsmm_meltw_unary_shape, align 8
  %23 = alloca %struct.libxsmm_meltw_unary_shape, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca float, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i64, align 8
  %33 = alloca i64, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca double, align 8
  %38 = alloca %struct.libxsmm_matdiff_info, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca ptr, align 8
  %45 = alloca ptr, align 8
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca ptr, align 8
  %55 = alloca ptr, align 8
  %56 = alloca ptr, align 8
  %57 = alloca ptr, align 8
  %58 = alloca ptr, align 8
  %59 = alloca ptr, align 8
  %60 = alloca ptr, align 8
  %61 = alloca ptr, align 8
  %62 = alloca ptr, align 8
  %63 = alloca ptr, align 8
  %64 = alloca ptr, align 8
  %65 = alloca i32, align 4
  %66 = alloca i32, align 4
  %67 = alloca i32, align 4
  %68 = alloca i32, align 4
  %69 = alloca i32, align 4
  %70 = alloca i32, align 4
  %71 = alloca i32, align 4
  %72 = alloca i32, align 4
  %73 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %74 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %75 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %76 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %77 = alloca %struct.libxsmm_matrix_arg_attributes, align 4
  %78 = alloca i32, align 4
  %79 = alloca %struct.libxsmm_meltw_unary_shape, align 4
  %80 = alloca %struct.libxsmm_meltw_unary_shape, align 4
  %81 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %82 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %83 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %84 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %85 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %86 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %87 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %88 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %89 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %90 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %91 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %92 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %93 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %94 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %95 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %96 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %97 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %98 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %99 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %100 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %101 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %102 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %103 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %104 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %105 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %106 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %107 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %108 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %109 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %110 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %111 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %112 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %113 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %114 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %115 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %116 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %117 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %118 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %119 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %120 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %121 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %122 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %123 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %124 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %125 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %126 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %127 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %128 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %129 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %130 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %131 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %132 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %133 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %134 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %135 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %136 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %137 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %138 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  store i32 0, ptr %3, align 4
  store i32 %0, ptr %4, align 4, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #8
  store i32 0, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #8
  store double 2.000000e-04, ptr %7, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #8
  store i32 0, ptr %20, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #8
  call void @llvm.lifetime.start.p0(i64 28, ptr %22) #8
  call void @llvm.lifetime.start.p0(i64 28, ptr %23) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #8
  store float 0x3E80000000000000, ptr %26, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #8
  store double 0.000000e+00, ptr %34, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #8
  store double 0.000000e+00, ptr %35, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #8
  store double 0.000000e+00, ptr %36, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #8
  store double 0.000000e+00, ptr %37, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 192, ptr %38) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %65) #8
  store i32 64, ptr %65, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %66) #8
  store i32 64, ptr %66, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %67) #8
  store i32 64, ptr %67, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %68) #8
  store i32 100, ptr %68, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %69) #8
  store i32 0, ptr %69, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %70) #8
  store i32 3, ptr %70, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %71) #8
  store i32 1, ptr %71, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %72) #8
  store i32 1, ptr %72, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %75) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %76) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %77) #8
  %139 = call { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0)
  %140 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %141 = extractvalue { i64, i64 } %139, 0
  store i64 %141, ptr %140, align 4
  %142 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %143 = extractvalue { i64, i64 } %139, 1
  store i64 %143, ptr %142, align 4
  call void @libxsmm_init()
  call void @libxsmm_matdiff_clear(ptr noundef %38)
  %144 = load i32, ptr %4, align 4, !tbaa !5
  %145 = icmp sgt i32 %144, 1
  br i1 %145, label %146, label %151

146:                                              ; preds = %2
  %147 = load ptr, ptr %5, align 8, !tbaa !9
  %148 = getelementptr inbounds ptr, ptr %147, i64 1
  %149 = load ptr, ptr %148, align 8, !tbaa !9
  %150 = call i32 @atoi(ptr noundef %149) #9
  store i32 %150, ptr %65, align 4, !tbaa !5
  br label %151

151:                                              ; preds = %146, %2
  %152 = load i32, ptr %4, align 4, !tbaa !5
  %153 = icmp sgt i32 %152, 2
  br i1 %153, label %154, label %159

154:                                              ; preds = %151
  %155 = load ptr, ptr %5, align 8, !tbaa !9
  %156 = getelementptr inbounds ptr, ptr %155, i64 2
  %157 = load ptr, ptr %156, align 8, !tbaa !9
  %158 = call i32 @atoi(ptr noundef %157) #9
  store i32 %158, ptr %66, align 4, !tbaa !5
  br label %159

159:                                              ; preds = %154, %151
  %160 = load i32, ptr %4, align 4, !tbaa !5
  %161 = icmp sgt i32 %160, 3
  br i1 %161, label %162, label %167

162:                                              ; preds = %159
  %163 = load ptr, ptr %5, align 8, !tbaa !9
  %164 = getelementptr inbounds ptr, ptr %163, i64 3
  %165 = load ptr, ptr %164, align 8, !tbaa !9
  %166 = call i32 @atoi(ptr noundef %165) #9
  store i32 %166, ptr %67, align 4, !tbaa !5
  br label %167

167:                                              ; preds = %162, %159
  %168 = load i32, ptr %4, align 4, !tbaa !5
  %169 = icmp sgt i32 %168, 4
  br i1 %169, label %170, label %175

170:                                              ; preds = %167
  %171 = load ptr, ptr %5, align 8, !tbaa !9
  %172 = getelementptr inbounds ptr, ptr %171, i64 4
  %173 = load ptr, ptr %172, align 8, !tbaa !9
  %174 = call i32 @atoi(ptr noundef %173) #9
  store i32 %174, ptr %69, align 4, !tbaa !5
  br label %175

175:                                              ; preds = %170, %167
  %176 = load i32, ptr %4, align 4, !tbaa !5
  %177 = icmp sgt i32 %176, 5
  br i1 %177, label %178, label %183

178:                                              ; preds = %175
  %179 = load ptr, ptr %5, align 8, !tbaa !9
  %180 = getelementptr inbounds ptr, ptr %179, i64 5
  %181 = load ptr, ptr %180, align 8, !tbaa !9
  %182 = call i32 @atoi(ptr noundef %181) #9
  store i32 %182, ptr %70, align 4, !tbaa !5
  br label %183

183:                                              ; preds = %178, %175
  %184 = load i32, ptr %4, align 4, !tbaa !5
  %185 = icmp sgt i32 %184, 6
  br i1 %185, label %186, label %191

186:                                              ; preds = %183
  %187 = load ptr, ptr %5, align 8, !tbaa !9
  %188 = getelementptr inbounds ptr, ptr %187, i64 6
  %189 = load ptr, ptr %188, align 8, !tbaa !9
  %190 = call i32 @atoi(ptr noundef %189) #9
  store i32 %190, ptr %68, align 4, !tbaa !5
  br label %191

191:                                              ; preds = %186, %183
  %192 = load i32, ptr %69, align 4, !tbaa !5
  %193 = icmp eq i32 %192, 0
  br i1 %193, label %194, label %202

194:                                              ; preds = %191
  store i32 1, ptr %71, align 4, !tbaa !5
  store i32 1, ptr %72, align 4, !tbaa !5
  %195 = load double, ptr %7, align 8, !tbaa !11
  %196 = fcmp olt double 7.000000e-03, %195
  br i1 %196, label %197, label %199

197:                                              ; preds = %194
  %198 = load double, ptr %7, align 8, !tbaa !11
  br label %200

199:                                              ; preds = %194
  br label %200

200:                                              ; preds = %199, %197
  %201 = phi double [ %198, %197 ], [ 7.000000e-03, %199 ]
  store double %201, ptr %7, align 8, !tbaa !11
  br label %216

202:                                              ; preds = %191
  %203 = load i32, ptr %69, align 4, !tbaa !5
  %204 = icmp eq i32 %203, 1
  br i1 %204, label %205, label %213

205:                                              ; preds = %202
  store i32 2, ptr %71, align 4, !tbaa !5
  store i32 2, ptr %72, align 4, !tbaa !5
  %206 = load double, ptr %7, align 8, !tbaa !11
  %207 = fcmp olt double 7.000000e-03, %206
  br i1 %207, label %208, label %210

208:                                              ; preds = %205
  %209 = load double, ptr %7, align 8, !tbaa !11
  br label %211

210:                                              ; preds = %205
  br label %211

211:                                              ; preds = %210, %208
  %212 = phi double [ %209, %208 ], [ 7.000000e-03, %210 ]
  store double %212, ptr %7, align 8, !tbaa !11
  br label %215

213:                                              ; preds = %202
  %214 = call i32 (ptr, ...) @printf(ptr noundef @.str)
  br label %215

215:                                              ; preds = %213, %211
  br label %216

216:                                              ; preds = %215, %200
  %217 = call ptr @getenv(ptr noundef @.str.1) #8
  store ptr %217, ptr %64, align 8, !tbaa !9
  %218 = load ptr, ptr %64, align 8, !tbaa !9
  %219 = icmp ne ptr null, %218
  br i1 %219, label %220, label %236

220:                                              ; preds = %216
  call void @llvm.lifetime.start.p0(i64 4, ptr %78) #8
  %221 = load ptr, ptr %64, align 8, !tbaa !9
  %222 = load double, ptr %7, align 8, !tbaa !11
  %223 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef @main.matdiff_ext, i64 noundef 1024, ptr noundef @.str.2, ptr noundef %221, double noundef %222) #8
  store i32 %223, ptr %78, align 4, !tbaa !5
  %224 = load i32, ptr %78, align 4, !tbaa !5
  %225 = icmp slt i32 0, %224
  br i1 %225, label %226, label %235

226:                                              ; preds = %220
  %227 = load i32, ptr %78, align 4, !tbaa !5
  %228 = icmp slt i32 %227, 1024
  br i1 %228, label %229, label %235

229:                                              ; preds = %226
  %230 = call i32 @putenv(ptr noundef @main.matdiff_ext) #8
  %231 = icmp eq i32 0, %230
  br i1 %231, label %232, label %233

232:                                              ; preds = %229
  br label %234

233:                                              ; preds = %229
  call void @__assert_fail(ptr noundef @.str.3, ptr noundef @.str.4, i32 noundef 661, ptr noundef @__PRETTY_FUNCTION__.main) #10
  unreachable

234:                                              ; preds = %232
  br label %235

235:                                              ; preds = %234, %226, %220
  call void @llvm.lifetime.end.p0(i64 4, ptr %78) #8
  br label %236

236:                                              ; preds = %235, %216
  %237 = load i32, ptr %65, align 4, !tbaa !5
  %238 = sext i32 %237 to i64
  %239 = mul i64 4, %238
  %240 = load i32, ptr %66, align 4, !tbaa !5
  %241 = sext i32 %240 to i64
  %242 = mul i64 %239, %241
  %243 = load i32, ptr %67, align 4, !tbaa !5
  %244 = sext i32 %243 to i64
  %245 = mul i64 %242, %244
  %246 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %245, i64 noundef 2097152)
  store ptr %246, ptr %39, align 8, !tbaa !9
  %247 = load i32, ptr %65, align 4, !tbaa !5
  %248 = sext i32 %247 to i64
  %249 = mul i64 4, %248
  %250 = load i32, ptr %66, align 4, !tbaa !5
  %251 = sext i32 %250 to i64
  %252 = mul i64 %249, %251
  %253 = load i32, ptr %67, align 4, !tbaa !5
  %254 = sext i32 %253 to i64
  %255 = mul i64 %252, %254
  %256 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %255, i64 noundef 2097152)
  store ptr %256, ptr %40, align 8, !tbaa !9
  %257 = load i32, ptr %65, align 4, !tbaa !5
  %258 = sext i32 %257 to i64
  %259 = mul i64 4, %258
  %260 = load i32, ptr %66, align 4, !tbaa !5
  %261 = sext i32 %260 to i64
  %262 = mul i64 %259, %261
  %263 = load i32, ptr %67, align 4, !tbaa !5
  %264 = sext i32 %263 to i64
  %265 = mul i64 %262, %264
  %266 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %265, i64 noundef 2097152)
  store ptr %266, ptr %41, align 8, !tbaa !9
  %267 = load i32, ptr %65, align 4, !tbaa !5
  %268 = sext i32 %267 to i64
  %269 = mul i64 4, %268
  %270 = load i32, ptr %66, align 4, !tbaa !5
  %271 = sext i32 %270 to i64
  %272 = mul i64 %269, %271
  %273 = load i32, ptr %67, align 4, !tbaa !5
  %274 = sext i32 %273 to i64
  %275 = mul i64 %272, %274
  %276 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %275, i64 noundef 2097152)
  store ptr %276, ptr %42, align 8, !tbaa !9
  %277 = load i32, ptr %65, align 4, !tbaa !5
  %278 = sext i32 %277 to i64
  %279 = mul i64 4, %278
  %280 = load i32, ptr %67, align 4, !tbaa !5
  %281 = sext i32 %280 to i64
  %282 = mul i64 %279, %281
  %283 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %282, i64 noundef 2097152)
  store ptr %283, ptr %47, align 8, !tbaa !9
  %284 = load i32, ptr %65, align 4, !tbaa !5
  %285 = sext i32 %284 to i64
  %286 = mul i64 4, %285
  %287 = load i32, ptr %67, align 4, !tbaa !5
  %288 = sext i32 %287 to i64
  %289 = mul i64 %286, %288
  %290 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %289, i64 noundef 2097152)
  store ptr %290, ptr %45, align 8, !tbaa !9
  %291 = load i32, ptr %65, align 4, !tbaa !5
  %292 = sext i32 %291 to i64
  %293 = mul i64 4, %292
  %294 = load i32, ptr %66, align 4, !tbaa !5
  %295 = sext i32 %294 to i64
  %296 = mul i64 %293, %295
  %297 = load i32, ptr %67, align 4, !tbaa !5
  %298 = sext i32 %297 to i64
  %299 = mul i64 %296, %298
  %300 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %299, i64 noundef 2097152)
  store ptr %300, ptr %43, align 8, !tbaa !9
  %301 = load i32, ptr %65, align 4, !tbaa !5
  %302 = sext i32 %301 to i64
  %303 = mul i64 4, %302
  %304 = load i32, ptr %66, align 4, !tbaa !5
  %305 = sext i32 %304 to i64
  %306 = mul i64 %303, %305
  %307 = load i32, ptr %67, align 4, !tbaa !5
  %308 = sext i32 %307 to i64
  %309 = mul i64 %306, %308
  %310 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %309, i64 noundef 2097152)
  store ptr %310, ptr %44, align 8, !tbaa !9
  %311 = load i32, ptr %65, align 4, !tbaa !5
  %312 = sext i32 %311 to i64
  %313 = mul i64 4, %312
  %314 = load i32, ptr %67, align 4, !tbaa !5
  %315 = sext i32 %314 to i64
  %316 = mul i64 %313, %315
  %317 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %316, i64 noundef 2097152)
  store ptr %317, ptr %48, align 8, !tbaa !9
  %318 = load i32, ptr %65, align 4, !tbaa !5
  %319 = sext i32 %318 to i64
  %320 = mul i64 4, %319
  %321 = load i32, ptr %67, align 4, !tbaa !5
  %322 = sext i32 %321 to i64
  %323 = mul i64 %320, %322
  %324 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %323, i64 noundef 2097152)
  store ptr %324, ptr %46, align 8, !tbaa !9
  %325 = load i32, ptr %65, align 4, !tbaa !5
  %326 = sext i32 %325 to i64
  %327 = mul i64 4, %326
  %328 = load i32, ptr %67, align 4, !tbaa !5
  %329 = sext i32 %328 to i64
  %330 = mul i64 %327, %329
  %331 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %330, i64 noundef 2097152)
  store ptr %331, ptr %50, align 8, !tbaa !9
  %332 = load i32, ptr %65, align 4, !tbaa !5
  %333 = sext i32 %332 to i64
  %334 = mul i64 4, %333
  %335 = load i32, ptr %67, align 4, !tbaa !5
  %336 = sext i32 %335 to i64
  %337 = mul i64 %334, %336
  %338 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %337, i64 noundef 2097152)
  store ptr %338, ptr %51, align 8, !tbaa !9
  %339 = load i32, ptr %66, align 4, !tbaa !5
  %340 = sext i32 %339 to i64
  %341 = mul i64 4, %340
  %342 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %341, i64 noundef 2097152)
  store ptr %342, ptr %53, align 8, !tbaa !9
  %343 = load i32, ptr %66, align 4, !tbaa !5
  %344 = sext i32 %343 to i64
  %345 = mul i64 4, %344
  %346 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %345, i64 noundef 2097152)
  store ptr %346, ptr %54, align 8, !tbaa !9
  %347 = load i32, ptr %65, align 4, !tbaa !5
  %348 = sext i32 %347 to i64
  %349 = mul i64 4, %348
  %350 = load i32, ptr %66, align 4, !tbaa !5
  %351 = sext i32 %350 to i64
  %352 = mul i64 %349, %351
  %353 = load i32, ptr %67, align 4, !tbaa !5
  %354 = sext i32 %353 to i64
  %355 = mul i64 %352, %354
  %356 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %355, i64 noundef 2097152)
  store ptr %356, ptr %49, align 8, !tbaa !9
  %357 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef 4194304, i64 noundef 2097152)
  store ptr %357, ptr %52, align 8, !tbaa !9
  %358 = load i32, ptr %65, align 4, !tbaa !5
  %359 = sext i32 %358 to i64
  %360 = mul i64 2, %359
  %361 = load i32, ptr %66, align 4, !tbaa !5
  %362 = sext i32 %361 to i64
  %363 = mul i64 %360, %362
  %364 = load i32, ptr %67, align 4, !tbaa !5
  %365 = sext i32 %364 to i64
  %366 = mul i64 %363, %365
  %367 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %366, i64 noundef 2097152)
  store ptr %367, ptr %55, align 8, !tbaa !9
  %368 = load i32, ptr %65, align 4, !tbaa !5
  %369 = sext i32 %368 to i64
  %370 = mul i64 2, %369
  %371 = load i32, ptr %66, align 4, !tbaa !5
  %372 = sext i32 %371 to i64
  %373 = mul i64 %370, %372
  %374 = load i32, ptr %67, align 4, !tbaa !5
  %375 = sext i32 %374 to i64
  %376 = mul i64 %373, %375
  %377 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %376, i64 noundef 2097152)
  store ptr %377, ptr %56, align 8, !tbaa !9
  %378 = load i32, ptr %65, align 4, !tbaa !5
  %379 = sext i32 %378 to i64
  %380 = mul i64 2, %379
  %381 = load i32, ptr %66, align 4, !tbaa !5
  %382 = sext i32 %381 to i64
  %383 = mul i64 %380, %382
  %384 = load i32, ptr %67, align 4, !tbaa !5
  %385 = sext i32 %384 to i64
  %386 = mul i64 %383, %385
  %387 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %386, i64 noundef 2097152)
  store ptr %387, ptr %57, align 8, !tbaa !9
  %388 = load i32, ptr %65, align 4, !tbaa !5
  %389 = sext i32 %388 to i64
  %390 = mul i64 2, %389
  %391 = load i32, ptr %66, align 4, !tbaa !5
  %392 = sext i32 %391 to i64
  %393 = mul i64 %390, %392
  %394 = load i32, ptr %67, align 4, !tbaa !5
  %395 = sext i32 %394 to i64
  %396 = mul i64 %393, %395
  %397 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %396, i64 noundef 2097152)
  store ptr %397, ptr %58, align 8, !tbaa !9
  %398 = load i32, ptr %65, align 4, !tbaa !5
  %399 = sext i32 %398 to i64
  %400 = mul i64 2, %399
  %401 = load i32, ptr %66, align 4, !tbaa !5
  %402 = sext i32 %401 to i64
  %403 = mul i64 %400, %402
  %404 = load i32, ptr %67, align 4, !tbaa !5
  %405 = sext i32 %404 to i64
  %406 = mul i64 %403, %405
  %407 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %406, i64 noundef 2097152)
  store ptr %407, ptr %59, align 8, !tbaa !9
  %408 = load i32, ptr %65, align 4, !tbaa !5
  %409 = sext i32 %408 to i64
  %410 = mul i64 2, %409
  %411 = load i32, ptr %66, align 4, !tbaa !5
  %412 = sext i32 %411 to i64
  %413 = mul i64 %410, %412
  %414 = load i32, ptr %67, align 4, !tbaa !5
  %415 = sext i32 %414 to i64
  %416 = mul i64 %413, %415
  %417 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %416, i64 noundef 2097152)
  store ptr %417, ptr %60, align 8, !tbaa !9
  %418 = load i32, ptr %65, align 4, !tbaa !5
  %419 = sext i32 %418 to i64
  %420 = mul i64 2, %419
  %421 = load i32, ptr %67, align 4, !tbaa !5
  %422 = sext i32 %421 to i64
  %423 = mul i64 %420, %422
  %424 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %423, i64 noundef 2097152)
  store ptr %424, ptr %61, align 8, !tbaa !9
  %425 = load i32, ptr %65, align 4, !tbaa !5
  %426 = sext i32 %425 to i64
  %427 = mul i64 2, %426
  %428 = load i32, ptr %67, align 4, !tbaa !5
  %429 = sext i32 %428 to i64
  %430 = mul i64 %427, %429
  %431 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %430, i64 noundef 2097152)
  store ptr %431, ptr %62, align 8, !tbaa !9
  %432 = load i32, ptr %65, align 4, !tbaa !5
  %433 = sext i32 %432 to i64
  %434 = mul i64 2, %433
  %435 = load i32, ptr %66, align 4, !tbaa !5
  %436 = sext i32 %435 to i64
  %437 = mul i64 %434, %436
  %438 = load i32, ptr %67, align 4, !tbaa !5
  %439 = sext i32 %438 to i64
  %440 = mul i64 %437, %439
  %441 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %440, i64 noundef 2097152)
  store ptr %441, ptr %63, align 8, !tbaa !9
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %442

442:                                              ; preds = %558, %236
  %443 = load i32, ptr %27, align 4, !tbaa !5
  %444 = load i32, ptr %65, align 4, !tbaa !5
  %445 = load i32, ptr %66, align 4, !tbaa !5
  %446 = mul nsw i32 %444, %445
  %447 = load i32, ptr %67, align 4, !tbaa !5
  %448 = mul nsw i32 %446, %447
  %449 = icmp slt i32 %443, %448
  br i1 %449, label %450, label %561

450:                                              ; preds = %442
  %451 = call double @libxsmm_rng_f64()
  %452 = fptrunc double %451 to float
  %453 = load ptr, ptr %39, align 8, !tbaa !9
  %454 = load i32, ptr %27, align 4, !tbaa !5
  %455 = sext i32 %454 to i64
  %456 = getelementptr inbounds float, ptr %453, i64 %455
  store float %452, ptr %456, align 4, !tbaa !13
  %457 = call double @libxsmm_rng_f64()
  %458 = fptrunc double %457 to float
  %459 = load ptr, ptr %40, align 8, !tbaa !9
  %460 = load i32, ptr %27, align 4, !tbaa !5
  %461 = sext i32 %460 to i64
  %462 = getelementptr inbounds float, ptr %459, i64 %461
  store float %458, ptr %462, align 4, !tbaa !13
  %463 = load ptr, ptr %40, align 8, !tbaa !9
  %464 = load i32, ptr %27, align 4, !tbaa !5
  %465 = sext i32 %464 to i64
  %466 = getelementptr inbounds float, ptr %463, i64 %465
  %467 = load float, ptr %466, align 4, !tbaa !13
  %468 = load ptr, ptr %49, align 8, !tbaa !9
  %469 = load i32, ptr %27, align 4, !tbaa !5
  %470 = sext i32 %469 to i64
  %471 = getelementptr inbounds float, ptr %468, i64 %470
  store float %467, ptr %471, align 4, !tbaa !13
  %472 = call double @libxsmm_rng_f64()
  %473 = fptrunc double %472 to float
  %474 = load ptr, ptr %41, align 8, !tbaa !9
  %475 = load i32, ptr %27, align 4, !tbaa !5
  %476 = sext i32 %475 to i64
  %477 = getelementptr inbounds float, ptr %474, i64 %476
  store float %473, ptr %477, align 4, !tbaa !13
  %478 = call double @libxsmm_rng_f64()
  %479 = fptrunc double %478 to float
  %480 = load ptr, ptr %42, align 8, !tbaa !9
  %481 = load i32, ptr %27, align 4, !tbaa !5
  %482 = sext i32 %481 to i64
  %483 = getelementptr inbounds float, ptr %480, i64 %482
  store float %479, ptr %483, align 4, !tbaa !13
  %484 = load ptr, ptr %41, align 8, !tbaa !9
  %485 = load i32, ptr %27, align 4, !tbaa !5
  %486 = sext i32 %485 to i64
  %487 = getelementptr inbounds float, ptr %484, i64 %486
  %488 = load float, ptr %487, align 4, !tbaa !13
  %489 = load ptr, ptr %43, align 8, !tbaa !9
  %490 = load i32, ptr %27, align 4, !tbaa !5
  %491 = sext i32 %490 to i64
  %492 = getelementptr inbounds float, ptr %489, i64 %491
  store float %488, ptr %492, align 4, !tbaa !13
  %493 = load ptr, ptr %42, align 8, !tbaa !9
  %494 = load i32, ptr %27, align 4, !tbaa !5
  %495 = sext i32 %494 to i64
  %496 = getelementptr inbounds float, ptr %493, i64 %495
  %497 = load float, ptr %496, align 4, !tbaa !13
  %498 = load ptr, ptr %44, align 8, !tbaa !9
  %499 = load i32, ptr %27, align 4, !tbaa !5
  %500 = sext i32 %499 to i64
  %501 = getelementptr inbounds float, ptr %498, i64 %500
  store float %497, ptr %501, align 4, !tbaa !13
  %502 = load ptr, ptr %39, align 8, !tbaa !9
  %503 = load i32, ptr %27, align 4, !tbaa !5
  %504 = sext i32 %503 to i64
  %505 = getelementptr inbounds float, ptr %502, i64 %504
  %506 = load ptr, ptr %55, align 8, !tbaa !9
  %507 = load i32, ptr %27, align 4, !tbaa !5
  %508 = sext i32 %507 to i64
  %509 = getelementptr inbounds i16, ptr %506, i64 %508
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %505, ptr noundef %509, i64 noundef 1)
  %510 = load ptr, ptr %40, align 8, !tbaa !9
  %511 = load i32, ptr %27, align 4, !tbaa !5
  %512 = sext i32 %511 to i64
  %513 = getelementptr inbounds float, ptr %510, i64 %512
  %514 = load ptr, ptr %56, align 8, !tbaa !9
  %515 = load i32, ptr %27, align 4, !tbaa !5
  %516 = sext i32 %515 to i64
  %517 = getelementptr inbounds i16, ptr %514, i64 %516
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %513, ptr noundef %517, i64 noundef 1)
  %518 = load ptr, ptr %49, align 8, !tbaa !9
  %519 = load i32, ptr %27, align 4, !tbaa !5
  %520 = sext i32 %519 to i64
  %521 = getelementptr inbounds float, ptr %518, i64 %520
  %522 = load ptr, ptr %63, align 8, !tbaa !9
  %523 = load i32, ptr %27, align 4, !tbaa !5
  %524 = sext i32 %523 to i64
  %525 = getelementptr inbounds i16, ptr %522, i64 %524
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %521, ptr noundef %525, i64 noundef 1)
  %526 = load ptr, ptr %42, align 8, !tbaa !9
  %527 = load i32, ptr %27, align 4, !tbaa !5
  %528 = sext i32 %527 to i64
  %529 = getelementptr inbounds float, ptr %526, i64 %528
  %530 = load ptr, ptr %58, align 8, !tbaa !9
  %531 = load i32, ptr %27, align 4, !tbaa !5
  %532 = sext i32 %531 to i64
  %533 = getelementptr inbounds i16, ptr %530, i64 %532
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %529, ptr noundef %533, i64 noundef 1)
  %534 = load ptr, ptr %44, align 8, !tbaa !9
  %535 = load i32, ptr %27, align 4, !tbaa !5
  %536 = sext i32 %535 to i64
  %537 = getelementptr inbounds float, ptr %534, i64 %536
  %538 = load ptr, ptr %60, align 8, !tbaa !9
  %539 = load i32, ptr %27, align 4, !tbaa !5
  %540 = sext i32 %539 to i64
  %541 = getelementptr inbounds i16, ptr %538, i64 %540
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %537, ptr noundef %541, i64 noundef 1)
  %542 = load ptr, ptr %41, align 8, !tbaa !9
  %543 = load i32, ptr %27, align 4, !tbaa !5
  %544 = sext i32 %543 to i64
  %545 = getelementptr inbounds float, ptr %542, i64 %544
  %546 = load ptr, ptr %57, align 8, !tbaa !9
  %547 = load i32, ptr %27, align 4, !tbaa !5
  %548 = sext i32 %547 to i64
  %549 = getelementptr inbounds i16, ptr %546, i64 %548
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %545, ptr noundef %549, i64 noundef 1)
  %550 = load ptr, ptr %43, align 8, !tbaa !9
  %551 = load i32, ptr %27, align 4, !tbaa !5
  %552 = sext i32 %551 to i64
  %553 = getelementptr inbounds float, ptr %550, i64 %552
  %554 = load ptr, ptr %59, align 8, !tbaa !9
  %555 = load i32, ptr %27, align 4, !tbaa !5
  %556 = sext i32 %555 to i64
  %557 = getelementptr inbounds i16, ptr %554, i64 %556
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %553, ptr noundef %557, i64 noundef 1)
  br label %558

558:                                              ; preds = %450
  %559 = load i32, ptr %27, align 4, !tbaa !5
  %560 = add nsw i32 %559, 1
  store i32 %560, ptr %27, align 4, !tbaa !5
  br label %442, !llvm.loop !15

561:                                              ; preds = %442
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %562

562:                                              ; preds = %627, %561
  %563 = load i32, ptr %27, align 4, !tbaa !5
  %564 = load i32, ptr %65, align 4, !tbaa !5
  %565 = load i32, ptr %67, align 4, !tbaa !5
  %566 = mul nsw i32 %564, %565
  %567 = icmp slt i32 %563, %566
  br i1 %567, label %568, label %630

568:                                              ; preds = %562
  %569 = call double @libxsmm_rng_f64()
  %570 = fptrunc double %569 to float
  %571 = load ptr, ptr %50, align 8, !tbaa !9
  %572 = load i32, ptr %27, align 4, !tbaa !5
  %573 = sext i32 %572 to i64
  %574 = getelementptr inbounds float, ptr %571, i64 %573
  store float %570, ptr %574, align 4, !tbaa !13
  %575 = call double @libxsmm_rng_f64()
  %576 = fptrunc double %575 to float
  %577 = load ptr, ptr %51, align 8, !tbaa !9
  %578 = load i32, ptr %27, align 4, !tbaa !5
  %579 = sext i32 %578 to i64
  %580 = getelementptr inbounds float, ptr %577, i64 %579
  store float %576, ptr %580, align 4, !tbaa !13
  %581 = call double @libxsmm_rng_f64()
  %582 = fptrunc double %581 to float
  %583 = load ptr, ptr %45, align 8, !tbaa !9
  %584 = load i32, ptr %27, align 4, !tbaa !5
  %585 = sext i32 %584 to i64
  %586 = getelementptr inbounds float, ptr %583, i64 %585
  store float %582, ptr %586, align 4, !tbaa !13
  %587 = call double @libxsmm_rng_f64()
  %588 = fptrunc double %587 to float
  %589 = load ptr, ptr %47, align 8, !tbaa !9
  %590 = load i32, ptr %27, align 4, !tbaa !5
  %591 = sext i32 %590 to i64
  %592 = getelementptr inbounds float, ptr %589, i64 %591
  store float %588, ptr %592, align 4, !tbaa !13
  %593 = load ptr, ptr %45, align 8, !tbaa !9
  %594 = load i32, ptr %27, align 4, !tbaa !5
  %595 = sext i32 %594 to i64
  %596 = getelementptr inbounds float, ptr %593, i64 %595
  %597 = load float, ptr %596, align 4, !tbaa !13
  %598 = load ptr, ptr %46, align 8, !tbaa !9
  %599 = load i32, ptr %27, align 4, !tbaa !5
  %600 = sext i32 %599 to i64
  %601 = getelementptr inbounds float, ptr %598, i64 %600
  store float %597, ptr %601, align 4, !tbaa !13
  %602 = load ptr, ptr %47, align 8, !tbaa !9
  %603 = load i32, ptr %27, align 4, !tbaa !5
  %604 = sext i32 %603 to i64
  %605 = getelementptr inbounds float, ptr %602, i64 %604
  %606 = load float, ptr %605, align 4, !tbaa !13
  %607 = load ptr, ptr %48, align 8, !tbaa !9
  %608 = load i32, ptr %27, align 4, !tbaa !5
  %609 = sext i32 %608 to i64
  %610 = getelementptr inbounds float, ptr %607, i64 %609
  store float %606, ptr %610, align 4, !tbaa !13
  %611 = load ptr, ptr %50, align 8, !tbaa !9
  %612 = load i32, ptr %27, align 4, !tbaa !5
  %613 = sext i32 %612 to i64
  %614 = getelementptr inbounds float, ptr %611, i64 %613
  %615 = load ptr, ptr %61, align 8, !tbaa !9
  %616 = load i32, ptr %27, align 4, !tbaa !5
  %617 = sext i32 %616 to i64
  %618 = getelementptr inbounds i16, ptr %615, i64 %617
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %614, ptr noundef %618, i64 noundef 1)
  %619 = load ptr, ptr %51, align 8, !tbaa !9
  %620 = load i32, ptr %27, align 4, !tbaa !5
  %621 = sext i32 %620 to i64
  %622 = getelementptr inbounds float, ptr %619, i64 %621
  %623 = load ptr, ptr %62, align 8, !tbaa !9
  %624 = load i32, ptr %27, align 4, !tbaa !5
  %625 = sext i32 %624 to i64
  %626 = getelementptr inbounds i16, ptr %623, i64 %625
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %622, ptr noundef %626, i64 noundef 1)
  br label %627

627:                                              ; preds = %568
  %628 = load i32, ptr %27, align 4, !tbaa !5
  %629 = add nsw i32 %628, 1
  store i32 %629, ptr %27, align 4, !tbaa !5
  br label %562, !llvm.loop !17

630:                                              ; preds = %562
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %631

631:                                              ; preds = %641, %630
  %632 = load i32, ptr %27, align 4, !tbaa !5
  %633 = icmp slt i32 %632, 1048576
  br i1 %633, label %634, label %644

634:                                              ; preds = %631
  %635 = call double @libxsmm_rng_f64()
  %636 = fptrunc double %635 to float
  %637 = load ptr, ptr %52, align 8, !tbaa !9
  %638 = load i32, ptr %27, align 4, !tbaa !5
  %639 = sext i32 %638 to i64
  %640 = getelementptr inbounds float, ptr %637, i64 %639
  store float %636, ptr %640, align 4, !tbaa !13
  br label %641

641:                                              ; preds = %634
  %642 = load i32, ptr %27, align 4, !tbaa !5
  %643 = add nsw i32 %642, 1
  store i32 %643, ptr %27, align 4, !tbaa !5
  br label %631, !llvm.loop !18

644:                                              ; preds = %631
  %645 = load i32, ptr %70, align 4, !tbaa !5
  %646 = and i32 %645, 1
  %647 = icmp sgt i32 %646, 0
  br i1 %647, label %648, label %1161

648:                                              ; preds = %644
  %649 = load i32, ptr %66, align 4, !tbaa !5
  %650 = load i32, ptr %67, align 4, !tbaa !5
  %651 = mul nsw i32 %649, %650
  store i32 %651, ptr %29, align 4, !tbaa !5
  %652 = load i32, ptr %67, align 4, !tbaa !5
  store i32 %652, ptr %30, align 4, !tbaa !5
  store i32 20, ptr %21, align 4, !tbaa !5
  store i32 16, ptr %20, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 28, ptr %79) #8
  %653 = load i32, ptr %67, align 4, !tbaa !5
  %654 = load i32, ptr %65, align 4, !tbaa !5
  %655 = load i32, ptr %29, align 4, !tbaa !5
  %656 = load i32, ptr %30, align 4, !tbaa !5
  %657 = load i32, ptr %71, align 4, !tbaa !5
  call void @libxsmm_create_meltw_unary_shape(ptr dead_on_unwind writable sret(%struct.libxsmm_meltw_unary_shape) align 4 %79, i32 noundef %653, i32 noundef %654, i32 noundef %655, i32 noundef %656, i32 noundef %657, i32 noundef 1, i32 noundef 1)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %23, ptr align 4 %79, i64 28, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 28, ptr %79) #8
  %658 = load i32, ptr %21, align 4, !tbaa !5
  %659 = load i32, ptr %20, align 4, !tbaa !5
  %660 = call ptr @libxsmm_dispatch_meltw_unary(i32 noundef %658, ptr noundef byval(%struct.libxsmm_meltw_unary_shape) align 8 %23, i32 noundef %659)
  store ptr %660, ptr %25, align 8, !tbaa !9
  %661 = load ptr, ptr %25, align 8, !tbaa !9
  %662 = call i32 @libxsmm_get_kernel_info(ptr noundef %661, ptr noundef @info)
  %663 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %663, ptr @is_reference_kernel, align 4, !tbaa !5
  %664 = load ptr, ptr %25, align 8, !tbaa !9
  %665 = icmp eq ptr %664, null
  br i1 %665, label %666, label %669

666:                                              ; preds = %648
  %667 = load ptr, ptr @stderr, align 8, !tbaa !9
  %668 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %667, ptr noundef @.str.5) #8
  call void @exit(i32 noundef -1) #10
  unreachable

669:                                              ; preds = %648
  %670 = load i32, ptr %67, align 4, !tbaa !5
  store i32 %670, ptr %29, align 4, !tbaa !5
  store i32 1, ptr %30, align 4, !tbaa !5
  store i32 18, ptr %21, align 4, !tbaa !5
  store i32 32, ptr %20, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 28, ptr %80) #8
  %671 = load i32, ptr %67, align 4, !tbaa !5
  %672 = load i32, ptr %29, align 4, !tbaa !5
  %673 = load i32, ptr %30, align 4, !tbaa !5
  call void @libxsmm_create_meltw_unary_shape(ptr dead_on_unwind writable sret(%struct.libxsmm_meltw_unary_shape) align 4 %80, i32 noundef %671, i32 noundef 1, i32 noundef %672, i32 noundef %673, i32 noundef 1, i32 noundef 1, i32 noundef 1)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %22, ptr align 4 %80, i64 28, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 28, ptr %80) #8
  %674 = load i32, ptr %21, align 4, !tbaa !5
  %675 = load i32, ptr %20, align 4, !tbaa !5
  %676 = call ptr @libxsmm_dispatch_meltw_unary(i32 noundef %674, ptr noundef byval(%struct.libxsmm_meltw_unary_shape) align 8 %22, i32 noundef %675)
  store ptr %676, ptr %24, align 8, !tbaa !9
  %677 = load ptr, ptr %24, align 8, !tbaa !9
  %678 = call i32 @libxsmm_get_kernel_info(ptr noundef %677, ptr noundef @info)
  %679 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %679, ptr @is_reference_kernel, align 4, !tbaa !5
  %680 = load ptr, ptr %24, align 8, !tbaa !9
  %681 = icmp eq ptr %680, null
  br i1 %681, label %682, label %685

682:                                              ; preds = %669
  %683 = load ptr, ptr @stderr, align 8, !tbaa !9
  %684 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %683, ptr noundef @.str.6) #8
  call void @exit(i32 noundef -1) #10
  unreachable

685:                                              ; preds = %669
  %686 = load i32, ptr %66, align 4, !tbaa !5
  %687 = load i32, ptr %67, align 4, !tbaa !5
  %688 = mul nsw i32 %686, %687
  store i32 %688, ptr %29, align 4, !tbaa !5
  store i32 1, ptr %30, align 4, !tbaa !5
  %689 = load i32, ptr %67, align 4, !tbaa !5
  store i32 %689, ptr %31, align 4, !tbaa !5
  %690 = call i32 @libxsmm_meqn_create()
  store i32 %690, ptr %8, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %81) #8
  %691 = load i32, ptr %8, align 4, !tbaa !5
  %692 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %691, i32 noundef -1)
  store i64 %692, ptr %81, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %74, ptr align 4 %81, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #8
  %693 = load i64, ptr %74, align 4
  %694 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %693, i32 noundef 1, i32 noundef 1, i32 noundef 512)
  %695 = load i64, ptr %74, align 4
  %696 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %695, i32 noundef 1, i32 noundef 1, i32 noundef 896)
  call void @llvm.lifetime.start.p0(i64 16, ptr %82) #8
  %697 = load i32, ptr %67, align 4, !tbaa !5
  %698 = load i32, ptr %65, align 4, !tbaa !5
  %699 = load i32, ptr %29, align 4, !tbaa !5
  %700 = load i32, ptr %71, align 4, !tbaa !5
  %701 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %697, i32 noundef %698, i32 noundef %699, i32 noundef %700)
  %702 = getelementptr inbounds { i64, i64 }, ptr %82, i32 0, i32 0
  %703 = extractvalue { i64, i64 } %701, 0
  store i64 %703, ptr %702, align 4
  %704 = getelementptr inbounds { i64, i64 }, ptr %82, i32 0, i32 1
  %705 = extractvalue { i64, i64 } %701, 1
  store i64 %705, ptr %704, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %82, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %82) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #8
  %706 = load i32, ptr %8, align 4, !tbaa !5
  %707 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %706, i32 noundef 0)
  store i64 %707, ptr %83, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %83, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #8
  %708 = load i64, ptr %73, align 4
  %709 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %710 = load i64, ptr %709, align 4
  %711 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %712 = load i64, ptr %711, align 4
  %713 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %714 = load i64, ptr %713, align 4
  %715 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %716 = load i64, ptr %715, align 4
  %717 = call i32 @libxsmm_meqn_push_back_arg(i64 %708, i64 %710, i64 %712, i64 %714, i64 %716)
  call void @llvm.lifetime.start.p0(i64 16, ptr %84) #8
  %718 = load i32, ptr %30, align 4, !tbaa !5
  %719 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef %718, i32 noundef 1)
  %720 = getelementptr inbounds { i64, i64 }, ptr %84, i32 0, i32 0
  %721 = extractvalue { i64, i64 } %719, 0
  store i64 %721, ptr %720, align 4
  %722 = getelementptr inbounds { i64, i64 }, ptr %84, i32 0, i32 1
  %723 = extractvalue { i64, i64 } %719, 1
  store i64 %723, ptr %722, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %84, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %84) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %85) #8
  %724 = load i32, ptr %8, align 4, !tbaa !5
  %725 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %724, i32 noundef 1)
  store i64 %725, ptr %85, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %85, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %85) #8
  %726 = load i64, ptr %73, align 4
  %727 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %728 = load i64, ptr %727, align 4
  %729 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %730 = load i64, ptr %729, align 4
  %731 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %732 = load i64, ptr %731, align 4
  %733 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %734 = load i64, ptr %733, align 4
  %735 = call i32 @libxsmm_meqn_push_back_arg(i64 %726, i64 %728, i64 %730, i64 %732, i64 %734)
  call void @llvm.lifetime.start.p0(i64 16, ptr %86) #8
  %736 = load i32, ptr %30, align 4, !tbaa !5
  %737 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef %736, i32 noundef 1)
  %738 = getelementptr inbounds { i64, i64 }, ptr %86, i32 0, i32 0
  %739 = extractvalue { i64, i64 } %737, 0
  store i64 %739, ptr %738, align 4
  %740 = getelementptr inbounds { i64, i64 }, ptr %86, i32 0, i32 1
  %741 = extractvalue { i64, i64 } %737, 1
  store i64 %741, ptr %740, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %86, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %86) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %87) #8
  %742 = load i32, ptr %8, align 4, !tbaa !5
  %743 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %742, i32 noundef 2)
  store i64 %743, ptr %87, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %87, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %87) #8
  %744 = load i64, ptr %73, align 4
  %745 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %746 = load i64, ptr %745, align 4
  %747 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %748 = load i64, ptr %747, align 4
  %749 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %750 = load i64, ptr %749, align 4
  %751 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %752 = load i64, ptr %751, align 4
  %753 = call i32 @libxsmm_meqn_push_back_arg(i64 %744, i64 %746, i64 %748, i64 %750, i64 %752)
  call void @llvm.lifetime.start.p0(i64 16, ptr %88) #8
  %754 = load i32, ptr %67, align 4, !tbaa !5
  %755 = load i32, ptr %65, align 4, !tbaa !5
  %756 = load i32, ptr %31, align 4, !tbaa !5
  %757 = load i32, ptr %71, align 4, !tbaa !5
  %758 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %754, i32 noundef %755, i32 noundef %756, i32 noundef %757)
  %759 = getelementptr inbounds { i64, i64 }, ptr %88, i32 0, i32 0
  %760 = extractvalue { i64, i64 } %758, 0
  store i64 %760, ptr %759, align 4
  %761 = getelementptr inbounds { i64, i64 }, ptr %88, i32 0, i32 1
  %762 = extractvalue { i64, i64 } %758, 1
  store i64 %762, ptr %761, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %88, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %88) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %89) #8
  %763 = load i32, ptr %8, align 4, !tbaa !5
  %764 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %763, i32 noundef 3)
  store i64 %764, ptr %89, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %89, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %89) #8
  %765 = load i64, ptr %73, align 4
  %766 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %767 = load i64, ptr %766, align 4
  %768 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %769 = load i64, ptr %768, align 4
  %770 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %771 = load i64, ptr %770, align 4
  %772 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %773 = load i64, ptr %772, align 4
  %774 = call i32 @libxsmm_meqn_push_back_arg(i64 %765, i64 %767, i64 %769, i64 %771, i64 %773)
  call void @llvm.lifetime.start.p0(i64 16, ptr %90) #8
  %775 = load i32, ptr %67, align 4, !tbaa !5
  %776 = load i32, ptr %65, align 4, !tbaa !5
  %777 = load i32, ptr %31, align 4, !tbaa !5
  %778 = load i32, ptr %71, align 4, !tbaa !5
  %779 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %775, i32 noundef %776, i32 noundef %777, i32 noundef %778)
  %780 = getelementptr inbounds { i64, i64 }, ptr %90, i32 0, i32 0
  %781 = extractvalue { i64, i64 } %779, 0
  store i64 %781, ptr %780, align 4
  %782 = getelementptr inbounds { i64, i64 }, ptr %90, i32 0, i32 1
  %783 = extractvalue { i64, i64 } %779, 1
  store i64 %783, ptr %782, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %90, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %90) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %91) #8
  %784 = load i32, ptr %8, align 4, !tbaa !5
  %785 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %784, i32 noundef 4)
  store i64 %785, ptr %91, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %91, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %91) #8
  %786 = load i64, ptr %73, align 4
  %787 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %788 = load i64, ptr %787, align 4
  %789 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %790 = load i64, ptr %789, align 4
  %791 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %792 = load i64, ptr %791, align 4
  %793 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %794 = load i64, ptr %793, align 4
  %795 = call i32 @libxsmm_meqn_push_back_arg(i64 %786, i64 %788, i64 %790, i64 %792, i64 %794)
  call void @llvm.lifetime.start.p0(i64 16, ptr %92) #8
  %796 = load i32, ptr %67, align 4, !tbaa !5
  %797 = load i32, ptr %65, align 4, !tbaa !5
  %798 = load i32, ptr %29, align 4, !tbaa !5
  %799 = load i32, ptr %72, align 4, !tbaa !5
  %800 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %796, i32 noundef %797, i32 noundef %798, i32 noundef %799)
  %801 = getelementptr inbounds { i64, i64 }, ptr %92, i32 0, i32 0
  %802 = extractvalue { i64, i64 } %800, 0
  store i64 %802, ptr %801, align 4
  %803 = getelementptr inbounds { i64, i64 }, ptr %92, i32 0, i32 1
  %804 = extractvalue { i64, i64 } %800, 1
  store i64 %804, ptr %803, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %76, ptr align 4 %92, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %92) #8
  %805 = load i32, ptr %8, align 4, !tbaa !5
  %806 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 0
  %807 = load i64, ptr %806, align 4
  %808 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 1
  %809 = load i64, ptr %808, align 4
  %810 = call ptr @libxsmm_dispatch_meqn(i32 noundef %805, i64 %807, i64 %809)
  store ptr %810, ptr %14, align 8, !tbaa !9
  %811 = load ptr, ptr %14, align 8, !tbaa !9
  %812 = call i32 @libxsmm_get_kernel_info(ptr noundef %811, ptr noundef @info)
  %813 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %813, ptr @is_reference_kernel, align 4, !tbaa !5
  %814 = load ptr, ptr %14, align 8, !tbaa !9
  %815 = icmp eq ptr %814, null
  br i1 %815, label %816, label %819

816:                                              ; preds = %685
  %817 = load ptr, ptr @stderr, align 8, !tbaa !9
  %818 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %817, ptr noundef @.str.7) #8
  call void @exit(i32 noundef -1) #10
  unreachable

819:                                              ; preds = %685
  %820 = load i32, ptr %69, align 4, !tbaa !5
  %821 = icmp eq i32 %820, 0
  br i1 %821, label %822, label %850

822:                                              ; preds = %819
  %823 = load i32, ptr %65, align 4, !tbaa !5
  %824 = sext i32 %823 to i64
  %825 = load i32, ptr %66, align 4, !tbaa !5
  %826 = sext i32 %825 to i64
  %827 = load i32, ptr %67, align 4, !tbaa !5
  %828 = sext i32 %827 to i64
  %829 = load ptr, ptr %39, align 8, !tbaa !9
  %830 = load ptr, ptr %50, align 8, !tbaa !9
  %831 = load ptr, ptr %51, align 8, !tbaa !9
  %832 = load ptr, ptr %53, align 8, !tbaa !9
  %833 = load ptr, ptr %54, align 8, !tbaa !9
  %834 = load ptr, ptr %40, align 8, !tbaa !9
  call void @vectorized_layernorm_fwd_fp32(i64 noundef %824, i64 noundef %826, i64 noundef %828, ptr noundef %829, ptr noundef %830, ptr noundef %831, ptr noundef %832, ptr noundef %833, ptr noundef %834, float noundef 0x3E80000000000000)
  %835 = load i32, ptr %65, align 4, !tbaa !5
  %836 = sext i32 %835 to i64
  %837 = load i32, ptr %66, align 4, !tbaa !5
  %838 = sext i32 %837 to i64
  %839 = load i32, ptr %67, align 4, !tbaa !5
  %840 = sext i32 %839 to i64
  %841 = load ptr, ptr %39, align 8, !tbaa !9
  %842 = load ptr, ptr %50, align 8, !tbaa !9
  %843 = load ptr, ptr %51, align 8, !tbaa !9
  %844 = load ptr, ptr %53, align 8, !tbaa !9
  %845 = load ptr, ptr %54, align 8, !tbaa !9
  %846 = load ptr, ptr %49, align 8, !tbaa !9
  %847 = load ptr, ptr %14, align 8, !tbaa !9
  %848 = load ptr, ptr %24, align 8, !tbaa !9
  %849 = load ptr, ptr %25, align 8, !tbaa !9
  call void @tpp_layernorm_fwd_fp32(i64 noundef %836, i64 noundef %838, i64 noundef %840, ptr noundef %841, ptr noundef %842, ptr noundef %843, ptr noundef %844, ptr noundef %845, ptr noundef %846, float noundef 0x3E80000000000000, ptr noundef %847, ptr noundef %848, ptr noundef %849)
  br label %915

850:                                              ; preds = %819
  %851 = load i32, ptr %69, align 4, !tbaa !5
  %852 = icmp eq i32 %851, 1
  br i1 %852, label %853, label %914

853:                                              ; preds = %850
  %854 = load i32, ptr %65, align 4, !tbaa !5
  %855 = sext i32 %854 to i64
  %856 = load i32, ptr %66, align 4, !tbaa !5
  %857 = sext i32 %856 to i64
  %858 = load i32, ptr %67, align 4, !tbaa !5
  %859 = sext i32 %858 to i64
  %860 = load ptr, ptr %55, align 8, !tbaa !9
  %861 = load ptr, ptr %61, align 8, !tbaa !9
  %862 = load ptr, ptr %62, align 8, !tbaa !9
  %863 = load ptr, ptr %53, align 8, !tbaa !9
  %864 = load ptr, ptr %54, align 8, !tbaa !9
  %865 = load ptr, ptr %56, align 8, !tbaa !9
  call void @vectorized_layernorm_fwd_bf16(i64 noundef %855, i64 noundef %857, i64 noundef %859, ptr noundef %860, ptr noundef %861, ptr noundef %862, ptr noundef %863, ptr noundef %864, ptr noundef %865, float noundef 0x3E80000000000000)
  %866 = load i32, ptr %65, align 4, !tbaa !5
  %867 = sext i32 %866 to i64
  %868 = load i32, ptr %66, align 4, !tbaa !5
  %869 = sext i32 %868 to i64
  %870 = load i32, ptr %67, align 4, !tbaa !5
  %871 = sext i32 %870 to i64
  %872 = load ptr, ptr %55, align 8, !tbaa !9
  %873 = load ptr, ptr %61, align 8, !tbaa !9
  %874 = load ptr, ptr %62, align 8, !tbaa !9
  %875 = load ptr, ptr %53, align 8, !tbaa !9
  %876 = load ptr, ptr %54, align 8, !tbaa !9
  %877 = load ptr, ptr %63, align 8, !tbaa !9
  %878 = load ptr, ptr %14, align 8, !tbaa !9
  %879 = load ptr, ptr %24, align 8, !tbaa !9
  %880 = load ptr, ptr %25, align 8, !tbaa !9
  call void @tpp_layernorm_fwd_bf16(i64 noundef %867, i64 noundef %869, i64 noundef %871, ptr noundef %872, ptr noundef %873, ptr noundef %874, ptr noundef %875, ptr noundef %876, ptr noundef %877, float noundef 0x3E80000000000000, ptr noundef %878, ptr noundef %879, ptr noundef %880)
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %881

881:                                              ; preds = %910, %853
  %882 = load i32, ptr %27, align 4, !tbaa !5
  %883 = load i32, ptr %65, align 4, !tbaa !5
  %884 = load i32, ptr %66, align 4, !tbaa !5
  %885 = mul nsw i32 %883, %884
  %886 = load i32, ptr %67, align 4, !tbaa !5
  %887 = mul nsw i32 %885, %886
  %888 = icmp slt i32 %882, %887
  br i1 %888, label %889, label %913

889:                                              ; preds = %881
  %890 = load ptr, ptr %56, align 8, !tbaa !9
  %891 = load i32, ptr %27, align 4, !tbaa !5
  %892 = sext i32 %891 to i64
  %893 = getelementptr inbounds i16, ptr %890, i64 %892
  %894 = load i16, ptr %893, align 2, !tbaa !25
  %895 = call float @upconvert_bf16(i16 noundef zeroext %894)
  %896 = load ptr, ptr %40, align 8, !tbaa !9
  %897 = load i32, ptr %27, align 4, !tbaa !5
  %898 = sext i32 %897 to i64
  %899 = getelementptr inbounds float, ptr %896, i64 %898
  store float %895, ptr %899, align 4, !tbaa !13
  %900 = load ptr, ptr %63, align 8, !tbaa !9
  %901 = load i32, ptr %27, align 4, !tbaa !5
  %902 = sext i32 %901 to i64
  %903 = getelementptr inbounds i16, ptr %900, i64 %902
  %904 = load i16, ptr %903, align 2, !tbaa !25
  %905 = call float @upconvert_bf16(i16 noundef zeroext %904)
  %906 = load ptr, ptr %49, align 8, !tbaa !9
  %907 = load i32, ptr %27, align 4, !tbaa !5
  %908 = sext i32 %907 to i64
  %909 = getelementptr inbounds float, ptr %906, i64 %908
  store float %905, ptr %909, align 4, !tbaa !13
  br label %910

910:                                              ; preds = %889
  %911 = load i32, ptr %27, align 4, !tbaa !5
  %912 = add nsw i32 %911, 1
  store i32 %912, ptr %27, align 4, !tbaa !5
  br label %881, !llvm.loop !27

913:                                              ; preds = %881
  br label %914

914:                                              ; preds = %913, %850
  br label %915

915:                                              ; preds = %914, %822
  %916 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  %917 = load i32, ptr %69, align 4, !tbaa !5
  %918 = icmp eq i32 %917, 0
  br i1 %918, label %919, label %921

919:                                              ; preds = %915
  %920 = call i32 (ptr, ...) @printf(ptr noundef @.str.9)
  br label %923

921:                                              ; preds = %915
  %922 = call i32 (ptr, ...) @printf(ptr noundef @.str.10)
  br label %923

923:                                              ; preds = %921, %919
  %924 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  %925 = load i32, ptr %65, align 4, !tbaa !5
  %926 = load i32, ptr %66, align 4, !tbaa !5
  %927 = mul nsw i32 %925, %926
  %928 = load i32, ptr %67, align 4, !tbaa !5
  %929 = mul nsw i32 %927, %928
  %930 = load ptr, ptr %40, align 8, !tbaa !9
  %931 = load ptr, ptr %49, align 8, !tbaa !9
  %932 = call i32 @libxsmm_matdiff(ptr noundef %38, i32 noundef 1, i32 noundef %929, i32 noundef 1, ptr noundef %930, ptr noundef %931, ptr noundef null, ptr noundef null)
  %933 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 10
  %934 = load double, ptr %933, align 8, !tbaa !28
  %935 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, double noundef %934)
  %936 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 15
  %937 = load double, ptr %936, align 8, !tbaa !30
  %938 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, double noundef %937)
  %939 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 7
  %940 = load double, ptr %939, align 8, !tbaa !31
  %941 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, double noundef %940)
  %942 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 8
  %943 = load double, ptr %942, align 8, !tbaa !32
  %944 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %943)
  %945 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 5
  %946 = load double, ptr %945, align 8, !tbaa !33
  %947 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, double noundef %946)
  %948 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 6
  %949 = load double, ptr %948, align 8, !tbaa !34
  %950 = call i32 (ptr, ...) @printf(ptr noundef @.str.16, double noundef %949)
  %951 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %952 = load double, ptr %951, align 8, !tbaa !35
  %953 = call i32 (ptr, ...) @printf(ptr noundef @.str.17, double noundef %952)
  %954 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %955 = load double, ptr %954, align 8, !tbaa !35
  %956 = load double, ptr %7, align 8, !tbaa !11
  %957 = fcmp ogt double %955, %956
  br i1 %957, label %958, label %959

958:                                              ; preds = %923
  store i32 1, ptr %6, align 4, !tbaa !5
  br label %959

959:                                              ; preds = %958, %923
  %960 = load i32, ptr %68, align 4, !tbaa !5
  %961 = icmp sgt i32 %960, 0
  br i1 %961, label %962, label %1160

962:                                              ; preds = %959
  %963 = load i32, ptr %69, align 4, !tbaa !5
  %964 = icmp eq i32 %963, 0
  br i1 %964, label %965, label %1060

965:                                              ; preds = %962
  %966 = load i32, ptr %65, align 4, !tbaa !5
  %967 = sext i32 %966 to i64
  %968 = load i32, ptr %66, align 4, !tbaa !5
  %969 = sext i32 %968 to i64
  %970 = load i32, ptr %67, align 4, !tbaa !5
  %971 = sext i32 %970 to i64
  %972 = load ptr, ptr %39, align 8, !tbaa !9
  %973 = load ptr, ptr %50, align 8, !tbaa !9
  %974 = load ptr, ptr %51, align 8, !tbaa !9
  %975 = load ptr, ptr %53, align 8, !tbaa !9
  %976 = load ptr, ptr %54, align 8, !tbaa !9
  %977 = load ptr, ptr %40, align 8, !tbaa !9
  call void @vectorized_layernorm_fwd_fp32(i64 noundef %967, i64 noundef %969, i64 noundef %971, ptr noundef %972, ptr noundef %973, ptr noundef %974, ptr noundef %975, ptr noundef %976, ptr noundef %977, float noundef 0x3E80000000000000)
  %978 = call i64 @libxsmm_timer_tick()
  store i64 %978, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %979

979:                                              ; preds = %996, %965
  %980 = load i32, ptr %28, align 4, !tbaa !5
  %981 = load i32, ptr %68, align 4, !tbaa !5
  %982 = icmp slt i32 %980, %981
  br i1 %982, label %983, label %999

983:                                              ; preds = %979
  %984 = load i32, ptr %65, align 4, !tbaa !5
  %985 = sext i32 %984 to i64
  %986 = load i32, ptr %66, align 4, !tbaa !5
  %987 = sext i32 %986 to i64
  %988 = load i32, ptr %67, align 4, !tbaa !5
  %989 = sext i32 %988 to i64
  %990 = load ptr, ptr %39, align 8, !tbaa !9
  %991 = load ptr, ptr %50, align 8, !tbaa !9
  %992 = load ptr, ptr %51, align 8, !tbaa !9
  %993 = load ptr, ptr %53, align 8, !tbaa !9
  %994 = load ptr, ptr %54, align 8, !tbaa !9
  %995 = load ptr, ptr %40, align 8, !tbaa !9
  call void @vectorized_layernorm_fwd_fp32(i64 noundef %985, i64 noundef %987, i64 noundef %989, ptr noundef %990, ptr noundef %991, ptr noundef %992, ptr noundef %993, ptr noundef %994, ptr noundef %995, float noundef 0x3E80000000000000)
  br label %996

996:                                              ; preds = %983
  %997 = load i32, ptr %28, align 4, !tbaa !5
  %998 = add nsw i32 %997, 1
  store i32 %998, ptr %28, align 4, !tbaa !5
  br label %979, !llvm.loop !38

999:                                              ; preds = %979
  %1000 = call i64 @libxsmm_timer_tick()
  store i64 %1000, ptr %33, align 8, !tbaa !36
  %1001 = load i64, ptr %32, align 8, !tbaa !36
  %1002 = load i64, ptr %33, align 8, !tbaa !36
  %1003 = call double @libxsmm_timer_duration(i64 noundef %1001, i64 noundef %1002)
  store double %1003, ptr %34, align 8, !tbaa !11
  %1004 = load double, ptr %34, align 8, !tbaa !11
  %1005 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef %1004)
  %1006 = load i32, ptr %65, align 4, !tbaa !5
  %1007 = sext i32 %1006 to i64
  %1008 = load i32, ptr %66, align 4, !tbaa !5
  %1009 = sext i32 %1008 to i64
  %1010 = load i32, ptr %67, align 4, !tbaa !5
  %1011 = sext i32 %1010 to i64
  %1012 = load ptr, ptr %39, align 8, !tbaa !9
  %1013 = load ptr, ptr %50, align 8, !tbaa !9
  %1014 = load ptr, ptr %51, align 8, !tbaa !9
  %1015 = load ptr, ptr %53, align 8, !tbaa !9
  %1016 = load ptr, ptr %54, align 8, !tbaa !9
  %1017 = load ptr, ptr %49, align 8, !tbaa !9
  %1018 = load ptr, ptr %14, align 8, !tbaa !9
  %1019 = load ptr, ptr %24, align 8, !tbaa !9
  %1020 = load ptr, ptr %25, align 8, !tbaa !9
  call void @tpp_layernorm_fwd_fp32(i64 noundef %1007, i64 noundef %1009, i64 noundef %1011, ptr noundef %1012, ptr noundef %1013, ptr noundef %1014, ptr noundef %1015, ptr noundef %1016, ptr noundef %1017, float noundef 0x3E80000000000000, ptr noundef %1018, ptr noundef %1019, ptr noundef %1020)
  %1021 = call i64 @libxsmm_timer_tick()
  store i64 %1021, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %1022

1022:                                             ; preds = %1042, %999
  %1023 = load i32, ptr %28, align 4, !tbaa !5
  %1024 = load i32, ptr %68, align 4, !tbaa !5
  %1025 = icmp slt i32 %1023, %1024
  br i1 %1025, label %1026, label %1045

1026:                                             ; preds = %1022
  %1027 = load i32, ptr %65, align 4, !tbaa !5
  %1028 = sext i32 %1027 to i64
  %1029 = load i32, ptr %66, align 4, !tbaa !5
  %1030 = sext i32 %1029 to i64
  %1031 = load i32, ptr %67, align 4, !tbaa !5
  %1032 = sext i32 %1031 to i64
  %1033 = load ptr, ptr %39, align 8, !tbaa !9
  %1034 = load ptr, ptr %50, align 8, !tbaa !9
  %1035 = load ptr, ptr %51, align 8, !tbaa !9
  %1036 = load ptr, ptr %53, align 8, !tbaa !9
  %1037 = load ptr, ptr %54, align 8, !tbaa !9
  %1038 = load ptr, ptr %49, align 8, !tbaa !9
  %1039 = load ptr, ptr %14, align 8, !tbaa !9
  %1040 = load ptr, ptr %24, align 8, !tbaa !9
  %1041 = load ptr, ptr %25, align 8, !tbaa !9
  call void @tpp_layernorm_fwd_fp32(i64 noundef %1028, i64 noundef %1030, i64 noundef %1032, ptr noundef %1033, ptr noundef %1034, ptr noundef %1035, ptr noundef %1036, ptr noundef %1037, ptr noundef %1038, float noundef 0x3E80000000000000, ptr noundef %1039, ptr noundef %1040, ptr noundef %1041)
  br label %1042

1042:                                             ; preds = %1026
  %1043 = load i32, ptr %28, align 4, !tbaa !5
  %1044 = add nsw i32 %1043, 1
  store i32 %1044, ptr %28, align 4, !tbaa !5
  br label %1022, !llvm.loop !39

1045:                                             ; preds = %1022
  %1046 = call i64 @libxsmm_timer_tick()
  store i64 %1046, ptr %33, align 8, !tbaa !36
  %1047 = load i64, ptr %32, align 8, !tbaa !36
  %1048 = load i64, ptr %33, align 8, !tbaa !36
  %1049 = call double @libxsmm_timer_duration(i64 noundef %1047, i64 noundef %1048)
  store double %1049, ptr %35, align 8, !tbaa !11
  %1050 = load double, ptr %35, align 8, !tbaa !11
  %1051 = call i32 (ptr, ...) @printf(ptr noundef @.str.19, double noundef %1050)
  %1052 = load double, ptr %35, align 8, !tbaa !11
  %1053 = fcmp olt double 0.000000e+00, %1052
  br i1 %1053, label %1054, label %1059

1054:                                             ; preds = %1045
  %1055 = load double, ptr %34, align 8, !tbaa !11
  %1056 = load double, ptr %35, align 8, !tbaa !11
  %1057 = fdiv double %1055, %1056
  %1058 = call i32 (ptr, ...) @printf(ptr noundef @.str.20, double noundef %1057)
  br label %1059

1059:                                             ; preds = %1054, %1045
  br label %1159

1060:                                             ; preds = %962
  %1061 = load i32, ptr %69, align 4, !tbaa !5
  %1062 = icmp eq i32 %1061, 1
  br i1 %1062, label %1063, label %1158

1063:                                             ; preds = %1060
  %1064 = load i32, ptr %65, align 4, !tbaa !5
  %1065 = sext i32 %1064 to i64
  %1066 = load i32, ptr %66, align 4, !tbaa !5
  %1067 = sext i32 %1066 to i64
  %1068 = load i32, ptr %67, align 4, !tbaa !5
  %1069 = sext i32 %1068 to i64
  %1070 = load ptr, ptr %55, align 8, !tbaa !9
  %1071 = load ptr, ptr %61, align 8, !tbaa !9
  %1072 = load ptr, ptr %62, align 8, !tbaa !9
  %1073 = load ptr, ptr %53, align 8, !tbaa !9
  %1074 = load ptr, ptr %54, align 8, !tbaa !9
  %1075 = load ptr, ptr %56, align 8, !tbaa !9
  call void @vectorized_layernorm_fwd_bf16(i64 noundef %1065, i64 noundef %1067, i64 noundef %1069, ptr noundef %1070, ptr noundef %1071, ptr noundef %1072, ptr noundef %1073, ptr noundef %1074, ptr noundef %1075, float noundef 0x3E80000000000000)
  %1076 = call i64 @libxsmm_timer_tick()
  store i64 %1076, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %1077

1077:                                             ; preds = %1094, %1063
  %1078 = load i32, ptr %28, align 4, !tbaa !5
  %1079 = load i32, ptr %68, align 4, !tbaa !5
  %1080 = icmp slt i32 %1078, %1079
  br i1 %1080, label %1081, label %1097

1081:                                             ; preds = %1077
  %1082 = load i32, ptr %65, align 4, !tbaa !5
  %1083 = sext i32 %1082 to i64
  %1084 = load i32, ptr %66, align 4, !tbaa !5
  %1085 = sext i32 %1084 to i64
  %1086 = load i32, ptr %67, align 4, !tbaa !5
  %1087 = sext i32 %1086 to i64
  %1088 = load ptr, ptr %55, align 8, !tbaa !9
  %1089 = load ptr, ptr %61, align 8, !tbaa !9
  %1090 = load ptr, ptr %62, align 8, !tbaa !9
  %1091 = load ptr, ptr %53, align 8, !tbaa !9
  %1092 = load ptr, ptr %54, align 8, !tbaa !9
  %1093 = load ptr, ptr %56, align 8, !tbaa !9
  call void @vectorized_layernorm_fwd_bf16(i64 noundef %1083, i64 noundef %1085, i64 noundef %1087, ptr noundef %1088, ptr noundef %1089, ptr noundef %1090, ptr noundef %1091, ptr noundef %1092, ptr noundef %1093, float noundef 0x3E80000000000000)
  br label %1094

1094:                                             ; preds = %1081
  %1095 = load i32, ptr %28, align 4, !tbaa !5
  %1096 = add nsw i32 %1095, 1
  store i32 %1096, ptr %28, align 4, !tbaa !5
  br label %1077, !llvm.loop !40

1097:                                             ; preds = %1077
  %1098 = call i64 @libxsmm_timer_tick()
  store i64 %1098, ptr %33, align 8, !tbaa !36
  %1099 = load i64, ptr %32, align 8, !tbaa !36
  %1100 = load i64, ptr %33, align 8, !tbaa !36
  %1101 = call double @libxsmm_timer_duration(i64 noundef %1099, i64 noundef %1100)
  store double %1101, ptr %34, align 8, !tbaa !11
  %1102 = load double, ptr %34, align 8, !tbaa !11
  %1103 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef %1102)
  %1104 = load i32, ptr %65, align 4, !tbaa !5
  %1105 = sext i32 %1104 to i64
  %1106 = load i32, ptr %66, align 4, !tbaa !5
  %1107 = sext i32 %1106 to i64
  %1108 = load i32, ptr %67, align 4, !tbaa !5
  %1109 = sext i32 %1108 to i64
  %1110 = load ptr, ptr %55, align 8, !tbaa !9
  %1111 = load ptr, ptr %61, align 8, !tbaa !9
  %1112 = load ptr, ptr %62, align 8, !tbaa !9
  %1113 = load ptr, ptr %53, align 8, !tbaa !9
  %1114 = load ptr, ptr %54, align 8, !tbaa !9
  %1115 = load ptr, ptr %63, align 8, !tbaa !9
  %1116 = load ptr, ptr %14, align 8, !tbaa !9
  %1117 = load ptr, ptr %24, align 8, !tbaa !9
  %1118 = load ptr, ptr %25, align 8, !tbaa !9
  call void @tpp_layernorm_fwd_bf16(i64 noundef %1105, i64 noundef %1107, i64 noundef %1109, ptr noundef %1110, ptr noundef %1111, ptr noundef %1112, ptr noundef %1113, ptr noundef %1114, ptr noundef %1115, float noundef 0x3E80000000000000, ptr noundef %1116, ptr noundef %1117, ptr noundef %1118)
  %1119 = call i64 @libxsmm_timer_tick()
  store i64 %1119, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %1120

1120:                                             ; preds = %1140, %1097
  %1121 = load i32, ptr %28, align 4, !tbaa !5
  %1122 = load i32, ptr %68, align 4, !tbaa !5
  %1123 = icmp slt i32 %1121, %1122
  br i1 %1123, label %1124, label %1143

1124:                                             ; preds = %1120
  %1125 = load i32, ptr %65, align 4, !tbaa !5
  %1126 = sext i32 %1125 to i64
  %1127 = load i32, ptr %66, align 4, !tbaa !5
  %1128 = sext i32 %1127 to i64
  %1129 = load i32, ptr %67, align 4, !tbaa !5
  %1130 = sext i32 %1129 to i64
  %1131 = load ptr, ptr %55, align 8, !tbaa !9
  %1132 = load ptr, ptr %61, align 8, !tbaa !9
  %1133 = load ptr, ptr %62, align 8, !tbaa !9
  %1134 = load ptr, ptr %53, align 8, !tbaa !9
  %1135 = load ptr, ptr %54, align 8, !tbaa !9
  %1136 = load ptr, ptr %63, align 8, !tbaa !9
  %1137 = load ptr, ptr %14, align 8, !tbaa !9
  %1138 = load ptr, ptr %24, align 8, !tbaa !9
  %1139 = load ptr, ptr %25, align 8, !tbaa !9
  call void @tpp_layernorm_fwd_bf16(i64 noundef %1126, i64 noundef %1128, i64 noundef %1130, ptr noundef %1131, ptr noundef %1132, ptr noundef %1133, ptr noundef %1134, ptr noundef %1135, ptr noundef %1136, float noundef 0x3E80000000000000, ptr noundef %1137, ptr noundef %1138, ptr noundef %1139)
  br label %1140

1140:                                             ; preds = %1124
  %1141 = load i32, ptr %28, align 4, !tbaa !5
  %1142 = add nsw i32 %1141, 1
  store i32 %1142, ptr %28, align 4, !tbaa !5
  br label %1120, !llvm.loop !41

1143:                                             ; preds = %1120
  %1144 = call i64 @libxsmm_timer_tick()
  store i64 %1144, ptr %33, align 8, !tbaa !36
  %1145 = load i64, ptr %32, align 8, !tbaa !36
  %1146 = load i64, ptr %33, align 8, !tbaa !36
  %1147 = call double @libxsmm_timer_duration(i64 noundef %1145, i64 noundef %1146)
  store double %1147, ptr %35, align 8, !tbaa !11
  %1148 = load double, ptr %35, align 8, !tbaa !11
  %1149 = call i32 (ptr, ...) @printf(ptr noundef @.str.19, double noundef %1148)
  %1150 = load double, ptr %35, align 8, !tbaa !11
  %1151 = fcmp olt double 0.000000e+00, %1150
  br i1 %1151, label %1152, label %1157

1152:                                             ; preds = %1143
  %1153 = load double, ptr %34, align 8, !tbaa !11
  %1154 = load double, ptr %35, align 8, !tbaa !11
  %1155 = fdiv double %1153, %1154
  %1156 = call i32 (ptr, ...) @printf(ptr noundef @.str.20, double noundef %1155)
  br label %1157

1157:                                             ; preds = %1152, %1143
  br label %1158

1158:                                             ; preds = %1157, %1060
  br label %1159

1159:                                             ; preds = %1158, %1059
  br label %1160

1160:                                             ; preds = %1159, %959
  br label %1161

1161:                                             ; preds = %1160, %644
  %1162 = load double, ptr %35, align 8, !tbaa !11
  store double %1162, ptr %37, align 8, !tbaa !11
  %1163 = load double, ptr %34, align 8, !tbaa !11
  store double %1163, ptr %36, align 8, !tbaa !11
  %1164 = load i32, ptr %70, align 4, !tbaa !5
  %1165 = and i32 %1164, 2
  %1166 = icmp sgt i32 %1165, 0
  br i1 %1166, label %1167, label %2155

1167:                                             ; preds = %1161
  %1168 = load i32, ptr %67, align 4, !tbaa !5
  store i32 %1168, ptr %30, align 4, !tbaa !5
  %1169 = load i32, ptr %66, align 4, !tbaa !5
  %1170 = load i32, ptr %67, align 4, !tbaa !5
  %1171 = mul nsw i32 %1169, %1170
  store i32 %1171, ptr %29, align 4, !tbaa !5
  store i32 1, ptr %31, align 4, !tbaa !5
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %1172

1172:                                             ; preds = %1189, %1167
  %1173 = load i32, ptr %27, align 4, !tbaa !5
  %1174 = load i32, ptr %66, align 4, !tbaa !5
  %1175 = icmp slt i32 %1173, %1174
  br i1 %1175, label %1176, label %1192

1176:                                             ; preds = %1172
  %1177 = call double @libxsmm_rng_f64()
  %1178 = fptrunc double %1177 to float
  %1179 = load ptr, ptr %53, align 8, !tbaa !9
  %1180 = load i32, ptr %27, align 4, !tbaa !5
  %1181 = sext i32 %1180 to i64
  %1182 = getelementptr inbounds float, ptr %1179, i64 %1181
  store float %1178, ptr %1182, align 4, !tbaa !13
  %1183 = call double @libxsmm_rng_f64()
  %1184 = fptrunc double %1183 to float
  %1185 = load ptr, ptr %54, align 8, !tbaa !9
  %1186 = load i32, ptr %27, align 4, !tbaa !5
  %1187 = sext i32 %1186 to i64
  %1188 = getelementptr inbounds float, ptr %1185, i64 %1187
  store float %1184, ptr %1188, align 4, !tbaa !13
  br label %1189

1189:                                             ; preds = %1176
  %1190 = load i32, ptr %27, align 4, !tbaa !5
  %1191 = add nsw i32 %1190, 1
  store i32 %1191, ptr %27, align 4, !tbaa !5
  br label %1172, !llvm.loop !42

1192:                                             ; preds = %1172
  %1193 = call i32 @libxsmm_meqn_create()
  store i32 %1193, ptr %9, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %93) #8
  %1194 = load i32, ptr %9, align 4, !tbaa !5
  %1195 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %1194, i32 noundef -1)
  store i64 %1195, ptr %93, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %74, ptr align 4 %93, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %93) #8
  %1196 = load i64, ptr %74, align 4
  %1197 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %1196, i32 noundef 1, i32 noundef 1, i32 noundef 512)
  %1198 = load i64, ptr %74, align 4
  %1199 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %1198, i32 noundef 1, i32 noundef 1, i32 noundef 896)
  call void @llvm.lifetime.start.p0(i64 16, ptr %94) #8
  %1200 = load i32, ptr %67, align 4, !tbaa !5
  %1201 = load i32, ptr %65, align 4, !tbaa !5
  %1202 = load i32, ptr %29, align 4, !tbaa !5
  %1203 = load i32, ptr %71, align 4, !tbaa !5
  %1204 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1200, i32 noundef %1201, i32 noundef %1202, i32 noundef %1203)
  %1205 = getelementptr inbounds { i64, i64 }, ptr %94, i32 0, i32 0
  %1206 = extractvalue { i64, i64 } %1204, 0
  store i64 %1206, ptr %1205, align 4
  %1207 = getelementptr inbounds { i64, i64 }, ptr %94, i32 0, i32 1
  %1208 = extractvalue { i64, i64 } %1204, 1
  store i64 %1208, ptr %1207, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %94, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %94) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %95) #8
  %1209 = load i32, ptr %9, align 4, !tbaa !5
  %1210 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1209, i32 noundef 0)
  store i64 %1210, ptr %95, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %95, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %95) #8
  %1211 = load i64, ptr %73, align 4
  %1212 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1213 = load i64, ptr %1212, align 4
  %1214 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1215 = load i64, ptr %1214, align 4
  %1216 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1217 = load i64, ptr %1216, align 4
  %1218 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1219 = load i64, ptr %1218, align 4
  %1220 = call i32 @libxsmm_meqn_push_back_arg(i64 %1211, i64 %1213, i64 %1215, i64 %1217, i64 %1219)
  call void @llvm.lifetime.start.p0(i64 16, ptr %96) #8
  %1221 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1)
  %1222 = getelementptr inbounds { i64, i64 }, ptr %96, i32 0, i32 0
  %1223 = extractvalue { i64, i64 } %1221, 0
  store i64 %1223, ptr %1222, align 4
  %1224 = getelementptr inbounds { i64, i64 }, ptr %96, i32 0, i32 1
  %1225 = extractvalue { i64, i64 } %1221, 1
  store i64 %1225, ptr %1224, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %96, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %96) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %97) #8
  %1226 = load i32, ptr %9, align 4, !tbaa !5
  %1227 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1226, i32 noundef 1)
  store i64 %1227, ptr %97, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %97, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %97) #8
  %1228 = load i64, ptr %73, align 4
  %1229 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1230 = load i64, ptr %1229, align 4
  %1231 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1232 = load i64, ptr %1231, align 4
  %1233 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1234 = load i64, ptr %1233, align 4
  %1235 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1236 = load i64, ptr %1235, align 4
  %1237 = call i32 @libxsmm_meqn_push_back_arg(i64 %1228, i64 %1230, i64 %1232, i64 %1234, i64 %1236)
  call void @llvm.lifetime.start.p0(i64 16, ptr %98) #8
  %1238 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1)
  %1239 = getelementptr inbounds { i64, i64 }, ptr %98, i32 0, i32 0
  %1240 = extractvalue { i64, i64 } %1238, 0
  store i64 %1240, ptr %1239, align 4
  %1241 = getelementptr inbounds { i64, i64 }, ptr %98, i32 0, i32 1
  %1242 = extractvalue { i64, i64 } %1238, 1
  store i64 %1242, ptr %1241, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %98, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %98) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %99) #8
  %1243 = load i32, ptr %9, align 4, !tbaa !5
  %1244 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1243, i32 noundef 2)
  store i64 %1244, ptr %99, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %99, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %99) #8
  %1245 = load i64, ptr %73, align 4
  %1246 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1247 = load i64, ptr %1246, align 4
  %1248 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1249 = load i64, ptr %1248, align 4
  %1250 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1251 = load i64, ptr %1250, align 4
  %1252 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1253 = load i64, ptr %1252, align 4
  %1254 = call i32 @libxsmm_meqn_push_back_arg(i64 %1245, i64 %1247, i64 %1249, i64 %1251, i64 %1253)
  call void @llvm.lifetime.start.p0(i64 16, ptr %100) #8
  %1255 = load i32, ptr %67, align 4, !tbaa !5
  %1256 = load i32, ptr %65, align 4, !tbaa !5
  %1257 = load i32, ptr %29, align 4, !tbaa !5
  %1258 = load i32, ptr %71, align 4, !tbaa !5
  %1259 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1255, i32 noundef %1256, i32 noundef %1257, i32 noundef %1258)
  %1260 = getelementptr inbounds { i64, i64 }, ptr %100, i32 0, i32 0
  %1261 = extractvalue { i64, i64 } %1259, 0
  store i64 %1261, ptr %1260, align 4
  %1262 = getelementptr inbounds { i64, i64 }, ptr %100, i32 0, i32 1
  %1263 = extractvalue { i64, i64 } %1259, 1
  store i64 %1263, ptr %1262, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %100, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %100) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %101) #8
  %1264 = load i32, ptr %9, align 4, !tbaa !5
  %1265 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1264, i32 noundef 3)
  store i64 %1265, ptr %101, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %101, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %101) #8
  %1266 = load i64, ptr %73, align 4
  %1267 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1268 = load i64, ptr %1267, align 4
  %1269 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1270 = load i64, ptr %1269, align 4
  %1271 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1272 = load i64, ptr %1271, align 4
  %1273 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1274 = load i64, ptr %1273, align 4
  %1275 = call i32 @libxsmm_meqn_push_back_arg(i64 %1266, i64 %1268, i64 %1270, i64 %1272, i64 %1274)
  call void @llvm.lifetime.start.p0(i64 16, ptr %102) #8
  %1276 = load i32, ptr %67, align 4, !tbaa !5
  %1277 = load i32, ptr %65, align 4, !tbaa !5
  %1278 = load i32, ptr %30, align 4, !tbaa !5
  %1279 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1276, i32 noundef %1277, i32 noundef %1278, i32 noundef 1)
  %1280 = getelementptr inbounds { i64, i64 }, ptr %102, i32 0, i32 0
  %1281 = extractvalue { i64, i64 } %1279, 0
  store i64 %1281, ptr %1280, align 4
  %1282 = getelementptr inbounds { i64, i64 }, ptr %102, i32 0, i32 1
  %1283 = extractvalue { i64, i64 } %1279, 1
  store i64 %1283, ptr %1282, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %102, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %102) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %103) #8
  %1284 = load i32, ptr %9, align 4, !tbaa !5
  %1285 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1284, i32 noundef 4)
  store i64 %1285, ptr %103, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %103, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %103) #8
  %1286 = load i64, ptr %73, align 4
  %1287 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1288 = load i64, ptr %1287, align 4
  %1289 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1290 = load i64, ptr %1289, align 4
  %1291 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1292 = load i64, ptr %1291, align 4
  %1293 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1294 = load i64, ptr %1293, align 4
  %1295 = call i32 @libxsmm_meqn_push_back_arg(i64 %1286, i64 %1288, i64 %1290, i64 %1292, i64 %1294)
  call void @llvm.lifetime.start.p0(i64 16, ptr %104) #8
  %1296 = load i32, ptr %67, align 4, !tbaa !5
  %1297 = load i32, ptr %65, align 4, !tbaa !5
  %1298 = load i32, ptr %30, align 4, !tbaa !5
  %1299 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1296, i32 noundef %1297, i32 noundef %1298, i32 noundef 1)
  %1300 = getelementptr inbounds { i64, i64 }, ptr %104, i32 0, i32 0
  %1301 = extractvalue { i64, i64 } %1299, 0
  store i64 %1301, ptr %1300, align 4
  %1302 = getelementptr inbounds { i64, i64 }, ptr %104, i32 0, i32 1
  %1303 = extractvalue { i64, i64 } %1299, 1
  store i64 %1303, ptr %1302, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %76, ptr align 4 %104, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %104) #8
  %1304 = load i32, ptr %9, align 4, !tbaa !5
  %1305 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 0
  %1306 = load i64, ptr %1305, align 4
  %1307 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 1
  %1308 = load i64, ptr %1307, align 4
  %1309 = call ptr @libxsmm_dispatch_meqn(i32 noundef %1304, i64 %1306, i64 %1308)
  store ptr %1309, ptr %15, align 8, !tbaa !9
  %1310 = load ptr, ptr %15, align 8, !tbaa !9
  %1311 = call i32 @libxsmm_get_kernel_info(ptr noundef %1310, ptr noundef @info)
  %1312 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %1312, ptr @is_reference_kernel, align 4, !tbaa !5
  %1313 = load ptr, ptr %15, align 8, !tbaa !9
  %1314 = icmp eq ptr %1313, null
  br i1 %1314, label %1315, label %1318

1315:                                             ; preds = %1192
  %1316 = load ptr, ptr @stderr, align 8, !tbaa !9
  %1317 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1316, ptr noundef @.str.21) #8
  call void @exit(i32 noundef -1) #10
  unreachable

1318:                                             ; preds = %1192
  %1319 = call i32 @libxsmm_meqn_create()
  store i32 %1319, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %105) #8
  %1320 = load i32, ptr %10, align 4, !tbaa !5
  %1321 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %1320, i32 noundef -1)
  store i64 %1321, ptr %105, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %74, ptr align 4 %105, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %105) #8
  %1322 = load i64, ptr %74, align 4
  %1323 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %1322, i32 noundef 1, i32 noundef 1, i32 noundef 0)
  call void @llvm.lifetime.start.p0(i64 16, ptr %106) #8
  %1324 = load i32, ptr %67, align 4, !tbaa !5
  %1325 = load i32, ptr %65, align 4, !tbaa !5
  %1326 = load i32, ptr %29, align 4, !tbaa !5
  %1327 = load i32, ptr %71, align 4, !tbaa !5
  %1328 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1324, i32 noundef %1325, i32 noundef %1326, i32 noundef %1327)
  %1329 = getelementptr inbounds { i64, i64 }, ptr %106, i32 0, i32 0
  %1330 = extractvalue { i64, i64 } %1328, 0
  store i64 %1330, ptr %1329, align 4
  %1331 = getelementptr inbounds { i64, i64 }, ptr %106, i32 0, i32 1
  %1332 = extractvalue { i64, i64 } %1328, 1
  store i64 %1332, ptr %1331, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %106, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %106) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %107) #8
  %1333 = load i32, ptr %10, align 4, !tbaa !5
  %1334 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1333, i32 noundef 3)
  store i64 %1334, ptr %107, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %107, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %107) #8
  %1335 = load i64, ptr %73, align 4
  %1336 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1337 = load i64, ptr %1336, align 4
  %1338 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1339 = load i64, ptr %1338, align 4
  %1340 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1341 = load i64, ptr %1340, align 4
  %1342 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1343 = load i64, ptr %1342, align 4
  %1344 = call i32 @libxsmm_meqn_push_back_arg(i64 %1335, i64 %1337, i64 %1339, i64 %1341, i64 %1343)
  call void @llvm.lifetime.start.p0(i64 16, ptr %108) #8
  %1345 = load i32, ptr %67, align 4, !tbaa !5
  %1346 = load i32, ptr %65, align 4, !tbaa !5
  %1347 = load i32, ptr %30, align 4, !tbaa !5
  %1348 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1345, i32 noundef %1346, i32 noundef %1347, i32 noundef 1)
  %1349 = getelementptr inbounds { i64, i64 }, ptr %108, i32 0, i32 0
  %1350 = extractvalue { i64, i64 } %1348, 0
  store i64 %1350, ptr %1349, align 4
  %1351 = getelementptr inbounds { i64, i64 }, ptr %108, i32 0, i32 1
  %1352 = extractvalue { i64, i64 } %1348, 1
  store i64 %1352, ptr %1351, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %108, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %108) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %109) #8
  %1353 = load i32, ptr %10, align 4, !tbaa !5
  %1354 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1353, i32 noundef 5)
  store i64 %1354, ptr %109, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %109, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %109) #8
  %1355 = load i64, ptr %73, align 4
  %1356 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1357 = load i64, ptr %1356, align 4
  %1358 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1359 = load i64, ptr %1358, align 4
  %1360 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1361 = load i64, ptr %1360, align 4
  %1362 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1363 = load i64, ptr %1362, align 4
  %1364 = call i32 @libxsmm_meqn_push_back_arg(i64 %1355, i64 %1357, i64 %1359, i64 %1361, i64 %1363)
  call void @llvm.lifetime.start.p0(i64 16, ptr %110) #8
  %1365 = load i32, ptr %67, align 4, !tbaa !5
  %1366 = load i32, ptr %65, align 4, !tbaa !5
  %1367 = load i32, ptr %30, align 4, !tbaa !5
  %1368 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1365, i32 noundef %1366, i32 noundef %1367, i32 noundef 1)
  %1369 = getelementptr inbounds { i64, i64 }, ptr %110, i32 0, i32 0
  %1370 = extractvalue { i64, i64 } %1368, 0
  store i64 %1370, ptr %1369, align 4
  %1371 = getelementptr inbounds { i64, i64 }, ptr %110, i32 0, i32 1
  %1372 = extractvalue { i64, i64 } %1368, 1
  store i64 %1372, ptr %1371, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %76, ptr align 4 %110, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %110) #8
  %1373 = load i32, ptr %10, align 4, !tbaa !5
  %1374 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 0
  %1375 = load i64, ptr %1374, align 4
  %1376 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 1
  %1377 = load i64, ptr %1376, align 4
  %1378 = call ptr @libxsmm_dispatch_meqn(i32 noundef %1373, i64 %1375, i64 %1377)
  store ptr %1378, ptr %16, align 8, !tbaa !9
  %1379 = load ptr, ptr %16, align 8, !tbaa !9
  %1380 = call i32 @libxsmm_get_kernel_info(ptr noundef %1379, ptr noundef @info)
  %1381 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %1381, ptr @is_reference_kernel, align 4, !tbaa !5
  %1382 = load ptr, ptr %16, align 8, !tbaa !9
  %1383 = icmp eq ptr %1382, null
  br i1 %1383, label %1384, label %1387

1384:                                             ; preds = %1318
  %1385 = load ptr, ptr @stderr, align 8, !tbaa !9
  %1386 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1385, ptr noundef @.str.22) #8
  call void @exit(i32 noundef -1) #10
  unreachable

1387:                                             ; preds = %1318
  %1388 = call i32 @libxsmm_meqn_create()
  store i32 %1388, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %111) #8
  %1389 = load i32, ptr %11, align 4, !tbaa !5
  %1390 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %1389, i32 noundef -1)
  store i64 %1390, ptr %111, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %74, ptr align 4 %111, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %111) #8
  %1391 = load i64, ptr %74, align 4
  %1392 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %1391, i32 noundef 7, i32 noundef 1, i32 noundef 0)
  call void @llvm.lifetime.start.p0(i64 16, ptr %112) #8
  %1393 = load i32, ptr %67, align 4, !tbaa !5
  %1394 = load i32, ptr %65, align 4, !tbaa !5
  %1395 = load i32, ptr %29, align 4, !tbaa !5
  %1396 = load i32, ptr %71, align 4, !tbaa !5
  %1397 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1393, i32 noundef %1394, i32 noundef %1395, i32 noundef %1396)
  %1398 = getelementptr inbounds { i64, i64 }, ptr %112, i32 0, i32 0
  %1399 = extractvalue { i64, i64 } %1397, 0
  store i64 %1399, ptr %1398, align 4
  %1400 = getelementptr inbounds { i64, i64 }, ptr %112, i32 0, i32 1
  %1401 = extractvalue { i64, i64 } %1397, 1
  store i64 %1401, ptr %1400, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %112, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %112) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %113) #8
  %1402 = load i32, ptr %11, align 4, !tbaa !5
  %1403 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1402, i32 noundef 3)
  store i64 %1403, ptr %113, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %113, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %113) #8
  %1404 = load i64, ptr %73, align 4
  %1405 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1406 = load i64, ptr %1405, align 4
  %1407 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1408 = load i64, ptr %1407, align 4
  %1409 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1410 = load i64, ptr %1409, align 4
  %1411 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1412 = load i64, ptr %1411, align 4
  %1413 = call i32 @libxsmm_meqn_push_back_arg(i64 %1404, i64 %1406, i64 %1408, i64 %1410, i64 %1412)
  call void @llvm.lifetime.start.p0(i64 16, ptr %114) #8
  %1414 = load i32, ptr %67, align 4, !tbaa !5
  %1415 = load i32, ptr %65, align 4, !tbaa !5
  %1416 = load i32, ptr %30, align 4, !tbaa !5
  %1417 = load i32, ptr %71, align 4, !tbaa !5
  %1418 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1414, i32 noundef %1415, i32 noundef %1416, i32 noundef %1417)
  %1419 = getelementptr inbounds { i64, i64 }, ptr %114, i32 0, i32 0
  %1420 = extractvalue { i64, i64 } %1418, 0
  store i64 %1420, ptr %1419, align 4
  %1421 = getelementptr inbounds { i64, i64 }, ptr %114, i32 0, i32 1
  %1422 = extractvalue { i64, i64 } %1418, 1
  store i64 %1422, ptr %1421, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %114, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %114) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %115) #8
  %1423 = load i32, ptr %11, align 4, !tbaa !5
  %1424 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1423, i32 noundef 6)
  store i64 %1424, ptr %115, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %115, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %115) #8
  %1425 = load i64, ptr %73, align 4
  %1426 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1427 = load i64, ptr %1426, align 4
  %1428 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1429 = load i64, ptr %1428, align 4
  %1430 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1431 = load i64, ptr %1430, align 4
  %1432 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1433 = load i64, ptr %1432, align 4
  %1434 = call i32 @libxsmm_meqn_push_back_arg(i64 %1425, i64 %1427, i64 %1429, i64 %1431, i64 %1433)
  call void @llvm.lifetime.start.p0(i64 16, ptr %116) #8
  %1435 = load i32, ptr %31, align 4, !tbaa !5
  %1436 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef %1435, i32 noundef 1)
  %1437 = getelementptr inbounds { i64, i64 }, ptr %116, i32 0, i32 0
  %1438 = extractvalue { i64, i64 } %1436, 0
  store i64 %1438, ptr %1437, align 4
  %1439 = getelementptr inbounds { i64, i64 }, ptr %116, i32 0, i32 1
  %1440 = extractvalue { i64, i64 } %1436, 1
  store i64 %1440, ptr %1439, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %76, ptr align 4 %116, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %116) #8
  %1441 = load i32, ptr %11, align 4, !tbaa !5
  %1442 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 0
  %1443 = load i64, ptr %1442, align 4
  %1444 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 1
  %1445 = load i64, ptr %1444, align 4
  %1446 = call ptr @libxsmm_dispatch_meqn(i32 noundef %1441, i64 %1443, i64 %1445)
  store ptr %1446, ptr %17, align 8, !tbaa !9
  %1447 = load ptr, ptr %17, align 8, !tbaa !9
  %1448 = call i32 @libxsmm_get_kernel_info(ptr noundef %1447, ptr noundef @info)
  %1449 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %1449, ptr @is_reference_kernel, align 4, !tbaa !5
  %1450 = load ptr, ptr %17, align 8, !tbaa !9
  %1451 = icmp eq ptr %1450, null
  br i1 %1451, label %1452, label %1455

1452:                                             ; preds = %1387
  %1453 = load ptr, ptr @stderr, align 8, !tbaa !9
  %1454 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1453, ptr noundef @.str.23) #8
  call void @exit(i32 noundef -1) #10
  unreachable

1455:                                             ; preds = %1387
  %1456 = call i32 @libxsmm_meqn_create()
  store i32 %1456, ptr %12, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %117) #8
  %1457 = load i32, ptr %12, align 4, !tbaa !5
  %1458 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %1457, i32 noundef -1)
  store i64 %1458, ptr %117, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %74, ptr align 4 %117, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %117) #8
  %1459 = load i64, ptr %74, align 4
  %1460 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %1459, i32 noundef 7, i32 noundef 1, i32 noundef 0)
  %1461 = load i64, ptr %74, align 4
  %1462 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %1461, i32 noundef 2, i32 noundef 1, i32 noundef 0)
  call void @llvm.lifetime.start.p0(i64 16, ptr %118) #8
  %1463 = load i32, ptr %67, align 4, !tbaa !5
  %1464 = load i32, ptr %65, align 4, !tbaa !5
  %1465 = load i32, ptr %29, align 4, !tbaa !5
  %1466 = load i32, ptr %71, align 4, !tbaa !5
  %1467 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1463, i32 noundef %1464, i32 noundef %1465, i32 noundef %1466)
  %1468 = getelementptr inbounds { i64, i64 }, ptr %118, i32 0, i32 0
  %1469 = extractvalue { i64, i64 } %1467, 0
  store i64 %1469, ptr %1468, align 4
  %1470 = getelementptr inbounds { i64, i64 }, ptr %118, i32 0, i32 1
  %1471 = extractvalue { i64, i64 } %1467, 1
  store i64 %1471, ptr %1470, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %118, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %118) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %119) #8
  %1472 = load i32, ptr %12, align 4, !tbaa !5
  %1473 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1472, i32 noundef 3)
  store i64 %1473, ptr %119, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %119, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %119) #8
  %1474 = load i64, ptr %73, align 4
  %1475 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1476 = load i64, ptr %1475, align 4
  %1477 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1478 = load i64, ptr %1477, align 4
  %1479 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1480 = load i64, ptr %1479, align 4
  %1481 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1482 = load i64, ptr %1481, align 4
  %1483 = call i32 @libxsmm_meqn_push_back_arg(i64 %1474, i64 %1476, i64 %1478, i64 %1480, i64 %1482)
  call void @llvm.lifetime.start.p0(i64 16, ptr %120) #8
  %1484 = load i32, ptr %67, align 4, !tbaa !5
  %1485 = load i32, ptr %65, align 4, !tbaa !5
  %1486 = load i32, ptr %30, align 4, !tbaa !5
  %1487 = load i32, ptr %71, align 4, !tbaa !5
  %1488 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1484, i32 noundef %1485, i32 noundef %1486, i32 noundef %1487)
  %1489 = getelementptr inbounds { i64, i64 }, ptr %120, i32 0, i32 0
  %1490 = extractvalue { i64, i64 } %1488, 0
  store i64 %1490, ptr %1489, align 4
  %1491 = getelementptr inbounds { i64, i64 }, ptr %120, i32 0, i32 1
  %1492 = extractvalue { i64, i64 } %1488, 1
  store i64 %1492, ptr %1491, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %120, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %120) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %121) #8
  %1493 = load i32, ptr %12, align 4, !tbaa !5
  %1494 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1493, i32 noundef 6)
  store i64 %1494, ptr %121, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %121, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %121) #8
  %1495 = load i64, ptr %73, align 4
  %1496 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1497 = load i64, ptr %1496, align 4
  %1498 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1499 = load i64, ptr %1498, align 4
  %1500 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1501 = load i64, ptr %1500, align 4
  %1502 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1503 = load i64, ptr %1502, align 4
  %1504 = call i32 @libxsmm_meqn_push_back_arg(i64 %1495, i64 %1497, i64 %1499, i64 %1501, i64 %1503)
  call void @llvm.lifetime.start.p0(i64 16, ptr %122) #8
  %1505 = load i32, ptr %67, align 4, !tbaa !5
  %1506 = load i32, ptr %65, align 4, !tbaa !5
  %1507 = load i32, ptr %29, align 4, !tbaa !5
  %1508 = load i32, ptr %71, align 4, !tbaa !5
  %1509 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1505, i32 noundef %1506, i32 noundef %1507, i32 noundef %1508)
  %1510 = getelementptr inbounds { i64, i64 }, ptr %122, i32 0, i32 0
  %1511 = extractvalue { i64, i64 } %1509, 0
  store i64 %1511, ptr %1510, align 4
  %1512 = getelementptr inbounds { i64, i64 }, ptr %122, i32 0, i32 1
  %1513 = extractvalue { i64, i64 } %1509, 1
  store i64 %1513, ptr %1512, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %122, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %122) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %123) #8
  %1514 = load i32, ptr %12, align 4, !tbaa !5
  %1515 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1514, i32 noundef 0)
  store i64 %1515, ptr %123, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %123, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %123) #8
  %1516 = load i64, ptr %73, align 4
  %1517 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1518 = load i64, ptr %1517, align 4
  %1519 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1520 = load i64, ptr %1519, align 4
  %1521 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1522 = load i64, ptr %1521, align 4
  %1523 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1524 = load i64, ptr %1523, align 4
  %1525 = call i32 @libxsmm_meqn_push_back_arg(i64 %1516, i64 %1518, i64 %1520, i64 %1522, i64 %1524)
  call void @llvm.lifetime.start.p0(i64 16, ptr %124) #8
  %1526 = load i32, ptr %31, align 4, !tbaa !5
  %1527 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef %1526, i32 noundef 1)
  %1528 = getelementptr inbounds { i64, i64 }, ptr %124, i32 0, i32 0
  %1529 = extractvalue { i64, i64 } %1527, 0
  store i64 %1529, ptr %1528, align 4
  %1530 = getelementptr inbounds { i64, i64 }, ptr %124, i32 0, i32 1
  %1531 = extractvalue { i64, i64 } %1527, 1
  store i64 %1531, ptr %1530, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %76, ptr align 4 %124, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %124) #8
  %1532 = load i32, ptr %12, align 4, !tbaa !5
  %1533 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 0
  %1534 = load i64, ptr %1533, align 4
  %1535 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 1
  %1536 = load i64, ptr %1535, align 4
  %1537 = call ptr @libxsmm_dispatch_meqn(i32 noundef %1532, i64 %1534, i64 %1536)
  store ptr %1537, ptr %18, align 8, !tbaa !9
  %1538 = load ptr, ptr %18, align 8, !tbaa !9
  %1539 = call i32 @libxsmm_get_kernel_info(ptr noundef %1538, ptr noundef @info)
  %1540 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %1540, ptr @is_reference_kernel, align 4, !tbaa !5
  %1541 = load ptr, ptr %18, align 8, !tbaa !9
  %1542 = icmp eq ptr %1541, null
  br i1 %1542, label %1543, label %1546

1543:                                             ; preds = %1455
  %1544 = load ptr, ptr @stderr, align 8, !tbaa !9
  %1545 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1544, ptr noundef @.str.24) #8
  call void @exit(i32 noundef -1) #10
  unreachable

1546:                                             ; preds = %1455
  %1547 = call i32 @libxsmm_meqn_create()
  store i32 %1547, ptr %13, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %125) #8
  %1548 = load i32, ptr %13, align 4, !tbaa !5
  %1549 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %1548, i32 noundef -1)
  store i64 %1549, ptr %125, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %74, ptr align 4 %125, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %125) #8
  %1550 = load i64, ptr %74, align 4
  %1551 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %1550, i32 noundef 1, i32 noundef 1, i32 noundef 512)
  %1552 = load i64, ptr %74, align 4
  %1553 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %1552, i32 noundef 2, i32 noundef 1, i32 noundef 32)
  call void @llvm.lifetime.start.p0(i64 16, ptr %126) #8
  %1554 = load i32, ptr %67, align 4, !tbaa !5
  %1555 = load i32, ptr %65, align 4, !tbaa !5
  %1556 = load i32, ptr %30, align 4, !tbaa !5
  %1557 = load i32, ptr %71, align 4, !tbaa !5
  %1558 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1554, i32 noundef %1555, i32 noundef %1556, i32 noundef %1557)
  %1559 = getelementptr inbounds { i64, i64 }, ptr %126, i32 0, i32 0
  %1560 = extractvalue { i64, i64 } %1558, 0
  store i64 %1560, ptr %1559, align 4
  %1561 = getelementptr inbounds { i64, i64 }, ptr %126, i32 0, i32 1
  %1562 = extractvalue { i64, i64 } %1558, 1
  store i64 %1562, ptr %1561, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %126, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %126) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %127) #8
  %1563 = load i32, ptr %13, align 4, !tbaa !5
  %1564 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1563, i32 noundef 6)
  store i64 %1564, ptr %127, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %127, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %127) #8
  %1565 = load i64, ptr %73, align 4
  %1566 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1567 = load i64, ptr %1566, align 4
  %1568 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1569 = load i64, ptr %1568, align 4
  %1570 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1571 = load i64, ptr %1570, align 4
  %1572 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1573 = load i64, ptr %1572, align 4
  %1574 = call i32 @libxsmm_meqn_push_back_arg(i64 %1565, i64 %1567, i64 %1569, i64 %1571, i64 %1573)
  call void @llvm.lifetime.start.p0(i64 16, ptr %128) #8
  %1575 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1)
  %1576 = getelementptr inbounds { i64, i64 }, ptr %128, i32 0, i32 0
  %1577 = extractvalue { i64, i64 } %1575, 0
  store i64 %1577, ptr %1576, align 4
  %1578 = getelementptr inbounds { i64, i64 }, ptr %128, i32 0, i32 1
  %1579 = extractvalue { i64, i64 } %1575, 1
  store i64 %1579, ptr %1578, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %128, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %128) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %129) #8
  %1580 = load i32, ptr %13, align 4, !tbaa !5
  %1581 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1580, i32 noundef 1)
  store i64 %1581, ptr %129, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %129, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %129) #8
  %1582 = load i64, ptr %73, align 4
  %1583 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1584 = load i64, ptr %1583, align 4
  %1585 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1586 = load i64, ptr %1585, align 4
  %1587 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1588 = load i64, ptr %1587, align 4
  %1589 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1590 = load i64, ptr %1589, align 4
  %1591 = call i32 @libxsmm_meqn_push_back_arg(i64 %1582, i64 %1584, i64 %1586, i64 %1588, i64 %1590)
  call void @llvm.lifetime.start.p0(i64 16, ptr %130) #8
  %1592 = load i32, ptr %67, align 4, !tbaa !5
  %1593 = load i32, ptr %65, align 4, !tbaa !5
  %1594 = load i32, ptr %29, align 4, !tbaa !5
  %1595 = load i32, ptr %71, align 4, !tbaa !5
  %1596 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1592, i32 noundef %1593, i32 noundef %1594, i32 noundef %1595)
  %1597 = getelementptr inbounds { i64, i64 }, ptr %130, i32 0, i32 0
  %1598 = extractvalue { i64, i64 } %1596, 0
  store i64 %1598, ptr %1597, align 4
  %1599 = getelementptr inbounds { i64, i64 }, ptr %130, i32 0, i32 1
  %1600 = extractvalue { i64, i64 } %1596, 1
  store i64 %1600, ptr %1599, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %130, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %130) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %131) #8
  %1601 = load i32, ptr %13, align 4, !tbaa !5
  %1602 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1601, i32 noundef 3)
  store i64 %1602, ptr %131, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %131, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %131) #8
  %1603 = load i64, ptr %73, align 4
  %1604 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1605 = load i64, ptr %1604, align 4
  %1606 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1607 = load i64, ptr %1606, align 4
  %1608 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1609 = load i64, ptr %1608, align 4
  %1610 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1611 = load i64, ptr %1610, align 4
  %1612 = call i32 @libxsmm_meqn_push_back_arg(i64 %1603, i64 %1605, i64 %1607, i64 %1609, i64 %1611)
  %1613 = load i64, ptr %74, align 4
  %1614 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %1613, i32 noundef 1, i32 noundef 1, i32 noundef 896)
  call void @llvm.lifetime.start.p0(i64 16, ptr %132) #8
  %1615 = load i32, ptr %67, align 4, !tbaa !5
  %1616 = load i32, ptr %65, align 4, !tbaa !5
  %1617 = load i32, ptr %29, align 4, !tbaa !5
  %1618 = load i32, ptr %71, align 4, !tbaa !5
  %1619 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1615, i32 noundef %1616, i32 noundef %1617, i32 noundef %1618)
  %1620 = getelementptr inbounds { i64, i64 }, ptr %132, i32 0, i32 0
  %1621 = extractvalue { i64, i64 } %1619, 0
  store i64 %1621, ptr %1620, align 4
  %1622 = getelementptr inbounds { i64, i64 }, ptr %132, i32 0, i32 1
  %1623 = extractvalue { i64, i64 } %1619, 1
  store i64 %1623, ptr %1622, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %132, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %132) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %133) #8
  %1624 = load i32, ptr %13, align 4, !tbaa !5
  %1625 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1624, i32 noundef 0)
  store i64 %1625, ptr %133, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %133, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %133) #8
  %1626 = load i64, ptr %73, align 4
  %1627 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1628 = load i64, ptr %1627, align 4
  %1629 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1630 = load i64, ptr %1629, align 4
  %1631 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1632 = load i64, ptr %1631, align 4
  %1633 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1634 = load i64, ptr %1633, align 4
  %1635 = call i32 @libxsmm_meqn_push_back_arg(i64 %1626, i64 %1628, i64 %1630, i64 %1632, i64 %1634)
  call void @llvm.lifetime.start.p0(i64 16, ptr %134) #8
  %1636 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1)
  %1637 = getelementptr inbounds { i64, i64 }, ptr %134, i32 0, i32 0
  %1638 = extractvalue { i64, i64 } %1636, 0
  store i64 %1638, ptr %1637, align 4
  %1639 = getelementptr inbounds { i64, i64 }, ptr %134, i32 0, i32 1
  %1640 = extractvalue { i64, i64 } %1636, 1
  store i64 %1640, ptr %1639, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %134, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %134) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %135) #8
  %1641 = load i32, ptr %13, align 4, !tbaa !5
  %1642 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1641, i32 noundef 2)
  store i64 %1642, ptr %135, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %135, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %135) #8
  %1643 = load i64, ptr %73, align 4
  %1644 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1645 = load i64, ptr %1644, align 4
  %1646 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1647 = load i64, ptr %1646, align 4
  %1648 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1649 = load i64, ptr %1648, align 4
  %1650 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1651 = load i64, ptr %1650, align 4
  %1652 = call i32 @libxsmm_meqn_push_back_arg(i64 %1643, i64 %1645, i64 %1647, i64 %1649, i64 %1651)
  call void @llvm.lifetime.start.p0(i64 16, ptr %136) #8
  %1653 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1)
  %1654 = getelementptr inbounds { i64, i64 }, ptr %136, i32 0, i32 0
  %1655 = extractvalue { i64, i64 } %1653, 0
  store i64 %1655, ptr %1654, align 4
  %1656 = getelementptr inbounds { i64, i64 }, ptr %136, i32 0, i32 1
  %1657 = extractvalue { i64, i64 } %1653, 1
  store i64 %1657, ptr %1656, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %136, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %136) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %137) #8
  %1658 = load i32, ptr %13, align 4, !tbaa !5
  %1659 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %1658, i32 noundef 7)
  store i64 %1659, ptr %137, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %137, i64 8, i1 false), !tbaa.struct !23
  call void @llvm.lifetime.end.p0(i64 8, ptr %137) #8
  %1660 = load i64, ptr %73, align 4
  %1661 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 0
  %1662 = load i64, ptr %1661, align 4
  %1663 = getelementptr inbounds { i64, i64 }, ptr %75, i32 0, i32 1
  %1664 = load i64, ptr %1663, align 4
  %1665 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 0
  %1666 = load i64, ptr %1665, align 4
  %1667 = getelementptr inbounds { i64, i64 }, ptr %77, i32 0, i32 1
  %1668 = load i64, ptr %1667, align 4
  %1669 = call i32 @libxsmm_meqn_push_back_arg(i64 %1660, i64 %1662, i64 %1664, i64 %1666, i64 %1668)
  call void @llvm.lifetime.start.p0(i64 16, ptr %138) #8
  %1670 = load i32, ptr %67, align 4, !tbaa !5
  %1671 = load i32, ptr %65, align 4, !tbaa !5
  %1672 = load i32, ptr %29, align 4, !tbaa !5
  %1673 = load i32, ptr %71, align 4, !tbaa !5
  %1674 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %1670, i32 noundef %1671, i32 noundef %1672, i32 noundef %1673)
  %1675 = getelementptr inbounds { i64, i64 }, ptr %138, i32 0, i32 0
  %1676 = extractvalue { i64, i64 } %1674, 0
  store i64 %1676, ptr %1675, align 4
  %1677 = getelementptr inbounds { i64, i64 }, ptr %138, i32 0, i32 1
  %1678 = extractvalue { i64, i64 } %1674, 1
  store i64 %1678, ptr %1677, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %76, ptr align 4 %138, i64 16, i1 false), !tbaa.struct !24
  call void @llvm.lifetime.end.p0(i64 16, ptr %138) #8
  %1679 = load i32, ptr %13, align 4, !tbaa !5
  %1680 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 0
  %1681 = load i64, ptr %1680, align 4
  %1682 = getelementptr inbounds { i64, i64 }, ptr %76, i32 0, i32 1
  %1683 = load i64, ptr %1682, align 4
  %1684 = call ptr @libxsmm_dispatch_meqn(i32 noundef %1679, i64 %1681, i64 %1683)
  store ptr %1684, ptr %19, align 8, !tbaa !9
  %1685 = load ptr, ptr %19, align 8, !tbaa !9
  %1686 = call i32 @libxsmm_get_kernel_info(ptr noundef %1685, ptr noundef @info)
  %1687 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !20
  store i32 %1687, ptr @is_reference_kernel, align 4, !tbaa !5
  %1688 = load ptr, ptr %19, align 8, !tbaa !9
  %1689 = icmp eq ptr %1688, null
  br i1 %1689, label %1690, label %1693

1690:                                             ; preds = %1546
  %1691 = load ptr, ptr @stderr, align 8, !tbaa !9
  %1692 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1691, ptr noundef @.str.25) #8
  call void @exit(i32 noundef -1) #10
  unreachable

1693:                                             ; preds = %1546
  %1694 = load i32, ptr %69, align 4, !tbaa !5
  %1695 = icmp eq i32 %1694, 0
  br i1 %1695, label %1696, label %1730

1696:                                             ; preds = %1693
  %1697 = load i32, ptr %65, align 4, !tbaa !5
  %1698 = sext i32 %1697 to i64
  %1699 = load i32, ptr %66, align 4, !tbaa !5
  %1700 = sext i32 %1699 to i64
  %1701 = load i32, ptr %67, align 4, !tbaa !5
  %1702 = sext i32 %1701 to i64
  %1703 = load ptr, ptr %42, align 8, !tbaa !9
  %1704 = load ptr, ptr %39, align 8, !tbaa !9
  %1705 = load ptr, ptr %53, align 8, !tbaa !9
  %1706 = load ptr, ptr %54, align 8, !tbaa !9
  %1707 = load ptr, ptr %50, align 8, !tbaa !9
  %1708 = load ptr, ptr %41, align 8, !tbaa !9
  %1709 = load ptr, ptr %47, align 8, !tbaa !9
  %1710 = load ptr, ptr %45, align 8, !tbaa !9
  call void @vectorized_layernorm_bwd_fp32(i64 noundef %1698, i64 noundef %1700, i64 noundef %1702, ptr noundef %1703, ptr noundef %1704, ptr noundef %1705, ptr noundef %1706, ptr noundef %1707, ptr noundef %1708, ptr noundef %1709, ptr noundef %1710)
  %1711 = load i32, ptr %65, align 4, !tbaa !5
  %1712 = sext i32 %1711 to i64
  %1713 = load i32, ptr %66, align 4, !tbaa !5
  %1714 = sext i32 %1713 to i64
  %1715 = load i32, ptr %67, align 4, !tbaa !5
  %1716 = sext i32 %1715 to i64
  %1717 = load ptr, ptr %44, align 8, !tbaa !9
  %1718 = load ptr, ptr %39, align 8, !tbaa !9
  %1719 = load ptr, ptr %53, align 8, !tbaa !9
  %1720 = load ptr, ptr %54, align 8, !tbaa !9
  %1721 = load ptr, ptr %50, align 8, !tbaa !9
  %1722 = load ptr, ptr %43, align 8, !tbaa !9
  %1723 = load ptr, ptr %48, align 8, !tbaa !9
  %1724 = load ptr, ptr %46, align 8, !tbaa !9
  %1725 = load ptr, ptr %15, align 8, !tbaa !9
  %1726 = load ptr, ptr %16, align 8, !tbaa !9
  %1727 = load ptr, ptr %17, align 8, !tbaa !9
  %1728 = load ptr, ptr %18, align 8, !tbaa !9
  %1729 = load ptr, ptr %19, align 8, !tbaa !9
  call void @tpp_layernorm_bwd_fp32(i64 noundef %1712, i64 noundef %1714, i64 noundef %1716, ptr noundef %1717, ptr noundef %1718, ptr noundef %1719, ptr noundef %1720, ptr noundef %1721, ptr noundef %1722, ptr noundef %1723, ptr noundef %1724, ptr noundef %1725, ptr noundef %1726, ptr noundef %1727, ptr noundef %1728, ptr noundef %1729)
  br label %1801

1730:                                             ; preds = %1693
  %1731 = load i32, ptr %69, align 4, !tbaa !5
  %1732 = icmp eq i32 %1731, 1
  br i1 %1732, label %1733, label %1800

1733:                                             ; preds = %1730
  %1734 = load i32, ptr %65, align 4, !tbaa !5
  %1735 = sext i32 %1734 to i64
  %1736 = load i32, ptr %66, align 4, !tbaa !5
  %1737 = sext i32 %1736 to i64
  %1738 = load i32, ptr %67, align 4, !tbaa !5
  %1739 = sext i32 %1738 to i64
  %1740 = load ptr, ptr %58, align 8, !tbaa !9
  %1741 = load ptr, ptr %55, align 8, !tbaa !9
  %1742 = load ptr, ptr %53, align 8, !tbaa !9
  %1743 = load ptr, ptr %54, align 8, !tbaa !9
  %1744 = load ptr, ptr %61, align 8, !tbaa !9
  %1745 = load ptr, ptr %57, align 8, !tbaa !9
  %1746 = load ptr, ptr %47, align 8, !tbaa !9
  %1747 = load ptr, ptr %45, align 8, !tbaa !9
  call void @vectorized_layernorm_bwd_bf16(i64 noundef %1735, i64 noundef %1737, i64 noundef %1739, ptr noundef %1740, ptr noundef %1741, ptr noundef %1742, ptr noundef %1743, ptr noundef %1744, ptr noundef %1745, ptr noundef %1746, ptr noundef %1747)
  %1748 = load i32, ptr %65, align 4, !tbaa !5
  %1749 = sext i32 %1748 to i64
  %1750 = load i32, ptr %66, align 4, !tbaa !5
  %1751 = sext i32 %1750 to i64
  %1752 = load i32, ptr %67, align 4, !tbaa !5
  %1753 = sext i32 %1752 to i64
  %1754 = load ptr, ptr %60, align 8, !tbaa !9
  %1755 = load ptr, ptr %55, align 8, !tbaa !9
  %1756 = load ptr, ptr %53, align 8, !tbaa !9
  %1757 = load ptr, ptr %54, align 8, !tbaa !9
  %1758 = load ptr, ptr %61, align 8, !tbaa !9
  %1759 = load ptr, ptr %59, align 8, !tbaa !9
  %1760 = load ptr, ptr %48, align 8, !tbaa !9
  %1761 = load ptr, ptr %46, align 8, !tbaa !9
  %1762 = load ptr, ptr %15, align 8, !tbaa !9
  %1763 = load ptr, ptr %16, align 8, !tbaa !9
  %1764 = load ptr, ptr %17, align 8, !tbaa !9
  %1765 = load ptr, ptr %18, align 8, !tbaa !9
  %1766 = load ptr, ptr %19, align 8, !tbaa !9
  call void @tpp_layernorm_bwd_bf16(i64 noundef %1749, i64 noundef %1751, i64 noundef %1753, ptr noundef %1754, ptr noundef %1755, ptr noundef %1756, ptr noundef %1757, ptr noundef %1758, ptr noundef %1759, ptr noundef %1760, ptr noundef %1761, ptr noundef %1762, ptr noundef %1763, ptr noundef %1764, ptr noundef %1765, ptr noundef %1766)
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %1767

1767:                                             ; preds = %1796, %1733
  %1768 = load i32, ptr %27, align 4, !tbaa !5
  %1769 = load i32, ptr %65, align 4, !tbaa !5
  %1770 = load i32, ptr %66, align 4, !tbaa !5
  %1771 = mul nsw i32 %1769, %1770
  %1772 = load i32, ptr %67, align 4, !tbaa !5
  %1773 = mul nsw i32 %1771, %1772
  %1774 = icmp slt i32 %1768, %1773
  br i1 %1774, label %1775, label %1799

1775:                                             ; preds = %1767
  %1776 = load ptr, ptr %57, align 8, !tbaa !9
  %1777 = load i32, ptr %27, align 4, !tbaa !5
  %1778 = sext i32 %1777 to i64
  %1779 = getelementptr inbounds i16, ptr %1776, i64 %1778
  %1780 = load i16, ptr %1779, align 2, !tbaa !25
  %1781 = call float @upconvert_bf16(i16 noundef zeroext %1780)
  %1782 = load ptr, ptr %41, align 8, !tbaa !9
  %1783 = load i32, ptr %27, align 4, !tbaa !5
  %1784 = sext i32 %1783 to i64
  %1785 = getelementptr inbounds float, ptr %1782, i64 %1784
  store float %1781, ptr %1785, align 4, !tbaa !13
  %1786 = load ptr, ptr %59, align 8, !tbaa !9
  %1787 = load i32, ptr %27, align 4, !tbaa !5
  %1788 = sext i32 %1787 to i64
  %1789 = getelementptr inbounds i16, ptr %1786, i64 %1788
  %1790 = load i16, ptr %1789, align 2, !tbaa !25
  %1791 = call float @upconvert_bf16(i16 noundef zeroext %1790)
  %1792 = load ptr, ptr %43, align 8, !tbaa !9
  %1793 = load i32, ptr %27, align 4, !tbaa !5
  %1794 = sext i32 %1793 to i64
  %1795 = getelementptr inbounds float, ptr %1792, i64 %1794
  store float %1791, ptr %1795, align 4, !tbaa !13
  br label %1796

1796:                                             ; preds = %1775
  %1797 = load i32, ptr %27, align 4, !tbaa !5
  %1798 = add nsw i32 %1797, 1
  store i32 %1798, ptr %27, align 4, !tbaa !5
  br label %1767, !llvm.loop !43

1799:                                             ; preds = %1767
  br label %1800

1800:                                             ; preds = %1799, %1730
  br label %1801

1801:                                             ; preds = %1800, %1696
  %1802 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  %1803 = load i32, ptr %69, align 4, !tbaa !5
  %1804 = icmp eq i32 %1803, 0
  br i1 %1804, label %1805, label %1807

1805:                                             ; preds = %1801
  %1806 = call i32 (ptr, ...) @printf(ptr noundef @.str.26)
  br label %1809

1807:                                             ; preds = %1801
  %1808 = call i32 (ptr, ...) @printf(ptr noundef @.str.27)
  br label %1809

1809:                                             ; preds = %1807, %1805
  %1810 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  %1811 = load i32, ptr %65, align 4, !tbaa !5
  %1812 = load i32, ptr %66, align 4, !tbaa !5
  %1813 = mul nsw i32 %1811, %1812
  %1814 = load i32, ptr %67, align 4, !tbaa !5
  %1815 = mul nsw i32 %1813, %1814
  %1816 = load ptr, ptr %41, align 8, !tbaa !9
  %1817 = load ptr, ptr %43, align 8, !tbaa !9
  %1818 = call i32 @libxsmm_matdiff(ptr noundef %38, i32 noundef 1, i32 noundef %1815, i32 noundef 1, ptr noundef %1816, ptr noundef %1817, ptr noundef null, ptr noundef null)
  %1819 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 10
  %1820 = load double, ptr %1819, align 8, !tbaa !28
  %1821 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, double noundef %1820)
  %1822 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 15
  %1823 = load double, ptr %1822, align 8, !tbaa !30
  %1824 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, double noundef %1823)
  %1825 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 7
  %1826 = load double, ptr %1825, align 8, !tbaa !31
  %1827 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, double noundef %1826)
  %1828 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 8
  %1829 = load double, ptr %1828, align 8, !tbaa !32
  %1830 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %1829)
  %1831 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 5
  %1832 = load double, ptr %1831, align 8, !tbaa !33
  %1833 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, double noundef %1832)
  %1834 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 6
  %1835 = load double, ptr %1834, align 8, !tbaa !34
  %1836 = call i32 (ptr, ...) @printf(ptr noundef @.str.16, double noundef %1835)
  %1837 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %1838 = load double, ptr %1837, align 8, !tbaa !35
  %1839 = call i32 (ptr, ...) @printf(ptr noundef @.str.17, double noundef %1838)
  %1840 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %1841 = load double, ptr %1840, align 8, !tbaa !35
  %1842 = load double, ptr %7, align 8, !tbaa !11
  %1843 = fcmp ogt double %1841, %1842
  br i1 %1843, label %1844, label %1845

1844:                                             ; preds = %1809
  store i32 1, ptr %6, align 4, !tbaa !5
  br label %1845

1845:                                             ; preds = %1844, %1809
  %1846 = call i32 (ptr, ...) @printf(ptr noundef @.str.28)
  %1847 = load i32, ptr %69, align 4, !tbaa !5
  %1848 = icmp eq i32 %1847, 0
  br i1 %1848, label %1849, label %1851

1849:                                             ; preds = %1845
  %1850 = call i32 (ptr, ...) @printf(ptr noundef @.str.29)
  br label %1853

1851:                                             ; preds = %1845
  %1852 = call i32 (ptr, ...) @printf(ptr noundef @.str.30)
  br label %1853

1853:                                             ; preds = %1851, %1849
  %1854 = call i32 (ptr, ...) @printf(ptr noundef @.str.28)
  %1855 = load i32, ptr %65, align 4, !tbaa !5
  %1856 = load i32, ptr %67, align 4, !tbaa !5
  %1857 = mul nsw i32 %1855, %1856
  %1858 = load ptr, ptr %45, align 8, !tbaa !9
  %1859 = load ptr, ptr %46, align 8, !tbaa !9
  %1860 = call i32 @libxsmm_matdiff(ptr noundef %38, i32 noundef 1, i32 noundef %1857, i32 noundef 1, ptr noundef %1858, ptr noundef %1859, ptr noundef null, ptr noundef null)
  %1861 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 10
  %1862 = load double, ptr %1861, align 8, !tbaa !28
  %1863 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, double noundef %1862)
  %1864 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 15
  %1865 = load double, ptr %1864, align 8, !tbaa !30
  %1866 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, double noundef %1865)
  %1867 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 7
  %1868 = load double, ptr %1867, align 8, !tbaa !31
  %1869 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, double noundef %1868)
  %1870 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 8
  %1871 = load double, ptr %1870, align 8, !tbaa !32
  %1872 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %1871)
  %1873 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 5
  %1874 = load double, ptr %1873, align 8, !tbaa !33
  %1875 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, double noundef %1874)
  %1876 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 6
  %1877 = load double, ptr %1876, align 8, !tbaa !34
  %1878 = call i32 (ptr, ...) @printf(ptr noundef @.str.16, double noundef %1877)
  %1879 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %1880 = load double, ptr %1879, align 8, !tbaa !35
  %1881 = call i32 (ptr, ...) @printf(ptr noundef @.str.17, double noundef %1880)
  %1882 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %1883 = load double, ptr %1882, align 8, !tbaa !35
  %1884 = load double, ptr %7, align 8, !tbaa !11
  %1885 = fcmp ogt double %1883, %1884
  br i1 %1885, label %1886, label %1887

1886:                                             ; preds = %1853
  store i32 1, ptr %6, align 4, !tbaa !5
  br label %1887

1887:                                             ; preds = %1886, %1853
  %1888 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  %1889 = load i32, ptr %69, align 4, !tbaa !5
  %1890 = icmp eq i32 %1889, 0
  br i1 %1890, label %1891, label %1893

1891:                                             ; preds = %1887
  %1892 = call i32 (ptr, ...) @printf(ptr noundef @.str.31)
  br label %1895

1893:                                             ; preds = %1887
  %1894 = call i32 (ptr, ...) @printf(ptr noundef @.str.32)
  br label %1895

1895:                                             ; preds = %1893, %1891
  %1896 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  %1897 = load i32, ptr %65, align 4, !tbaa !5
  %1898 = load i32, ptr %67, align 4, !tbaa !5
  %1899 = mul nsw i32 %1897, %1898
  %1900 = load ptr, ptr %47, align 8, !tbaa !9
  %1901 = load ptr, ptr %48, align 8, !tbaa !9
  %1902 = call i32 @libxsmm_matdiff(ptr noundef %38, i32 noundef 1, i32 noundef %1899, i32 noundef 1, ptr noundef %1900, ptr noundef %1901, ptr noundef null, ptr noundef null)
  %1903 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 10
  %1904 = load double, ptr %1903, align 8, !tbaa !28
  %1905 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, double noundef %1904)
  %1906 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 15
  %1907 = load double, ptr %1906, align 8, !tbaa !30
  %1908 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, double noundef %1907)
  %1909 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 7
  %1910 = load double, ptr %1909, align 8, !tbaa !31
  %1911 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, double noundef %1910)
  %1912 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 8
  %1913 = load double, ptr %1912, align 8, !tbaa !32
  %1914 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %1913)
  %1915 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 5
  %1916 = load double, ptr %1915, align 8, !tbaa !33
  %1917 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, double noundef %1916)
  %1918 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 6
  %1919 = load double, ptr %1918, align 8, !tbaa !34
  %1920 = call i32 (ptr, ...) @printf(ptr noundef @.str.16, double noundef %1919)
  %1921 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %1922 = load double, ptr %1921, align 8, !tbaa !35
  %1923 = call i32 (ptr, ...) @printf(ptr noundef @.str.17, double noundef %1922)
  %1924 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %38, i32 0, i32 4
  %1925 = load double, ptr %1924, align 8, !tbaa !35
  %1926 = load double, ptr %7, align 8, !tbaa !11
  %1927 = fcmp ogt double %1925, %1926
  br i1 %1927, label %1928, label %1929

1928:                                             ; preds = %1895
  store i32 1, ptr %6, align 4, !tbaa !5
  br label %1929

1929:                                             ; preds = %1928, %1895
  %1930 = load i32, ptr %68, align 4, !tbaa !5
  %1931 = icmp sgt i32 %1930, 0
  br i1 %1931, label %1932, label %2154

1932:                                             ; preds = %1929
  %1933 = load i32, ptr %69, align 4, !tbaa !5
  %1934 = icmp eq i32 %1933, 0
  br i1 %1934, label %1935, label %2042

1935:                                             ; preds = %1932
  %1936 = load i32, ptr %65, align 4, !tbaa !5
  %1937 = sext i32 %1936 to i64
  %1938 = load i32, ptr %66, align 4, !tbaa !5
  %1939 = sext i32 %1938 to i64
  %1940 = load i32, ptr %67, align 4, !tbaa !5
  %1941 = sext i32 %1940 to i64
  %1942 = load ptr, ptr %42, align 8, !tbaa !9
  %1943 = load ptr, ptr %39, align 8, !tbaa !9
  %1944 = load ptr, ptr %53, align 8, !tbaa !9
  %1945 = load ptr, ptr %54, align 8, !tbaa !9
  %1946 = load ptr, ptr %50, align 8, !tbaa !9
  %1947 = load ptr, ptr %41, align 8, !tbaa !9
  %1948 = load ptr, ptr %47, align 8, !tbaa !9
  %1949 = load ptr, ptr %45, align 8, !tbaa !9
  call void @vectorized_layernorm_bwd_fp32(i64 noundef %1937, i64 noundef %1939, i64 noundef %1941, ptr noundef %1942, ptr noundef %1943, ptr noundef %1944, ptr noundef %1945, ptr noundef %1946, ptr noundef %1947, ptr noundef %1948, ptr noundef %1949)
  %1950 = call i64 @libxsmm_timer_tick()
  store i64 %1950, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %1951

1951:                                             ; preds = %1970, %1935
  %1952 = load i32, ptr %28, align 4, !tbaa !5
  %1953 = load i32, ptr %68, align 4, !tbaa !5
  %1954 = icmp slt i32 %1952, %1953
  br i1 %1954, label %1955, label %1973

1955:                                             ; preds = %1951
  %1956 = load i32, ptr %65, align 4, !tbaa !5
  %1957 = sext i32 %1956 to i64
  %1958 = load i32, ptr %66, align 4, !tbaa !5
  %1959 = sext i32 %1958 to i64
  %1960 = load i32, ptr %67, align 4, !tbaa !5
  %1961 = sext i32 %1960 to i64
  %1962 = load ptr, ptr %42, align 8, !tbaa !9
  %1963 = load ptr, ptr %39, align 8, !tbaa !9
  %1964 = load ptr, ptr %53, align 8, !tbaa !9
  %1965 = load ptr, ptr %54, align 8, !tbaa !9
  %1966 = load ptr, ptr %50, align 8, !tbaa !9
  %1967 = load ptr, ptr %41, align 8, !tbaa !9
  %1968 = load ptr, ptr %47, align 8, !tbaa !9
  %1969 = load ptr, ptr %45, align 8, !tbaa !9
  call void @vectorized_layernorm_bwd_fp32(i64 noundef %1957, i64 noundef %1959, i64 noundef %1961, ptr noundef %1962, ptr noundef %1963, ptr noundef %1964, ptr noundef %1965, ptr noundef %1966, ptr noundef %1967, ptr noundef %1968, ptr noundef %1969)
  br label %1970

1970:                                             ; preds = %1955
  %1971 = load i32, ptr %28, align 4, !tbaa !5
  %1972 = add nsw i32 %1971, 1
  store i32 %1972, ptr %28, align 4, !tbaa !5
  br label %1951, !llvm.loop !44

1973:                                             ; preds = %1951
  %1974 = call i64 @libxsmm_timer_tick()
  store i64 %1974, ptr %33, align 8, !tbaa !36
  %1975 = load i64, ptr %32, align 8, !tbaa !36
  %1976 = load i64, ptr %33, align 8, !tbaa !36
  %1977 = call double @libxsmm_timer_duration(i64 noundef %1975, i64 noundef %1976)
  store double %1977, ptr %34, align 8, !tbaa !11
  %1978 = load double, ptr %34, align 8, !tbaa !11
  %1979 = call i32 (ptr, ...) @printf(ptr noundef @.str.33, double noundef %1978)
  %1980 = load i32, ptr %65, align 4, !tbaa !5
  %1981 = sext i32 %1980 to i64
  %1982 = load i32, ptr %66, align 4, !tbaa !5
  %1983 = sext i32 %1982 to i64
  %1984 = load i32, ptr %67, align 4, !tbaa !5
  %1985 = sext i32 %1984 to i64
  %1986 = load ptr, ptr %44, align 8, !tbaa !9
  %1987 = load ptr, ptr %39, align 8, !tbaa !9
  %1988 = load ptr, ptr %53, align 8, !tbaa !9
  %1989 = load ptr, ptr %54, align 8, !tbaa !9
  %1990 = load ptr, ptr %50, align 8, !tbaa !9
  %1991 = load ptr, ptr %43, align 8, !tbaa !9
  %1992 = load ptr, ptr %48, align 8, !tbaa !9
  %1993 = load ptr, ptr %46, align 8, !tbaa !9
  %1994 = load ptr, ptr %15, align 8, !tbaa !9
  %1995 = load ptr, ptr %16, align 8, !tbaa !9
  %1996 = load ptr, ptr %17, align 8, !tbaa !9
  %1997 = load ptr, ptr %18, align 8, !tbaa !9
  %1998 = load ptr, ptr %19, align 8, !tbaa !9
  call void @tpp_layernorm_bwd_fp32(i64 noundef %1981, i64 noundef %1983, i64 noundef %1985, ptr noundef %1986, ptr noundef %1987, ptr noundef %1988, ptr noundef %1989, ptr noundef %1990, ptr noundef %1991, ptr noundef %1992, ptr noundef %1993, ptr noundef %1994, ptr noundef %1995, ptr noundef %1996, ptr noundef %1997, ptr noundef %1998)
  %1999 = call i64 @libxsmm_timer_tick()
  store i64 %1999, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %2000

2000:                                             ; preds = %2024, %1973
  %2001 = load i32, ptr %28, align 4, !tbaa !5
  %2002 = load i32, ptr %68, align 4, !tbaa !5
  %2003 = icmp slt i32 %2001, %2002
  br i1 %2003, label %2004, label %2027

2004:                                             ; preds = %2000
  %2005 = load i32, ptr %65, align 4, !tbaa !5
  %2006 = sext i32 %2005 to i64
  %2007 = load i32, ptr %66, align 4, !tbaa !5
  %2008 = sext i32 %2007 to i64
  %2009 = load i32, ptr %67, align 4, !tbaa !5
  %2010 = sext i32 %2009 to i64
  %2011 = load ptr, ptr %44, align 8, !tbaa !9
  %2012 = load ptr, ptr %39, align 8, !tbaa !9
  %2013 = load ptr, ptr %53, align 8, !tbaa !9
  %2014 = load ptr, ptr %54, align 8, !tbaa !9
  %2015 = load ptr, ptr %50, align 8, !tbaa !9
  %2016 = load ptr, ptr %43, align 8, !tbaa !9
  %2017 = load ptr, ptr %48, align 8, !tbaa !9
  %2018 = load ptr, ptr %46, align 8, !tbaa !9
  %2019 = load ptr, ptr %15, align 8, !tbaa !9
  %2020 = load ptr, ptr %16, align 8, !tbaa !9
  %2021 = load ptr, ptr %17, align 8, !tbaa !9
  %2022 = load ptr, ptr %18, align 8, !tbaa !9
  %2023 = load ptr, ptr %19, align 8, !tbaa !9
  call void @tpp_layernorm_bwd_fp32(i64 noundef %2006, i64 noundef %2008, i64 noundef %2010, ptr noundef %2011, ptr noundef %2012, ptr noundef %2013, ptr noundef %2014, ptr noundef %2015, ptr noundef %2016, ptr noundef %2017, ptr noundef %2018, ptr noundef %2019, ptr noundef %2020, ptr noundef %2021, ptr noundef %2022, ptr noundef %2023)
  br label %2024

2024:                                             ; preds = %2004
  %2025 = load i32, ptr %28, align 4, !tbaa !5
  %2026 = add nsw i32 %2025, 1
  store i32 %2026, ptr %28, align 4, !tbaa !5
  br label %2000, !llvm.loop !45

2027:                                             ; preds = %2000
  %2028 = call i64 @libxsmm_timer_tick()
  store i64 %2028, ptr %33, align 8, !tbaa !36
  %2029 = load i64, ptr %32, align 8, !tbaa !36
  %2030 = load i64, ptr %33, align 8, !tbaa !36
  %2031 = call double @libxsmm_timer_duration(i64 noundef %2029, i64 noundef %2030)
  store double %2031, ptr %35, align 8, !tbaa !11
  %2032 = load double, ptr %35, align 8, !tbaa !11
  %2033 = call i32 (ptr, ...) @printf(ptr noundef @.str.34, double noundef %2032)
  %2034 = load double, ptr %35, align 8, !tbaa !11
  %2035 = fcmp olt double 0.000000e+00, %2034
  br i1 %2035, label %2036, label %2041

2036:                                             ; preds = %2027
  %2037 = load double, ptr %34, align 8, !tbaa !11
  %2038 = load double, ptr %35, align 8, !tbaa !11
  %2039 = fdiv double %2037, %2038
  %2040 = call i32 (ptr, ...) @printf(ptr noundef @.str.35, double noundef %2039)
  br label %2041

2041:                                             ; preds = %2036, %2027
  br label %2153

2042:                                             ; preds = %1932
  %2043 = load i32, ptr %69, align 4, !tbaa !5
  %2044 = icmp eq i32 %2043, 1
  br i1 %2044, label %2045, label %2152

2045:                                             ; preds = %2042
  %2046 = load i32, ptr %65, align 4, !tbaa !5
  %2047 = sext i32 %2046 to i64
  %2048 = load i32, ptr %66, align 4, !tbaa !5
  %2049 = sext i32 %2048 to i64
  %2050 = load i32, ptr %67, align 4, !tbaa !5
  %2051 = sext i32 %2050 to i64
  %2052 = load ptr, ptr %58, align 8, !tbaa !9
  %2053 = load ptr, ptr %55, align 8, !tbaa !9
  %2054 = load ptr, ptr %53, align 8, !tbaa !9
  %2055 = load ptr, ptr %54, align 8, !tbaa !9
  %2056 = load ptr, ptr %61, align 8, !tbaa !9
  %2057 = load ptr, ptr %57, align 8, !tbaa !9
  %2058 = load ptr, ptr %47, align 8, !tbaa !9
  %2059 = load ptr, ptr %45, align 8, !tbaa !9
  call void @vectorized_layernorm_bwd_bf16(i64 noundef %2047, i64 noundef %2049, i64 noundef %2051, ptr noundef %2052, ptr noundef %2053, ptr noundef %2054, ptr noundef %2055, ptr noundef %2056, ptr noundef %2057, ptr noundef %2058, ptr noundef %2059)
  %2060 = call i64 @libxsmm_timer_tick()
  store i64 %2060, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %2061

2061:                                             ; preds = %2080, %2045
  %2062 = load i32, ptr %28, align 4, !tbaa !5
  %2063 = load i32, ptr %68, align 4, !tbaa !5
  %2064 = icmp slt i32 %2062, %2063
  br i1 %2064, label %2065, label %2083

2065:                                             ; preds = %2061
  %2066 = load i32, ptr %65, align 4, !tbaa !5
  %2067 = sext i32 %2066 to i64
  %2068 = load i32, ptr %66, align 4, !tbaa !5
  %2069 = sext i32 %2068 to i64
  %2070 = load i32, ptr %67, align 4, !tbaa !5
  %2071 = sext i32 %2070 to i64
  %2072 = load ptr, ptr %58, align 8, !tbaa !9
  %2073 = load ptr, ptr %55, align 8, !tbaa !9
  %2074 = load ptr, ptr %53, align 8, !tbaa !9
  %2075 = load ptr, ptr %54, align 8, !tbaa !9
  %2076 = load ptr, ptr %61, align 8, !tbaa !9
  %2077 = load ptr, ptr %57, align 8, !tbaa !9
  %2078 = load ptr, ptr %47, align 8, !tbaa !9
  %2079 = load ptr, ptr %45, align 8, !tbaa !9
  call void @vectorized_layernorm_bwd_bf16(i64 noundef %2067, i64 noundef %2069, i64 noundef %2071, ptr noundef %2072, ptr noundef %2073, ptr noundef %2074, ptr noundef %2075, ptr noundef %2076, ptr noundef %2077, ptr noundef %2078, ptr noundef %2079)
  br label %2080

2080:                                             ; preds = %2065
  %2081 = load i32, ptr %28, align 4, !tbaa !5
  %2082 = add nsw i32 %2081, 1
  store i32 %2082, ptr %28, align 4, !tbaa !5
  br label %2061, !llvm.loop !46

2083:                                             ; preds = %2061
  %2084 = call i64 @libxsmm_timer_tick()
  store i64 %2084, ptr %33, align 8, !tbaa !36
  %2085 = load i64, ptr %32, align 8, !tbaa !36
  %2086 = load i64, ptr %33, align 8, !tbaa !36
  %2087 = call double @libxsmm_timer_duration(i64 noundef %2085, i64 noundef %2086)
  store double %2087, ptr %34, align 8, !tbaa !11
  %2088 = load double, ptr %34, align 8, !tbaa !11
  %2089 = call i32 (ptr, ...) @printf(ptr noundef @.str.33, double noundef %2088)
  %2090 = load i32, ptr %65, align 4, !tbaa !5
  %2091 = sext i32 %2090 to i64
  %2092 = load i32, ptr %66, align 4, !tbaa !5
  %2093 = sext i32 %2092 to i64
  %2094 = load i32, ptr %67, align 4, !tbaa !5
  %2095 = sext i32 %2094 to i64
  %2096 = load ptr, ptr %60, align 8, !tbaa !9
  %2097 = load ptr, ptr %55, align 8, !tbaa !9
  %2098 = load ptr, ptr %53, align 8, !tbaa !9
  %2099 = load ptr, ptr %54, align 8, !tbaa !9
  %2100 = load ptr, ptr %61, align 8, !tbaa !9
  %2101 = load ptr, ptr %59, align 8, !tbaa !9
  %2102 = load ptr, ptr %48, align 8, !tbaa !9
  %2103 = load ptr, ptr %46, align 8, !tbaa !9
  %2104 = load ptr, ptr %15, align 8, !tbaa !9
  %2105 = load ptr, ptr %16, align 8, !tbaa !9
  %2106 = load ptr, ptr %17, align 8, !tbaa !9
  %2107 = load ptr, ptr %18, align 8, !tbaa !9
  %2108 = load ptr, ptr %19, align 8, !tbaa !9
  call void @tpp_layernorm_bwd_bf16(i64 noundef %2091, i64 noundef %2093, i64 noundef %2095, ptr noundef %2096, ptr noundef %2097, ptr noundef %2098, ptr noundef %2099, ptr noundef %2100, ptr noundef %2101, ptr noundef %2102, ptr noundef %2103, ptr noundef %2104, ptr noundef %2105, ptr noundef %2106, ptr noundef %2107, ptr noundef %2108)
  %2109 = call i64 @libxsmm_timer_tick()
  store i64 %2109, ptr %32, align 8, !tbaa !36
  store i32 0, ptr %28, align 4, !tbaa !5
  br label %2110

2110:                                             ; preds = %2134, %2083
  %2111 = load i32, ptr %28, align 4, !tbaa !5
  %2112 = load i32, ptr %68, align 4, !tbaa !5
  %2113 = icmp slt i32 %2111, %2112
  br i1 %2113, label %2114, label %2137

2114:                                             ; preds = %2110
  %2115 = load i32, ptr %65, align 4, !tbaa !5
  %2116 = sext i32 %2115 to i64
  %2117 = load i32, ptr %66, align 4, !tbaa !5
  %2118 = sext i32 %2117 to i64
  %2119 = load i32, ptr %67, align 4, !tbaa !5
  %2120 = sext i32 %2119 to i64
  %2121 = load ptr, ptr %60, align 8, !tbaa !9
  %2122 = load ptr, ptr %55, align 8, !tbaa !9
  %2123 = load ptr, ptr %53, align 8, !tbaa !9
  %2124 = load ptr, ptr %54, align 8, !tbaa !9
  %2125 = load ptr, ptr %61, align 8, !tbaa !9
  %2126 = load ptr, ptr %59, align 8, !tbaa !9
  %2127 = load ptr, ptr %48, align 8, !tbaa !9
  %2128 = load ptr, ptr %46, align 8, !tbaa !9
  %2129 = load ptr, ptr %15, align 8, !tbaa !9
  %2130 = load ptr, ptr %16, align 8, !tbaa !9
  %2131 = load ptr, ptr %17, align 8, !tbaa !9
  %2132 = load ptr, ptr %18, align 8, !tbaa !9
  %2133 = load ptr, ptr %19, align 8, !tbaa !9
  call void @tpp_layernorm_bwd_bf16(i64 noundef %2116, i64 noundef %2118, i64 noundef %2120, ptr noundef %2121, ptr noundef %2122, ptr noundef %2123, ptr noundef %2124, ptr noundef %2125, ptr noundef %2126, ptr noundef %2127, ptr noundef %2128, ptr noundef %2129, ptr noundef %2130, ptr noundef %2131, ptr noundef %2132, ptr noundef %2133)
  br label %2134

2134:                                             ; preds = %2114
  %2135 = load i32, ptr %28, align 4, !tbaa !5
  %2136 = add nsw i32 %2135, 1
  store i32 %2136, ptr %28, align 4, !tbaa !5
  br label %2110, !llvm.loop !47

2137:                                             ; preds = %2110
  %2138 = call i64 @libxsmm_timer_tick()
  store i64 %2138, ptr %33, align 8, !tbaa !36
  %2139 = load i64, ptr %32, align 8, !tbaa !36
  %2140 = load i64, ptr %33, align 8, !tbaa !36
  %2141 = call double @libxsmm_timer_duration(i64 noundef %2139, i64 noundef %2140)
  store double %2141, ptr %35, align 8, !tbaa !11
  %2142 = load double, ptr %35, align 8, !tbaa !11
  %2143 = call i32 (ptr, ...) @printf(ptr noundef @.str.34, double noundef %2142)
  %2144 = load double, ptr %35, align 8, !tbaa !11
  %2145 = fcmp olt double 0.000000e+00, %2144
  br i1 %2145, label %2146, label %2151

2146:                                             ; preds = %2137
  %2147 = load double, ptr %34, align 8, !tbaa !11
  %2148 = load double, ptr %35, align 8, !tbaa !11
  %2149 = fdiv double %2147, %2148
  %2150 = call i32 (ptr, ...) @printf(ptr noundef @.str.35, double noundef %2149)
  br label %2151

2151:                                             ; preds = %2146, %2137
  br label %2152

2152:                                             ; preds = %2151, %2042
  br label %2153

2153:                                             ; preds = %2152, %2041
  br label %2154

2154:                                             ; preds = %2153, %1929
  br label %2155

2155:                                             ; preds = %2154, %1161
  %2156 = load double, ptr %35, align 8, !tbaa !11
  %2157 = load double, ptr %37, align 8, !tbaa !11
  %2158 = fadd double %2157, %2156
  store double %2158, ptr %37, align 8, !tbaa !11
  %2159 = load double, ptr %34, align 8, !tbaa !11
  %2160 = load double, ptr %36, align 8, !tbaa !11
  %2161 = fadd double %2160, %2159
  store double %2161, ptr %36, align 8, !tbaa !11
  %2162 = load i32, ptr %68, align 4, !tbaa !5
  %2163 = icmp sgt i32 %2162, 0
  br i1 %2163, label %2164, label %2171

2164:                                             ; preds = %2155
  %2165 = call i32 (ptr, ...) @printf(ptr noundef @.str.36)
  %2166 = load double, ptr %36, align 8, !tbaa !11
  %2167 = load double, ptr %37, align 8, !tbaa !11
  %2168 = fdiv double %2166, %2167
  %2169 = call i32 (ptr, ...) @printf(ptr noundef @.str.37, double noundef %2168)
  %2170 = call i32 (ptr, ...) @printf(ptr noundef @.str.38)
  br label %2171

2171:                                             ; preds = %2164, %2155
  %2172 = load ptr, ptr %39, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2172)
  %2173 = load ptr, ptr %40, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2173)
  %2174 = load ptr, ptr %41, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2174)
  %2175 = load ptr, ptr %42, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2175)
  %2176 = load ptr, ptr %43, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2176)
  %2177 = load ptr, ptr %44, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2177)
  %2178 = load ptr, ptr %57, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2178)
  %2179 = load ptr, ptr %58, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2179)
  %2180 = load ptr, ptr %59, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2180)
  %2181 = load ptr, ptr %60, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2181)
  %2182 = load ptr, ptr %47, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2182)
  %2183 = load ptr, ptr %45, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2183)
  %2184 = load ptr, ptr %48, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2184)
  %2185 = load ptr, ptr %46, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2185)
  %2186 = load ptr, ptr %53, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2186)
  %2187 = load ptr, ptr %54, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2187)
  %2188 = load ptr, ptr %50, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2188)
  %2189 = load ptr, ptr %51, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2189)
  %2190 = load ptr, ptr %49, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2190)
  %2191 = load ptr, ptr %55, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2191)
  %2192 = load ptr, ptr %56, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2192)
  %2193 = load ptr, ptr %61, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2193)
  %2194 = load ptr, ptr %62, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2194)
  %2195 = load ptr, ptr %63, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2195)
  %2196 = load ptr, ptr %52, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %2196)
  %2197 = load i32, ptr %6, align 4, !tbaa !5
  %2198 = icmp eq i32 %2197, 0
  br i1 %2198, label %2199, label %2202

2199:                                             ; preds = %2171
  %2200 = load i32, ptr @is_reference_kernel, align 4, !tbaa !5
  %2201 = call i32 @libxsmm_return_success_code(i32 noundef %2200)
  br label %2204

2202:                                             ; preds = %2171
  %2203 = load i32, ptr %6, align 4, !tbaa !5
  br label %2204

2204:                                             ; preds = %2202, %2199
  %2205 = phi i32 [ %2201, %2199 ], [ %2203, %2202 ]
  store i32 %2205, ptr %6, align 4, !tbaa !5
  %2206 = load i32, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 16, ptr %77) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %76) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %75) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %72) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %71) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %70) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %69) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %68) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %67) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %66) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %65) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #8
  call void @llvm.lifetime.end.p0(i64 192, ptr %38) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 28, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 28, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #8
  ret i32 %2206
}

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

declare { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef, i32 noundef, i32 noundef, i32 noundef) #2

declare void @libxsmm_init() #2

declare void @libxsmm_matdiff_clear(ptr noundef) #2

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare i32 @atoi(ptr noundef nonnull) #3

declare i32 @printf(ptr noundef, ...) #2

; Function Attrs: nounwind
declare ptr @getenv(ptr noundef) #4

; Function Attrs: nounwind
declare i32 @snprintf(ptr noundef, i64 noundef, ptr noundef, ...) #4

; Function Attrs: nounwind
declare i32 @putenv(ptr noundef) #4

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

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

declare noalias ptr @libxsmm_aligned_malloc(i64 noundef, i64 noundef) #2

declare double @libxsmm_rng_f64() #2

declare void @libxsmm_rne_convert_fp32_bf16(ptr noundef, ptr noundef, i64 noundef) #2

declare void @libxsmm_create_meltw_unary_shape(ptr dead_on_unwind writable sret(%struct.libxsmm_meltw_unary_shape) align 4, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #2

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

declare ptr @libxsmm_dispatch_meltw_unary(i32 noundef, ptr noundef byval(%struct.libxsmm_meltw_unary_shape) align 8, i32 noundef) #2

declare i32 @libxsmm_get_kernel_info(ptr noundef, ptr noundef) #2

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

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #5

declare i32 @libxsmm_meqn_create() #2

declare i64 @libxsmm_create_meqn_op_metadata(i32 noundef, i32 noundef) #2

declare i32 @libxsmm_meqn_push_back_ternary_op(i64, i32 noundef, i32 noundef, i32 noundef) #2

declare { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef, i32 noundef, i32 noundef, i32 noundef) #2

declare i64 @libxsmm_create_meqn_arg_metadata(i32 noundef, i32 noundef) #2

declare i32 @libxsmm_meqn_push_back_arg(i64, i64, i64, i64, i64) #2

declare ptr @libxsmm_dispatch_meqn(i32 noundef, i64, i64) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_fwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_fwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef, ptr noundef, ptr noundef, ptr noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_fwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_fwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef, ptr noundef, ptr noundef, ptr noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @upconvert_bf16(i16 noundef zeroext) #7

declare i32 @libxsmm_matdiff(ptr noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

declare i64 @libxsmm_timer_tick() #2

declare double @libxsmm_timer_duration(i64 noundef, i64 noundef) #2

declare i32 @libxsmm_meqn_push_back_binary_op(i64, i32 noundef, i32 noundef, i32 noundef) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_bwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_bwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_bwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_bwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #7

declare void @libxsmm_free(ptr noundef) #2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"float", !7, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = distinct !{!17, !16}
!18 = distinct !{!18, !16}
!19 = !{i64 0, i64 4, !5, i64 4, i64 4, !5, i64 8, i64 4, !5, i64 12, i64 4, !5, i64 16, i64 4, !5, i64 20, i64 4, !5, i64 24, i64 4, !5}
!20 = !{!21, !6, i64 16}
!21 = !{!"libxsmm_kernel_info", !6, i64 0, !6, i64 4, !22, i64 8, !6, i64 16}
!22 = !{!"long", !7, i64 0}
!23 = !{i64 0, i64 4, !5, i64 4, i64 4, !5}
!24 = !{i64 0, i64 4, !5, i64 4, i64 4, !5, i64 8, i64 4, !5, i64 12, i64 4, !5}
!25 = !{!26, !26, i64 0}
!26 = !{!"short", !7, i64 0}
!27 = distinct !{!27, !16}
!28 = !{!29, !12, i64 80}
!29 = !{!"libxsmm_matdiff_info", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120, !12, i64 128, !12, i64 136, !12, i64 144, !12, i64 152, !12, i64 160, !12, i64 168, !6, i64 176, !6, i64 180, !6, i64 184, !6, i64 188}
!30 = !{!29, !12, i64 120}
!31 = !{!29, !12, i64 56}
!32 = !{!29, !12, i64 64}
!33 = !{!29, !12, i64 40}
!34 = !{!29, !12, i64 48}
!35 = !{!29, !12, i64 32}
!36 = !{!37, !37, i64 0}
!37 = !{!"long long", !7, i64 0}
!38 = distinct !{!38, !16}
!39 = distinct !{!39, !16}
!40 = distinct !{!40, !16}
!41 = distinct !{!41, !16}
!42 = distinct !{!42, !16}
!43 = distinct !{!43, !16}
!44 = distinct !{!44, !16}
!45 = distinct !{!45, !16}
!46 = distinct !{!46, !16}
!47 = distinct !{!47, !16}


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

%struct.libxsmm_kernel_info = type { i32, i32, i64, i32 }
%struct.libxsmm_meltw_unary_shape = type { i32, i32, i32, i32, i32, i32, i32 }
%struct.libxsmm_matdiff_info = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i32, i32, i32, i32 }

@is_reference_kernel = external dso_local local_unnamed_addr global i32, align 4
@.str = external hidden unnamed_addr constant [52 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [16 x i8], align 1
@main.matdiff_ext = external hidden global [1024 x i8], align 16
@.str.2 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [87 x i8], align 1
@__PRETTY_FUNCTION__.main = external hidden unnamed_addr constant [23 x i8], align 1
@info = external dso_local global %struct.libxsmm_kernel_info, align 8
@stderr = external local_unnamed_addr global ptr, align 8
@.str.5 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [35 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local i32 @libxsmm_return_success_code(i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local i32 @main(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #0 {
  %3 = alloca %struct.libxsmm_meltw_unary_shape, align 8
  %4 = alloca %struct.libxsmm_meltw_unary_shape, align 8
  %5 = alloca %struct.libxsmm_matdiff_info, align 8
  %6 = alloca %struct.libxsmm_meltw_unary_shape, align 8
  %7 = alloca %struct.libxsmm_meltw_unary_shape, align 8
  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %3) #11
  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %4) #11
  call void @llvm.lifetime.start.p0(i64 192, ptr nonnull %5) #11
  %8 = tail call { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0) #11
  %9 = extractvalue { i64, i64 } %8, 0
  %10 = extractvalue { i64, i64 } %8, 1
  tail call void @libxsmm_init() #11
  call void @libxsmm_matdiff_clear(ptr noundef nonnull %5) #11
  %11 = icmp sgt i32 %0, 1
  br i1 %11, label %12, label %.thread1069.thread

12:                                               ; preds = %2
  %13 = getelementptr inbounds i8, ptr %1, i64 8
  %14 = load ptr, ptr %13, align 8, !tbaa !5
  %15 = call i32 @atoi(ptr nocapture noundef %14) #12
  %.not1111 = icmp eq i32 %0, 2
  br i1 %.not1111, label %.thread1069.thread, label %16

16:                                               ; preds = %12
  %17 = getelementptr inbounds i8, ptr %1, i64 16
  %18 = load ptr, ptr %17, align 8, !tbaa !5
  %19 = call i32 @atoi(ptr nocapture noundef %18) #12
  %20 = icmp ugt i32 %0, 3
  br i1 %20, label %21, label %.thread1069.thread

21:                                               ; preds = %16
  %22 = getelementptr inbounds i8, ptr %1, i64 24
  %23 = load ptr, ptr %22, align 8, !tbaa !5
  %24 = call i32 @atoi(ptr nocapture noundef %23) #12
  %.not1112 = icmp eq i32 %0, 4
  br i1 %.not1112, label %.thread1069.thread, label %25

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %1, i64 32
  %27 = load ptr, ptr %26, align 8, !tbaa !5
  %28 = call i32 @atoi(ptr nocapture noundef %27) #12
  %29 = icmp ugt i32 %0, 5
  br i1 %29, label %30, label %.thread1069

30:                                               ; preds = %25
  %31 = getelementptr inbounds i8, ptr %1, i64 40
  %32 = load ptr, ptr %31, align 8, !tbaa !5
  %33 = call i32 @atoi(ptr nocapture noundef %32) #12
  %.not1113 = icmp eq i32 %0, 6
  br i1 %.not1113, label %.thread1069, label %34

34:                                               ; preds = %30
  %35 = getelementptr inbounds i8, ptr %1, i64 48
  %36 = load ptr, ptr %35, align 8, !tbaa !5
  %37 = call i32 @atoi(ptr nocapture noundef %36) #12
  br label %.thread1069

.thread1069:                                      ; preds = %25, %34, %30
  %.010191079 = phi i32 [ %33, %34 ], [ %33, %30 ], [ 3, %25 ]
  %.01017 = phi i32 [ %37, %34 ], [ 100, %30 ], [ 100, %25 ]
  switch i32 %28, label %38 [
    i32 0, label %.thread1069.thread
    i32 1, label %.thread1069.thread.fold.split
  ]

38:                                               ; preds = %.thread1069
  %39 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str)
  br label %.thread1069.thread

.thread1069.thread.fold.split:                    ; preds = %.thread1069
  br label %.thread1069.thread

.thread1069.thread:                               ; preds = %.thread1069, %.thread1069.thread.fold.split, %2, %12, %16, %21, %38
  %40 = phi i1 [ false, %38 ], [ true, %.thread1069 ], [ true, %21 ], [ true, %16 ], [ true, %12 ], [ true, %2 ], [ false, %.thread1069.thread.fold.split ]
  %.010171110 = phi i32 [ %.01017, %38 ], [ %.01017, %.thread1069 ], [ 100, %21 ], [ 100, %16 ], [ 100, %12 ], [ 100, %2 ], [ %.01017, %.thread1069.thread.fold.split ]
  %.01018106710751106 = phi i32 [ %28, %38 ], [ %28, %.thread1069 ], [ 0, %21 ], [ 0, %16 ], [ 0, %12 ], [ 0, %2 ], [ %28, %.thread1069.thread.fold.split ]
  %.0101510491055106610761105 = phi i32 [ %19, %38 ], [ %19, %.thread1069 ], [ %19, %21 ], [ %19, %16 ], [ 64, %12 ], [ 64, %2 ], [ %19, %.thread1069.thread.fold.split ]
  %.01014104410481056106510771104 = phi i32 [ %15, %38 ], [ %15, %.thread1069 ], [ %15, %21 ], [ %15, %16 ], [ %15, %12 ], [ 64, %2 ], [ %15, %.thread1069.thread.fold.split ]
  %.010161057106410781103 = phi i32 [ %24, %38 ], [ %24, %.thread1069 ], [ %24, %21 ], [ 64, %16 ], [ 64, %12 ], [ 64, %2 ], [ %24, %.thread1069.thread.fold.split ]
  %.0101910791102 = phi i32 [ %.010191079, %38 ], [ %.010191079, %.thread1069 ], [ 3, %21 ], [ 3, %16 ], [ 3, %12 ], [ 3, %2 ], [ %.010191079, %.thread1069.thread.fold.split ]
  %.01020 = phi i32 [ 1, %38 ], [ 1, %.thread1069 ], [ 1, %21 ], [ 1, %16 ], [ 1, %12 ], [ 1, %2 ], [ 2, %.thread1069.thread.fold.split ]
  %.0997 = phi double [ 2.000000e-04, %38 ], [ 7.000000e-03, %.thread1069 ], [ 7.000000e-03, %21 ], [ 7.000000e-03, %16 ], [ 7.000000e-03, %12 ], [ 7.000000e-03, %2 ], [ 7.000000e-03, %.thread1069.thread.fold.split ]
  %41 = call ptr @getenv(ptr noundef nonnull @.str.1) #11
  %.not = icmp eq ptr %41, null
  br i1 %.not, label %49, label %42

42:                                               ; preds = %.thread1069.thread
  %43 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) @main.matdiff_ext, i64 noundef 1024, ptr noundef nonnull @.str.2, ptr noundef nonnull %41, double noundef %.0997) #11
  %44 = add i32 %43, -1
  %or.cond = icmp ult i32 %44, 1023
  br i1 %or.cond, label %45, label %49

45:                                               ; preds = %42
  %46 = call i32 @putenv(ptr noundef nonnull @main.matdiff_ext) #11
  %47 = icmp eq i32 %46, 0
  br i1 %47, label %49, label %48

48:                                               ; preds = %45
  call void @__assert_fail(ptr noundef nonnull @.str.3, ptr noundef nonnull @.str.4, i32 noundef 661, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #13
  unreachable

49:                                               ; preds = %42, %45, %.thread1069.thread
  %50 = sext i32 %.01014104410481056106510771104 to i64
  %51 = shl nsw i64 %50, 2
  %52 = sext i32 %.0101510491055106610761105 to i64
  %53 = sext i32 %.010161057106410781103 to i64
  %54 = mul nsw i64 %53, %52
  %55 = mul i64 %54, %51
  %56 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %55, i64 noundef 2097152) #11
  %57 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %55, i64 noundef 2097152) #11
  %58 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %55, i64 noundef 2097152) #11
  %59 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %55, i64 noundef 2097152) #11
  %60 = mul i64 %51, %53
  %61 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %60, i64 noundef 2097152) #11
  %62 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %60, i64 noundef 2097152) #11
  %63 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %55, i64 noundef 2097152) #11
  %64 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %55, i64 noundef 2097152) #11
  %65 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %60, i64 noundef 2097152) #11
  %66 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %60, i64 noundef 2097152) #11
  %67 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %60, i64 noundef 2097152) #11
  %68 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %60, i64 noundef 2097152) #11
  %69 = shl nsw i64 %52, 2
  %70 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %69, i64 noundef 2097152) #11
  %71 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %69, i64 noundef 2097152) #11
  %72 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %55, i64 noundef 2097152) #11
  %73 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef 4194304, i64 noundef 2097152) #11
  %74 = shl nsw i64 %50, 1
  %75 = mul i64 %54, %74
  %76 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %75, i64 noundef 2097152) #11
  %77 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %75, i64 noundef 2097152) #11
  %78 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %75, i64 noundef 2097152) #11
  %79 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %75, i64 noundef 2097152) #11
  %80 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %75, i64 noundef 2097152) #11
  %81 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %75, i64 noundef 2097152) #11
  %82 = mul i64 %74, %53
  %83 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %82, i64 noundef 2097152) #11
  %84 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %82, i64 noundef 2097152) #11
  %85 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %75, i64 noundef 2097152) #11
  %86 = mul i32 %.010161057106410781103, %.0101510491055106610761105
  %87 = mul i32 %86, %.01014104410481056106510771104
  %88 = icmp sgt i32 %87, 0
  br i1 %88, label %.lr.ph.preheader, label %.preheader1114

.lr.ph.preheader:                                 ; preds = %49
  %wide.trip.count = zext nneg i32 %87 to i64
  br label %.lr.ph

.preheader1114:                                   ; preds = %.lr.ph, %49
  %89 = mul nsw i32 %.010161057106410781103, %.01014104410481056106510771104
  %90 = icmp sgt i32 %89, 0
  br i1 %90, label %.lr.ph1118.preheader, label %.preheader.preheader

.lr.ph1118.preheader:                             ; preds = %.preheader1114
  %wide.trip.count1167 = zext nneg i32 %89 to i64
  br label %.lr.ph1118

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %.lr.ph ]
  %91 = call double @libxsmm_rng_f64() #11
  %92 = fptrunc double %91 to float
  %93 = getelementptr inbounds float, ptr %56, i64 %indvars.iv
  store float %92, ptr %93, align 4, !tbaa !9
  %94 = call double @libxsmm_rng_f64() #11
  %95 = fptrunc double %94 to float
  %96 = getelementptr inbounds float, ptr %57, i64 %indvars.iv
  store float %95, ptr %96, align 4, !tbaa !9
  %97 = getelementptr inbounds float, ptr %72, i64 %indvars.iv
  store float %95, ptr %97, align 4, !tbaa !9
  %98 = call double @libxsmm_rng_f64() #11
  %99 = fptrunc double %98 to float
  %100 = getelementptr inbounds float, ptr %58, i64 %indvars.iv
  store float %99, ptr %100, align 4, !tbaa !9
  %101 = call double @libxsmm_rng_f64() #11
  %102 = fptrunc double %101 to float
  %103 = getelementptr inbounds float, ptr %59, i64 %indvars.iv
  store float %102, ptr %103, align 4, !tbaa !9
  %104 = load float, ptr %100, align 4, !tbaa !9
  %105 = getelementptr inbounds float, ptr %63, i64 %indvars.iv
  store float %104, ptr %105, align 4, !tbaa !9
  %106 = getelementptr inbounds float, ptr %64, i64 %indvars.iv
  store float %102, ptr %106, align 4, !tbaa !9
  %107 = getelementptr inbounds i16, ptr %76, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %93, ptr noundef %107, i64 noundef 1) #11
  %108 = getelementptr inbounds i16, ptr %77, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %96, ptr noundef %108, i64 noundef 1) #11
  %109 = getelementptr inbounds i16, ptr %85, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %97, ptr noundef %109, i64 noundef 1) #11
  %110 = getelementptr inbounds i16, ptr %79, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %103, ptr noundef %110, i64 noundef 1) #11
  %111 = getelementptr inbounds i16, ptr %81, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %106, ptr noundef %111, i64 noundef 1) #11
  %112 = getelementptr inbounds i16, ptr %78, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %100, ptr noundef %112, i64 noundef 1) #11
  %113 = getelementptr inbounds i16, ptr %80, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %105, ptr noundef %113, i64 noundef 1) #11
  %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 %.preheader1114, label %.lr.ph, !llvm.loop !11

.lr.ph1118:                                       ; preds = %.lr.ph1118.preheader, %.lr.ph1118
  %indvars.iv1164 = phi i64 [ 0, %.lr.ph1118.preheader ], [ %indvars.iv.next1165, %.lr.ph1118 ]
  %114 = call double @libxsmm_rng_f64() #11
  %115 = fptrunc double %114 to float
  %116 = getelementptr inbounds float, ptr %67, i64 %indvars.iv1164
  store float %115, ptr %116, align 4, !tbaa !9
  %117 = call double @libxsmm_rng_f64() #11
  %118 = fptrunc double %117 to float
  %119 = getelementptr inbounds float, ptr %68, i64 %indvars.iv1164
  store float %118, ptr %119, align 4, !tbaa !9
  %120 = call double @libxsmm_rng_f64() #11
  %121 = fptrunc double %120 to float
  %122 = getelementptr inbounds float, ptr %62, i64 %indvars.iv1164
  store float %121, ptr %122, align 4, !tbaa !9
  %123 = call double @libxsmm_rng_f64() #11
  %124 = fptrunc double %123 to float
  %125 = getelementptr inbounds float, ptr %61, i64 %indvars.iv1164
  store float %124, ptr %125, align 4, !tbaa !9
  %126 = load float, ptr %122, align 4, !tbaa !9
  %127 = getelementptr inbounds float, ptr %66, i64 %indvars.iv1164
  store float %126, ptr %127, align 4, !tbaa !9
  %128 = getelementptr inbounds float, ptr %65, i64 %indvars.iv1164
  store float %124, ptr %128, align 4, !tbaa !9
  %129 = getelementptr inbounds i16, ptr %83, i64 %indvars.iv1164
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %116, ptr noundef %129, i64 noundef 1) #11
  %130 = getelementptr inbounds i16, ptr %84, i64 %indvars.iv1164
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %119, ptr noundef %130, i64 noundef 1) #11
  %indvars.iv.next1165 = add nuw nsw i64 %indvars.iv1164, 1
  %exitcond1168.not = icmp eq i64 %indvars.iv.next1165, %wide.trip.count1167
  br i1 %exitcond1168.not, label %.preheader.preheader, label %.lr.ph1118, !llvm.loop !13

.preheader.preheader:                             ; preds = %.lr.ph1118, %.preheader1114
  br label %.preheader

.preheader:                                       ; preds = %.preheader.preheader, %.preheader
  %indvars.iv1169 = phi i64 [ %indvars.iv.next1170, %.preheader ], [ 0, %.preheader.preheader ]
  %131 = call double @libxsmm_rng_f64() #11
  %132 = fptrunc double %131 to float
  %133 = getelementptr inbounds float, ptr %73, i64 %indvars.iv1169
  store float %132, ptr %133, align 4, !tbaa !9
  %indvars.iv.next1170 = add nuw nsw i64 %indvars.iv1169, 1
  %exitcond1172.not = icmp eq i64 %indvars.iv.next1170, 1048576
  br i1 %exitcond1172.not, label %134, label %.preheader, !llvm.loop !14

134:                                              ; preds = %.preheader
  %135 = and i32 %.0101910791102, 1
  %.not1041 = icmp eq i32 %135, 0
  br i1 %.not1041, label %263, label %136

136:                                              ; preds = %134
  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %6) #11
  call void @libxsmm_create_meltw_unary_shape(ptr dead_on_unwind nonnull writable sret(%struct.libxsmm_meltw_unary_shape) align 4 %6, i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.010161057106410781103, i32 noundef %.01020, i32 noundef 1, i32 noundef 1) #11
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %4, ptr noundef nonnull align 8 dereferenceable(28) %6, i64 28, i1 false), !tbaa.struct !15
  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %6) #11
  %137 = call ptr @libxsmm_dispatch_meltw_unary(i32 noundef 20, ptr noundef nonnull byval(%struct.libxsmm_meltw_unary_shape) align 8 %4, i32 noundef 16) #11
  %138 = call i32 @libxsmm_get_kernel_info(ptr noundef %137, ptr noundef nonnull @info) #11
  %139 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %139, ptr @is_reference_kernel, align 4, !tbaa !16
  %140 = icmp eq ptr %137, null
  br i1 %140, label %141, label %144

141:                                              ; preds = %136
  %142 = load ptr, ptr @stderr, align 8, !tbaa !5
  %143 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %142, ptr noundef nonnull @.str.5) #14
  call void @exit(i32 noundef -1) #13
  unreachable

144:                                              ; preds = %136
  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %7) #11
  call void @libxsmm_create_meltw_unary_shape(ptr dead_on_unwind nonnull writable sret(%struct.libxsmm_meltw_unary_shape) align 4 %7, i32 noundef %.010161057106410781103, i32 noundef 1, i32 noundef %.010161057106410781103, i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %3, ptr noundef nonnull align 8 dereferenceable(28) %7, i64 28, i1 false), !tbaa.struct !15
  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %7) #11
  %145 = call ptr @libxsmm_dispatch_meltw_unary(i32 noundef 18, ptr noundef nonnull byval(%struct.libxsmm_meltw_unary_shape) align 8 %3, i32 noundef 32) #11
  %146 = call i32 @libxsmm_get_kernel_info(ptr noundef %145, ptr noundef nonnull @info) #11
  %147 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %147, ptr @is_reference_kernel, align 4, !tbaa !16
  %148 = icmp eq ptr %145, null
  br i1 %148, label %149, label %152

149:                                              ; preds = %144
  %150 = load ptr, ptr @stderr, align 8, !tbaa !5
  %151 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %150, ptr noundef nonnull @.str.6) #14
  call void @exit(i32 noundef -1) #13
  unreachable

152:                                              ; preds = %144
  %153 = call i32 @libxsmm_meqn_create() #11
  %154 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %153, i32 noundef -1) #11
  %155 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %154, i32 noundef 1, i32 noundef 1, i32 noundef 512) #11
  %156 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %154, i32 noundef 1, i32 noundef 1, i32 noundef 896) #11
  %157 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %158 = extractvalue { i64, i64 } %157, 0
  %159 = extractvalue { i64, i64 } %157, 1
  %160 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %153, i32 noundef 0) #11
  %161 = call i32 @libxsmm_meqn_push_back_arg(i64 %160, i64 %158, i64 %159, i64 %9, i64 %10) #11
  %162 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %163 = extractvalue { i64, i64 } %162, 0
  %164 = extractvalue { i64, i64 } %162, 1
  %165 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %153, i32 noundef 1) #11
  %166 = call i32 @libxsmm_meqn_push_back_arg(i64 %165, i64 %163, i64 %164, i64 %9, i64 %10) #11
  %167 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %168 = extractvalue { i64, i64 } %167, 0
  %169 = extractvalue { i64, i64 } %167, 1
  %170 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %153, i32 noundef 2) #11
  %171 = call i32 @libxsmm_meqn_push_back_arg(i64 %170, i64 %168, i64 %169, i64 %9, i64 %10) #11
  %172 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef %.01020) #11
  %173 = extractvalue { i64, i64 } %172, 0
  %174 = extractvalue { i64, i64 } %172, 1
  %175 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %153, i32 noundef 3) #11
  %176 = call i32 @libxsmm_meqn_push_back_arg(i64 %175, i64 %173, i64 %174, i64 %9, i64 %10) #11
  %177 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef %.01020) #11
  %178 = extractvalue { i64, i64 } %177, 0
  %179 = extractvalue { i64, i64 } %177, 1
  %180 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %153, i32 noundef 4) #11
  %181 = call i32 @libxsmm_meqn_push_back_arg(i64 %180, i64 %178, i64 %179, i64 %9, i64 %10) #11
  %182 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %183 = extractvalue { i64, i64 } %182, 0
  %184 = extractvalue { i64, i64 } %182, 1
  %185 = call ptr @libxsmm_dispatch_meqn(i32 noundef %153, i64 %183, i64 %184) #11
  %186 = call i32 @libxsmm_get_kernel_info(ptr noundef %185, ptr noundef nonnull @info) #11
  %187 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %187, ptr @is_reference_kernel, align 4, !tbaa !16
  %188 = icmp eq ptr %185, null
  br i1 %188, label %189, label %192

189:                                              ; preds = %152
  %190 = load ptr, ptr @stderr, align 8, !tbaa !5
  %191 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %190, ptr noundef nonnull @.str.7) #14
  call void @exit(i32 noundef -1) #13
  unreachable

192:                                              ; preds = %152
  br i1 %40, label %204, label %193

193:                                              ; preds = %192
  %194 = icmp eq i32 %.01018106710751106, 1
  br i1 %194, label %195, label %.thread1081

195:                                              ; preds = %193
  call void @vectorized_layernorm_fwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %76, ptr noundef %83, ptr noundef %84, ptr noundef %70, ptr noundef %71, ptr noundef %77, float noundef 0x3E80000000000000)
  call void @tpp_layernorm_fwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %76, ptr noundef %83, ptr noundef %84, ptr noundef %70, ptr noundef %71, ptr noundef %85, float noundef 0x3E80000000000000, ptr noundef nonnull %185, ptr noundef nonnull %145, ptr noundef nonnull %137)
  br i1 %88, label %.lr.ph1122.preheader, label %.thread1081

.lr.ph1122.preheader:                             ; preds = %195
  %wide.trip.count1176 = zext nneg i32 %87 to i64
  br label %.lr.ph1122

.lr.ph1122:                                       ; preds = %.lr.ph1122.preheader, %.lr.ph1122
  %indvars.iv1173 = phi i64 [ 0, %.lr.ph1122.preheader ], [ %indvars.iv.next1174, %.lr.ph1122 ]
  %196 = getelementptr inbounds i16, ptr %77, i64 %indvars.iv1173
  %197 = load i16, ptr %196, align 2, !tbaa !21
  %198 = call float @upconvert_bf16(i16 noundef zeroext %197)
  %199 = getelementptr inbounds float, ptr %57, i64 %indvars.iv1173
  store float %198, ptr %199, align 4, !tbaa !9
  %200 = getelementptr inbounds i16, ptr %85, i64 %indvars.iv1173
  %201 = load i16, ptr %200, align 2, !tbaa !21
  %202 = call float @upconvert_bf16(i16 noundef zeroext %201)
  %203 = getelementptr inbounds float, ptr %72, i64 %indvars.iv1173
  store float %202, ptr %203, align 4, !tbaa !9
  %indvars.iv.next1174 = add nuw nsw i64 %indvars.iv1173, 1
  %exitcond1177.not = icmp eq i64 %indvars.iv.next1174, %wide.trip.count1176
  br i1 %exitcond1177.not, label %.thread1081, label %.lr.ph1122, !llvm.loop !23

204:                                              ; preds = %192
  call void @vectorized_layernorm_fwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %56, ptr noundef %67, ptr noundef %68, ptr noundef %70, ptr noundef %71, ptr noundef %57, float noundef 0x3E80000000000000)
  call void @tpp_layernorm_fwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %56, ptr noundef %67, ptr noundef %68, ptr noundef %70, ptr noundef %71, ptr noundef %72, float noundef 0x3E80000000000000, ptr noundef nonnull %185, ptr noundef nonnull %145, ptr noundef nonnull %137)
  br label %.thread1081

.thread1081:                                      ; preds = %.lr.ph1122, %193, %195, %204
  %.str.10.sink = phi ptr [ @.str.9, %204 ], [ @.str.10, %195 ], [ @.str.10, %193 ], [ @.str.10, %.lr.ph1122 ]
  %205 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8)
  %206 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.10.sink)
  %207 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8)
  %208 = call i32 @libxsmm_matdiff(ptr noundef nonnull %5, i32 noundef 1, i32 noundef %87, i32 noundef 1, ptr noundef %57, ptr noundef %72, ptr noundef null, ptr noundef null) #11
  %209 = getelementptr inbounds i8, ptr %5, i64 80
  %210 = load double, ptr %209, align 8, !tbaa !24
  %211 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, double noundef %210)
  %212 = getelementptr inbounds i8, ptr %5, i64 120
  %213 = load double, ptr %212, align 8, !tbaa !27
  %214 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, double noundef %213)
  %215 = getelementptr inbounds i8, ptr %5, i64 56
  %216 = load double, ptr %215, align 8, !tbaa !28
  %217 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, double noundef %216)
  %218 = getelementptr inbounds i8, ptr %5, i64 64
  %219 = load double, ptr %218, align 8, !tbaa !29
  %220 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14, double noundef %219)
  %221 = getelementptr inbounds i8, ptr %5, i64 40
  %222 = load double, ptr %221, align 8, !tbaa !30
  %223 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, double noundef %222)
  %224 = getelementptr inbounds i8, ptr %5, i64 48
  %225 = load double, ptr %224, align 8, !tbaa !31
  %226 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, double noundef %225)
  %227 = getelementptr inbounds i8, ptr %5, i64 32
  %228 = load double, ptr %227, align 8, !tbaa !32
  %229 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17, double noundef %228)
  %230 = load double, ptr %227, align 8, !tbaa !32
  %231 = fcmp ogt double %230, %.0997
  %232 = icmp sgt i32 %.010171110, 0
  br i1 %232, label %233, label %263

233:                                              ; preds = %.thread1081
  br i1 %40, label %.lr.ph1133.preheader, label %247

.lr.ph1133.preheader:                             ; preds = %233
  call void @vectorized_layernorm_fwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %56, ptr noundef %67, ptr noundef %68, ptr noundef %70, ptr noundef %71, ptr noundef %57, float noundef 0x3E80000000000000)
  %234 = call i64 @libxsmm_timer_tick() #11
  br label %.lr.ph1133

.lr.ph1133:                                       ; preds = %.lr.ph1133.preheader, %.lr.ph1133
  %.010041131 = phi i32 [ %235, %.lr.ph1133 ], [ 0, %.lr.ph1133.preheader ]
  call void @vectorized_layernorm_fwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %56, ptr noundef %67, ptr noundef %68, ptr noundef %70, ptr noundef %71, ptr noundef %57, float noundef 0x3E80000000000000)
  %235 = add nuw nsw i32 %.010041131, 1
  %exitcond1180.not = icmp eq i32 %235, %.010171110
  br i1 %exitcond1180.not, label %.lr.ph1137.preheader, label %.lr.ph1133, !llvm.loop !33

.lr.ph1137.preheader:                             ; preds = %.lr.ph1133
  %236 = call i64 @libxsmm_timer_tick() #11
  %237 = call double @libxsmm_timer_duration(i64 noundef %234, i64 noundef %236) #11
  %238 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef %237)
  call void @tpp_layernorm_fwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %56, ptr noundef %67, ptr noundef %68, ptr noundef %70, ptr noundef %71, ptr noundef %72, float noundef 0x3E80000000000000, ptr noundef nonnull %185, ptr noundef nonnull %145, ptr noundef nonnull %137)
  %239 = call i64 @libxsmm_timer_tick() #11
  %smax1181 = call i32 @llvm.smax.i32(i32 %.010171110, i32 1)
  br label %.lr.ph1137

.lr.ph1137:                                       ; preds = %.lr.ph1137.preheader, %.lr.ph1137
  %.110051135 = phi i32 [ %240, %.lr.ph1137 ], [ 0, %.lr.ph1137.preheader ]
  call void @tpp_layernorm_fwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %56, ptr noundef %67, ptr noundef %68, ptr noundef %70, ptr noundef %71, ptr noundef %72, float noundef 0x3E80000000000000, ptr noundef nonnull %185, ptr noundef nonnull %145, ptr noundef nonnull %137)
  %240 = add nuw nsw i32 %.110051135, 1
  %exitcond1182.not = icmp eq i32 %240, %smax1181
  br i1 %exitcond1182.not, label %._crit_edge1138, label %.lr.ph1137, !llvm.loop !34

._crit_edge1138:                                  ; preds = %.lr.ph1137
  %241 = call i64 @libxsmm_timer_tick() #11
  %242 = call double @libxsmm_timer_duration(i64 noundef %239, i64 noundef %241) #11
  %243 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19, double noundef %242)
  %244 = fcmp ogt double %242, 0.000000e+00
  br i1 %244, label %245, label %263

245:                                              ; preds = %._crit_edge1138
  %246 = fdiv double %237, %242
  br label %.sink.split

247:                                              ; preds = %233
  %248 = icmp eq i32 %.01018106710751106, 1
  br i1 %248, label %.lr.ph1125.preheader, label %263

.lr.ph1125.preheader:                             ; preds = %247
  call void @vectorized_layernorm_fwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %76, ptr noundef %83, ptr noundef %84, ptr noundef %70, ptr noundef %71, ptr noundef %77, float noundef 0x3E80000000000000)
  %249 = call i64 @libxsmm_timer_tick() #11
  br label %.lr.ph1125

.lr.ph1125:                                       ; preds = %.lr.ph1125.preheader, %.lr.ph1125
  %.210061123 = phi i32 [ %250, %.lr.ph1125 ], [ 0, %.lr.ph1125.preheader ]
  call void @vectorized_layernorm_fwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %76, ptr noundef %83, ptr noundef %84, ptr noundef %70, ptr noundef %71, ptr noundef %77, float noundef 0x3E80000000000000)
  %250 = add nuw nsw i32 %.210061123, 1
  %exitcond1178.not = icmp eq i32 %250, %.010171110
  br i1 %exitcond1178.not, label %.lr.ph1129.preheader, label %.lr.ph1125, !llvm.loop !35

.lr.ph1129.preheader:                             ; preds = %.lr.ph1125
  %251 = call i64 @libxsmm_timer_tick() #11
  %252 = call double @libxsmm_timer_duration(i64 noundef %249, i64 noundef %251) #11
  %253 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef %252)
  call void @tpp_layernorm_fwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %76, ptr noundef %83, ptr noundef %84, ptr noundef %70, ptr noundef %71, ptr noundef %85, float noundef 0x3E80000000000000, ptr noundef nonnull %185, ptr noundef nonnull %145, ptr noundef nonnull %137)
  %254 = call i64 @libxsmm_timer_tick() #11
  %smax = call i32 @llvm.smax.i32(i32 %.010171110, i32 1)
  br label %.lr.ph1129

.lr.ph1129:                                       ; preds = %.lr.ph1129.preheader, %.lr.ph1129
  %.310071127 = phi i32 [ %255, %.lr.ph1129 ], [ 0, %.lr.ph1129.preheader ]
  call void @tpp_layernorm_fwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %76, ptr noundef %83, ptr noundef %84, ptr noundef %70, ptr noundef %71, ptr noundef %85, float noundef 0x3E80000000000000, ptr noundef nonnull %185, ptr noundef nonnull %145, ptr noundef nonnull %137)
  %255 = add nuw nsw i32 %.310071127, 1
  %exitcond1179.not = icmp eq i32 %255, %smax
  br i1 %exitcond1179.not, label %._crit_edge1130, label %.lr.ph1129, !llvm.loop !36

._crit_edge1130:                                  ; preds = %.lr.ph1129
  %256 = call i64 @libxsmm_timer_tick() #11
  %257 = call double @libxsmm_timer_duration(i64 noundef %254, i64 noundef %256) #11
  %258 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19, double noundef %257)
  %259 = fcmp ogt double %257, 0.000000e+00
  br i1 %259, label %260, label %263

260:                                              ; preds = %._crit_edge1130
  %261 = fdiv double %252, %257
  br label %.sink.split

.sink.split:                                      ; preds = %245, %260
  %.sink = phi double [ %261, %260 ], [ %246, %245 ]
  %.01012.ph = phi double [ %257, %260 ], [ %242, %245 ]
  %.01010.ph = phi double [ %252, %260 ], [ %237, %245 ]
  %262 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.20, double noundef %.sink)
  br label %263

263:                                              ; preds = %.sink.split, %.thread1081, %247, %._crit_edge1130, %._crit_edge1138, %134
  %264 = phi i1 [ true, %._crit_edge1138 ], [ false, %._crit_edge1130 ], [ false, %247 ], [ %40, %.thread1081 ], [ %40, %134 ], [ %40, %.sink.split ]
  %.01012 = phi double [ %242, %._crit_edge1138 ], [ %257, %._crit_edge1130 ], [ 0.000000e+00, %247 ], [ 0.000000e+00, %.thread1081 ], [ 0.000000e+00, %134 ], [ %.01012.ph, %.sink.split ]
  %.01010 = phi double [ %237, %._crit_edge1138 ], [ %252, %._crit_edge1130 ], [ 0.000000e+00, %247 ], [ 0.000000e+00, %.thread1081 ], [ 0.000000e+00, %134 ], [ %.01010.ph, %.sink.split ]
  %.1.shrunk = phi i1 [ %231, %._crit_edge1138 ], [ %231, %._crit_edge1130 ], [ %231, %247 ], [ %231, %.thread1081 ], [ false, %134 ], [ %231, %.sink.split ]
  %.1 = zext i1 %.1.shrunk to i32
  %265 = and i32 %.0101910791102, 2
  %.not1042 = icmp eq i32 %265, 0
  br i1 %.not1042, label %550, label %266

266:                                              ; preds = %263
  %267 = icmp sgt i32 %.0101510491055106610761105, 0
  br i1 %267, label %.lr.ph1141.preheader, label %._crit_edge1142

.lr.ph1141.preheader:                             ; preds = %266
  %wide.trip.count1186 = zext nneg i32 %.0101510491055106610761105 to i64
  br label %.lr.ph1141

.lr.ph1141:                                       ; preds = %.lr.ph1141.preheader, %.lr.ph1141
  %indvars.iv1183 = phi i64 [ 0, %.lr.ph1141.preheader ], [ %indvars.iv.next1184, %.lr.ph1141 ]
  %268 = call double @libxsmm_rng_f64() #11
  %269 = fptrunc double %268 to float
  %270 = getelementptr inbounds float, ptr %70, i64 %indvars.iv1183
  store float %269, ptr %270, align 4, !tbaa !9
  %271 = call double @libxsmm_rng_f64() #11
  %272 = fptrunc double %271 to float
  %273 = getelementptr inbounds float, ptr %71, i64 %indvars.iv1183
  store float %272, ptr %273, align 4, !tbaa !9
  %indvars.iv.next1184 = add nuw nsw i64 %indvars.iv1183, 1
  %exitcond1187.not = icmp eq i64 %indvars.iv.next1184, %wide.trip.count1186
  br i1 %exitcond1187.not, label %._crit_edge1142, label %.lr.ph1141, !llvm.loop !37

._crit_edge1142:                                  ; preds = %.lr.ph1141, %266
  %274 = call i32 @libxsmm_meqn_create() #11
  %275 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %274, i32 noundef -1) #11
  %276 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %275, i32 noundef 1, i32 noundef 1, i32 noundef 512) #11
  %277 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %275, i32 noundef 1, i32 noundef 1, i32 noundef 896) #11
  %278 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %279 = extractvalue { i64, i64 } %278, 0
  %280 = extractvalue { i64, i64 } %278, 1
  %281 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %274, i32 noundef 0) #11
  %282 = call i32 @libxsmm_meqn_push_back_arg(i64 %281, i64 %279, i64 %280, i64 %9, i64 %10) #11
  %283 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %284 = extractvalue { i64, i64 } %283, 0
  %285 = extractvalue { i64, i64 } %283, 1
  %286 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %274, i32 noundef 1) #11
  %287 = call i32 @libxsmm_meqn_push_back_arg(i64 %286, i64 %284, i64 %285, i64 %9, i64 %10) #11
  %288 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %289 = extractvalue { i64, i64 } %288, 0
  %290 = extractvalue { i64, i64 } %288, 1
  %291 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %274, i32 noundef 2) #11
  %292 = call i32 @libxsmm_meqn_push_back_arg(i64 %291, i64 %289, i64 %290, i64 %9, i64 %10) #11
  %293 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %294 = extractvalue { i64, i64 } %293, 0
  %295 = extractvalue { i64, i64 } %293, 1
  %296 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %274, i32 noundef 3) #11
  %297 = call i32 @libxsmm_meqn_push_back_arg(i64 %296, i64 %294, i64 %295, i64 %9, i64 %10) #11
  %298 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef 1) #11
  %299 = extractvalue { i64, i64 } %298, 0
  %300 = extractvalue { i64, i64 } %298, 1
  %301 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %274, i32 noundef 4) #11
  %302 = call i32 @libxsmm_meqn_push_back_arg(i64 %301, i64 %299, i64 %300, i64 %9, i64 %10) #11
  %303 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef 1) #11
  %304 = extractvalue { i64, i64 } %303, 0
  %305 = extractvalue { i64, i64 } %303, 1
  %306 = call ptr @libxsmm_dispatch_meqn(i32 noundef %274, i64 %304, i64 %305) #11
  %307 = call i32 @libxsmm_get_kernel_info(ptr noundef %306, ptr noundef nonnull @info) #11
  %308 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %308, ptr @is_reference_kernel, align 4, !tbaa !16
  %309 = icmp eq ptr %306, null
  br i1 %309, label %310, label %313

310:                                              ; preds = %._crit_edge1142
  %311 = load ptr, ptr @stderr, align 8, !tbaa !5
  %312 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %311, ptr noundef nonnull @.str.21) #14
  call void @exit(i32 noundef -1) #13
  unreachable

313:                                              ; preds = %._crit_edge1142
  %314 = call i32 @libxsmm_meqn_create() #11
  %315 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %314, i32 noundef -1) #11
  %316 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %315, i32 noundef 1, i32 noundef 1, i32 noundef 0) #11
  %317 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %318 = extractvalue { i64, i64 } %317, 0
  %319 = extractvalue { i64, i64 } %317, 1
  %320 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %314, i32 noundef 3) #11
  %321 = call i32 @libxsmm_meqn_push_back_arg(i64 %320, i64 %318, i64 %319, i64 %9, i64 %10) #11
  %322 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef 1) #11
  %323 = extractvalue { i64, i64 } %322, 0
  %324 = extractvalue { i64, i64 } %322, 1
  %325 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %314, i32 noundef 5) #11
  %326 = call i32 @libxsmm_meqn_push_back_arg(i64 %325, i64 %323, i64 %324, i64 %9, i64 %10) #11
  %327 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef 1) #11
  %328 = extractvalue { i64, i64 } %327, 0
  %329 = extractvalue { i64, i64 } %327, 1
  %330 = call ptr @libxsmm_dispatch_meqn(i32 noundef %314, i64 %328, i64 %329) #11
  %331 = call i32 @libxsmm_get_kernel_info(ptr noundef %330, ptr noundef nonnull @info) #11
  %332 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %332, ptr @is_reference_kernel, align 4, !tbaa !16
  %333 = icmp eq ptr %330, null
  br i1 %333, label %334, label %337

334:                                              ; preds = %313
  %335 = load ptr, ptr @stderr, align 8, !tbaa !5
  %336 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %335, ptr noundef nonnull @.str.22) #14
  call void @exit(i32 noundef -1) #13
  unreachable

337:                                              ; preds = %313
  %338 = call i32 @libxsmm_meqn_create() #11
  %339 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %338, i32 noundef -1) #11
  %340 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %339, i32 noundef 7, i32 noundef 1, i32 noundef 0) #11
  %341 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %342 = extractvalue { i64, i64 } %341, 0
  %343 = extractvalue { i64, i64 } %341, 1
  %344 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %338, i32 noundef 3) #11
  %345 = call i32 @libxsmm_meqn_push_back_arg(i64 %344, i64 %342, i64 %343, i64 %9, i64 %10) #11
  %346 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef %.01020) #11
  %347 = extractvalue { i64, i64 } %346, 0
  %348 = extractvalue { i64, i64 } %346, 1
  %349 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %338, i32 noundef 6) #11
  %350 = call i32 @libxsmm_meqn_push_back_arg(i64 %349, i64 %347, i64 %348, i64 %9, i64 %10) #11
  %351 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %352 = extractvalue { i64, i64 } %351, 0
  %353 = extractvalue { i64, i64 } %351, 1
  %354 = call ptr @libxsmm_dispatch_meqn(i32 noundef %338, i64 %352, i64 %353) #11
  %355 = call i32 @libxsmm_get_kernel_info(ptr noundef %354, ptr noundef nonnull @info) #11
  %356 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %356, ptr @is_reference_kernel, align 4, !tbaa !16
  %357 = icmp eq ptr %354, null
  br i1 %357, label %358, label %361

358:                                              ; preds = %337
  %359 = load ptr, ptr @stderr, align 8, !tbaa !5
  %360 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %359, ptr noundef nonnull @.str.23) #14
  call void @exit(i32 noundef -1) #13
  unreachable

361:                                              ; preds = %337
  %362 = call i32 @libxsmm_meqn_create() #11
  %363 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %362, i32 noundef -1) #11
  %364 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %363, i32 noundef 7, i32 noundef 1, i32 noundef 0) #11
  %365 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %363, i32 noundef 2, i32 noundef 1, i32 noundef 0) #11
  %366 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %367 = extractvalue { i64, i64 } %366, 0
  %368 = extractvalue { i64, i64 } %366, 1
  %369 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %362, i32 noundef 3) #11
  %370 = call i32 @libxsmm_meqn_push_back_arg(i64 %369, i64 %367, i64 %368, i64 %9, i64 %10) #11
  %371 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef %.01020) #11
  %372 = extractvalue { i64, i64 } %371, 0
  %373 = extractvalue { i64, i64 } %371, 1
  %374 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %362, i32 noundef 6) #11
  %375 = call i32 @libxsmm_meqn_push_back_arg(i64 %374, i64 %372, i64 %373, i64 %9, i64 %10) #11
  %376 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %377 = extractvalue { i64, i64 } %376, 0
  %378 = extractvalue { i64, i64 } %376, 1
  %379 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %362, i32 noundef 0) #11
  %380 = call i32 @libxsmm_meqn_push_back_arg(i64 %379, i64 %377, i64 %378, i64 %9, i64 %10) #11
  %381 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %382 = extractvalue { i64, i64 } %381, 0
  %383 = extractvalue { i64, i64 } %381, 1
  %384 = call ptr @libxsmm_dispatch_meqn(i32 noundef %362, i64 %382, i64 %383) #11
  %385 = call i32 @libxsmm_get_kernel_info(ptr noundef %384, ptr noundef nonnull @info) #11
  %386 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %386, ptr @is_reference_kernel, align 4, !tbaa !16
  %387 = icmp eq ptr %384, null
  br i1 %387, label %388, label %391

388:                                              ; preds = %361
  %389 = load ptr, ptr @stderr, align 8, !tbaa !5
  %390 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %389, ptr noundef nonnull @.str.24) #14
  call void @exit(i32 noundef -1) #13
  unreachable

391:                                              ; preds = %361
  %392 = call i32 @libxsmm_meqn_create() #11
  %393 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %392, i32 noundef -1) #11
  %394 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %393, i32 noundef 1, i32 noundef 1, i32 noundef 512) #11
  %395 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %393, i32 noundef 2, i32 noundef 1, i32 noundef 32) #11
  %396 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %.010161057106410781103, i32 noundef %.01020) #11
  %397 = extractvalue { i64, i64 } %396, 0
  %398 = extractvalue { i64, i64 } %396, 1
  %399 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %392, i32 noundef 6) #11
  %400 = call i32 @libxsmm_meqn_push_back_arg(i64 %399, i64 %397, i64 %398, i64 %9, i64 %10) #11
  %401 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %402 = extractvalue { i64, i64 } %401, 0
  %403 = extractvalue { i64, i64 } %401, 1
  %404 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %392, i32 noundef 1) #11
  %405 = call i32 @libxsmm_meqn_push_back_arg(i64 %404, i64 %402, i64 %403, i64 %9, i64 %10) #11
  %406 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %407 = extractvalue { i64, i64 } %406, 0
  %408 = extractvalue { i64, i64 } %406, 1
  %409 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %392, i32 noundef 3) #11
  %410 = call i32 @libxsmm_meqn_push_back_arg(i64 %409, i64 %407, i64 %408, i64 %9, i64 %10) #11
  %411 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %393, i32 noundef 1, i32 noundef 1, i32 noundef 896) #11
  %412 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %413 = extractvalue { i64, i64 } %412, 0
  %414 = extractvalue { i64, i64 } %412, 1
  %415 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %392, i32 noundef 0) #11
  %416 = call i32 @libxsmm_meqn_push_back_arg(i64 %415, i64 %413, i64 %414, i64 %9, i64 %10) #11
  %417 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %418 = extractvalue { i64, i64 } %417, 0
  %419 = extractvalue { i64, i64 } %417, 1
  %420 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %392, i32 noundef 2) #11
  %421 = call i32 @libxsmm_meqn_push_back_arg(i64 %420, i64 %418, i64 %419, i64 %9, i64 %10) #11
  %422 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef 1, i32 noundef 1, i32 noundef 1, i32 noundef 1) #11
  %423 = extractvalue { i64, i64 } %422, 0
  %424 = extractvalue { i64, i64 } %422, 1
  %425 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %392, i32 noundef 7) #11
  %426 = call i32 @libxsmm_meqn_push_back_arg(i64 %425, i64 %423, i64 %424, i64 %9, i64 %10) #11
  %427 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.010161057106410781103, i32 noundef %.01014104410481056106510771104, i32 noundef %86, i32 noundef %.01020) #11
  %428 = extractvalue { i64, i64 } %427, 0
  %429 = extractvalue { i64, i64 } %427, 1
  %430 = call ptr @libxsmm_dispatch_meqn(i32 noundef %392, i64 %428, i64 %429) #11
  %431 = call i32 @libxsmm_get_kernel_info(ptr noundef %430, ptr noundef nonnull @info) #11
  %432 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !18
  store i32 %432, ptr @is_reference_kernel, align 4, !tbaa !16
  %433 = icmp eq ptr %430, null
  br i1 %433, label %434, label %437

434:                                              ; preds = %391
  %435 = load ptr, ptr @stderr, align 8, !tbaa !5
  %436 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %435, ptr noundef nonnull @.str.25) #14
  call void @exit(i32 noundef -1) #13
  unreachable

437:                                              ; preds = %391
  br i1 %264, label %449, label %438

438:                                              ; preds = %437
  %439 = icmp eq i32 %.01018106710751106, 1
  br i1 %439, label %440, label %.thread1083

440:                                              ; preds = %438
  call void @vectorized_layernorm_bwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %79, ptr noundef %76, ptr noundef %70, ptr noundef %71, ptr noundef %83, ptr noundef %78, ptr noundef %61, ptr noundef %62)
  call void @tpp_layernorm_bwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %81, ptr noundef %76, ptr noundef %70, ptr noundef %71, ptr noundef %83, ptr noundef %80, ptr noundef %65, ptr noundef %66, ptr noundef nonnull %306, ptr noundef nonnull %330, ptr noundef nonnull %354, ptr noundef nonnull %384, ptr noundef nonnull %430)
  br i1 %88, label %.lr.ph1145.preheader, label %.thread1083

.lr.ph1145.preheader:                             ; preds = %440
  %wide.trip.count1191 = zext nneg i32 %87 to i64
  br label %.lr.ph1145

.lr.ph1145:                                       ; preds = %.lr.ph1145.preheader, %.lr.ph1145
  %indvars.iv1188 = phi i64 [ 0, %.lr.ph1145.preheader ], [ %indvars.iv.next1189, %.lr.ph1145 ]
  %441 = getelementptr inbounds i16, ptr %78, i64 %indvars.iv1188
  %442 = load i16, ptr %441, align 2, !tbaa !21
  %443 = call float @upconvert_bf16(i16 noundef zeroext %442)
  %444 = getelementptr inbounds float, ptr %58, i64 %indvars.iv1188
  store float %443, ptr %444, align 4, !tbaa !9
  %445 = getelementptr inbounds i16, ptr %80, i64 %indvars.iv1188
  %446 = load i16, ptr %445, align 2, !tbaa !21
  %447 = call float @upconvert_bf16(i16 noundef zeroext %446)
  %448 = getelementptr inbounds float, ptr %63, i64 %indvars.iv1188
  store float %447, ptr %448, align 4, !tbaa !9
  %indvars.iv.next1189 = add nuw nsw i64 %indvars.iv1188, 1
  %exitcond1192.not = icmp eq i64 %indvars.iv.next1189, %wide.trip.count1191
  br i1 %exitcond1192.not, label %.thread1083, label %.lr.ph1145, !llvm.loop !38

449:                                              ; preds = %437
  call void @vectorized_layernorm_bwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %59, ptr noundef %56, ptr noundef %70, ptr noundef %71, ptr noundef %67, ptr noundef %58, ptr noundef %61, ptr noundef %62)
  call void @tpp_layernorm_bwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %64, ptr noundef %56, ptr noundef %70, ptr noundef %71, ptr noundef %67, ptr noundef %63, ptr noundef %65, ptr noundef %66, ptr noundef nonnull %306, ptr noundef nonnull %330, ptr noundef nonnull %354, ptr noundef nonnull %384, ptr noundef nonnull %430)
  br label %.thread1083

.thread1083:                                      ; preds = %.lr.ph1145, %438, %440, %449
  %.str.32.sink = phi ptr [ @.str.31, %449 ], [ @.str.32, %440 ], [ @.str.32, %438 ], [ @.str.32, %.lr.ph1145 ]
  %.str.29..str.30 = phi ptr [ @.str.29, %449 ], [ @.str.30, %440 ], [ @.str.30, %438 ], [ @.str.30, %.lr.ph1145 ]
  %.str.27.sink = phi ptr [ @.str.26, %449 ], [ @.str.27, %440 ], [ @.str.27, %438 ], [ @.str.27, %.lr.ph1145 ]
  %450 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8)
  %451 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.27.sink)
  %452 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8)
  %453 = call i32 @libxsmm_matdiff(ptr noundef nonnull %5, i32 noundef 1, i32 noundef %87, i32 noundef 1, ptr noundef %58, ptr noundef %63, ptr noundef null, ptr noundef null) #11
  %454 = getelementptr inbounds i8, ptr %5, i64 80
  %455 = load double, ptr %454, align 8, !tbaa !24
  %456 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, double noundef %455)
  %457 = getelementptr inbounds i8, ptr %5, i64 120
  %458 = load double, ptr %457, align 8, !tbaa !27
  %459 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, double noundef %458)
  %460 = getelementptr inbounds i8, ptr %5, i64 56
  %461 = load double, ptr %460, align 8, !tbaa !28
  %462 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, double noundef %461)
  %463 = getelementptr inbounds i8, ptr %5, i64 64
  %464 = load double, ptr %463, align 8, !tbaa !29
  %465 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14, double noundef %464)
  %466 = getelementptr inbounds i8, ptr %5, i64 40
  %467 = load double, ptr %466, align 8, !tbaa !30
  %468 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, double noundef %467)
  %469 = getelementptr inbounds i8, ptr %5, i64 48
  %470 = load double, ptr %469, align 8, !tbaa !31
  %471 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, double noundef %470)
  %472 = getelementptr inbounds i8, ptr %5, i64 32
  %473 = load double, ptr %472, align 8, !tbaa !32
  %474 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17, double noundef %473)
  %475 = load double, ptr %472, align 8, !tbaa !32
  %476 = fcmp ogt double %475, %.0997
  %477 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.28)
  %478 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.29..str.30)
  %479 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.28)
  %480 = call i32 @libxsmm_matdiff(ptr noundef nonnull %5, i32 noundef 1, i32 noundef %89, i32 noundef 1, ptr noundef %62, ptr noundef %66, ptr noundef null, ptr noundef null) #11
  %481 = load double, ptr %454, align 8, !tbaa !24
  %482 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, double noundef %481)
  %483 = load double, ptr %457, align 8, !tbaa !27
  %484 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, double noundef %483)
  %485 = load double, ptr %460, align 8, !tbaa !28
  %486 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, double noundef %485)
  %487 = load double, ptr %463, align 8, !tbaa !29
  %488 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14, double noundef %487)
  %489 = load double, ptr %466, align 8, !tbaa !30
  %490 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, double noundef %489)
  %491 = load double, ptr %469, align 8, !tbaa !31
  %492 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, double noundef %491)
  %493 = load double, ptr %472, align 8, !tbaa !32
  %494 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17, double noundef %493)
  %495 = load double, ptr %472, align 8, !tbaa !32
  %496 = fcmp ogt double %495, %.0997
  %497 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8)
  %498 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.32.sink)
  %499 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8)
  %500 = call i32 @libxsmm_matdiff(ptr noundef nonnull %5, i32 noundef 1, i32 noundef %89, i32 noundef 1, ptr noundef %61, ptr noundef %65, ptr noundef null, ptr noundef null) #11
  %501 = load double, ptr %454, align 8, !tbaa !24
  %502 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, double noundef %501)
  %503 = load double, ptr %457, align 8, !tbaa !27
  %504 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, double noundef %503)
  %505 = load double, ptr %460, align 8, !tbaa !28
  %506 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, double noundef %505)
  %507 = load double, ptr %463, align 8, !tbaa !29
  %508 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14, double noundef %507)
  %509 = load double, ptr %466, align 8, !tbaa !30
  %510 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, double noundef %509)
  %511 = load double, ptr %469, align 8, !tbaa !31
  %512 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, double noundef %511)
  %513 = load double, ptr %472, align 8, !tbaa !32
  %514 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17, double noundef %513)
  %515 = load double, ptr %472, align 8, !tbaa !32
  %516 = fcmp ogt double %515, %.0997
  %517 = select i1 %516, i1 true, i1 %496
  %518 = select i1 %517, i1 true, i1 %476
  %.4 = select i1 %518, i32 1, i32 %.1
  %519 = icmp sgt i32 %.010171110, 0
  br i1 %519, label %520, label %.thread1092

520:                                              ; preds = %.thread1083
  br i1 %264, label %.lr.ph1157.preheader, label %534

.lr.ph1157.preheader:                             ; preds = %520
  call void @vectorized_layernorm_bwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %59, ptr noundef %56, ptr noundef %70, ptr noundef %71, ptr noundef %67, ptr noundef %58, ptr noundef %61, ptr noundef %62)
  %521 = call i64 @libxsmm_timer_tick() #11
  br label %.lr.ph1157

.lr.ph1157:                                       ; preds = %.lr.ph1157.preheader, %.lr.ph1157
  %.410081155 = phi i32 [ %522, %.lr.ph1157 ], [ 0, %.lr.ph1157.preheader ]
  call void @vectorized_layernorm_bwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %59, ptr noundef %56, ptr noundef %70, ptr noundef %71, ptr noundef %67, ptr noundef %58, ptr noundef %61, ptr noundef %62)
  %522 = add nuw nsw i32 %.410081155, 1
  %exitcond1196.not = icmp eq i32 %522, %.010171110
  br i1 %exitcond1196.not, label %.lr.ph1161.preheader, label %.lr.ph1157, !llvm.loop !39

.lr.ph1161.preheader:                             ; preds = %.lr.ph1157
  %523 = call i64 @libxsmm_timer_tick() #11
  %524 = call double @libxsmm_timer_duration(i64 noundef %521, i64 noundef %523) #11
  %525 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, double noundef %524)
  call void @tpp_layernorm_bwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %64, ptr noundef %56, ptr noundef %70, ptr noundef %71, ptr noundef %67, ptr noundef %63, ptr noundef %65, ptr noundef %66, ptr noundef nonnull %306, ptr noundef nonnull %330, ptr noundef nonnull %354, ptr noundef nonnull %384, ptr noundef nonnull %430)
  %526 = call i64 @libxsmm_timer_tick() #11
  %smax1197 = call i32 @llvm.smax.i32(i32 %.010171110, i32 1)
  br label %.lr.ph1161

.lr.ph1161:                                       ; preds = %.lr.ph1161.preheader, %.lr.ph1161
  %.510091159 = phi i32 [ %527, %.lr.ph1161 ], [ 0, %.lr.ph1161.preheader ]
  call void @tpp_layernorm_bwd_fp32(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %64, ptr noundef %56, ptr noundef %70, ptr noundef %71, ptr noundef %67, ptr noundef %63, ptr noundef %65, ptr noundef %66, ptr noundef nonnull %306, ptr noundef nonnull %330, ptr noundef nonnull %354, ptr noundef nonnull %384, ptr noundef nonnull %430)
  %527 = add nuw nsw i32 %.510091159, 1
  %exitcond1198.not = icmp eq i32 %527, %smax1197
  br i1 %exitcond1198.not, label %._crit_edge1162, label %.lr.ph1161, !llvm.loop !40

._crit_edge1162:                                  ; preds = %.lr.ph1161
  %528 = call i64 @libxsmm_timer_tick() #11
  %529 = call double @libxsmm_timer_duration(i64 noundef %526, i64 noundef %528) #11
  %530 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, double noundef %529)
  %531 = fcmp ogt double %529, 0.000000e+00
  br i1 %531, label %532, label %550

532:                                              ; preds = %._crit_edge1162
  %533 = fdiv double %524, %529
  br label %.sink.split1199

534:                                              ; preds = %520
  %535 = icmp eq i32 %.01018106710751106, 1
  br i1 %535, label %.lr.ph1149.preheader, label %.thread1084

.lr.ph1149.preheader:                             ; preds = %534
  call void @vectorized_layernorm_bwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %79, ptr noundef %76, ptr noundef %70, ptr noundef %71, ptr noundef %83, ptr noundef %78, ptr noundef %61, ptr noundef %62)
  %536 = call i64 @libxsmm_timer_tick() #11
  br label %.lr.ph1149

.lr.ph1149:                                       ; preds = %.lr.ph1149.preheader, %.lr.ph1149
  %.61147 = phi i32 [ %537, %.lr.ph1149 ], [ 0, %.lr.ph1149.preheader ]
  call void @vectorized_layernorm_bwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %79, ptr noundef %76, ptr noundef %70, ptr noundef %71, ptr noundef %83, ptr noundef %78, ptr noundef %61, ptr noundef %62)
  %537 = add nuw nsw i32 %.61147, 1
  %exitcond1193.not = icmp eq i32 %537, %.010171110
  br i1 %exitcond1193.not, label %.lr.ph1153.preheader, label %.lr.ph1149, !llvm.loop !41

.lr.ph1153.preheader:                             ; preds = %.lr.ph1149
  %538 = call i64 @libxsmm_timer_tick() #11
  %539 = call double @libxsmm_timer_duration(i64 noundef %536, i64 noundef %538) #11
  %540 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, double noundef %539)
  call void @tpp_layernorm_bwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %81, ptr noundef %76, ptr noundef %70, ptr noundef %71, ptr noundef %83, ptr noundef %80, ptr noundef %65, ptr noundef %66, ptr noundef nonnull %306, ptr noundef nonnull %330, ptr noundef nonnull %354, ptr noundef nonnull %384, ptr noundef nonnull %430)
  %541 = call i64 @libxsmm_timer_tick() #11
  %smax1194 = call i32 @llvm.smax.i32(i32 %.010171110, i32 1)
  br label %.lr.ph1153

.lr.ph1153:                                       ; preds = %.lr.ph1153.preheader, %.lr.ph1153
  %.71151 = phi i32 [ %542, %.lr.ph1153 ], [ 0, %.lr.ph1153.preheader ]
  call void @tpp_layernorm_bwd_bf16(i64 noundef %50, i64 noundef %52, i64 noundef %53, ptr noundef %81, ptr noundef %76, ptr noundef %70, ptr noundef %71, ptr noundef %83, ptr noundef %80, ptr noundef %65, ptr noundef %66, ptr noundef nonnull %306, ptr noundef nonnull %330, ptr noundef nonnull %354, ptr noundef nonnull %384, ptr noundef nonnull %430)
  %542 = add nuw nsw i32 %.71151, 1
  %exitcond1195.not = icmp eq i32 %542, %smax1194
  br i1 %exitcond1195.not, label %._crit_edge1154, label %.lr.ph1153, !llvm.loop !42

._crit_edge1154:                                  ; preds = %.lr.ph1153
  %543 = call i64 @libxsmm_timer_tick() #11
  %544 = call double @libxsmm_timer_duration(i64 noundef %541, i64 noundef %543) #11
  %545 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, double noundef %544)
  %546 = fcmp ogt double %544, 0.000000e+00
  br i1 %546, label %547, label %550

547:                                              ; preds = %._crit_edge1154
  %548 = fdiv double %539, %544
  br label %.sink.split1199

.sink.split1199:                                  ; preds = %532, %547
  %.sink1200 = phi double [ %548, %547 ], [ %533, %532 ]
  %.11013.ph = phi double [ %544, %547 ], [ %529, %532 ]
  %.11011.ph = phi double [ %539, %547 ], [ %524, %532 ]
  %549 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.35, double noundef %.sink1200)
  br label %550

550:                                              ; preds = %.sink.split1199, %._crit_edge1154, %._crit_edge1162, %263
  %.11013 = phi double [ %529, %._crit_edge1162 ], [ %544, %._crit_edge1154 ], [ %.01012, %263 ], [ %.11013.ph, %.sink.split1199 ]
  %.11011 = phi double [ %524, %._crit_edge1162 ], [ %539, %._crit_edge1154 ], [ %.01010, %263 ], [ %.11011.ph, %.sink.split1199 ]
  %.5 = phi i32 [ %.4, %._crit_edge1162 ], [ %.4, %._crit_edge1154 ], [ %.1, %263 ], [ %.4, %.sink.split1199 ]
  %551 = icmp sgt i32 %.010171110, 0
  br i1 %551, label %.thread1084, label %.thread1092

.thread1084:                                      ; preds = %534, %550
  %.51091 = phi i32 [ %.5, %550 ], [ %.4, %534 ]
  %.110111089 = phi double [ %.11011, %550 ], [ %.01010, %534 ]
  %.110131088 = phi double [ %.11013, %550 ], [ %.01012, %534 ]
  %552 = fadd double %.01010, %.110111089
  %553 = fadd double %.01012, %.110131088
  %554 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.36)
  %555 = fdiv double %552, %553
  %556 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.37, double noundef %555)
  %557 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.38)
  br label %.thread1092

.thread1092:                                      ; preds = %.thread1083, %.thread1084, %550
  %.51090 = phi i32 [ %.51091, %.thread1084 ], [ %.5, %550 ], [ %.4, %.thread1083 ]
  call void @libxsmm_free(ptr noundef %56) #11
  call void @libxsmm_free(ptr noundef %57) #11
  call void @libxsmm_free(ptr noundef %58) #11
  call void @libxsmm_free(ptr noundef %59) #11
  call void @libxsmm_free(ptr noundef %63) #11
  call void @libxsmm_free(ptr noundef %64) #11
  call void @libxsmm_free(ptr noundef %78) #11
  call void @libxsmm_free(ptr noundef %79) #11
  call void @libxsmm_free(ptr noundef %80) #11
  call void @libxsmm_free(ptr noundef %81) #11
  call void @libxsmm_free(ptr noundef %61) #11
  call void @libxsmm_free(ptr noundef %62) #11
  call void @libxsmm_free(ptr noundef %65) #11
  call void @libxsmm_free(ptr noundef %66) #11
  call void @libxsmm_free(ptr noundef %70) #11
  call void @libxsmm_free(ptr noundef %71) #11
  call void @libxsmm_free(ptr noundef %67) #11
  call void @libxsmm_free(ptr noundef %68) #11
  call void @libxsmm_free(ptr noundef %72) #11
  call void @libxsmm_free(ptr noundef %76) #11
  call void @libxsmm_free(ptr noundef %77) #11
  call void @libxsmm_free(ptr noundef %83) #11
  call void @libxsmm_free(ptr noundef %84) #11
  call void @libxsmm_free(ptr noundef %85) #11
  call void @libxsmm_free(ptr noundef %73) #11
  %558 = icmp eq i32 %.51090, 0
  br i1 %558, label %559, label %562

559:                                              ; preds = %.thread1092
  %560 = load i32, ptr @is_reference_kernel, align 4, !tbaa !16
  %561 = call i32 @libxsmm_return_success_code(i32 noundef %560)
  br label %562

562:                                              ; preds = %.thread1092, %559
  %563 = phi i32 [ %561, %559 ], [ 1, %.thread1092 ]
  call void @llvm.lifetime.end.p0(i64 192, ptr nonnull %5) #11
  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %4) #11
  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %3) #11
  ret i32 %563
}

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

declare { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

declare void @libxsmm_init() local_unnamed_addr #2

declare void @libxsmm_matdiff_clear(ptr noundef) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable
declare i32 @atoi(ptr nocapture noundef nonnull) local_unnamed_addr #3

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

; Function Attrs: nofree nounwind memory(read)
declare noundef ptr @getenv(ptr nocapture noundef) local_unnamed_addr #5

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

; Function Attrs: nounwind
declare i32 @putenv(ptr noundef) local_unnamed_addr #6

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

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

declare noalias ptr @libxsmm_aligned_malloc(i64 noundef, i64 noundef) local_unnamed_addr #2

declare double @libxsmm_rng_f64() local_unnamed_addr #2

declare void @libxsmm_rne_convert_fp32_bf16(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #2

declare void @libxsmm_create_meltw_unary_shape(ptr dead_on_unwind writable sret(%struct.libxsmm_meltw_unary_shape) align 4, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

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

declare ptr @libxsmm_dispatch_meltw_unary(i32 noundef, ptr noundef byval(%struct.libxsmm_meltw_unary_shape) align 8, i32 noundef) local_unnamed_addr #2

declare i32 @libxsmm_get_kernel_info(ptr noundef, ptr noundef) local_unnamed_addr #2

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

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) local_unnamed_addr #7

declare i32 @libxsmm_meqn_create() local_unnamed_addr #2

declare i64 @libxsmm_create_meqn_op_metadata(i32 noundef, i32 noundef) local_unnamed_addr #2

declare i32 @libxsmm_meqn_push_back_ternary_op(i64, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

declare { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

declare i64 @libxsmm_create_meqn_arg_metadata(i32 noundef, i32 noundef) local_unnamed_addr #2

declare i32 @libxsmm_meqn_push_back_arg(i64, i64, i64, i64, i64) local_unnamed_addr #2

declare ptr @libxsmm_dispatch_meqn(i32 noundef, i64, i64) local_unnamed_addr #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_fwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef) local_unnamed_addr #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_fwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_fwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef) local_unnamed_addr #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_fwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, float noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @upconvert_bf16(i16 noundef zeroext) local_unnamed_addr #9

declare i32 @libxsmm_matdiff(ptr noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i64 @libxsmm_timer_tick() local_unnamed_addr #2

declare double @libxsmm_timer_duration(i64 noundef, i64 noundef) local_unnamed_addr #2

declare i32 @libxsmm_meqn_push_back_binary_op(i64, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_bwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_bwd_fp32(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vectorized_layernorm_bwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #9

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_layernorm_bwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #9

declare void @libxsmm_free(ptr noundef) local_unnamed_addr #2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !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 = !{!"float", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = distinct !{!13, !12}
!14 = distinct !{!14, !12}
!15 = !{i64 0, i64 4, !16, i64 4, i64 4, !16, i64 8, i64 4, !16, i64 12, i64 4, !16, i64 16, i64 4, !16, i64 20, i64 4, !16, i64 24, i64 4, !16}
!16 = !{!17, !17, i64 0}
!17 = !{!"int", !7, i64 0}
!18 = !{!19, !17, i64 16}
!19 = !{!"libxsmm_kernel_info", !17, i64 0, !17, i64 4, !20, i64 8, !17, i64 16}
!20 = !{!"long", !7, i64 0}
!21 = !{!22, !22, i64 0}
!22 = !{!"short", !7, i64 0}
!23 = distinct !{!23, !12}
!24 = !{!25, !26, i64 80}
!25 = !{!"libxsmm_matdiff_info", !26, i64 0, !26, i64 8, !26, i64 16, !26, i64 24, !26, i64 32, !26, i64 40, !26, i64 48, !26, i64 56, !26, i64 64, !26, i64 72, !26, i64 80, !26, i64 88, !26, i64 96, !26, i64 104, !26, i64 112, !26, i64 120, !26, i64 128, !26, i64 136, !26, i64 144, !26, i64 152, !26, i64 160, !26, i64 168, !17, i64 176, !17, i64 180, !17, i64 184, !17, i64 188}
!26 = !{!"double", !7, i64 0}
!27 = !{!25, !26, i64 120}
!28 = !{!25, !26, i64 56}
!29 = !{!25, !26, i64 64}
!30 = !{!25, !26, i64 40}
!31 = !{!25, !26, i64 48}
!32 = !{!25, !26, i64 32}
!33 = distinct !{!33, !12}
!34 = distinct !{!34, !12}
!35 = distinct !{!35, !12}
!36 = distinct !{!36, !12}
!37 = distinct !{!37, !12}
!38 = distinct !{!38, !12}
!39 = distinct !{!39, !12}
!40 = distinct !{!40, !12}
!41 = distinct !{!41, !12}
!42 = distinct !{!42, !12}


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