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

; 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_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_shape = type { i32, i32, i32, i32 }
%struct.libxsmm_matrix_arg_attributes = type { i32, i32, i32, i32 }
%struct.libxsmm_meqn_arg_metadata = type { i32, i32 }
%struct.libxsmm_meqn_op_metadata = type { i32, i32 }

@is_reference_kernel = external dso_local global i32, align 4
@.str = external hidden unnamed_addr constant [52 x i8], align 1
@info = external dso_local global %struct.libxsmm_kernel_info, align 8
@stderr = external global ptr, align 8
@.str.1 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.24 = 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 ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca double, align 8
  %21 = alloca double, align 8
  %22 = alloca double, align 8
  %23 = alloca double, align 8
  %24 = alloca %struct.libxsmm_matdiff_info, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %43 = alloca %struct.libxsmm_matrix_arg_attributes, align 4
  %44 = alloca [2 x %struct.libxsmm_meqn_arg_metadata], align 16
  %45 = alloca [2 x %struct.libxsmm_meqn_op_metadata], align 16
  %46 = alloca [2 x %struct.libxsmm_meqn_arg_shape], align 16
  %47 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %48 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %49 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %50 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %51 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %52 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %53 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %54 = alloca %struct.libxsmm_matrix_arg_attributes, align 4
  %55 = alloca %struct.libxsmm_matrix_arg_attributes, align 4
  %56 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %57 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %58 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %59 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %60 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %61 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %62 = alloca %struct.libxsmm_meqn_op_metadata, align 4
  %63 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %64 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %65 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %66 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %67 = alloca %struct.libxsmm_meqn_arg_shape, align 4
  %68 = alloca %struct.libxsmm_meqn_arg_metadata, align 4
  %69 = 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 0x3F826E978D4FDF3B, 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 8, ptr %11) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #8
  call void @llvm.lifetime.start.p0(i64 4, 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 8, ptr %20) #8
  store double 0.000000e+00, ptr %20, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #8
  store double 0.000000e+00, ptr %21, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  store double 0.000000e+00, ptr %22, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #8
  store double 0.000000e+00, ptr %23, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 192, ptr %24) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #8
  store ptr null, ptr %25, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #8
  store ptr null, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #8
  store ptr null, ptr %27, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #8
  store ptr null, ptr %28, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #8
  store ptr null, ptr %29, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #8
  store ptr null, ptr %30, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #8
  store ptr null, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #8
  store ptr null, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #8
  store ptr null, ptr %33, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #8
  store i32 64, ptr %34, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #8
  store i32 64, ptr %35, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #8
  store i32 64, ptr %36, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #8
  store i32 100, ptr %37, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #8
  store i32 0, ptr %38, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #8
  store i32 3, ptr %39, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #8
  store i32 1, ptr %40, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #8
  store i32 1, ptr %41, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %42) #8
  call void @libxsmm_init()
  call void @libxsmm_matdiff_clear(ptr noundef %24)
  %70 = load i32, ptr %4, align 4, !tbaa !5
  %71 = icmp sgt i32 %70, 1
  br i1 %71, label %72, label %77

72:                                               ; preds = %2
  %73 = load ptr, ptr %5, align 8, !tbaa !9
  %74 = getelementptr inbounds ptr, ptr %73, i64 1
  %75 = load ptr, ptr %74, align 8, !tbaa !9
  %76 = call i32 @atoi(ptr noundef %75) #9
  store i32 %76, ptr %34, align 4, !tbaa !5
  br label %77

77:                                               ; preds = %72, %2
  %78 = load i32, ptr %4, align 4, !tbaa !5
  %79 = icmp sgt i32 %78, 2
  br i1 %79, label %80, label %85

80:                                               ; preds = %77
  %81 = load ptr, ptr %5, align 8, !tbaa !9
  %82 = getelementptr inbounds ptr, ptr %81, i64 2
  %83 = load ptr, ptr %82, align 8, !tbaa !9
  %84 = call i32 @atoi(ptr noundef %83) #9
  store i32 %84, ptr %35, align 4, !tbaa !5
  br label %85

85:                                               ; preds = %80, %77
  %86 = load i32, ptr %4, align 4, !tbaa !5
  %87 = icmp sgt i32 %86, 3
  br i1 %87, label %88, label %93

88:                                               ; preds = %85
  %89 = load ptr, ptr %5, align 8, !tbaa !9
  %90 = getelementptr inbounds ptr, ptr %89, i64 3
  %91 = load ptr, ptr %90, align 8, !tbaa !9
  %92 = call i32 @atoi(ptr noundef %91) #9
  store i32 %92, ptr %36, align 4, !tbaa !5
  br label %93

93:                                               ; preds = %88, %85
  %94 = load i32, ptr %4, align 4, !tbaa !5
  %95 = icmp sgt i32 %94, 4
  br i1 %95, label %96, label %101

96:                                               ; preds = %93
  %97 = load ptr, ptr %5, align 8, !tbaa !9
  %98 = getelementptr inbounds ptr, ptr %97, i64 4
  %99 = load ptr, ptr %98, align 8, !tbaa !9
  %100 = call i32 @atoi(ptr noundef %99) #9
  store i32 %100, ptr %38, align 4, !tbaa !5
  br label %101

101:                                              ; preds = %96, %93
  %102 = load i32, ptr %4, align 4, !tbaa !5
  %103 = icmp sgt i32 %102, 5
  br i1 %103, label %104, label %109

104:                                              ; preds = %101
  %105 = load ptr, ptr %5, align 8, !tbaa !9
  %106 = getelementptr inbounds ptr, ptr %105, i64 5
  %107 = load ptr, ptr %106, align 8, !tbaa !9
  %108 = call i32 @atoi(ptr noundef %107) #9
  store i32 %108, ptr %39, align 4, !tbaa !5
  br label %109

109:                                              ; preds = %104, %101
  %110 = load i32, ptr %4, align 4, !tbaa !5
  %111 = icmp sgt i32 %110, 6
  br i1 %111, label %112, label %117

112:                                              ; preds = %109
  %113 = load ptr, ptr %5, align 8, !tbaa !9
  %114 = getelementptr inbounds ptr, ptr %113, i64 6
  %115 = load ptr, ptr %114, align 8, !tbaa !9
  %116 = call i32 @atoi(ptr noundef %115) #9
  store i32 %116, ptr %37, align 4, !tbaa !5
  br label %117

117:                                              ; preds = %112, %109
  %118 = load i32, ptr %38, align 4, !tbaa !5
  %119 = icmp eq i32 %118, 0
  br i1 %119, label %120, label %121

120:                                              ; preds = %117
  store i32 1, ptr %40, align 4, !tbaa !5
  store i32 1, ptr %41, align 4, !tbaa !5
  br label %128

121:                                              ; preds = %117
  %122 = load i32, ptr %38, align 4, !tbaa !5
  %123 = icmp eq i32 %122, 1
  br i1 %123, label %124, label %125

124:                                              ; preds = %121
  store i32 2, ptr %40, align 4, !tbaa !5
  store i32 2, ptr %41, align 4, !tbaa !5
  store double 5.000000e-03, ptr %7, align 8, !tbaa !11
  br label %127

125:                                              ; preds = %121
  %126 = call i32 (ptr, ...) @printf(ptr noundef @.str)
  br label %127

127:                                              ; preds = %125, %124
  br label %128

128:                                              ; preds = %127, %120
  %129 = load i32, ptr %34, align 4, !tbaa !5
  %130 = sext i32 %129 to i64
  %131 = mul i64 4, %130
  %132 = load i32, ptr %36, align 4, !tbaa !5
  %133 = sext i32 %132 to i64
  %134 = mul i64 %131, %133
  %135 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %134, i64 noundef 2097152)
  store ptr %135, ptr %25, align 8, !tbaa !9
  %136 = load i32, ptr %34, align 4, !tbaa !5
  %137 = sext i32 %136 to i64
  %138 = mul i64 4, %137
  %139 = load i32, ptr %35, align 4, !tbaa !5
  %140 = sext i32 %139 to i64
  %141 = mul i64 %138, %140
  %142 = load i32, ptr %36, align 4, !tbaa !5
  %143 = sext i32 %142 to i64
  %144 = mul i64 %141, %143
  %145 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %144, i64 noundef 2097152)
  store ptr %145, ptr %26, align 8, !tbaa !9
  %146 = load i32, ptr %34, align 4, !tbaa !5
  %147 = sext i32 %146 to i64
  %148 = mul i64 4, %147
  %149 = load i32, ptr %35, align 4, !tbaa !5
  %150 = sext i32 %149 to i64
  %151 = mul i64 %148, %150
  %152 = load i32, ptr %36, align 4, !tbaa !5
  %153 = sext i32 %152 to i64
  %154 = mul i64 %151, %153
  %155 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %154, i64 noundef 2097152)
  store ptr %155, ptr %27, align 8, !tbaa !9
  %156 = load i32, ptr %34, align 4, !tbaa !5
  %157 = sext i32 %156 to i64
  %158 = mul i64 4, %157
  %159 = load i32, ptr %35, align 4, !tbaa !5
  %160 = sext i32 %159 to i64
  %161 = mul i64 %158, %160
  %162 = load i32, ptr %36, align 4, !tbaa !5
  %163 = sext i32 %162 to i64
  %164 = mul i64 %161, %163
  %165 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %164, i64 noundef 2097152)
  store ptr %165, ptr %29, align 8, !tbaa !9
  %166 = load i32, ptr %34, align 4, !tbaa !5
  %167 = sext i32 %166 to i64
  %168 = mul i64 4, %167
  %169 = load i32, ptr %35, align 4, !tbaa !5
  %170 = sext i32 %169 to i64
  %171 = mul i64 %168, %170
  %172 = load i32, ptr %36, align 4, !tbaa !5
  %173 = sext i32 %172 to i64
  %174 = mul i64 %171, %173
  %175 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %174, i64 noundef 2097152)
  store ptr %175, ptr %28, align 8, !tbaa !9
  %176 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef 4194304, i64 noundef 2097152)
  store ptr %176, ptr %30, align 8, !tbaa !9
  %177 = load i32, ptr %34, align 4, !tbaa !5
  %178 = sext i32 %177 to i64
  %179 = mul i64 2, %178
  %180 = load i32, ptr %35, align 4, !tbaa !5
  %181 = sext i32 %180 to i64
  %182 = mul i64 %179, %181
  %183 = load i32, ptr %36, align 4, !tbaa !5
  %184 = sext i32 %183 to i64
  %185 = mul i64 %182, %184
  %186 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %185, i64 noundef 2097152)
  store ptr %186, ptr %31, align 8, !tbaa !9
  %187 = load i32, ptr %34, align 4, !tbaa !5
  %188 = sext i32 %187 to i64
  %189 = mul i64 2, %188
  %190 = load i32, ptr %35, align 4, !tbaa !5
  %191 = sext i32 %190 to i64
  %192 = mul i64 %189, %191
  %193 = load i32, ptr %36, align 4, !tbaa !5
  %194 = sext i32 %193 to i64
  %195 = mul i64 %192, %194
  %196 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %195, i64 noundef 2097152)
  store ptr %196, ptr %32, align 8, !tbaa !9
  %197 = load i32, ptr %34, align 4, !tbaa !5
  %198 = sext i32 %197 to i64
  %199 = mul i64 2, %198
  %200 = load i32, ptr %35, align 4, !tbaa !5
  %201 = sext i32 %200 to i64
  %202 = mul i64 %199, %201
  %203 = load i32, ptr %36, align 4, !tbaa !5
  %204 = sext i32 %203 to i64
  %205 = mul i64 %202, %204
  %206 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %205, i64 noundef 2097152)
  store ptr %206, ptr %33, align 8, !tbaa !9
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %207

207:                                              ; preds = %267, %128
  %208 = load i32, ptr %14, align 4, !tbaa !5
  %209 = load i32, ptr %34, align 4, !tbaa !5
  %210 = load i32, ptr %35, align 4, !tbaa !5
  %211 = mul nsw i32 %209, %210
  %212 = load i32, ptr %36, align 4, !tbaa !5
  %213 = mul nsw i32 %211, %212
  %214 = icmp slt i32 %208, %213
  br i1 %214, label %215, label %270

215:                                              ; preds = %207
  %216 = call double @libxsmm_rng_f64()
  %217 = fptrunc double %216 to float
  %218 = load ptr, ptr %26, align 8, !tbaa !9
  %219 = load i32, ptr %14, align 4, !tbaa !5
  %220 = sext i32 %219 to i64
  %221 = getelementptr inbounds float, ptr %218, i64 %220
  store float %217, ptr %221, align 4, !tbaa !13
  %222 = call double @libxsmm_rng_f64()
  %223 = fptrunc double %222 to float
  %224 = load ptr, ptr %27, align 8, !tbaa !9
  %225 = load i32, ptr %14, align 4, !tbaa !5
  %226 = sext i32 %225 to i64
  %227 = getelementptr inbounds float, ptr %224, i64 %226
  store float %223, ptr %227, align 4, !tbaa !13
  %228 = call double @libxsmm_rng_f64()
  %229 = fptrunc double %228 to float
  %230 = load ptr, ptr %29, align 8, !tbaa !9
  %231 = load i32, ptr %14, align 4, !tbaa !5
  %232 = sext i32 %231 to i64
  %233 = getelementptr inbounds float, ptr %230, i64 %232
  store float %229, ptr %233, align 4, !tbaa !13
  %234 = load ptr, ptr %27, align 8, !tbaa !9
  %235 = load i32, ptr %14, align 4, !tbaa !5
  %236 = sext i32 %235 to i64
  %237 = getelementptr inbounds float, ptr %234, i64 %236
  %238 = load float, ptr %237, align 4, !tbaa !13
  %239 = load ptr, ptr %28, align 8, !tbaa !9
  %240 = load i32, ptr %14, align 4, !tbaa !5
  %241 = sext i32 %240 to i64
  %242 = getelementptr inbounds float, ptr %239, i64 %241
  store float %238, ptr %242, align 4, !tbaa !13
  %243 = load ptr, ptr %26, align 8, !tbaa !9
  %244 = load i32, ptr %14, align 4, !tbaa !5
  %245 = sext i32 %244 to i64
  %246 = getelementptr inbounds float, ptr %243, i64 %245
  %247 = load ptr, ptr %31, align 8, !tbaa !9
  %248 = load i32, ptr %14, align 4, !tbaa !5
  %249 = sext i32 %248 to i64
  %250 = getelementptr inbounds i16, ptr %247, i64 %249
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %246, ptr noundef %250, i64 noundef 1)
  %251 = load ptr, ptr %27, align 8, !tbaa !9
  %252 = load i32, ptr %14, align 4, !tbaa !5
  %253 = sext i32 %252 to i64
  %254 = getelementptr inbounds float, ptr %251, i64 %253
  %255 = load ptr, ptr %32, align 8, !tbaa !9
  %256 = load i32, ptr %14, align 4, !tbaa !5
  %257 = sext i32 %256 to i64
  %258 = getelementptr inbounds i16, ptr %255, i64 %257
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %254, ptr noundef %258, i64 noundef 1)
  %259 = load ptr, ptr %28, align 8, !tbaa !9
  %260 = load i32, ptr %14, align 4, !tbaa !5
  %261 = sext i32 %260 to i64
  %262 = getelementptr inbounds float, ptr %259, i64 %261
  %263 = load ptr, ptr %33, align 8, !tbaa !9
  %264 = load i32, ptr %14, align 4, !tbaa !5
  %265 = sext i32 %264 to i64
  %266 = getelementptr inbounds i16, ptr %263, i64 %265
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %262, ptr noundef %266, i64 noundef 1)
  br label %267

267:                                              ; preds = %215
  %268 = load i32, ptr %14, align 4, !tbaa !5
  %269 = add nsw i32 %268, 1
  store i32 %269, ptr %14, align 4, !tbaa !5
  br label %207, !llvm.loop !15

270:                                              ; preds = %207
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %271

271:                                              ; preds = %281, %270
  %272 = load i32, ptr %14, align 4, !tbaa !5
  %273 = icmp slt i32 %272, 1048576
  br i1 %273, label %274, label %284

274:                                              ; preds = %271
  %275 = call double @libxsmm_rng_f64()
  %276 = fptrunc double %275 to float
  %277 = load ptr, ptr %30, align 8, !tbaa !9
  %278 = load i32, ptr %14, align 4, !tbaa !5
  %279 = sext i32 %278 to i64
  %280 = getelementptr inbounds float, ptr %277, i64 %279
  store float %276, ptr %280, align 4, !tbaa !13
  br label %281

281:                                              ; preds = %274
  %282 = load i32, ptr %14, align 4, !tbaa !5
  %283 = add nsw i32 %282, 1
  store i32 %283, ptr %14, align 4, !tbaa !5
  br label %271, !llvm.loop !17

284:                                              ; preds = %271
  %285 = load i32, ptr %39, align 4, !tbaa !5
  %286 = and i32 %285, 1
  %287 = icmp sgt i32 %286, 0
  br i1 %287, label %288, label %720

288:                                              ; preds = %284
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %44) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %45) #8
  call void @llvm.lifetime.start.p0(i64 32, ptr %46) #8
  %289 = load i32, ptr %36, align 4, !tbaa !5
  store i32 %289, ptr %17, align 4, !tbaa !5
  %290 = load i32, ptr %35, align 4, !tbaa !5
  %291 = load i32, ptr %36, align 4, !tbaa !5
  %292 = mul nsw i32 %290, %291
  store i32 %292, ptr %16, align 4, !tbaa !5
  %293 = call i32 @libxsmm_meqn_create()
  store i32 %293, ptr %8, align 4, !tbaa !5
  %294 = getelementptr inbounds %struct.libxsmm_matrix_arg_attributes, ptr %43, i32 0, i32 0
  store i32 0, ptr %294, align 4, !tbaa !18
  %295 = load i32, ptr %8, align 4, !tbaa !5
  %296 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %297 = getelementptr inbounds %struct.libxsmm_meqn_op_metadata, ptr %296, i32 0, i32 0
  store i32 %295, ptr %297, align 16, !tbaa !20
  %298 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %299 = getelementptr inbounds %struct.libxsmm_meqn_op_metadata, ptr %298, i32 0, i32 1
  store i32 -1, ptr %299, align 4, !tbaa !22
  %300 = load i32, ptr %8, align 4, !tbaa !5
  %301 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 1
  %302 = getelementptr inbounds %struct.libxsmm_meqn_op_metadata, ptr %301, i32 0, i32 0
  store i32 %300, ptr %302, align 8, !tbaa !20
  %303 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 1
  %304 = getelementptr inbounds %struct.libxsmm_meqn_op_metadata, ptr %303, i32 0, i32 1
  store i32 31, ptr %304, align 4, !tbaa !22
  %305 = load i32, ptr %8, align 4, !tbaa !5
  %306 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_metadata], ptr %44, i64 0, i64 0
  %307 = getelementptr inbounds %struct.libxsmm_meqn_arg_metadata, ptr %306, i32 0, i32 0
  store i32 %305, ptr %307, align 16, !tbaa !23
  %308 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_metadata], ptr %44, i64 0, i64 0
  %309 = getelementptr inbounds %struct.libxsmm_meqn_arg_metadata, ptr %308, i32 0, i32 1
  store i32 0, ptr %309, align 4, !tbaa !25
  %310 = load i32, ptr %36, align 4, !tbaa !5
  %311 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 0
  %312 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %311, i32 0, i32 0
  store i32 %310, ptr %312, align 16, !tbaa !26
  %313 = load i32, ptr %34, align 4, !tbaa !5
  %314 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 0
  %315 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %314, i32 0, i32 1
  store i32 %313, ptr %315, align 4, !tbaa !28
  %316 = load i32, ptr %17, align 4, !tbaa !5
  %317 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 0
  %318 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %317, i32 0, i32 2
  store i32 %316, ptr %318, align 8, !tbaa !29
  %319 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 0
  %320 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %319, i32 0, i32 3
  store i32 1, ptr %320, align 4, !tbaa !30
  %321 = load i32, ptr %8, align 4, !tbaa !5
  %322 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_metadata], ptr %44, i64 0, i64 1
  %323 = getelementptr inbounds %struct.libxsmm_meqn_arg_metadata, ptr %322, i32 0, i32 0
  store i32 %321, ptr %323, align 8, !tbaa !23
  %324 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_metadata], ptr %44, i64 0, i64 1
  %325 = getelementptr inbounds %struct.libxsmm_meqn_arg_metadata, ptr %324, i32 0, i32 1
  store i32 1, ptr %325, align 4, !tbaa !25
  %326 = load i32, ptr %36, align 4, !tbaa !5
  %327 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 1
  %328 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %327, i32 0, i32 0
  store i32 %326, ptr %328, align 16, !tbaa !26
  %329 = load i32, ptr %34, align 4, !tbaa !5
  %330 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 1
  %331 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %330, i32 0, i32 1
  store i32 %329, ptr %331, align 4, !tbaa !28
  %332 = load i32, ptr %16, align 4, !tbaa !5
  %333 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 1
  %334 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %333, i32 0, i32 2
  store i32 %332, ptr %334, align 8, !tbaa !29
  %335 = load i32, ptr %40, align 4, !tbaa !5
  %336 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 1
  %337 = getelementptr inbounds %struct.libxsmm_meqn_arg_shape, ptr %336, i32 0, i32 3
  store i32 %335, ptr %337, align 4, !tbaa !30
  %338 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %339 = load i64, ptr %338, align 16
  %340 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %339, i32 noundef 2, i32 noundef 1, i32 noundef 32)
  %341 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_metadata], ptr %44, i64 0, i64 0
  %342 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 0
  %343 = load i64, ptr %341, align 16
  %344 = getelementptr inbounds { i64, i64 }, ptr %342, i32 0, i32 0
  %345 = load i64, ptr %344, align 16
  %346 = getelementptr inbounds { i64, i64 }, ptr %342, i32 0, i32 1
  %347 = load i64, ptr %346, align 8
  %348 = getelementptr inbounds { i64, i64 }, ptr %43, i32 0, i32 0
  %349 = load i64, ptr %348, align 4
  %350 = getelementptr inbounds { i64, i64 }, ptr %43, i32 0, i32 1
  %351 = load i64, ptr %350, align 4
  %352 = call i32 @libxsmm_meqn_push_back_arg(i64 %343, i64 %345, i64 %347, i64 %349, i64 %351)
  %353 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %354 = load i64, ptr %353, align 16
  %355 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %354, i32 noundef 15, i32 noundef 1, i32 noundef 0)
  %356 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %357 = load i64, ptr %356, align 16
  %358 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %357, i32 noundef 18, i32 noundef 1, i32 noundef 32)
  %359 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %360 = load i64, ptr %359, align 16
  %361 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %360, i32 noundef 18, i32 noundef 1, i32 noundef 16)
  %362 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 1
  %363 = load i64, ptr %362, align 8
  %364 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %363, i32 noundef 63, i32 noundef 1, i32 noundef 0)
  %365 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %366 = load i64, ptr %365, align 16
  %367 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %366, i32 noundef 17, i32 noundef 1, i32 noundef 0)
  %368 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %369 = load i64, ptr %368, align 16
  %370 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %369, i32 noundef 3, i32 noundef 1, i32 noundef 32)
  %371 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_metadata], ptr %44, i64 0, i64 1
  %372 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 1
  %373 = load i64, ptr %371, align 8
  %374 = getelementptr inbounds { i64, i64 }, ptr %372, i32 0, i32 0
  %375 = load i64, ptr %374, align 16
  %376 = getelementptr inbounds { i64, i64 }, ptr %372, i32 0, i32 1
  %377 = load i64, ptr %376, align 8
  %378 = getelementptr inbounds { i64, i64 }, ptr %43, i32 0, i32 0
  %379 = load i64, ptr %378, align 4
  %380 = getelementptr inbounds { i64, i64 }, ptr %43, i32 0, i32 1
  %381 = load i64, ptr %380, align 4
  %382 = call i32 @libxsmm_meqn_push_back_arg(i64 %373, i64 %375, i64 %377, i64 %379, i64 %381)
  %383 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %384 = load i64, ptr %383, align 16
  %385 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %384, i32 noundef 21, i32 noundef 1, i32 noundef 32)
  %386 = getelementptr inbounds [2 x %struct.libxsmm_meqn_op_metadata], ptr %45, i64 0, i64 0
  %387 = load i64, ptr %386, align 16
  %388 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %387, i32 noundef 21, i32 noundef 1, i32 noundef 16)
  %389 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_metadata], ptr %44, i64 0, i64 1
  %390 = getelementptr inbounds [2 x %struct.libxsmm_meqn_arg_shape], ptr %46, i64 0, i64 1
  %391 = load i64, ptr %389, align 8
  %392 = getelementptr inbounds { i64, i64 }, ptr %390, i32 0, i32 0
  %393 = load i64, ptr %392, align 16
  %394 = getelementptr inbounds { i64, i64 }, ptr %390, i32 0, i32 1
  %395 = load i64, ptr %394, align 8
  %396 = getelementptr inbounds { i64, i64 }, ptr %43, i32 0, i32 0
  %397 = load i64, ptr %396, align 4
  %398 = getelementptr inbounds { i64, i64 }, ptr %43, i32 0, i32 1
  %399 = load i64, ptr %398, align 4
  %400 = call i32 @libxsmm_meqn_push_back_arg(i64 %391, i64 %393, i64 %395, i64 %397, i64 %399)
  call void @llvm.lifetime.start.p0(i64 16, ptr %47) #8
  %401 = load i32, ptr %36, align 4, !tbaa !5
  %402 = load i32, ptr %34, align 4, !tbaa !5
  %403 = load i32, ptr %16, align 4, !tbaa !5
  %404 = load i32, ptr %41, align 4, !tbaa !5
  %405 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %401, i32 noundef %402, i32 noundef %403, i32 noundef %404)
  %406 = getelementptr inbounds { i64, i64 }, ptr %47, i32 0, i32 0
  %407 = extractvalue { i64, i64 } %405, 0
  store i64 %407, ptr %406, align 4
  %408 = getelementptr inbounds { i64, i64 }, ptr %47, i32 0, i32 1
  %409 = extractvalue { i64, i64 } %405, 1
  store i64 %409, ptr %408, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %42, ptr align 4 %47, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %47) #8
  %410 = load i32, ptr %8, align 4, !tbaa !5
  %411 = getelementptr inbounds { i64, i64 }, ptr %42, i32 0, i32 0
  %412 = load i64, ptr %411, align 4
  %413 = getelementptr inbounds { i64, i64 }, ptr %42, i32 0, i32 1
  %414 = load i64, ptr %413, align 4
  %415 = call ptr @libxsmm_dispatch_meqn(i32 noundef %410, i64 %412, i64 %414)
  store ptr %415, ptr %11, align 8, !tbaa !9
  %416 = load ptr, ptr %11, align 8, !tbaa !9
  %417 = call i32 @libxsmm_get_kernel_info(ptr noundef %416, ptr noundef @info)
  %418 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !32
  store i32 %418, ptr @is_reference_kernel, align 4, !tbaa !5
  %419 = load ptr, ptr %11, align 8, !tbaa !9
  %420 = icmp eq ptr %419, null
  br i1 %420, label %421, label %424

421:                                              ; preds = %288
  %422 = load ptr, ptr @stderr, align 8, !tbaa !9
  %423 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %422, ptr noundef @.str.1) #8
  call void @exit(i32 noundef -1) #10
  unreachable

424:                                              ; preds = %288
  %425 = load i32, ptr %38, align 4, !tbaa !5
  %426 = icmp eq i32 %425, 0
  br i1 %426, label %427, label %447

427:                                              ; preds = %424
  %428 = load i32, ptr %34, align 4, !tbaa !5
  %429 = sext i32 %428 to i64
  %430 = load i32, ptr %35, align 4, !tbaa !5
  %431 = sext i32 %430 to i64
  %432 = load i32, ptr %36, align 4, !tbaa !5
  %433 = sext i32 %432 to i64
  %434 = load ptr, ptr %26, align 8, !tbaa !9
  %435 = load ptr, ptr %27, align 8, !tbaa !9
  %436 = load ptr, ptr %25, align 8, !tbaa !9
  call void @vectorized_softmax_fwd(i64 noundef %429, i64 noundef %431, i64 noundef %433, ptr noundef %434, ptr noundef %435, ptr noundef %436)
  %437 = load i32, ptr %34, align 4, !tbaa !5
  %438 = sext i32 %437 to i64
  %439 = load i32, ptr %35, align 4, !tbaa !5
  %440 = sext i32 %439 to i64
  %441 = load i32, ptr %36, align 4, !tbaa !5
  %442 = sext i32 %441 to i64
  %443 = load ptr, ptr %26, align 8, !tbaa !9
  %444 = load ptr, ptr %28, align 8, !tbaa !9
  %445 = load ptr, ptr %25, align 8, !tbaa !9
  %446 = load ptr, ptr %11, align 8, !tbaa !9
  call void @tpp_softmax_fwd(i64 noundef %438, i64 noundef %440, i64 noundef %442, ptr noundef %443, ptr noundef %444, ptr noundef %445, ptr noundef %446)
  br label %504

447:                                              ; preds = %424
  %448 = load i32, ptr %38, align 4, !tbaa !5
  %449 = icmp eq i32 %448, 1
  br i1 %449, label %450, label %503

450:                                              ; preds = %447
  %451 = load i32, ptr %34, align 4, !tbaa !5
  %452 = sext i32 %451 to i64
  %453 = load i32, ptr %35, align 4, !tbaa !5
  %454 = sext i32 %453 to i64
  %455 = load i32, ptr %36, align 4, !tbaa !5
  %456 = sext i32 %455 to i64
  %457 = load ptr, ptr %31, align 8, !tbaa !9
  %458 = load ptr, ptr %32, align 8, !tbaa !9
  %459 = load ptr, ptr %25, align 8, !tbaa !9
  call void @vectorized_softmax_fwd_bf16(i64 noundef %452, i64 noundef %454, i64 noundef %456, ptr noundef %457, ptr noundef %458, ptr noundef %459)
  %460 = load i32, ptr %34, align 4, !tbaa !5
  %461 = sext i32 %460 to i64
  %462 = load i32, ptr %35, align 4, !tbaa !5
  %463 = sext i32 %462 to i64
  %464 = load i32, ptr %36, align 4, !tbaa !5
  %465 = sext i32 %464 to i64
  %466 = load ptr, ptr %31, align 8, !tbaa !9
  %467 = load ptr, ptr %33, align 8, !tbaa !9
  %468 = load ptr, ptr %25, align 8, !tbaa !9
  %469 = load ptr, ptr %11, align 8, !tbaa !9
  call void @tpp_softmax_fwd_bf16(i64 noundef %461, i64 noundef %463, i64 noundef %465, ptr noundef %466, ptr noundef %467, ptr noundef %468, ptr noundef %469)
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %470

470:                                              ; preds = %499, %450
  %471 = load i32, ptr %14, align 4, !tbaa !5
  %472 = load i32, ptr %34, align 4, !tbaa !5
  %473 = load i32, ptr %35, align 4, !tbaa !5
  %474 = mul nsw i32 %472, %473
  %475 = load i32, ptr %36, align 4, !tbaa !5
  %476 = mul nsw i32 %474, %475
  %477 = icmp slt i32 %471, %476
  br i1 %477, label %478, label %502

478:                                              ; preds = %470
  %479 = load ptr, ptr %32, align 8, !tbaa !9
  %480 = load i32, ptr %14, align 4, !tbaa !5
  %481 = sext i32 %480 to i64
  %482 = getelementptr inbounds i16, ptr %479, i64 %481
  %483 = load i16, ptr %482, align 2, !tbaa !35
  %484 = call float @upconvert_bf16(i16 noundef zeroext %483)
  %485 = load ptr, ptr %27, align 8, !tbaa !9
  %486 = load i32, ptr %14, align 4, !tbaa !5
  %487 = sext i32 %486 to i64
  %488 = getelementptr inbounds float, ptr %485, i64 %487
  store float %484, ptr %488, align 4, !tbaa !13
  %489 = load ptr, ptr %33, align 8, !tbaa !9
  %490 = load i32, ptr %14, align 4, !tbaa !5
  %491 = sext i32 %490 to i64
  %492 = getelementptr inbounds i16, ptr %489, i64 %491
  %493 = load i16, ptr %492, align 2, !tbaa !35
  %494 = call float @upconvert_bf16(i16 noundef zeroext %493)
  %495 = load ptr, ptr %28, align 8, !tbaa !9
  %496 = load i32, ptr %14, align 4, !tbaa !5
  %497 = sext i32 %496 to i64
  %498 = getelementptr inbounds float, ptr %495, i64 %497
  store float %494, ptr %498, align 4, !tbaa !13
  br label %499

499:                                              ; preds = %478
  %500 = load i32, ptr %14, align 4, !tbaa !5
  %501 = add nsw i32 %500, 1
  store i32 %501, ptr %14, align 4, !tbaa !5
  br label %470, !llvm.loop !37

502:                                              ; preds = %470
  br label %503

503:                                              ; preds = %502, %447
  br label %504

504:                                              ; preds = %503, %427
  %505 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  %506 = load i32, ptr %38, align 4, !tbaa !5
  %507 = icmp eq i32 %506, 0
  br i1 %507, label %508, label %510

508:                                              ; preds = %504
  %509 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %512

510:                                              ; preds = %504
  %511 = call i32 (ptr, ...) @printf(ptr noundef @.str.4)
  br label %512

512:                                              ; preds = %510, %508
  %513 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  %514 = load i32, ptr %34, align 4, !tbaa !5
  %515 = load i32, ptr %35, align 4, !tbaa !5
  %516 = mul nsw i32 %514, %515
  %517 = load i32, ptr %36, align 4, !tbaa !5
  %518 = mul nsw i32 %516, %517
  %519 = load ptr, ptr %27, align 8, !tbaa !9
  %520 = load ptr, ptr %28, align 8, !tbaa !9
  %521 = call i32 @libxsmm_matdiff(ptr noundef %24, i32 noundef 1, i32 noundef %518, i32 noundef 1, ptr noundef %519, ptr noundef %520, ptr noundef null, ptr noundef null)
  %522 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 10
  %523 = load double, ptr %522, align 8, !tbaa !38
  %524 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, double noundef %523)
  %525 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 15
  %526 = load double, ptr %525, align 8, !tbaa !40
  %527 = call i32 (ptr, ...) @printf(ptr noundef @.str.6, double noundef %526)
  %528 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 7
  %529 = load double, ptr %528, align 8, !tbaa !41
  %530 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %529)
  %531 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 8
  %532 = load double, ptr %531, align 8, !tbaa !42
  %533 = call i32 (ptr, ...) @printf(ptr noundef @.str.8, double noundef %532)
  %534 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 5
  %535 = load double, ptr %534, align 8, !tbaa !43
  %536 = call i32 (ptr, ...) @printf(ptr noundef @.str.9, double noundef %535)
  %537 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 6
  %538 = load double, ptr %537, align 8, !tbaa !44
  %539 = call i32 (ptr, ...) @printf(ptr noundef @.str.10, double noundef %538)
  %540 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 4
  %541 = load double, ptr %540, align 8, !tbaa !45
  %542 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, double noundef %541)
  %543 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 4
  %544 = load double, ptr %543, align 8, !tbaa !45
  %545 = load double, ptr %7, align 8, !tbaa !11
  %546 = fcmp ogt double %544, %545
  br i1 %546, label %547, label %548

547:                                              ; preds = %512
  store i32 1, ptr %6, align 4, !tbaa !5
  br label %548

548:                                              ; preds = %547, %512
  %549 = load i32, ptr %37, align 4, !tbaa !5
  %550 = icmp sgt i32 %549, 0
  br i1 %550, label %551, label %719

551:                                              ; preds = %548
  %552 = load i32, ptr %38, align 4, !tbaa !5
  %553 = icmp eq i32 %552, 0
  br i1 %553, label %554, label %633

554:                                              ; preds = %551
  %555 = load i32, ptr %34, align 4, !tbaa !5
  %556 = sext i32 %555 to i64
  %557 = load i32, ptr %35, align 4, !tbaa !5
  %558 = sext i32 %557 to i64
  %559 = load i32, ptr %36, align 4, !tbaa !5
  %560 = sext i32 %559 to i64
  %561 = load ptr, ptr %26, align 8, !tbaa !9
  %562 = load ptr, ptr %27, align 8, !tbaa !9
  %563 = load ptr, ptr %25, align 8, !tbaa !9
  call void @vectorized_softmax_fwd(i64 noundef %556, i64 noundef %558, i64 noundef %560, ptr noundef %561, ptr noundef %562, ptr noundef %563)
  %564 = call i64 @libxsmm_timer_tick()
  store i64 %564, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %565

565:                                              ; preds = %579, %554
  %566 = load i32, ptr %15, align 4, !tbaa !5
  %567 = load i32, ptr %37, align 4, !tbaa !5
  %568 = icmp slt i32 %566, %567
  br i1 %568, label %569, label %582

569:                                              ; preds = %565
  %570 = load i32, ptr %34, align 4, !tbaa !5
  %571 = sext i32 %570 to i64
  %572 = load i32, ptr %35, align 4, !tbaa !5
  %573 = sext i32 %572 to i64
  %574 = load i32, ptr %36, align 4, !tbaa !5
  %575 = sext i32 %574 to i64
  %576 = load ptr, ptr %26, align 8, !tbaa !9
  %577 = load ptr, ptr %27, align 8, !tbaa !9
  %578 = load ptr, ptr %25, align 8, !tbaa !9
  call void @vectorized_softmax_fwd(i64 noundef %571, i64 noundef %573, i64 noundef %575, ptr noundef %576, ptr noundef %577, ptr noundef %578)
  br label %579

579:                                              ; preds = %569
  %580 = load i32, ptr %15, align 4, !tbaa !5
  %581 = add nsw i32 %580, 1
  store i32 %581, ptr %15, align 4, !tbaa !5
  br label %565, !llvm.loop !48

582:                                              ; preds = %565
  %583 = call i64 @libxsmm_timer_tick()
  store i64 %583, ptr %19, align 8, !tbaa !46
  %584 = load i64, ptr %18, align 8, !tbaa !46
  %585 = load i64, ptr %19, align 8, !tbaa !46
  %586 = call double @libxsmm_timer_duration(i64 noundef %584, i64 noundef %585)
  store double %586, ptr %20, align 8, !tbaa !11
  %587 = load double, ptr %20, align 8, !tbaa !11
  %588 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, double noundef %587)
  %589 = load i32, ptr %34, align 4, !tbaa !5
  %590 = sext i32 %589 to i64
  %591 = load i32, ptr %35, align 4, !tbaa !5
  %592 = sext i32 %591 to i64
  %593 = load i32, ptr %36, align 4, !tbaa !5
  %594 = sext i32 %593 to i64
  %595 = load ptr, ptr %26, align 8, !tbaa !9
  %596 = load ptr, ptr %28, align 8, !tbaa !9
  %597 = load ptr, ptr %25, align 8, !tbaa !9
  %598 = load ptr, ptr %11, align 8, !tbaa !9
  call void @tpp_softmax_fwd(i64 noundef %590, i64 noundef %592, i64 noundef %594, ptr noundef %595, ptr noundef %596, ptr noundef %597, ptr noundef %598)
  %599 = call i64 @libxsmm_timer_tick()
  store i64 %599, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %600

600:                                              ; preds = %615, %582
  %601 = load i32, ptr %15, align 4, !tbaa !5
  %602 = load i32, ptr %37, align 4, !tbaa !5
  %603 = icmp slt i32 %601, %602
  br i1 %603, label %604, label %618

604:                                              ; preds = %600
  %605 = load i32, ptr %34, align 4, !tbaa !5
  %606 = sext i32 %605 to i64
  %607 = load i32, ptr %35, align 4, !tbaa !5
  %608 = sext i32 %607 to i64
  %609 = load i32, ptr %36, align 4, !tbaa !5
  %610 = sext i32 %609 to i64
  %611 = load ptr, ptr %26, align 8, !tbaa !9
  %612 = load ptr, ptr %28, align 8, !tbaa !9
  %613 = load ptr, ptr %25, align 8, !tbaa !9
  %614 = load ptr, ptr %11, align 8, !tbaa !9
  call void @tpp_softmax_fwd(i64 noundef %606, i64 noundef %608, i64 noundef %610, ptr noundef %611, ptr noundef %612, ptr noundef %613, ptr noundef %614)
  br label %615

615:                                              ; preds = %604
  %616 = load i32, ptr %15, align 4, !tbaa !5
  %617 = add nsw i32 %616, 1
  store i32 %617, ptr %15, align 4, !tbaa !5
  br label %600, !llvm.loop !49

618:                                              ; preds = %600
  %619 = call i64 @libxsmm_timer_tick()
  store i64 %619, ptr %19, align 8, !tbaa !46
  %620 = load i64, ptr %18, align 8, !tbaa !46
  %621 = load i64, ptr %19, align 8, !tbaa !46
  %622 = call double @libxsmm_timer_duration(i64 noundef %620, i64 noundef %621)
  store double %622, ptr %21, align 8, !tbaa !11
  %623 = load double, ptr %21, align 8, !tbaa !11
  %624 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, double noundef %623)
  %625 = load double, ptr %21, align 8, !tbaa !11
  %626 = fcmp olt double 0.000000e+00, %625
  br i1 %626, label %627, label %632

627:                                              ; preds = %618
  %628 = load double, ptr %20, align 8, !tbaa !11
  %629 = load double, ptr %21, align 8, !tbaa !11
  %630 = fdiv double %628, %629
  %631 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %630)
  br label %632

632:                                              ; preds = %627, %618
  br label %716

633:                                              ; preds = %551
  %634 = load i32, ptr %38, align 4, !tbaa !5
  %635 = icmp eq i32 %634, 1
  br i1 %635, label %636, label %715

636:                                              ; preds = %633
  %637 = load i32, ptr %34, align 4, !tbaa !5
  %638 = sext i32 %637 to i64
  %639 = load i32, ptr %35, align 4, !tbaa !5
  %640 = sext i32 %639 to i64
  %641 = load i32, ptr %36, align 4, !tbaa !5
  %642 = sext i32 %641 to i64
  %643 = load ptr, ptr %31, align 8, !tbaa !9
  %644 = load ptr, ptr %32, align 8, !tbaa !9
  %645 = load ptr, ptr %25, align 8, !tbaa !9
  call void @vectorized_softmax_fwd_bf16(i64 noundef %638, i64 noundef %640, i64 noundef %642, ptr noundef %643, ptr noundef %644, ptr noundef %645)
  %646 = call i64 @libxsmm_timer_tick()
  store i64 %646, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %647

647:                                              ; preds = %661, %636
  %648 = load i32, ptr %15, align 4, !tbaa !5
  %649 = load i32, ptr %37, align 4, !tbaa !5
  %650 = icmp slt i32 %648, %649
  br i1 %650, label %651, label %664

651:                                              ; preds = %647
  %652 = load i32, ptr %34, align 4, !tbaa !5
  %653 = sext i32 %652 to i64
  %654 = load i32, ptr %35, align 4, !tbaa !5
  %655 = sext i32 %654 to i64
  %656 = load i32, ptr %36, align 4, !tbaa !5
  %657 = sext i32 %656 to i64
  %658 = load ptr, ptr %31, align 8, !tbaa !9
  %659 = load ptr, ptr %32, align 8, !tbaa !9
  %660 = load ptr, ptr %25, align 8, !tbaa !9
  call void @vectorized_softmax_fwd_bf16(i64 noundef %653, i64 noundef %655, i64 noundef %657, ptr noundef %658, ptr noundef %659, ptr noundef %660)
  br label %661

661:                                              ; preds = %651
  %662 = load i32, ptr %15, align 4, !tbaa !5
  %663 = add nsw i32 %662, 1
  store i32 %663, ptr %15, align 4, !tbaa !5
  br label %647, !llvm.loop !50

664:                                              ; preds = %647
  %665 = call i64 @libxsmm_timer_tick()
  store i64 %665, ptr %19, align 8, !tbaa !46
  %666 = load i64, ptr %18, align 8, !tbaa !46
  %667 = load i64, ptr %19, align 8, !tbaa !46
  %668 = call double @libxsmm_timer_duration(i64 noundef %666, i64 noundef %667)
  store double %668, ptr %20, align 8, !tbaa !11
  %669 = load double, ptr %20, align 8, !tbaa !11
  %670 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, double noundef %669)
  %671 = load i32, ptr %34, align 4, !tbaa !5
  %672 = sext i32 %671 to i64
  %673 = load i32, ptr %35, align 4, !tbaa !5
  %674 = sext i32 %673 to i64
  %675 = load i32, ptr %36, align 4, !tbaa !5
  %676 = sext i32 %675 to i64
  %677 = load ptr, ptr %31, align 8, !tbaa !9
  %678 = load ptr, ptr %33, align 8, !tbaa !9
  %679 = load ptr, ptr %25, align 8, !tbaa !9
  %680 = load ptr, ptr %11, align 8, !tbaa !9
  call void @tpp_softmax_fwd_bf16(i64 noundef %672, i64 noundef %674, i64 noundef %676, ptr noundef %677, ptr noundef %678, ptr noundef %679, ptr noundef %680)
  %681 = call i64 @libxsmm_timer_tick()
  store i64 %681, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %682

682:                                              ; preds = %697, %664
  %683 = load i32, ptr %15, align 4, !tbaa !5
  %684 = load i32, ptr %37, align 4, !tbaa !5
  %685 = icmp slt i32 %683, %684
  br i1 %685, label %686, label %700

686:                                              ; preds = %682
  %687 = load i32, ptr %34, align 4, !tbaa !5
  %688 = sext i32 %687 to i64
  %689 = load i32, ptr %35, align 4, !tbaa !5
  %690 = sext i32 %689 to i64
  %691 = load i32, ptr %36, align 4, !tbaa !5
  %692 = sext i32 %691 to i64
  %693 = load ptr, ptr %31, align 8, !tbaa !9
  %694 = load ptr, ptr %33, align 8, !tbaa !9
  %695 = load ptr, ptr %25, align 8, !tbaa !9
  %696 = load ptr, ptr %11, align 8, !tbaa !9
  call void @tpp_softmax_fwd_bf16(i64 noundef %688, i64 noundef %690, i64 noundef %692, ptr noundef %693, ptr noundef %694, ptr noundef %695, ptr noundef %696)
  br label %697

697:                                              ; preds = %686
  %698 = load i32, ptr %15, align 4, !tbaa !5
  %699 = add nsw i32 %698, 1
  store i32 %699, ptr %15, align 4, !tbaa !5
  br label %682, !llvm.loop !51

700:                                              ; preds = %682
  %701 = call i64 @libxsmm_timer_tick()
  store i64 %701, ptr %19, align 8, !tbaa !46
  %702 = load i64, ptr %18, align 8, !tbaa !46
  %703 = load i64, ptr %19, align 8, !tbaa !46
  %704 = call double @libxsmm_timer_duration(i64 noundef %702, i64 noundef %703)
  store double %704, ptr %21, align 8, !tbaa !11
  %705 = load double, ptr %21, align 8, !tbaa !11
  %706 = call i32 (ptr, ...) @printf(ptr noundef @.str.13, double noundef %705)
  %707 = load double, ptr %21, align 8, !tbaa !11
  %708 = fcmp olt double 0.000000e+00, %707
  br i1 %708, label %709, label %714

709:                                              ; preds = %700
  %710 = load double, ptr %20, align 8, !tbaa !11
  %711 = load double, ptr %21, align 8, !tbaa !11
  %712 = fdiv double %710, %711
  %713 = call i32 (ptr, ...) @printf(ptr noundef @.str.14, double noundef %712)
  br label %714

714:                                              ; preds = %709, %700
  br label %715

715:                                              ; preds = %714, %633
  br label %716

716:                                              ; preds = %715, %632
  %717 = load double, ptr %21, align 8, !tbaa !11
  store double %717, ptr %23, align 8, !tbaa !11
  %718 = load double, ptr %20, align 8, !tbaa !11
  store double %718, ptr %22, align 8, !tbaa !11
  br label %719

719:                                              ; preds = %716, %548
  call void @llvm.lifetime.end.p0(i64 32, ptr %46) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #8
  br label %720

720:                                              ; preds = %719, %284
  %721 = load i32, ptr %39, align 4, !tbaa !5
  %722 = and i32 %721, 2
  %723 = icmp sgt i32 %722, 0
  br i1 %723, label %724, label %1179

724:                                              ; preds = %720
  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 16, ptr %52) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %53) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %54) #8
  %725 = call { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0)
  %726 = getelementptr inbounds { i64, i64 }, ptr %54, i32 0, i32 0
  %727 = extractvalue { i64, i64 } %725, 0
  store i64 %727, ptr %726, align 4
  %728 = getelementptr inbounds { i64, i64 }, ptr %54, i32 0, i32 1
  %729 = extractvalue { i64, i64 } %725, 1
  store i64 %729, ptr %728, align 4
  call void @llvm.lifetime.start.p0(i64 16, ptr %55) #8
  %730 = call { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0)
  %731 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 0
  %732 = extractvalue { i64, i64 } %730, 0
  store i64 %732, ptr %731, align 4
  %733 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 1
  %734 = extractvalue { i64, i64 } %730, 1
  store i64 %734, ptr %733, align 4
  %735 = load i32, ptr %36, align 4, !tbaa !5
  store i32 %735, ptr %17, align 4, !tbaa !5
  %736 = load i32, ptr %35, align 4, !tbaa !5
  %737 = load i32, ptr %36, align 4, !tbaa !5
  %738 = mul nsw i32 %736, %737
  store i32 %738, ptr %16, align 4, !tbaa !5
  %739 = call i32 @libxsmm_meqn_create()
  store i32 %739, ptr %9, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #8
  %740 = load i32, ptr %9, align 4, !tbaa !5
  %741 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %740, i32 noundef -1)
  store i64 %741, ptr %56, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %50, ptr align 4 %56, i64 8, i1 false), !tbaa.struct !52
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #8
  %742 = load i64, ptr %50, align 4
  %743 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %742, i32 noundef 2, i32 noundef 1, i32 noundef 0)
  call void @llvm.lifetime.start.p0(i64 16, ptr %57) #8
  %744 = load i32, ptr %36, align 4, !tbaa !5
  %745 = load i32, ptr %34, align 4, !tbaa !5
  %746 = load i32, ptr %16, align 4, !tbaa !5
  %747 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %744, i32 noundef %745, i32 noundef %746, i32 noundef 1)
  %748 = getelementptr inbounds { i64, i64 }, ptr %57, i32 0, i32 0
  %749 = extractvalue { i64, i64 } %747, 0
  store i64 %749, ptr %748, align 4
  %750 = getelementptr inbounds { i64, i64 }, ptr %57, i32 0, i32 1
  %751 = extractvalue { i64, i64 } %747, 1
  store i64 %751, ptr %750, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %52, ptr align 4 %57, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #8
  %752 = load i32, ptr %9, align 4, !tbaa !5
  %753 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %752, i32 noundef 0)
  store i64 %753, ptr %58, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %48, ptr align 4 %58, i64 8, i1 false), !tbaa.struct !52
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #8
  %754 = load i64, ptr %48, align 4
  %755 = getelementptr inbounds { i64, i64 }, ptr %52, i32 0, i32 0
  %756 = load i64, ptr %755, align 4
  %757 = getelementptr inbounds { i64, i64 }, ptr %52, i32 0, i32 1
  %758 = load i64, ptr %757, align 4
  %759 = getelementptr inbounds { i64, i64 }, ptr %54, i32 0, i32 0
  %760 = load i64, ptr %759, align 4
  %761 = getelementptr inbounds { i64, i64 }, ptr %54, i32 0, i32 1
  %762 = load i64, ptr %761, align 4
  %763 = call i32 @libxsmm_meqn_push_back_arg(i64 %754, i64 %756, i64 %758, i64 %760, i64 %762)
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #8
  %764 = load i32, ptr %36, align 4, !tbaa !5
  %765 = load i32, ptr %34, align 4, !tbaa !5
  %766 = load i32, ptr %16, align 4, !tbaa !5
  %767 = load i32, ptr %40, align 4, !tbaa !5
  %768 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %764, i32 noundef %765, i32 noundef %766, i32 noundef %767)
  %769 = getelementptr inbounds { i64, i64 }, ptr %59, i32 0, i32 0
  %770 = extractvalue { i64, i64 } %768, 0
  store i64 %770, ptr %769, align 4
  %771 = getelementptr inbounds { i64, i64 }, ptr %59, i32 0, i32 1
  %772 = extractvalue { i64, i64 } %768, 1
  store i64 %772, ptr %771, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %52, ptr align 4 %59, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #8
  %773 = load i32, ptr %9, align 4, !tbaa !5
  %774 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %773, i32 noundef 1)
  store i64 %774, ptr %60, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %48, ptr align 4 %60, i64 8, i1 false), !tbaa.struct !52
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #8
  %775 = load i64, ptr %48, align 4
  %776 = getelementptr inbounds { i64, i64 }, ptr %52, i32 0, i32 0
  %777 = load i64, ptr %776, align 4
  %778 = getelementptr inbounds { i64, i64 }, ptr %52, i32 0, i32 1
  %779 = load i64, ptr %778, align 4
  %780 = getelementptr inbounds { i64, i64 }, ptr %54, i32 0, i32 0
  %781 = load i64, ptr %780, align 4
  %782 = getelementptr inbounds { i64, i64 }, ptr %54, i32 0, i32 1
  %783 = load i64, ptr %782, align 4
  %784 = call i32 @libxsmm_meqn_push_back_arg(i64 %775, i64 %777, i64 %779, i64 %781, i64 %783)
  call void @llvm.lifetime.start.p0(i64 16, ptr %61) #8
  %785 = load i32, ptr %36, align 4, !tbaa !5
  %786 = load i32, ptr %34, align 4, !tbaa !5
  %787 = load i32, ptr %17, align 4, !tbaa !5
  %788 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %785, i32 noundef %786, i32 noundef %787, i32 noundef 1)
  %789 = getelementptr inbounds { i64, i64 }, ptr %61, i32 0, i32 0
  %790 = extractvalue { i64, i64 } %788, 0
  store i64 %790, ptr %789, align 4
  %791 = getelementptr inbounds { i64, i64 }, ptr %61, i32 0, i32 1
  %792 = extractvalue { i64, i64 } %788, 1
  store i64 %792, ptr %791, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %42, ptr align 4 %61, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %61) #8
  %793 = load i32, ptr %9, align 4, !tbaa !5
  %794 = getelementptr inbounds { i64, i64 }, ptr %42, i32 0, i32 0
  %795 = load i64, ptr %794, align 4
  %796 = getelementptr inbounds { i64, i64 }, ptr %42, i32 0, i32 1
  %797 = load i64, ptr %796, align 4
  %798 = call ptr @libxsmm_dispatch_meqn(i32 noundef %793, i64 %795, i64 %797)
  store ptr %798, ptr %12, align 8, !tbaa !9
  %799 = load ptr, ptr %12, align 8, !tbaa !9
  %800 = call i32 @libxsmm_get_kernel_info(ptr noundef %799, ptr noundef @info)
  %801 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !32
  store i32 %801, ptr @is_reference_kernel, align 4, !tbaa !5
  %802 = load ptr, ptr %12, align 8, !tbaa !9
  %803 = icmp eq ptr %802, null
  br i1 %803, label %804, label %807

804:                                              ; preds = %724
  %805 = load ptr, ptr @stderr, align 8, !tbaa !9
  %806 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %805, ptr noundef @.str.15) #8
  call void @exit(i32 noundef -1) #10
  unreachable

807:                                              ; preds = %724
  %808 = call i32 @libxsmm_meqn_create()
  store i32 %808, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #8
  %809 = load i32, ptr %10, align 4, !tbaa !5
  %810 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %809, i32 noundef -1)
  store i64 %810, ptr %62, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %51, ptr align 4 %62, i64 8, i1 false), !tbaa.struct !52
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #8
  %811 = load i64, ptr %51, align 4
  %812 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %811, i32 noundef 4, i32 noundef 1, i32 noundef 576)
  %813 = load i64, ptr %51, align 4
  %814 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %813, i32 noundef 18, i32 noundef 1, i32 noundef 32)
  %815 = load i64, ptr %51, align 4
  %816 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %815, i32 noundef 18, i32 noundef 1, i32 noundef 16)
  call void @llvm.lifetime.start.p0(i64 16, ptr %63) #8
  %817 = load i32, ptr %36, align 4, !tbaa !5
  %818 = load i32, ptr %34, align 4, !tbaa !5
  %819 = load i32, ptr %17, align 4, !tbaa !5
  %820 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %817, i32 noundef %818, i32 noundef %819, i32 noundef 1)
  %821 = getelementptr inbounds { i64, i64 }, ptr %63, i32 0, i32 0
  %822 = extractvalue { i64, i64 } %820, 0
  store i64 %822, ptr %821, align 4
  %823 = getelementptr inbounds { i64, i64 }, ptr %63, i32 0, i32 1
  %824 = extractvalue { i64, i64 } %820, 1
  store i64 %824, ptr %823, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %53, ptr align 4 %63, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %63) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #8
  %825 = load i32, ptr %10, align 4, !tbaa !5
  %826 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %825, i32 noundef 0)
  store i64 %826, ptr %64, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %49, ptr align 4 %64, i64 8, i1 false), !tbaa.struct !52
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #8
  %827 = load i64, ptr %49, align 4
  %828 = getelementptr inbounds { i64, i64 }, ptr %53, i32 0, i32 0
  %829 = load i64, ptr %828, align 4
  %830 = getelementptr inbounds { i64, i64 }, ptr %53, i32 0, i32 1
  %831 = load i64, ptr %830, align 4
  %832 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 0
  %833 = load i64, ptr %832, align 4
  %834 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 1
  %835 = load i64, ptr %834, align 4
  %836 = call i32 @libxsmm_meqn_push_back_arg(i64 %827, i64 %829, i64 %831, i64 %833, i64 %835)
  call void @llvm.lifetime.start.p0(i64 16, ptr %65) #8
  %837 = load i32, ptr %36, align 4, !tbaa !5
  %838 = load i32, ptr %34, align 4, !tbaa !5
  %839 = load i32, ptr %17, align 4, !tbaa !5
  %840 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %837, i32 noundef %838, i32 noundef %839, i32 noundef 1)
  %841 = getelementptr inbounds { i64, i64 }, ptr %65, i32 0, i32 0
  %842 = extractvalue { i64, i64 } %840, 0
  store i64 %842, ptr %841, align 4
  %843 = getelementptr inbounds { i64, i64 }, ptr %65, i32 0, i32 1
  %844 = extractvalue { i64, i64 } %840, 1
  store i64 %844, ptr %843, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %53, ptr align 4 %65, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #8
  %845 = load i32, ptr %10, align 4, !tbaa !5
  %846 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %845, i32 noundef 0)
  store i64 %846, ptr %66, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %49, ptr align 4 %66, i64 8, i1 false), !tbaa.struct !52
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #8
  %847 = load i64, ptr %49, align 4
  %848 = getelementptr inbounds { i64, i64 }, ptr %53, i32 0, i32 0
  %849 = load i64, ptr %848, align 4
  %850 = getelementptr inbounds { i64, i64 }, ptr %53, i32 0, i32 1
  %851 = load i64, ptr %850, align 4
  %852 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 0
  %853 = load i64, ptr %852, align 4
  %854 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 1
  %855 = load i64, ptr %854, align 4
  %856 = call i32 @libxsmm_meqn_push_back_arg(i64 %847, i64 %849, i64 %851, i64 %853, i64 %855)
  call void @llvm.lifetime.start.p0(i64 16, ptr %67) #8
  %857 = load i32, ptr %36, align 4, !tbaa !5
  %858 = load i32, ptr %34, align 4, !tbaa !5
  %859 = load i32, ptr %16, align 4, !tbaa !5
  %860 = load i32, ptr %40, align 4, !tbaa !5
  %861 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %857, i32 noundef %858, i32 noundef %859, i32 noundef %860)
  %862 = getelementptr inbounds { i64, i64 }, ptr %67, i32 0, i32 0
  %863 = extractvalue { i64, i64 } %861, 0
  store i64 %863, ptr %862, align 4
  %864 = getelementptr inbounds { i64, i64 }, ptr %67, i32 0, i32 1
  %865 = extractvalue { i64, i64 } %861, 1
  store i64 %865, ptr %864, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %53, ptr align 4 %67, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %67) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #8
  %866 = load i32, ptr %10, align 4, !tbaa !5
  %867 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %866, i32 noundef 1)
  store i64 %867, ptr %68, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %49, ptr align 4 %68, i64 8, i1 false), !tbaa.struct !52
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #8
  %868 = load i64, ptr %49, align 4
  %869 = getelementptr inbounds { i64, i64 }, ptr %53, i32 0, i32 0
  %870 = load i64, ptr %869, align 4
  %871 = getelementptr inbounds { i64, i64 }, ptr %53, i32 0, i32 1
  %872 = load i64, ptr %871, align 4
  %873 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 0
  %874 = load i64, ptr %873, align 4
  %875 = getelementptr inbounds { i64, i64 }, ptr %55, i32 0, i32 1
  %876 = load i64, ptr %875, align 4
  %877 = call i32 @libxsmm_meqn_push_back_arg(i64 %868, i64 %870, i64 %872, i64 %874, i64 %876)
  call void @llvm.lifetime.start.p0(i64 16, ptr %69) #8
  %878 = load i32, ptr %36, align 4, !tbaa !5
  %879 = load i32, ptr %34, align 4, !tbaa !5
  %880 = load i32, ptr %16, align 4, !tbaa !5
  %881 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %878, i32 noundef %879, i32 noundef %880, i32 noundef 1)
  %882 = getelementptr inbounds { i64, i64 }, ptr %69, i32 0, i32 0
  %883 = extractvalue { i64, i64 } %881, 0
  store i64 %883, ptr %882, align 4
  %884 = getelementptr inbounds { i64, i64 }, ptr %69, i32 0, i32 1
  %885 = extractvalue { i64, i64 } %881, 1
  store i64 %885, ptr %884, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %42, ptr align 4 %69, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %69) #8
  %886 = load i32, ptr %10, align 4, !tbaa !5
  %887 = getelementptr inbounds { i64, i64 }, ptr %42, i32 0, i32 0
  %888 = load i64, ptr %887, align 4
  %889 = getelementptr inbounds { i64, i64 }, ptr %42, i32 0, i32 1
  %890 = load i64, ptr %889, align 4
  %891 = call ptr @libxsmm_dispatch_meqn(i32 noundef %886, i64 %888, i64 %890)
  store ptr %891, ptr %13, align 8, !tbaa !9
  %892 = load ptr, ptr %13, align 8, !tbaa !9
  %893 = call i32 @libxsmm_get_kernel_info(ptr noundef %892, ptr noundef @info)
  %894 = load i32, ptr getelementptr inbounds (%struct.libxsmm_kernel_info, ptr @info, i32 0, i32 3), align 8, !tbaa !32
  store i32 %894, ptr @is_reference_kernel, align 4, !tbaa !5
  %895 = load ptr, ptr %13, align 8, !tbaa !9
  %896 = icmp eq ptr %895, null
  br i1 %896, label %897, label %900

897:                                              ; preds = %807
  %898 = load ptr, ptr @stderr, align 8, !tbaa !9
  %899 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %898, ptr noundef @.str.16) #8
  call void @exit(i32 noundef -1) #10
  unreachable

900:                                              ; preds = %807
  %901 = load i32, ptr %38, align 4, !tbaa !5
  %902 = icmp eq i32 %901, 0
  br i1 %902, label %903, label %925

903:                                              ; preds = %900
  %904 = load i32, ptr %34, align 4, !tbaa !5
  %905 = sext i32 %904 to i64
  %906 = load i32, ptr %35, align 4, !tbaa !5
  %907 = sext i32 %906 to i64
  %908 = load i32, ptr %36, align 4, !tbaa !5
  %909 = sext i32 %908 to i64
  %910 = load ptr, ptr %27, align 8, !tbaa !9
  %911 = load ptr, ptr %26, align 8, !tbaa !9
  %912 = load ptr, ptr %29, align 8, !tbaa !9
  call void @vectorized_softmax_bwd(i64 noundef %905, i64 noundef %907, i64 noundef %909, ptr noundef %910, ptr noundef %911, ptr noundef %912)
  %913 = load i32, ptr %34, align 4, !tbaa !5
  %914 = sext i32 %913 to i64
  %915 = load i32, ptr %35, align 4, !tbaa !5
  %916 = sext i32 %915 to i64
  %917 = load i32, ptr %36, align 4, !tbaa !5
  %918 = sext i32 %917 to i64
  %919 = load ptr, ptr %28, align 8, !tbaa !9
  %920 = load ptr, ptr %26, align 8, !tbaa !9
  %921 = load ptr, ptr %29, align 8, !tbaa !9
  %922 = load ptr, ptr %25, align 8, !tbaa !9
  %923 = load ptr, ptr %12, align 8, !tbaa !9
  %924 = load ptr, ptr %13, align 8, !tbaa !9
  call void @tpp_softmax_bwd(i64 noundef %914, i64 noundef %916, i64 noundef %918, ptr noundef %919, ptr noundef %920, ptr noundef %921, ptr noundef %922, ptr noundef %923, ptr noundef %924)
  br label %951

925:                                              ; preds = %900
  %926 = load i32, ptr %38, align 4, !tbaa !5
  %927 = icmp eq i32 %926, 1
  br i1 %927, label %928, label %950

928:                                              ; preds = %925
  %929 = load i32, ptr %34, align 4, !tbaa !5
  %930 = sext i32 %929 to i64
  %931 = load i32, ptr %35, align 4, !tbaa !5
  %932 = sext i32 %931 to i64
  %933 = load i32, ptr %36, align 4, !tbaa !5
  %934 = sext i32 %933 to i64
  %935 = load ptr, ptr %27, align 8, !tbaa !9
  %936 = load ptr, ptr %26, align 8, !tbaa !9
  %937 = load ptr, ptr %32, align 8, !tbaa !9
  call void @vectorized_softmax_bwd_bf16(i64 noundef %930, i64 noundef %932, i64 noundef %934, ptr noundef %935, ptr noundef %936, ptr noundef %937)
  %938 = load i32, ptr %34, align 4, !tbaa !5
  %939 = sext i32 %938 to i64
  %940 = load i32, ptr %35, align 4, !tbaa !5
  %941 = sext i32 %940 to i64
  %942 = load i32, ptr %36, align 4, !tbaa !5
  %943 = sext i32 %942 to i64
  %944 = load ptr, ptr %28, align 8, !tbaa !9
  %945 = load ptr, ptr %26, align 8, !tbaa !9
  %946 = load ptr, ptr %32, align 8, !tbaa !9
  %947 = load ptr, ptr %25, align 8, !tbaa !9
  %948 = load ptr, ptr %12, align 8, !tbaa !9
  %949 = load ptr, ptr %13, align 8, !tbaa !9
  call void @tpp_softmax_bwd_bf16(i64 noundef %939, i64 noundef %941, i64 noundef %943, ptr noundef %944, ptr noundef %945, ptr noundef %946, ptr noundef %947, ptr noundef %948, ptr noundef %949)
  br label %950

950:                                              ; preds = %928, %925
  br label %951

951:                                              ; preds = %950, %903
  %952 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  %953 = load i32, ptr %38, align 4, !tbaa !5
  %954 = icmp eq i32 %953, 0
  br i1 %954, label %955, label %957

955:                                              ; preds = %951
  %956 = call i32 (ptr, ...) @printf(ptr noundef @.str.17)
  br label %959

957:                                              ; preds = %951
  %958 = call i32 (ptr, ...) @printf(ptr noundef @.str.18)
  br label %959

959:                                              ; preds = %957, %955
  %960 = call i32 (ptr, ...) @printf(ptr noundef @.str.2)
  %961 = load i32, ptr %34, align 4, !tbaa !5
  %962 = load i32, ptr %35, align 4, !tbaa !5
  %963 = mul nsw i32 %961, %962
  %964 = load i32, ptr %36, align 4, !tbaa !5
  %965 = mul nsw i32 %963, %964
  %966 = load ptr, ptr %27, align 8, !tbaa !9
  %967 = load ptr, ptr %28, align 8, !tbaa !9
  %968 = call i32 @libxsmm_matdiff(ptr noundef %24, i32 noundef 1, i32 noundef %965, i32 noundef 1, ptr noundef %966, ptr noundef %967, ptr noundef null, ptr noundef null)
  %969 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 10
  %970 = load double, ptr %969, align 8, !tbaa !38
  %971 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, double noundef %970)
  %972 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 15
  %973 = load double, ptr %972, align 8, !tbaa !40
  %974 = call i32 (ptr, ...) @printf(ptr noundef @.str.6, double noundef %973)
  %975 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 7
  %976 = load double, ptr %975, align 8, !tbaa !41
  %977 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %976)
  %978 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 8
  %979 = load double, ptr %978, align 8, !tbaa !42
  %980 = call i32 (ptr, ...) @printf(ptr noundef @.str.8, double noundef %979)
  %981 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 5
  %982 = load double, ptr %981, align 8, !tbaa !43
  %983 = call i32 (ptr, ...) @printf(ptr noundef @.str.9, double noundef %982)
  %984 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 6
  %985 = load double, ptr %984, align 8, !tbaa !44
  %986 = call i32 (ptr, ...) @printf(ptr noundef @.str.10, double noundef %985)
  %987 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 4
  %988 = load double, ptr %987, align 8, !tbaa !45
  %989 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, double noundef %988)
  %990 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %24, i32 0, i32 4
  %991 = load double, ptr %990, align 8, !tbaa !45
  %992 = load double, ptr %7, align 8, !tbaa !11
  %993 = fcmp ogt double %991, %992
  br i1 %993, label %994, label %995

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

995:                                              ; preds = %994, %959
  %996 = load i32, ptr %37, align 4, !tbaa !5
  %997 = icmp sgt i32 %996, 0
  br i1 %997, label %998, label %1178

998:                                              ; preds = %995
  %999 = load i32, ptr %38, align 4, !tbaa !5
  %1000 = icmp eq i32 %999, 0
  br i1 %1000, label %1001, label %1084

1001:                                             ; preds = %998
  %1002 = load i32, ptr %34, align 4, !tbaa !5
  %1003 = sext i32 %1002 to i64
  %1004 = load i32, ptr %35, align 4, !tbaa !5
  %1005 = sext i32 %1004 to i64
  %1006 = load i32, ptr %36, align 4, !tbaa !5
  %1007 = sext i32 %1006 to i64
  %1008 = load ptr, ptr %27, align 8, !tbaa !9
  %1009 = load ptr, ptr %26, align 8, !tbaa !9
  %1010 = load ptr, ptr %29, align 8, !tbaa !9
  call void @vectorized_softmax_bwd(i64 noundef %1003, i64 noundef %1005, i64 noundef %1007, ptr noundef %1008, ptr noundef %1009, ptr noundef %1010)
  %1011 = call i64 @libxsmm_timer_tick()
  store i64 %1011, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %1012

1012:                                             ; preds = %1026, %1001
  %1013 = load i32, ptr %15, align 4, !tbaa !5
  %1014 = load i32, ptr %37, align 4, !tbaa !5
  %1015 = icmp slt i32 %1013, %1014
  br i1 %1015, label %1016, label %1029

1016:                                             ; preds = %1012
  %1017 = load i32, ptr %34, align 4, !tbaa !5
  %1018 = sext i32 %1017 to i64
  %1019 = load i32, ptr %35, align 4, !tbaa !5
  %1020 = sext i32 %1019 to i64
  %1021 = load i32, ptr %36, align 4, !tbaa !5
  %1022 = sext i32 %1021 to i64
  %1023 = load ptr, ptr %27, align 8, !tbaa !9
  %1024 = load ptr, ptr %26, align 8, !tbaa !9
  %1025 = load ptr, ptr %29, align 8, !tbaa !9
  call void @vectorized_softmax_bwd(i64 noundef %1018, i64 noundef %1020, i64 noundef %1022, ptr noundef %1023, ptr noundef %1024, ptr noundef %1025)
  br label %1026

1026:                                             ; preds = %1016
  %1027 = load i32, ptr %15, align 4, !tbaa !5
  %1028 = add nsw i32 %1027, 1
  store i32 %1028, ptr %15, align 4, !tbaa !5
  br label %1012, !llvm.loop !53

1029:                                             ; preds = %1012
  %1030 = call i64 @libxsmm_timer_tick()
  store i64 %1030, ptr %19, align 8, !tbaa !46
  %1031 = load i64, ptr %18, align 8, !tbaa !46
  %1032 = load i64, ptr %19, align 8, !tbaa !46
  %1033 = call double @libxsmm_timer_duration(i64 noundef %1031, i64 noundef %1032)
  store double %1033, ptr %20, align 8, !tbaa !11
  %1034 = load double, ptr %20, align 8, !tbaa !11
  %1035 = call i32 (ptr, ...) @printf(ptr noundef @.str.19, double noundef %1034)
  %1036 = load i32, ptr %34, align 4, !tbaa !5
  %1037 = sext i32 %1036 to i64
  %1038 = load i32, ptr %35, align 4, !tbaa !5
  %1039 = sext i32 %1038 to i64
  %1040 = load i32, ptr %36, align 4, !tbaa !5
  %1041 = sext i32 %1040 to i64
  %1042 = load ptr, ptr %28, align 8, !tbaa !9
  %1043 = load ptr, ptr %26, align 8, !tbaa !9
  %1044 = load ptr, ptr %29, align 8, !tbaa !9
  %1045 = load ptr, ptr %25, align 8, !tbaa !9
  %1046 = load ptr, ptr %12, align 8, !tbaa !9
  %1047 = load ptr, ptr %13, align 8, !tbaa !9
  call void @tpp_softmax_bwd(i64 noundef %1037, i64 noundef %1039, i64 noundef %1041, ptr noundef %1042, ptr noundef %1043, ptr noundef %1044, ptr noundef %1045, ptr noundef %1046, ptr noundef %1047)
  %1048 = call i64 @libxsmm_timer_tick()
  store i64 %1048, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %1049

1049:                                             ; preds = %1066, %1029
  %1050 = load i32, ptr %15, align 4, !tbaa !5
  %1051 = load i32, ptr %37, align 4, !tbaa !5
  %1052 = icmp slt i32 %1050, %1051
  br i1 %1052, label %1053, label %1069

1053:                                             ; preds = %1049
  %1054 = load i32, ptr %34, align 4, !tbaa !5
  %1055 = sext i32 %1054 to i64
  %1056 = load i32, ptr %35, align 4, !tbaa !5
  %1057 = sext i32 %1056 to i64
  %1058 = load i32, ptr %36, align 4, !tbaa !5
  %1059 = sext i32 %1058 to i64
  %1060 = load ptr, ptr %28, align 8, !tbaa !9
  %1061 = load ptr, ptr %26, align 8, !tbaa !9
  %1062 = load ptr, ptr %29, align 8, !tbaa !9
  %1063 = load ptr, ptr %25, align 8, !tbaa !9
  %1064 = load ptr, ptr %12, align 8, !tbaa !9
  %1065 = load ptr, ptr %13, align 8, !tbaa !9
  call void @tpp_softmax_bwd(i64 noundef %1055, i64 noundef %1057, i64 noundef %1059, ptr noundef %1060, ptr noundef %1061, ptr noundef %1062, ptr noundef %1063, ptr noundef %1064, ptr noundef %1065)
  br label %1066

1066:                                             ; preds = %1053
  %1067 = load i32, ptr %15, align 4, !tbaa !5
  %1068 = add nsw i32 %1067, 1
  store i32 %1068, ptr %15, align 4, !tbaa !5
  br label %1049, !llvm.loop !54

1069:                                             ; preds = %1049
  %1070 = call i64 @libxsmm_timer_tick()
  store i64 %1070, ptr %19, align 8, !tbaa !46
  %1071 = load i64, ptr %18, align 8, !tbaa !46
  %1072 = load i64, ptr %19, align 8, !tbaa !46
  %1073 = call double @libxsmm_timer_duration(i64 noundef %1071, i64 noundef %1072)
  store double %1073, ptr %21, align 8, !tbaa !11
  %1074 = load double, ptr %21, align 8, !tbaa !11
  %1075 = call i32 (ptr, ...) @printf(ptr noundef @.str.20, double noundef %1074)
  %1076 = load double, ptr %21, align 8, !tbaa !11
  %1077 = fcmp olt double 0.000000e+00, %1076
  br i1 %1077, label %1078, label %1083

1078:                                             ; preds = %1069
  %1079 = load double, ptr %20, align 8, !tbaa !11
  %1080 = load double, ptr %21, align 8, !tbaa !11
  %1081 = fdiv double %1079, %1080
  %1082 = call i32 (ptr, ...) @printf(ptr noundef @.str.21, double noundef %1081)
  br label %1083

1083:                                             ; preds = %1078, %1069
  br label %1171

1084:                                             ; preds = %998
  %1085 = load i32, ptr %38, align 4, !tbaa !5
  %1086 = icmp eq i32 %1085, 1
  br i1 %1086, label %1087, label %1170

1087:                                             ; preds = %1084
  %1088 = load i32, ptr %34, align 4, !tbaa !5
  %1089 = sext i32 %1088 to i64
  %1090 = load i32, ptr %35, align 4, !tbaa !5
  %1091 = sext i32 %1090 to i64
  %1092 = load i32, ptr %36, align 4, !tbaa !5
  %1093 = sext i32 %1092 to i64
  %1094 = load ptr, ptr %27, align 8, !tbaa !9
  %1095 = load ptr, ptr %26, align 8, !tbaa !9
  %1096 = load ptr, ptr %32, align 8, !tbaa !9
  call void @vectorized_softmax_bwd_bf16(i64 noundef %1089, i64 noundef %1091, i64 noundef %1093, ptr noundef %1094, ptr noundef %1095, ptr noundef %1096)
  %1097 = call i64 @libxsmm_timer_tick()
  store i64 %1097, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %1098

1098:                                             ; preds = %1112, %1087
  %1099 = load i32, ptr %15, align 4, !tbaa !5
  %1100 = load i32, ptr %37, align 4, !tbaa !5
  %1101 = icmp slt i32 %1099, %1100
  br i1 %1101, label %1102, label %1115

1102:                                             ; preds = %1098
  %1103 = load i32, ptr %34, align 4, !tbaa !5
  %1104 = sext i32 %1103 to i64
  %1105 = load i32, ptr %35, align 4, !tbaa !5
  %1106 = sext i32 %1105 to i64
  %1107 = load i32, ptr %36, align 4, !tbaa !5
  %1108 = sext i32 %1107 to i64
  %1109 = load ptr, ptr %27, align 8, !tbaa !9
  %1110 = load ptr, ptr %26, align 8, !tbaa !9
  %1111 = load ptr, ptr %32, align 8, !tbaa !9
  call void @vectorized_softmax_bwd_bf16(i64 noundef %1104, i64 noundef %1106, i64 noundef %1108, ptr noundef %1109, ptr noundef %1110, ptr noundef %1111)
  br label %1112

1112:                                             ; preds = %1102
  %1113 = load i32, ptr %15, align 4, !tbaa !5
  %1114 = add nsw i32 %1113, 1
  store i32 %1114, ptr %15, align 4, !tbaa !5
  br label %1098, !llvm.loop !55

1115:                                             ; preds = %1098
  %1116 = call i64 @libxsmm_timer_tick()
  store i64 %1116, ptr %19, align 8, !tbaa !46
  %1117 = load i64, ptr %18, align 8, !tbaa !46
  %1118 = load i64, ptr %19, align 8, !tbaa !46
  %1119 = call double @libxsmm_timer_duration(i64 noundef %1117, i64 noundef %1118)
  store double %1119, ptr %20, align 8, !tbaa !11
  %1120 = load double, ptr %20, align 8, !tbaa !11
  %1121 = call i32 (ptr, ...) @printf(ptr noundef @.str.19, double noundef %1120)
  %1122 = load i32, ptr %34, align 4, !tbaa !5
  %1123 = sext i32 %1122 to i64
  %1124 = load i32, ptr %35, align 4, !tbaa !5
  %1125 = sext i32 %1124 to i64
  %1126 = load i32, ptr %36, align 4, !tbaa !5
  %1127 = sext i32 %1126 to i64
  %1128 = load ptr, ptr %28, align 8, !tbaa !9
  %1129 = load ptr, ptr %26, align 8, !tbaa !9
  %1130 = load ptr, ptr %32, align 8, !tbaa !9
  %1131 = load ptr, ptr %25, align 8, !tbaa !9
  %1132 = load ptr, ptr %12, align 8, !tbaa !9
  %1133 = load ptr, ptr %13, align 8, !tbaa !9
  call void @tpp_softmax_bwd_bf16(i64 noundef %1123, i64 noundef %1125, i64 noundef %1127, ptr noundef %1128, ptr noundef %1129, ptr noundef %1130, ptr noundef %1131, ptr noundef %1132, ptr noundef %1133)
  %1134 = call i64 @libxsmm_timer_tick()
  store i64 %1134, ptr %18, align 8, !tbaa !46
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %1135

1135:                                             ; preds = %1152, %1115
  %1136 = load i32, ptr %15, align 4, !tbaa !5
  %1137 = load i32, ptr %37, align 4, !tbaa !5
  %1138 = icmp slt i32 %1136, %1137
  br i1 %1138, label %1139, label %1155

1139:                                             ; preds = %1135
  %1140 = load i32, ptr %34, align 4, !tbaa !5
  %1141 = sext i32 %1140 to i64
  %1142 = load i32, ptr %35, align 4, !tbaa !5
  %1143 = sext i32 %1142 to i64
  %1144 = load i32, ptr %36, align 4, !tbaa !5
  %1145 = sext i32 %1144 to i64
  %1146 = load ptr, ptr %28, align 8, !tbaa !9
  %1147 = load ptr, ptr %26, align 8, !tbaa !9
  %1148 = load ptr, ptr %32, align 8, !tbaa !9
  %1149 = load ptr, ptr %25, align 8, !tbaa !9
  %1150 = load ptr, ptr %12, align 8, !tbaa !9
  %1151 = load ptr, ptr %13, align 8, !tbaa !9
  call void @tpp_softmax_bwd_bf16(i64 noundef %1141, i64 noundef %1143, i64 noundef %1145, ptr noundef %1146, ptr noundef %1147, ptr noundef %1148, ptr noundef %1149, ptr noundef %1150, ptr noundef %1151)
  br label %1152

1152:                                             ; preds = %1139
  %1153 = load i32, ptr %15, align 4, !tbaa !5
  %1154 = add nsw i32 %1153, 1
  store i32 %1154, ptr %15, align 4, !tbaa !5
  br label %1135, !llvm.loop !56

1155:                                             ; preds = %1135
  %1156 = call i64 @libxsmm_timer_tick()
  store i64 %1156, ptr %19, align 8, !tbaa !46
  %1157 = load i64, ptr %18, align 8, !tbaa !46
  %1158 = load i64, ptr %19, align 8, !tbaa !46
  %1159 = call double @libxsmm_timer_duration(i64 noundef %1157, i64 noundef %1158)
  store double %1159, ptr %21, align 8, !tbaa !11
  %1160 = load double, ptr %21, align 8, !tbaa !11
  %1161 = call i32 (ptr, ...) @printf(ptr noundef @.str.20, double noundef %1160)
  %1162 = load double, ptr %21, align 8, !tbaa !11
  %1163 = fcmp olt double 0.000000e+00, %1162
  br i1 %1163, label %1164, label %1169

1164:                                             ; preds = %1155
  %1165 = load double, ptr %20, align 8, !tbaa !11
  %1166 = load double, ptr %21, align 8, !tbaa !11
  %1167 = fdiv double %1165, %1166
  %1168 = call i32 (ptr, ...) @printf(ptr noundef @.str.21, double noundef %1167)
  br label %1169

1169:                                             ; preds = %1164, %1155
  br label %1170

1170:                                             ; preds = %1169, %1084
  br label %1171

1171:                                             ; preds = %1170, %1083
  %1172 = load double, ptr %21, align 8, !tbaa !11
  %1173 = load double, ptr %23, align 8, !tbaa !11
  %1174 = fadd double %1173, %1172
  store double %1174, ptr %23, align 8, !tbaa !11
  %1175 = load double, ptr %20, align 8, !tbaa !11
  %1176 = load double, ptr %22, align 8, !tbaa !11
  %1177 = fadd double %1176, %1175
  store double %1177, ptr %22, align 8, !tbaa !11
  br label %1178

1178:                                             ; preds = %1171, %995
  call void @llvm.lifetime.end.p0(i64 16, ptr %55) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #8
  call void @llvm.lifetime.end.p0(i64 16, 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
  br label %1179

1179:                                             ; preds = %1178, %720
  %1180 = load i32, ptr %37, align 4, !tbaa !5
  %1181 = icmp sgt i32 %1180, 0
  br i1 %1181, label %1182, label %1189

1182:                                             ; preds = %1179
  %1183 = call i32 (ptr, ...) @printf(ptr noundef @.str.22)
  %1184 = load double, ptr %22, align 8, !tbaa !11
  %1185 = load double, ptr %23, align 8, !tbaa !11
  %1186 = fdiv double %1184, %1185
  %1187 = call i32 (ptr, ...) @printf(ptr noundef @.str.23, double noundef %1186)
  %1188 = call i32 (ptr, ...) @printf(ptr noundef @.str.24)
  br label %1189

1189:                                             ; preds = %1182, %1179
  %1190 = load ptr, ptr %26, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1190)
  %1191 = load ptr, ptr %27, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1191)
  %1192 = load ptr, ptr %29, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1192)
  %1193 = load ptr, ptr %28, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1193)
  %1194 = load ptr, ptr %31, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1194)
  %1195 = load ptr, ptr %32, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1195)
  %1196 = load ptr, ptr %33, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1196)
  %1197 = load ptr, ptr %30, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %1197)
  %1198 = load i32, ptr %6, align 4, !tbaa !5
  %1199 = icmp eq i32 %1198, 0
  br i1 %1199, label %1200, label %1203

1200:                                             ; preds = %1189
  %1201 = load i32, ptr @is_reference_kernel, align 4, !tbaa !5
  %1202 = call i32 @libxsmm_return_success_code(i32 noundef %1201)
  br label %1205

1203:                                             ; preds = %1189
  %1204 = load i32, ptr %6, align 4, !tbaa !5
  br label %1205

1205:                                             ; preds = %1203, %1200
  %1206 = phi i32 [ %1202, %1200 ], [ %1204, %1203 ]
  store i32 %1206, ptr %6, align 4, !tbaa !5
  %1207 = load i32, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 16, ptr %42) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 4, 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 8, ptr %31) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 192, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 8, 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 %1207
}

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

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

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 i32 @libxsmm_meqn_create() #2

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

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

declare i32 @libxsmm_meqn_push_back_unary_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

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

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

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

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_softmax_fwd_bf16(i64 noundef, i64 noundef, i64 noundef, ptr 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 { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef, i32 noundef, i32 noundef, i32 noundef) #2

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @tpp_softmax_bwd_bf16(i64 noundef, i64 noundef, i64 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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { 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 #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 = !{!19, !6, i64 0}
!19 = !{!"libxsmm_matrix_arg_attributes", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12}
!20 = !{!21, !6, i64 0}
!21 = !{!"libxsmm_meqn_op_metadata", !6, i64 0, !6, i64 4}
!22 = !{!21, !6, i64 4}
!23 = !{!24, !6, i64 0}
!24 = !{!"libxsmm_meqn_arg_metadata", !6, i64 0, !6, i64 4}
!25 = !{!24, !6, i64 4}
!26 = !{!27, !6, i64 0}
!27 = !{!"libxsmm_meqn_arg_shape", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12}
!28 = !{!27, !6, i64 4}
!29 = !{!27, !6, i64 8}
!30 = !{!27, !6, i64 12}
!31 = !{i64 0, i64 4, !5, i64 4, i64 4, !5, i64 8, i64 4, !5, i64 12, i64 4, !5}
!32 = !{!33, !6, i64 16}
!33 = !{!"libxsmm_kernel_info", !6, i64 0, !6, i64 4, !34, i64 8, !6, i64 16}
!34 = !{!"long", !7, i64 0}
!35 = !{!36, !36, i64 0}
!36 = !{!"short", !7, i64 0}
!37 = distinct !{!37, !16}
!38 = !{!39, !12, i64 80}
!39 = !{!"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}
!40 = !{!39, !12, i64 120}
!41 = !{!39, !12, i64 56}
!42 = !{!39, !12, i64 64}
!43 = !{!39, !12, i64 40}
!44 = !{!39, !12, i64 48}
!45 = !{!39, !12, i64 32}
!46 = !{!47, !47, i64 0}
!47 = !{!"long long", !7, i64 0}
!48 = distinct !{!48, !16}
!49 = distinct !{!49, !16}
!50 = distinct !{!50, !16}
!51 = distinct !{!51, !16}
!52 = !{i64 0, i64 4, !5, i64 4, i64 4, !5}
!53 = distinct !{!53, !16}
!54 = distinct !{!54, !16}
!55 = distinct !{!55, !16}
!56 = distinct !{!56, !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_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
@info = external dso_local global %struct.libxsmm_kernel_info, align 8
@stderr = external local_unnamed_addr global ptr, align 8
@.str.1 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.24 = 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_matdiff_info, align 8
  call void @llvm.lifetime.start.p0(i64 192, ptr nonnull %3) #8
  tail call void @libxsmm_init() #8
  call void @libxsmm_matdiff_clear(ptr noundef nonnull %3) #8
  %4 = icmp sgt i32 %0, 1
  br i1 %4, label %5, label %.thread561.thread

5:                                                ; preds = %2
  %6 = getelementptr inbounds i8, ptr %1, i64 8
  %7 = load ptr, ptr %6, align 8, !tbaa !5
  %8 = call i32 @atoi(ptr nocapture noundef %7) #9
  %.not595 = icmp eq i32 %0, 2
  br i1 %.not595, label %.thread561.thread, label %9

9:                                                ; preds = %5
  %10 = getelementptr inbounds i8, ptr %1, i64 16
  %11 = load ptr, ptr %10, align 8, !tbaa !5
  %12 = call i32 @atoi(ptr nocapture noundef %11) #9
  %13 = icmp ugt i32 %0, 3
  br i1 %13, label %14, label %.thread561.thread

14:                                               ; preds = %9
  %15 = getelementptr inbounds i8, ptr %1, i64 24
  %16 = load ptr, ptr %15, align 8, !tbaa !5
  %17 = call i32 @atoi(ptr nocapture noundef %16) #9
  %.not596 = icmp eq i32 %0, 4
  br i1 %.not596, label %.thread561.thread, label %18

18:                                               ; preds = %14
  %19 = getelementptr inbounds i8, ptr %1, i64 32
  %20 = load ptr, ptr %19, align 8, !tbaa !5
  %21 = call i32 @atoi(ptr nocapture noundef %20) #9
  %22 = icmp ugt i32 %0, 5
  br i1 %22, label %23, label %.thread561

23:                                               ; preds = %18
  %24 = getelementptr inbounds i8, ptr %1, i64 40
  %25 = load ptr, ptr %24, align 8, !tbaa !5
  %26 = call i32 @atoi(ptr nocapture noundef %25) #9
  %.not597 = icmp eq i32 %0, 6
  br i1 %.not597, label %.thread561, label %27

27:                                               ; preds = %23
  %28 = getelementptr inbounds i8, ptr %1, i64 48
  %29 = load ptr, ptr %28, align 8, !tbaa !5
  %30 = call i32 @atoi(ptr nocapture noundef %29) #9
  br label %.thread561

.thread561:                                       ; preds = %18, %27, %23
  %.0519571 = phi i32 [ %26, %27 ], [ %26, %23 ], [ 3, %18 ]
  %.0517 = phi i32 [ %30, %27 ], [ 100, %23 ], [ 100, %18 ]
  switch i32 %21, label %31 [
    i32 0, label %.thread561.thread
    i32 1, label %.thread561.thread.fold.split
  ]

31:                                               ; preds = %.thread561
  %32 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str)
  br label %.thread561.thread

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

.thread561.thread:                                ; preds = %.thread561, %.thread561.thread.fold.split, %2, %5, %9, %14, %31
  %33 = phi i1 [ false, %31 ], [ true, %.thread561 ], [ true, %14 ], [ true, %9 ], [ true, %5 ], [ true, %2 ], [ false, %.thread561.thread.fold.split ]
  %.0517594 = phi i32 [ %.0517, %31 ], [ %.0517, %.thread561 ], [ 100, %14 ], [ 100, %9 ], [ 100, %5 ], [ 100, %2 ], [ %.0517, %.thread561.thread.fold.split ]
  %.0518559567591 = phi i32 [ %21, %31 ], [ %21, %.thread561 ], [ 0, %14 ], [ 0, %9 ], [ 0, %5 ], [ 0, %2 ], [ %21, %.thread561.thread.fold.split ]
  %.0515541547558568590 = phi i32 [ %12, %31 ], [ %12, %.thread561 ], [ %12, %14 ], [ %12, %9 ], [ 64, %5 ], [ 64, %2 ], [ %12, %.thread561.thread.fold.split ]
  %.0514536540548557569589 = phi i32 [ %8, %31 ], [ %8, %.thread561 ], [ %8, %14 ], [ %8, %9 ], [ %8, %5 ], [ 64, %2 ], [ %8, %.thread561.thread.fold.split ]
  %.0516549556570588 = phi i32 [ %17, %31 ], [ %17, %.thread561 ], [ %17, %14 ], [ 64, %9 ], [ 64, %5 ], [ 64, %2 ], [ %17, %.thread561.thread.fold.split ]
  %.0519571587 = phi i32 [ %.0519571, %31 ], [ %.0519571, %.thread561 ], [ 3, %14 ], [ 3, %9 ], [ 3, %5 ], [ 3, %2 ], [ %.0519571, %.thread561.thread.fold.split ]
  %.0520 = phi i32 [ 1, %31 ], [ 1, %.thread561 ], [ 1, %14 ], [ 1, %9 ], [ 1, %5 ], [ 1, %2 ], [ 2, %.thread561.thread.fold.split ]
  %.0490 = phi double [ 0x3F826E978D4FDF3B, %31 ], [ 0x3F826E978D4FDF3B, %.thread561 ], [ 0x3F826E978D4FDF3B, %14 ], [ 0x3F826E978D4FDF3B, %9 ], [ 0x3F826E978D4FDF3B, %5 ], [ 0x3F826E978D4FDF3B, %2 ], [ 5.000000e-03, %.thread561.thread.fold.split ]
  %34 = sext i32 %.0514536540548557569589 to i64
  %35 = shl nsw i64 %34, 2
  %36 = sext i32 %.0516549556570588 to i64
  %37 = mul i64 %35, %36
  %38 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %37, i64 noundef 2097152) #8
  %39 = sext i32 %.0515541547558568590 to i64
  %40 = mul nsw i64 %36, %39
  %41 = mul i64 %40, %35
  %42 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %41, i64 noundef 2097152) #8
  %43 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %41, i64 noundef 2097152) #8
  %44 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %41, i64 noundef 2097152) #8
  %45 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %41, i64 noundef 2097152) #8
  %46 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef 4194304, i64 noundef 2097152) #8
  %47 = shl i64 %40, 1
  %48 = mul i64 %47, %34
  %49 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %48, i64 noundef 2097152) #8
  %50 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %48, i64 noundef 2097152) #8
  %51 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %48, i64 noundef 2097152) #8
  %52 = mul i32 %.0516549556570588, %.0515541547558568590
  %53 = mul i32 %52, %.0514536540548557569589
  %54 = icmp sgt i32 %53, 0
  br i1 %54, label %.lr.ph.preheader, label %.preheader.preheader

.lr.ph.preheader:                                 ; preds = %.thread561.thread
  %wide.trip.count = zext nneg i32 %53 to i64
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %.lr.ph ]
  %55 = call double @libxsmm_rng_f64() #8
  %56 = fptrunc double %55 to float
  %57 = getelementptr inbounds float, ptr %42, i64 %indvars.iv
  store float %56, ptr %57, align 4, !tbaa !9
  %58 = call double @libxsmm_rng_f64() #8
  %59 = fptrunc double %58 to float
  %60 = getelementptr inbounds float, ptr %43, i64 %indvars.iv
  store float %59, ptr %60, align 4, !tbaa !9
  %61 = call double @libxsmm_rng_f64() #8
  %62 = fptrunc double %61 to float
  %63 = getelementptr inbounds float, ptr %44, i64 %indvars.iv
  store float %62, ptr %63, align 4, !tbaa !9
  %64 = load float, ptr %60, align 4, !tbaa !9
  %65 = getelementptr inbounds float, ptr %45, i64 %indvars.iv
  store float %64, ptr %65, align 4, !tbaa !9
  %66 = getelementptr inbounds i16, ptr %49, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %57, ptr noundef %66, i64 noundef 1) #8
  %67 = getelementptr inbounds i16, ptr %50, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %60, ptr noundef %67, i64 noundef 1) #8
  %68 = getelementptr inbounds i16, ptr %51, i64 %indvars.iv
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef nonnull %65, ptr noundef %68, i64 noundef 1) #8
  %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 %.preheader.preheader, label %.lr.ph, !llvm.loop !11

.preheader.preheader:                             ; preds = %.lr.ph, %.thread561.thread
  br label %.preheader

.preheader:                                       ; preds = %.preheader.preheader, %.preheader
  %indvars.iv635 = phi i64 [ %indvars.iv.next636, %.preheader ], [ 0, %.preheader.preheader ]
  %69 = call double @libxsmm_rng_f64() #8
  %70 = fptrunc double %69 to float
  %71 = getelementptr inbounds float, ptr %46, i64 %indvars.iv635
  store float %70, ptr %71, align 4, !tbaa !9
  %indvars.iv.next636 = add nuw nsw i64 %indvars.iv635, 1
  %exitcond638.not = icmp eq i64 %indvars.iv.next636, 1048576
  br i1 %exitcond638.not, label %72, label %.preheader, !llvm.loop !13

72:                                               ; preds = %.preheader
  %73 = and i32 %.0519571587, 1
  %.not = icmp eq i32 %73, 0
  br i1 %.not, label %169, label %74

74:                                               ; preds = %72
  %75 = call i32 @libxsmm_meqn_create() #8
  %.sroa.053.0.insert.ext = zext i32 %75 to i64
  %.sroa.053.4.insert.insert = or disjoint i64 %.sroa.053.0.insert.ext, -4294967296
  %.sroa.1261.12.insert.insert = or disjoint i64 %.sroa.053.0.insert.ext, 133143986176
  %.sroa.048.0.insert.ext = zext i32 %.0516549556570588 to i64
  %.sroa.048.4.insert.ext = zext i32 %.0514536540548557569589 to i64
  %.sroa.048.4.insert.shift = shl nuw i64 %.sroa.048.4.insert.ext, 32
  %.sroa.048.4.insert.insert = or disjoint i64 %.sroa.048.4.insert.shift, %.sroa.048.0.insert.ext
  %.sroa.549.12.insert.insert = or disjoint i64 %.sroa.048.0.insert.ext, 4294967296
  %.sroa.563.12.insert.insert = or disjoint i64 %.sroa.053.0.insert.ext, 4294967296
  %.sroa.12.24.insert.ext = zext i32 %52 to i64
  %.sroa.12.28.insert.ext = zext nneg i32 %.0520 to i64
  %.sroa.12.28.insert.shift = shl nuw nsw i64 %.sroa.12.28.insert.ext, 32
  %.sroa.12.28.insert.insert = or disjoint i64 %.sroa.12.28.insert.shift, %.sroa.12.24.insert.ext
  %76 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 2, i32 noundef 1, i32 noundef 32) #8
  %77 = call i32 @libxsmm_meqn_push_back_arg(i64 %.sroa.053.0.insert.ext, i64 %.sroa.048.4.insert.insert, i64 %.sroa.549.12.insert.insert, i64 0, i64 undef) #8
  %78 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 15, i32 noundef 1, i32 noundef 0) #8
  %79 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 18, i32 noundef 1, i32 noundef 32) #8
  %80 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 18, i32 noundef 1, i32 noundef 16) #8
  %81 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %.sroa.1261.12.insert.insert, i32 noundef 63, i32 noundef 1, i32 noundef 0) #8
  %82 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 17, i32 noundef 1, i32 noundef 0) #8
  %83 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 3, i32 noundef 1, i32 noundef 32) #8
  %84 = call i32 @libxsmm_meqn_push_back_arg(i64 %.sroa.563.12.insert.insert, i64 %.sroa.048.4.insert.insert, i64 %.sroa.12.28.insert.insert, i64 0, i64 undef) #8
  %85 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 21, i32 noundef 1, i32 noundef 32) #8
  %86 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %.sroa.053.4.insert.insert, i32 noundef 21, i32 noundef 1, i32 noundef 16) #8
  %87 = call i32 @libxsmm_meqn_push_back_arg(i64 %.sroa.563.12.insert.insert, i64 %.sroa.048.4.insert.insert, i64 %.sroa.12.28.insert.insert, i64 0, i64 undef) #8
  %88 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %52, i32 noundef %.0520) #8
  %89 = extractvalue { i64, i64 } %88, 0
  %90 = extractvalue { i64, i64 } %88, 1
  %91 = call ptr @libxsmm_dispatch_meqn(i32 noundef %75, i64 %89, i64 %90) #8
  %92 = call i32 @libxsmm_get_kernel_info(ptr noundef %91, ptr noundef nonnull @info) #8
  %93 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !14
  store i32 %93, ptr @is_reference_kernel, align 4, !tbaa !18
  %94 = icmp eq ptr %91, null
  br i1 %94, label %95, label %98

95:                                               ; preds = %74
  %96 = load ptr, ptr @stderr, align 8, !tbaa !5
  %97 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %96, ptr noundef nonnull @.str.1) #10
  call void @exit(i32 noundef -1) #11
  unreachable

98:                                               ; preds = %74
  br i1 %33, label %110, label %99

99:                                               ; preds = %98
  %100 = icmp eq i32 %.0518559567591, 1
  br i1 %100, label %101, label %.thread573

101:                                              ; preds = %99
  call void @vectorized_softmax_fwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %49, ptr noundef %50, ptr noundef %38)
  call void @tpp_softmax_fwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %49, ptr noundef %51, ptr noundef %38, ptr noundef nonnull %91)
  br i1 %54, label %.lr.ph601.preheader, label %.thread573

.lr.ph601.preheader:                              ; preds = %101
  %wide.trip.count642 = zext nneg i32 %53 to i64
  br label %.lr.ph601

.lr.ph601:                                        ; preds = %.lr.ph601.preheader, %.lr.ph601
  %indvars.iv639 = phi i64 [ 0, %.lr.ph601.preheader ], [ %indvars.iv.next640, %.lr.ph601 ]
  %102 = getelementptr inbounds i16, ptr %50, i64 %indvars.iv639
  %103 = load i16, ptr %102, align 2, !tbaa !19
  %104 = call float @upconvert_bf16(i16 noundef zeroext %103)
  %105 = getelementptr inbounds float, ptr %43, i64 %indvars.iv639
  store float %104, ptr %105, align 4, !tbaa !9
  %106 = getelementptr inbounds i16, ptr %51, i64 %indvars.iv639
  %107 = load i16, ptr %106, align 2, !tbaa !19
  %108 = call float @upconvert_bf16(i16 noundef zeroext %107)
  %109 = getelementptr inbounds float, ptr %45, i64 %indvars.iv639
  store float %108, ptr %109, align 4, !tbaa !9
  %indvars.iv.next640 = add nuw nsw i64 %indvars.iv639, 1
  %exitcond643.not = icmp eq i64 %indvars.iv.next640, %wide.trip.count642
  br i1 %exitcond643.not, label %.thread573, label %.lr.ph601, !llvm.loop !21

110:                                              ; preds = %98
  call void @vectorized_softmax_fwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %42, ptr noundef %43, ptr noundef %38)
  call void @tpp_softmax_fwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %42, ptr noundef %45, ptr noundef %38, ptr noundef nonnull %91)
  br label %.thread573

.thread573:                                       ; preds = %.lr.ph601, %99, %101, %110
  %.str.4.sink = phi ptr [ @.str.3, %110 ], [ @.str.4, %101 ], [ @.str.4, %99 ], [ @.str.4, %.lr.ph601 ]
  %111 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  %112 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.4.sink)
  %113 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  %114 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef %53, i32 noundef 1, ptr noundef %43, ptr noundef %45, ptr noundef null, ptr noundef null) #8
  %115 = getelementptr inbounds i8, ptr %3, i64 80
  %116 = load double, ptr %115, align 8, !tbaa !22
  %117 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, double noundef %116)
  %118 = getelementptr inbounds i8, ptr %3, i64 120
  %119 = load double, ptr %118, align 8, !tbaa !25
  %120 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6, double noundef %119)
  %121 = getelementptr inbounds i8, ptr %3, i64 56
  %122 = load double, ptr %121, align 8, !tbaa !26
  %123 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %122)
  %124 = getelementptr inbounds i8, ptr %3, i64 64
  %125 = load double, ptr %124, align 8, !tbaa !27
  %126 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8, double noundef %125)
  %127 = getelementptr inbounds i8, ptr %3, i64 40
  %128 = load double, ptr %127, align 8, !tbaa !28
  %129 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.9, double noundef %128)
  %130 = getelementptr inbounds i8, ptr %3, i64 48
  %131 = load double, ptr %130, align 8, !tbaa !29
  %132 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.10, double noundef %131)
  %133 = getelementptr inbounds i8, ptr %3, i64 32
  %134 = load double, ptr %133, align 8, !tbaa !30
  %135 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, double noundef %134)
  %136 = load double, ptr %133, align 8, !tbaa !30
  %137 = fcmp ogt double %136, %.0490
  %138 = icmp sgt i32 %.0517594, 0
  br i1 %138, label %139, label %169

139:                                              ; preds = %.thread573
  br i1 %33, label %.lr.ph612.preheader, label %153

.lr.ph612.preheader:                              ; preds = %139
  call void @vectorized_softmax_fwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %42, ptr noundef %43, ptr noundef %38)
  %140 = call i64 @libxsmm_timer_tick() #8
  br label %.lr.ph612

.lr.ph612:                                        ; preds = %.lr.ph612.preheader, %.lr.ph612
  %.0494610 = phi i32 [ %141, %.lr.ph612 ], [ 0, %.lr.ph612.preheader ]
  call void @vectorized_softmax_fwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %42, ptr noundef %43, ptr noundef %38)
  %141 = add nuw nsw i32 %.0494610, 1
  %exitcond646.not = icmp eq i32 %141, %.0517594
  br i1 %exitcond646.not, label %.lr.ph616.preheader, label %.lr.ph612, !llvm.loop !31

.lr.ph616.preheader:                              ; preds = %.lr.ph612
  %142 = call i64 @libxsmm_timer_tick() #8
  %143 = call double @libxsmm_timer_duration(i64 noundef %140, i64 noundef %142) #8
  %144 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, double noundef %143)
  call void @tpp_softmax_fwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %42, ptr noundef %45, ptr noundef %38, ptr noundef nonnull %91)
  %145 = call i64 @libxsmm_timer_tick() #8
  %smax647 = call i32 @llvm.smax.i32(i32 %.0517594, i32 1)
  br label %.lr.ph616

.lr.ph616:                                        ; preds = %.lr.ph616.preheader, %.lr.ph616
  %.1495614 = phi i32 [ %146, %.lr.ph616 ], [ 0, %.lr.ph616.preheader ]
  call void @tpp_softmax_fwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %42, ptr noundef %45, ptr noundef %38, ptr noundef nonnull %91)
  %146 = add nuw nsw i32 %.1495614, 1
  %exitcond648.not = icmp eq i32 %146, %smax647
  br i1 %exitcond648.not, label %._crit_edge617, label %.lr.ph616, !llvm.loop !32

._crit_edge617:                                   ; preds = %.lr.ph616
  %147 = call i64 @libxsmm_timer_tick() #8
  %148 = call double @libxsmm_timer_duration(i64 noundef %145, i64 noundef %147) #8
  %149 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, double noundef %148)
  %150 = fcmp ogt double %148, 0.000000e+00
  br i1 %150, label %151, label %169

151:                                              ; preds = %._crit_edge617
  %152 = fdiv double %143, %148
  br label %.sink.split

153:                                              ; preds = %139
  %154 = icmp eq i32 %.0518559567591, 1
  br i1 %154, label %.lr.ph604.preheader, label %169

.lr.ph604.preheader:                              ; preds = %153
  call void @vectorized_softmax_fwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %49, ptr noundef %50, ptr noundef %38)
  %155 = call i64 @libxsmm_timer_tick() #8
  br label %.lr.ph604

.lr.ph604:                                        ; preds = %.lr.ph604.preheader, %.lr.ph604
  %.2496602 = phi i32 [ %156, %.lr.ph604 ], [ 0, %.lr.ph604.preheader ]
  call void @vectorized_softmax_fwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %49, ptr noundef %50, ptr noundef %38)
  %156 = add nuw nsw i32 %.2496602, 1
  %exitcond644.not = icmp eq i32 %156, %.0517594
  br i1 %exitcond644.not, label %.lr.ph608.preheader, label %.lr.ph604, !llvm.loop !33

.lr.ph608.preheader:                              ; preds = %.lr.ph604
  %157 = call i64 @libxsmm_timer_tick() #8
  %158 = call double @libxsmm_timer_duration(i64 noundef %155, i64 noundef %157) #8
  %159 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, double noundef %158)
  call void @tpp_softmax_fwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %49, ptr noundef %51, ptr noundef %38, ptr noundef nonnull %91)
  %160 = call i64 @libxsmm_timer_tick() #8
  %smax = call i32 @llvm.smax.i32(i32 %.0517594, i32 1)
  br label %.lr.ph608

.lr.ph608:                                        ; preds = %.lr.ph608.preheader, %.lr.ph608
  %.3497606 = phi i32 [ %161, %.lr.ph608 ], [ 0, %.lr.ph608.preheader ]
  call void @tpp_softmax_fwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %49, ptr noundef %51, ptr noundef %38, ptr noundef nonnull %91)
  %161 = add nuw nsw i32 %.3497606, 1
  %exitcond645.not = icmp eq i32 %161, %smax
  br i1 %exitcond645.not, label %._crit_edge609, label %.lr.ph608, !llvm.loop !34

._crit_edge609:                                   ; preds = %.lr.ph608
  %162 = call i64 @libxsmm_timer_tick() #8
  %163 = call double @libxsmm_timer_duration(i64 noundef %160, i64 noundef %162) #8
  %164 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13, double noundef %163)
  %165 = fcmp ogt double %163, 0.000000e+00
  br i1 %165, label %166, label %169

166:                                              ; preds = %._crit_edge609
  %167 = fdiv double %158, %163
  br label %.sink.split

.sink.split:                                      ; preds = %151, %166
  %.sink = phi double [ %167, %166 ], [ %152, %151 ]
  %.2504.ph = phi double [ %163, %166 ], [ %148, %151 ]
  %.2500.ph = phi double [ %158, %166 ], [ %143, %151 ]
  %168 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14, double noundef %.sink)
  br label %169

169:                                              ; preds = %.sink.split, %.thread573, %153, %._crit_edge609, %._crit_edge617, %72
  %170 = phi i1 [ %33, %72 ], [ %33, %.thread573 ], [ true, %._crit_edge617 ], [ false, %._crit_edge609 ], [ false, %153 ], [ %33, %.sink.split ]
  %.2504 = phi double [ 0.000000e+00, %72 ], [ 0.000000e+00, %.thread573 ], [ %148, %._crit_edge617 ], [ %163, %._crit_edge609 ], [ 0.000000e+00, %153 ], [ %.2504.ph, %.sink.split ]
  %.2500 = phi double [ 0.000000e+00, %72 ], [ 0.000000e+00, %.thread573 ], [ %143, %._crit_edge617 ], [ %158, %._crit_edge609 ], [ 0.000000e+00, %153 ], [ %.2500.ph, %.sink.split ]
  %.1.shrunk = phi i1 [ false, %72 ], [ %137, %.thread573 ], [ %137, %._crit_edge617 ], [ %137, %._crit_edge609 ], [ %137, %153 ], [ %137, %.sink.split ]
  %.1 = zext i1 %.1.shrunk to i32
  %171 = and i32 %.0519571587, 2
  %.not534 = icmp eq i32 %171, 0
  br i1 %.not534, label %300, label %172

172:                                              ; preds = %169
  %173 = call { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0) #8
  %174 = extractvalue { i64, i64 } %173, 0
  %175 = extractvalue { i64, i64 } %173, 1
  %176 = call { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0) #8
  %177 = call i32 @libxsmm_meqn_create() #8
  %178 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %177, i32 noundef -1) #8
  %179 = call i32 @libxsmm_meqn_push_back_binary_op(i64 %178, i32 noundef 2, i32 noundef 1, i32 noundef 0) #8
  %180 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %52, i32 noundef 1) #8
  %181 = extractvalue { i64, i64 } %180, 0
  %182 = extractvalue { i64, i64 } %180, 1
  %183 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %177, i32 noundef 0) #8
  %184 = call i32 @libxsmm_meqn_push_back_arg(i64 %183, i64 %181, i64 %182, i64 %174, i64 %175) #8
  %185 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %52, i32 noundef %.0520) #8
  %186 = extractvalue { i64, i64 } %185, 0
  %187 = extractvalue { i64, i64 } %185, 1
  %188 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %177, i32 noundef 1) #8
  %189 = call i32 @libxsmm_meqn_push_back_arg(i64 %188, i64 %186, i64 %187, i64 %174, i64 %175) #8
  %190 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %.0516549556570588, i32 noundef 1) #8
  %191 = extractvalue { i64, i64 } %190, 0
  %192 = extractvalue { i64, i64 } %190, 1
  %193 = call ptr @libxsmm_dispatch_meqn(i32 noundef %177, i64 %191, i64 %192) #8
  %194 = call i32 @libxsmm_get_kernel_info(ptr noundef %193, ptr noundef nonnull @info) #8
  %195 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !14
  store i32 %195, ptr @is_reference_kernel, align 4, !tbaa !18
  %196 = icmp eq ptr %193, null
  br i1 %196, label %197, label %200

197:                                              ; preds = %172
  %198 = load ptr, ptr @stderr, align 8, !tbaa !5
  %199 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %198, ptr noundef nonnull @.str.15) #10
  call void @exit(i32 noundef -1) #11
  unreachable

200:                                              ; preds = %172
  %201 = extractvalue { i64, i64 } %176, 1
  %202 = extractvalue { i64, i64 } %176, 0
  %203 = call i32 @libxsmm_meqn_create() #8
  %204 = call i64 @libxsmm_create_meqn_op_metadata(i32 noundef %203, i32 noundef -1) #8
  %205 = call i32 @libxsmm_meqn_push_back_ternary_op(i64 %204, i32 noundef 4, i32 noundef 1, i32 noundef 576) #8
  %206 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %204, i32 noundef 18, i32 noundef 1, i32 noundef 32) #8
  %207 = call i32 @libxsmm_meqn_push_back_unary_op(i64 %204, i32 noundef 18, i32 noundef 1, i32 noundef 16) #8
  %208 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %.0516549556570588, i32 noundef 1) #8
  %209 = extractvalue { i64, i64 } %208, 0
  %210 = extractvalue { i64, i64 } %208, 1
  %211 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %203, i32 noundef 0) #8
  %212 = call i32 @libxsmm_meqn_push_back_arg(i64 %211, i64 %209, i64 %210, i64 %202, i64 %201) #8
  %213 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %.0516549556570588, i32 noundef 1) #8
  %214 = extractvalue { i64, i64 } %213, 0
  %215 = extractvalue { i64, i64 } %213, 1
  %216 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %203, i32 noundef 0) #8
  %217 = call i32 @libxsmm_meqn_push_back_arg(i64 %216, i64 %214, i64 %215, i64 %202, i64 %201) #8
  %218 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %52, i32 noundef %.0520) #8
  %219 = extractvalue { i64, i64 } %218, 0
  %220 = extractvalue { i64, i64 } %218, 1
  %221 = call i64 @libxsmm_create_meqn_arg_metadata(i32 noundef %203, i32 noundef 1) #8
  %222 = call i32 @libxsmm_meqn_push_back_arg(i64 %221, i64 %219, i64 %220, i64 %202, i64 %201) #8
  %223 = call { i64, i64 } @libxsmm_create_meqn_arg_shape(i32 noundef %.0516549556570588, i32 noundef %.0514536540548557569589, i32 noundef %52, i32 noundef 1) #8
  %224 = extractvalue { i64, i64 } %223, 0
  %225 = extractvalue { i64, i64 } %223, 1
  %226 = call ptr @libxsmm_dispatch_meqn(i32 noundef %203, i64 %224, i64 %225) #8
  %227 = call i32 @libxsmm_get_kernel_info(ptr noundef %226, ptr noundef nonnull @info) #8
  %228 = load i32, ptr getelementptr inbounds (i8, ptr @info, i64 16), align 8, !tbaa !14
  store i32 %228, ptr @is_reference_kernel, align 4, !tbaa !18
  %229 = icmp eq ptr %226, null
  br i1 %229, label %230, label %233

230:                                              ; preds = %200
  %231 = load ptr, ptr @stderr, align 8, !tbaa !5
  %232 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %231, ptr noundef nonnull @.str.16) #10
  call void @exit(i32 noundef -1) #11
  unreachable

233:                                              ; preds = %200
  br i1 %170, label %237, label %234

234:                                              ; preds = %233
  %235 = icmp eq i32 %.0518559567591, 1
  br i1 %235, label %236, label %238

236:                                              ; preds = %234
  call void @vectorized_softmax_bwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %43, ptr noundef %42, ptr noundef %50)
  call void @tpp_softmax_bwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %45, ptr noundef %42, ptr noundef %50, ptr noundef %38, ptr noundef nonnull %193, ptr noundef nonnull %226)
  br label %238

237:                                              ; preds = %233
  call void @vectorized_softmax_bwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %43, ptr noundef %42, ptr noundef %44)
  call void @tpp_softmax_bwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %45, ptr noundef %42, ptr noundef %44, ptr noundef %38, ptr noundef nonnull %193, ptr noundef nonnull %226)
  br label %238

238:                                              ; preds = %236, %234, %237
  %.str.18.sink = phi ptr [ @.str.17, %237 ], [ @.str.18, %234 ], [ @.str.18, %236 ]
  %239 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  %240 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.18.sink)
  %241 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2)
  %242 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef %53, i32 noundef 1, ptr noundef %43, ptr noundef %45, ptr noundef null, ptr noundef null) #8
  %243 = getelementptr inbounds i8, ptr %3, i64 80
  %244 = load double, ptr %243, align 8, !tbaa !22
  %245 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, double noundef %244)
  %246 = getelementptr inbounds i8, ptr %3, i64 120
  %247 = load double, ptr %246, align 8, !tbaa !25
  %248 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6, double noundef %247)
  %249 = getelementptr inbounds i8, ptr %3, i64 56
  %250 = load double, ptr %249, align 8, !tbaa !26
  %251 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %250)
  %252 = getelementptr inbounds i8, ptr %3, i64 64
  %253 = load double, ptr %252, align 8, !tbaa !27
  %254 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8, double noundef %253)
  %255 = getelementptr inbounds i8, ptr %3, i64 40
  %256 = load double, ptr %255, align 8, !tbaa !28
  %257 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.9, double noundef %256)
  %258 = getelementptr inbounds i8, ptr %3, i64 48
  %259 = load double, ptr %258, align 8, !tbaa !29
  %260 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.10, double noundef %259)
  %261 = getelementptr inbounds i8, ptr %3, i64 32
  %262 = load double, ptr %261, align 8, !tbaa !30
  %263 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, double noundef %262)
  %264 = load double, ptr %261, align 8, !tbaa !30
  %265 = fcmp ogt double %264, %.0490
  %.2 = select i1 %265, i32 1, i32 %.1
  %266 = icmp sgt i32 %.0517594, 0
  br i1 %266, label %267, label %.thread576

267:                                              ; preds = %238
  br i1 %170, label %.lr.ph628.preheader, label %281

.lr.ph628.preheader:                              ; preds = %267
  call void @vectorized_softmax_bwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %43, ptr noundef %42, ptr noundef %44)
  %268 = call i64 @libxsmm_timer_tick() #8
  br label %.lr.ph628

.lr.ph628:                                        ; preds = %.lr.ph628.preheader, %.lr.ph628
  %.4626 = phi i32 [ %269, %.lr.ph628 ], [ 0, %.lr.ph628.preheader ]
  call void @vectorized_softmax_bwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %43, ptr noundef %42, ptr noundef %44)
  %269 = add nuw nsw i32 %.4626, 1
  %exitcond652.not = icmp eq i32 %269, %.0517594
  br i1 %exitcond652.not, label %.lr.ph632.preheader, label %.lr.ph628, !llvm.loop !35

.lr.ph632.preheader:                              ; preds = %.lr.ph628
  %270 = call i64 @libxsmm_timer_tick() #8
  %271 = call double @libxsmm_timer_duration(i64 noundef %268, i64 noundef %270) #8
  %272 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19, double noundef %271)
  call void @tpp_softmax_bwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %45, ptr noundef %42, ptr noundef %44, ptr noundef %38, ptr noundef nonnull %193, ptr noundef nonnull %226)
  %273 = call i64 @libxsmm_timer_tick() #8
  %smax653 = call i32 @llvm.smax.i32(i32 %.0517594, i32 1)
  br label %.lr.ph632

.lr.ph632:                                        ; preds = %.lr.ph632.preheader, %.lr.ph632
  %.5630 = phi i32 [ %274, %.lr.ph632 ], [ 0, %.lr.ph632.preheader ]
  call void @tpp_softmax_bwd(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %45, ptr noundef %42, ptr noundef %44, ptr noundef %38, ptr noundef nonnull %193, ptr noundef nonnull %226)
  %274 = add nuw nsw i32 %.5630, 1
  %exitcond654.not = icmp eq i32 %274, %smax653
  br i1 %exitcond654.not, label %._crit_edge633, label %.lr.ph632, !llvm.loop !36

._crit_edge633:                                   ; preds = %.lr.ph632
  %275 = call i64 @libxsmm_timer_tick() #8
  %276 = call double @libxsmm_timer_duration(i64 noundef %273, i64 noundef %275) #8
  %277 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.20, double noundef %276)
  %278 = fcmp ogt double %276, 0.000000e+00
  br i1 %278, label %279, label %297

279:                                              ; preds = %._crit_edge633
  %280 = fdiv double %271, %276
  br label %.sink.split655

281:                                              ; preds = %267
  %282 = icmp eq i32 %.0518559567591, 1
  br i1 %282, label %.lr.ph620.preheader, label %297

.lr.ph620.preheader:                              ; preds = %281
  call void @vectorized_softmax_bwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %43, ptr noundef %42, ptr noundef %50)
  %283 = call i64 @libxsmm_timer_tick() #8
  br label %.lr.ph620

.lr.ph620:                                        ; preds = %.lr.ph620.preheader, %.lr.ph620
  %.6618 = phi i32 [ %284, %.lr.ph620 ], [ 0, %.lr.ph620.preheader ]
  call void @vectorized_softmax_bwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %43, ptr noundef %42, ptr noundef %50)
  %284 = add nuw nsw i32 %.6618, 1
  %exitcond649.not = icmp eq i32 %284, %.0517594
  br i1 %exitcond649.not, label %.lr.ph624.preheader, label %.lr.ph620, !llvm.loop !37

.lr.ph624.preheader:                              ; preds = %.lr.ph620
  %285 = call i64 @libxsmm_timer_tick() #8
  %286 = call double @libxsmm_timer_duration(i64 noundef %283, i64 noundef %285) #8
  %287 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19, double noundef %286)
  call void @tpp_softmax_bwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %45, ptr noundef %42, ptr noundef %50, ptr noundef %38, ptr noundef nonnull %193, ptr noundef nonnull %226)
  %288 = call i64 @libxsmm_timer_tick() #8
  %smax650 = call i32 @llvm.smax.i32(i32 %.0517594, i32 1)
  br label %.lr.ph624

.lr.ph624:                                        ; preds = %.lr.ph624.preheader, %.lr.ph624
  %.7622 = phi i32 [ %289, %.lr.ph624 ], [ 0, %.lr.ph624.preheader ]
  call void @tpp_softmax_bwd_bf16(i64 noundef %34, i64 noundef %39, i64 noundef %36, ptr noundef %45, ptr noundef %42, ptr noundef %50, ptr noundef %38, ptr noundef nonnull %193, ptr noundef nonnull %226)
  %289 = add nuw nsw i32 %.7622, 1
  %exitcond651.not = icmp eq i32 %289, %smax650
  br i1 %exitcond651.not, label %._crit_edge625, label %.lr.ph624, !llvm.loop !38

._crit_edge625:                                   ; preds = %.lr.ph624
  %290 = call i64 @libxsmm_timer_tick() #8
  %291 = call double @libxsmm_timer_duration(i64 noundef %288, i64 noundef %290) #8
  %292 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.20, double noundef %291)
  %293 = fcmp ogt double %291, 0.000000e+00
  br i1 %293, label %294, label %297

294:                                              ; preds = %._crit_edge625
  %295 = fdiv double %286, %291
  br label %.sink.split655

.sink.split655:                                   ; preds = %279, %294
  %.sink656 = phi double [ %295, %294 ], [ %280, %279 ]
  %.3505.ph = phi double [ %291, %294 ], [ %276, %279 ]
  %.3501.ph = phi double [ %286, %294 ], [ %271, %279 ]
  %296 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.21, double noundef %.sink656)
  br label %297

297:                                              ; preds = %.sink.split655, %281, %._crit_edge625, %._crit_edge633
  %.3505 = phi double [ %276, %._crit_edge633 ], [ %291, %._crit_edge625 ], [ %.2504, %281 ], [ %.3505.ph, %.sink.split655 ]
  %.3501 = phi double [ %271, %._crit_edge633 ], [ %286, %._crit_edge625 ], [ %.2500, %281 ], [ %.3501.ph, %.sink.split655 ]
  %298 = fadd double %.2504, %.3505
  %299 = fadd double %.2500, %.3501
  br label %300

300:                                              ; preds = %297, %169
  %.3513 = phi double [ %.2504, %169 ], [ %298, %297 ]
  %.3509 = phi double [ %.2500, %169 ], [ %299, %297 ]
  %.3 = phi i32 [ %.1, %169 ], [ %.2, %297 ]
  %301 = icmp sgt i32 %.0517594, 0
  br i1 %301, label %302, label %.thread576

302:                                              ; preds = %300
  %303 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.22)
  %304 = fdiv double %.3509, %.3513
  %305 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.23, double noundef %304)
  %306 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.24)
  br label %.thread576

.thread576:                                       ; preds = %238, %302, %300
  %.3580 = phi i32 [ %.3, %302 ], [ %.3, %300 ], [ %.2, %238 ]
  call void @libxsmm_free(ptr noundef %42) #8
  call void @libxsmm_free(ptr noundef %43) #8
  call void @libxsmm_free(ptr noundef %44) #8
  call void @libxsmm_free(ptr noundef %45) #8
  call void @libxsmm_free(ptr noundef %49) #8
  call void @libxsmm_free(ptr noundef %50) #8
  call void @libxsmm_free(ptr noundef %51) #8
  call void @libxsmm_free(ptr noundef %46) #8
  %307 = icmp eq i32 %.3580, 0
  br i1 %307, label %308, label %311

308:                                              ; preds = %.thread576
  %309 = load i32, ptr @is_reference_kernel, align 4, !tbaa !18
  %310 = call i32 @libxsmm_return_success_code(i32 noundef %309)
  br label %311

311:                                              ; preds = %.thread576, %308
  %312 = phi i32 [ %310, %308 ], [ 1, %.thread576 ]
  call void @llvm.lifetime.end.p0(i64 192, ptr nonnull %3) #8
  ret i32 %312
}

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

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

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 i32 @libxsmm_meqn_create() local_unnamed_addr #2

declare i32 @libxsmm_meqn_push_back_binary_op(i64, i32 noundef, 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 i32 @libxsmm_meqn_push_back_unary_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

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

declare ptr @libxsmm_dispatch_meqn(i32 noundef, i64, i64) 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 #5

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

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

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

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

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

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 { i64, i64 } @libxsmm_create_matrix_arg_attributes(i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

declare i64 @libxsmm_create_meqn_op_metadata(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_ternary_op(i64, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

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

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

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

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

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

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 = { 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 = { 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 #7 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #8 = { nounwind }
attributes #9 = { nounwind willreturn memory(read) }
attributes #10 = { cold nounwind }
attributes #11 = { noreturn nounwind }

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

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


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