; LLVM IR from libxsmm/libxsmm :: samples/eltwise (eltwise_unary_gather_scatter)

; 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_meltw_unary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }
%struct.libxsmm_matrix_op_arg = type { ptr, ptr, ptr, ptr }
%struct.libxsmm_matrix_arg = type { ptr, ptr, ptr, ptr, ptr, ptr }

@is_reference_kernel = external dso_local global i32, align 4
@.str = external hidden unnamed_addr constant [28 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [96 x i8], align 1
@__PRETTY_FUNCTION__.main = external hidden unnamed_addr constant [23 x i8], align 1
@stdout = external global ptr, align 8
@.str.2 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [19 x i8], align 1
@stderr = external global ptr, align 8
@.str.6 = external hidden unnamed_addr constant [106 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 i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %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 ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca %struct.libxsmm_meltw_unary_param, align 8
  %38 = alloca i32, align 4
  %39 = alloca i64, align 8
  %40 = alloca i64, align 8
  %41 = alloca double, align 8
  %42 = alloca double, align 8
  %43 = alloca i64, align 8
  %44 = alloca i64, align 8
  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) #9
  store i32 64, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #9
  store i32 64, ptr %7, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #9
  store i32 0, ptr %8, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #9
  store i32 0, ptr %9, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #9
  store i32 64, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #9
  store i32 64, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #9
  store i32 64, ptr %12, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #9
  store i32 64, ptr %13, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #9
  store i32 0, ptr %14, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #9
  store i32 0, ptr %15, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #9
  store i32 64, ptr %16, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #9
  store i32 64, ptr %17, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #9
  store i32 0, ptr %22, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #9
  store i32 0, ptr %23, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #9
  store i32 0, ptr %24, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #9
  store i32 0, ptr %25, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #9
  store i32 100, ptr %26, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #9
  store ptr null, ptr %27, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #9
  store ptr null, ptr %28, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #9
  store ptr null, ptr %29, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #9
  store ptr null, ptr %30, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #9
  store ptr null, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #9
  store ptr null, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #9
  store ptr null, ptr %36, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 128, ptr %37) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #9
  store i32 1, ptr %38, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #9
  store double 0.000000e+00, ptr %41, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #9
  store double 0.000000e+00, ptr %42, align 8, !tbaa !11
  call void @libxsmm_init()
  %45 = load i32, ptr %4, align 4, !tbaa !5
  %46 = icmp sgt i32 %45, 1
  br i1 %46, label %47, label %52

47:                                               ; preds = %2
  %48 = load ptr, ptr %5, align 8, !tbaa !9
  %49 = getelementptr inbounds ptr, ptr %48, i64 1
  %50 = load ptr, ptr %49, align 8, !tbaa !9
  %51 = call i32 @atoi(ptr noundef %50) #10
  store i32 %51, ptr %6, align 4, !tbaa !5
  br label %52

52:                                               ; preds = %47, %2
  %53 = load i32, ptr %4, align 4, !tbaa !5
  %54 = icmp sgt i32 %53, 2
  br i1 %54, label %55, label %60

55:                                               ; preds = %52
  %56 = load ptr, ptr %5, align 8, !tbaa !9
  %57 = getelementptr inbounds ptr, ptr %56, i64 2
  %58 = load ptr, ptr %57, align 8, !tbaa !9
  %59 = call i32 @atoi(ptr noundef %58) #10
  store i32 %59, ptr %7, align 4, !tbaa !5
  br label %60

60:                                               ; preds = %55, %52
  %61 = load i32, ptr %4, align 4, !tbaa !5
  %62 = icmp sgt i32 %61, 3
  br i1 %62, label %63, label %68

63:                                               ; preds = %60
  %64 = load ptr, ptr %5, align 8, !tbaa !9
  %65 = getelementptr inbounds ptr, ptr %64, i64 3
  %66 = load ptr, ptr %65, align 8, !tbaa !9
  %67 = call i32 @atoi(ptr noundef %66) #10
  store i32 %67, ptr %16, align 4, !tbaa !5
  br label %68

68:                                               ; preds = %63, %60
  %69 = load i32, ptr %4, align 4, !tbaa !5
  %70 = icmp sgt i32 %69, 4
  br i1 %70, label %71, label %76

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

76:                                               ; preds = %71, %68
  %77 = load i32, ptr %4, align 4, !tbaa !5
  %78 = icmp sgt i32 %77, 5
  br i1 %78, label %79, label %84

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

84:                                               ; preds = %79, %76
  %85 = load i32, ptr %4, align 4, !tbaa !5
  %86 = icmp sgt i32 %85, 6
  br i1 %86, label %87, label %92

87:                                               ; preds = %84
  %88 = load ptr, ptr %5, align 8, !tbaa !9
  %89 = getelementptr inbounds ptr, ptr %88, i64 6
  %90 = load ptr, ptr %89, align 8, !tbaa !9
  %91 = call i32 @atoi(ptr noundef %90) #10
  store i32 %91, ptr %23, align 4, !tbaa !5
  br label %92

92:                                               ; preds = %87, %84
  %93 = load i32, ptr %4, align 4, !tbaa !5
  %94 = icmp sgt i32 %93, 7
  br i1 %94, label %95, label %100

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

100:                                              ; preds = %95, %92
  %101 = load i32, ptr %4, align 4, !tbaa !5
  %102 = icmp sgt i32 %101, 8
  br i1 %102, label %103, label %108

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

108:                                              ; preds = %103, %100
  %109 = load i32, ptr %4, align 4, !tbaa !5
  %110 = icmp sgt i32 %109, 9
  br i1 %110, label %111, label %116

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

116:                                              ; preds = %111, %108
  %117 = load i32, ptr %6, align 4, !tbaa !5
  %118 = icmp ult i32 %117, 1
  br i1 %118, label %119, label %120

119:                                              ; preds = %116
  br label %122

120:                                              ; preds = %116
  %121 = load i32, ptr %6, align 4, !tbaa !5
  br label %122

122:                                              ; preds = %120, %119
  %123 = phi i32 [ 1, %119 ], [ %121, %120 ]
  store i32 %123, ptr %6, align 4, !tbaa !5
  %124 = load i32, ptr %7, align 4, !tbaa !5
  %125 = icmp ult i32 %124, 1
  br i1 %125, label %126, label %127

126:                                              ; preds = %122
  br label %129

127:                                              ; preds = %122
  %128 = load i32, ptr %7, align 4, !tbaa !5
  br label %129

129:                                              ; preds = %127, %126
  %130 = phi i32 [ 1, %126 ], [ %128, %127 ]
  store i32 %130, ptr %7, align 4, !tbaa !5
  %131 = load i32, ptr %16, align 4, !tbaa !5
  %132 = load i32, ptr %6, align 4, !tbaa !5
  %133 = icmp slt i32 %131, %132
  br i1 %133, label %134, label %136

134:                                              ; preds = %129
  %135 = load i32, ptr %6, align 4, !tbaa !5
  br label %138

136:                                              ; preds = %129
  %137 = load i32, ptr %16, align 4, !tbaa !5
  br label %138

138:                                              ; preds = %136, %134
  %139 = phi i32 [ %135, %134 ], [ %137, %136 ]
  store i32 %139, ptr %16, align 4, !tbaa !5
  %140 = load i32, ptr %17, align 4, !tbaa !5
  %141 = load i32, ptr %6, align 4, !tbaa !5
  %142 = icmp slt i32 %140, %141
  br i1 %142, label %143, label %145

143:                                              ; preds = %138
  %144 = load i32, ptr %6, align 4, !tbaa !5
  br label %147

145:                                              ; preds = %138
  %146 = load i32, ptr %17, align 4, !tbaa !5
  br label %147

147:                                              ; preds = %145, %143
  %148 = phi i32 [ %144, %143 ], [ %146, %145 ]
  store i32 %148, ptr %17, align 4, !tbaa !5
  %149 = load i32, ptr %6, align 4, !tbaa !5
  %150 = mul i32 %149, 4
  store i32 %150, ptr %8, align 4, !tbaa !5
  %151 = load i32, ptr %7, align 4, !tbaa !5
  %152 = mul i32 %151, 4
  store i32 %152, ptr %9, align 4, !tbaa !5
  %153 = load i32, ptr %16, align 4, !tbaa !5
  %154 = mul nsw i32 %153, 4
  store i32 %154, ptr %18, align 4, !tbaa !5
  %155 = load i32, ptr %17, align 4, !tbaa !5
  %156 = mul nsw i32 %155, 4
  store i32 %156, ptr %19, align 4, !tbaa !5
  %157 = load i32, ptr %8, align 4, !tbaa !5
  %158 = load i32, ptr %9, align 4, !tbaa !5
  %159 = mul i32 %157, %158
  %160 = zext i32 %159 to i64
  %161 = mul i64 %160, 8
  %162 = call noalias ptr @malloc(i64 noundef %161) #11
  store ptr %162, ptr %35, align 8, !tbaa !9
  %163 = load i32, ptr %22, align 4, !tbaa !5
  %164 = icmp eq i32 %163, 0
  br i1 %164, label %165, label %359

165:                                              ; preds = %147
  %166 = load i32, ptr %23, align 4, !tbaa !5
  %167 = icmp eq i32 %166, 0
  br i1 %167, label %168, label %218

168:                                              ; preds = %165
  %169 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %169, ptr %10, align 4, !tbaa !5
  %170 = load i32, ptr %9, align 4, !tbaa !5
  store i32 %170, ptr %11, align 4, !tbaa !5
  %171 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %171, ptr %12, align 4, !tbaa !5
  %172 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %172, ptr %13, align 4, !tbaa !5
  %173 = load i32, ptr %16, align 4, !tbaa !5
  store i32 %173, ptr %20, align 4, !tbaa !5
  %174 = load i32, ptr %17, align 4, !tbaa !5
  store i32 %174, ptr %21, align 4, !tbaa !5
  %175 = load i32, ptr %13, align 4, !tbaa !5
  %176 = zext i32 %175 to i64
  %177 = mul i64 %176, 8
  %178 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %177, i64 noundef 2097152)
  store ptr %178, ptr %33, align 8, !tbaa !9
  %179 = load i32, ptr %13, align 4, !tbaa !5
  %180 = zext i32 %179 to i64
  %181 = mul i64 %180, 4
  %182 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %181, i64 noundef 2097152)
  store ptr %182, ptr %34, align 8, !tbaa !9
  %183 = load ptr, ptr %35, align 8, !tbaa !9
  %184 = icmp ne ptr null, %183
  br i1 %184, label %185, label %186

185:                                              ; preds = %168
  br label %187

186:                                              ; preds = %168
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 527, ptr noundef @__PRETTY_FUNCTION__.main) #12
  unreachable

187:                                              ; preds = %185
  %188 = load ptr, ptr %35, align 8, !tbaa !9
  %189 = load i32, ptr %11, align 4, !tbaa !5
  call void @create_unique_random_array(ptr noundef %188, i32 noundef %189)
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %190

190:                                              ; preds = %214, %187
  %191 = load i32, ptr %14, align 4, !tbaa !5
  %192 = load i32, ptr %13, align 4, !tbaa !5
  %193 = icmp ult i32 %191, %192
  br i1 %193, label %194, label %217

194:                                              ; preds = %190
  %195 = load ptr, ptr %35, align 8, !tbaa !9
  %196 = load i32, ptr %14, align 4, !tbaa !5
  %197 = zext i32 %196 to i64
  %198 = getelementptr inbounds i64, ptr %195, i64 %197
  %199 = load i64, ptr %198, align 8, !tbaa !13
  %200 = load ptr, ptr %33, align 8, !tbaa !9
  %201 = load i32, ptr %14, align 4, !tbaa !5
  %202 = zext i32 %201 to i64
  %203 = getelementptr inbounds i64, ptr %200, i64 %202
  store i64 %199, ptr %203, align 8, !tbaa !13
  %204 = load ptr, ptr %33, align 8, !tbaa !9
  %205 = load i32, ptr %14, align 4, !tbaa !5
  %206 = zext i32 %205 to i64
  %207 = getelementptr inbounds i64, ptr %204, i64 %206
  %208 = load i64, ptr %207, align 8, !tbaa !13
  %209 = trunc i64 %208 to i32
  %210 = load ptr, ptr %34, align 8, !tbaa !9
  %211 = load i32, ptr %14, align 4, !tbaa !5
  %212 = zext i32 %211 to i64
  %213 = getelementptr inbounds i32, ptr %210, i64 %212
  store i32 %209, ptr %213, align 4, !tbaa !5
  br label %214

214:                                              ; preds = %194
  %215 = load i32, ptr %14, align 4, !tbaa !5
  %216 = add i32 %215, 1
  store i32 %216, ptr %14, align 4, !tbaa !5
  br label %190, !llvm.loop !15

217:                                              ; preds = %190
  br label %358

218:                                              ; preds = %165
  %219 = load i32, ptr %23, align 4, !tbaa !5
  %220 = icmp eq i32 %219, 1
  br i1 %220, label %221, label %266

221:                                              ; preds = %218
  %222 = load i32, ptr %8, align 4, !tbaa !5
  store i32 %222, ptr %10, align 4, !tbaa !5
  %223 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %223, ptr %11, align 4, !tbaa !5
  %224 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %224, ptr %12, align 4, !tbaa !5
  %225 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %225, ptr %13, align 4, !tbaa !5
  %226 = load i32, ptr %18, align 4, !tbaa !5
  store i32 %226, ptr %20, align 4, !tbaa !5
  %227 = load i32, ptr %17, align 4, !tbaa !5
  store i32 %227, ptr %21, align 4, !tbaa !5
  %228 = load i32, ptr %12, align 4, !tbaa !5
  %229 = zext i32 %228 to i64
  %230 = mul i64 %229, 8
  %231 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %230, i64 noundef 2097152)
  store ptr %231, ptr %33, align 8, !tbaa !9
  %232 = load i32, ptr %12, align 4, !tbaa !5
  %233 = zext i32 %232 to i64
  %234 = mul i64 %233, 4
  %235 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %234, i64 noundef 2097152)
  store ptr %235, ptr %34, align 8, !tbaa !9
  %236 = load ptr, ptr %35, align 8, !tbaa !9
  %237 = load i32, ptr %10, align 4, !tbaa !5
  call void @create_unique_random_array(ptr noundef %236, i32 noundef %237)
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %238

238:                                              ; preds = %262, %221
  %239 = load i32, ptr %14, align 4, !tbaa !5
  %240 = load i32, ptr %12, align 4, !tbaa !5
  %241 = icmp ult i32 %239, %240
  br i1 %241, label %242, label %265

242:                                              ; preds = %238
  %243 = load ptr, ptr %35, align 8, !tbaa !9
  %244 = load i32, ptr %14, align 4, !tbaa !5
  %245 = zext i32 %244 to i64
  %246 = getelementptr inbounds i64, ptr %243, i64 %245
  %247 = load i64, ptr %246, align 8, !tbaa !13
  %248 = load ptr, ptr %33, align 8, !tbaa !9
  %249 = load i32, ptr %14, align 4, !tbaa !5
  %250 = zext i32 %249 to i64
  %251 = getelementptr inbounds i64, ptr %248, i64 %250
  store i64 %247, ptr %251, align 8, !tbaa !13
  %252 = load ptr, ptr %33, align 8, !tbaa !9
  %253 = load i32, ptr %14, align 4, !tbaa !5
  %254 = zext i32 %253 to i64
  %255 = getelementptr inbounds i64, ptr %252, i64 %254
  %256 = load i64, ptr %255, align 8, !tbaa !13
  %257 = trunc i64 %256 to i32
  %258 = load ptr, ptr %34, align 8, !tbaa !9
  %259 = load i32, ptr %14, align 4, !tbaa !5
  %260 = zext i32 %259 to i64
  %261 = getelementptr inbounds i32, ptr %258, i64 %260
  store i32 %257, ptr %261, align 4, !tbaa !5
  br label %262

262:                                              ; preds = %242
  %263 = load i32, ptr %14, align 4, !tbaa !5
  %264 = add i32 %263, 1
  store i32 %264, ptr %14, align 4, !tbaa !5
  br label %238, !llvm.loop !17

265:                                              ; preds = %238
  br label %357

266:                                              ; preds = %218
  %267 = load i32, ptr %23, align 4, !tbaa !5
  %268 = icmp eq i32 %267, 2
  br i1 %268, label %269, label %353

269:                                              ; preds = %266
  %270 = load i32, ptr %8, align 4, !tbaa !5
  store i32 %270, ptr %10, align 4, !tbaa !5
  %271 = load i32, ptr %9, align 4, !tbaa !5
  store i32 %271, ptr %11, align 4, !tbaa !5
  %272 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %272, ptr %12, align 4, !tbaa !5
  %273 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %273, ptr %13, align 4, !tbaa !5
  %274 = load i32, ptr %18, align 4, !tbaa !5
  store i32 %274, ptr %20, align 4, !tbaa !5
  %275 = load i32, ptr %17, align 4, !tbaa !5
  store i32 %275, ptr %21, align 4, !tbaa !5
  %276 = load i32, ptr %12, align 4, !tbaa !5
  %277 = load i32, ptr %13, align 4, !tbaa !5
  %278 = mul i32 %276, %277
  %279 = zext i32 %278 to i64
  %280 = mul i64 %279, 8
  %281 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %280, i64 noundef 2097152)
  store ptr %281, ptr %33, align 8, !tbaa !9
  %282 = load i32, ptr %12, align 4, !tbaa !5
  %283 = load i32, ptr %13, align 4, !tbaa !5
  %284 = mul i32 %282, %283
  %285 = zext i32 %284 to i64
  %286 = mul i64 %285, 4
  %287 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %286, i64 noundef 2097152)
  store ptr %287, ptr %34, align 8, !tbaa !9
  %288 = load ptr, ptr %35, align 8, !tbaa !9
  %289 = load i32, ptr %10, align 4, !tbaa !5
  %290 = load i32, ptr %11, align 4, !tbaa !5
  %291 = mul i32 %289, %290
  call void @create_unique_random_array(ptr noundef %288, i32 noundef %291)
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %292

292:                                              ; preds = %349, %269
  %293 = load i32, ptr %15, align 4, !tbaa !5
  %294 = load i32, ptr %13, align 4, !tbaa !5
  %295 = icmp ult i32 %293, %294
  br i1 %295, label %296, label %352

296:                                              ; preds = %292
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %297

297:                                              ; preds = %345, %296
  %298 = load i32, ptr %14, align 4, !tbaa !5
  %299 = load i32, ptr %12, align 4, !tbaa !5
  %300 = icmp ult i32 %298, %299
  br i1 %300, label %301, label %348

301:                                              ; preds = %297
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #9
  %302 = load ptr, ptr %35, align 8, !tbaa !9
  %303 = load i32, ptr %14, align 4, !tbaa !5
  %304 = load i32, ptr %15, align 4, !tbaa !5
  %305 = load i32, ptr %12, align 4, !tbaa !5
  %306 = mul i32 %304, %305
  %307 = add i32 %303, %306
  %308 = zext i32 %307 to i64
  %309 = getelementptr inbounds i64, ptr %302, i64 %308
  %310 = load i64, ptr %309, align 8, !tbaa !13
  store i64 %310, ptr %43, align 8, !tbaa !13
  %311 = load i64, ptr %43, align 8, !tbaa !13
  %312 = load i32, ptr %10, align 4, !tbaa !5
  %313 = zext i32 %312 to i64
  %314 = udiv i64 %311, %313
  %315 = load i32, ptr %18, align 4, !tbaa !5
  %316 = sext i32 %315 to i64
  %317 = mul i64 %314, %316
  %318 = load i64, ptr %43, align 8, !tbaa !13
  %319 = load i32, ptr %10, align 4, !tbaa !5
  %320 = zext i32 %319 to i64
  %321 = urem i64 %318, %320
  %322 = add i64 %317, %321
  %323 = load ptr, ptr %33, align 8, !tbaa !9
  %324 = load i32, ptr %14, align 4, !tbaa !5
  %325 = load i32, ptr %15, align 4, !tbaa !5
  %326 = load i32, ptr %12, align 4, !tbaa !5
  %327 = mul i32 %325, %326
  %328 = add i32 %324, %327
  %329 = zext i32 %328 to i64
  %330 = getelementptr inbounds i64, ptr %323, i64 %329
  store i64 %322, ptr %330, align 8, !tbaa !13
  %331 = load ptr, ptr %33, align 8, !tbaa !9
  %332 = load i32, ptr %14, align 4, !tbaa !5
  %333 = zext i32 %332 to i64
  %334 = getelementptr inbounds i64, ptr %331, i64 %333
  %335 = load i64, ptr %334, align 8, !tbaa !13
  %336 = trunc i64 %335 to i32
  %337 = load ptr, ptr %34, align 8, !tbaa !9
  %338 = load i32, ptr %14, align 4, !tbaa !5
  %339 = load i32, ptr %15, align 4, !tbaa !5
  %340 = load i32, ptr %12, align 4, !tbaa !5
  %341 = mul i32 %339, %340
  %342 = add i32 %338, %341
  %343 = zext i32 %342 to i64
  %344 = getelementptr inbounds i32, ptr %337, i64 %343
  store i32 %336, ptr %344, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #9
  br label %345

345:                                              ; preds = %301
  %346 = load i32, ptr %14, align 4, !tbaa !5
  %347 = add i32 %346, 1
  store i32 %347, ptr %14, align 4, !tbaa !5
  br label %297, !llvm.loop !18

348:                                              ; preds = %297
  br label %349

349:                                              ; preds = %348
  %350 = load i32, ptr %15, align 4, !tbaa !5
  %351 = add i32 %350, 1
  store i32 %351, ptr %15, align 4, !tbaa !5
  br label %292, !llvm.loop !19

352:                                              ; preds = %292
  br label %356

353:                                              ; preds = %266
  %354 = load ptr, ptr @stdout, align 8, !tbaa !9
  %355 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %354, ptr noundef @.str.2) #9
  call void @exit(i32 noundef 1) #12
  unreachable

356:                                              ; preds = %352
  br label %357

357:                                              ; preds = %356, %265
  br label %358

358:                                              ; preds = %357, %217
  br label %555

359:                                              ; preds = %147
  %360 = load i32, ptr %22, align 4, !tbaa !5
  %361 = icmp eq i32 %360, 1
  br i1 %361, label %362, label %551

362:                                              ; preds = %359
  %363 = load i32, ptr %23, align 4, !tbaa !5
  %364 = icmp eq i32 %363, 0
  br i1 %364, label %365, label %410

365:                                              ; preds = %362
  %366 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %366, ptr %10, align 4, !tbaa !5
  %367 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %367, ptr %11, align 4, !tbaa !5
  %368 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %368, ptr %12, align 4, !tbaa !5
  %369 = load i32, ptr %9, align 4, !tbaa !5
  store i32 %369, ptr %13, align 4, !tbaa !5
  %370 = load i32, ptr %16, align 4, !tbaa !5
  store i32 %370, ptr %20, align 4, !tbaa !5
  %371 = load i32, ptr %17, align 4, !tbaa !5
  store i32 %371, ptr %21, align 4, !tbaa !5
  %372 = load i32, ptr %11, align 4, !tbaa !5
  %373 = zext i32 %372 to i64
  %374 = mul i64 %373, 8
  %375 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %374, i64 noundef 2097152)
  store ptr %375, ptr %33, align 8, !tbaa !9
  %376 = load i32, ptr %11, align 4, !tbaa !5
  %377 = zext i32 %376 to i64
  %378 = mul i64 %377, 4
  %379 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %378, i64 noundef 2097152)
  store ptr %379, ptr %34, align 8, !tbaa !9
  %380 = load ptr, ptr %35, align 8, !tbaa !9
  %381 = load i32, ptr %13, align 4, !tbaa !5
  call void @create_unique_random_array(ptr noundef %380, i32 noundef %381)
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %382

382:                                              ; preds = %406, %365
  %383 = load i32, ptr %14, align 4, !tbaa !5
  %384 = load i32, ptr %11, align 4, !tbaa !5
  %385 = icmp ult i32 %383, %384
  br i1 %385, label %386, label %409

386:                                              ; preds = %382
  %387 = load ptr, ptr %35, align 8, !tbaa !9
  %388 = load i32, ptr %14, align 4, !tbaa !5
  %389 = zext i32 %388 to i64
  %390 = getelementptr inbounds i64, ptr %387, i64 %389
  %391 = load i64, ptr %390, align 8, !tbaa !13
  %392 = load ptr, ptr %33, align 8, !tbaa !9
  %393 = load i32, ptr %14, align 4, !tbaa !5
  %394 = zext i32 %393 to i64
  %395 = getelementptr inbounds i64, ptr %392, i64 %394
  store i64 %391, ptr %395, align 8, !tbaa !13
  %396 = load ptr, ptr %33, align 8, !tbaa !9
  %397 = load i32, ptr %14, align 4, !tbaa !5
  %398 = zext i32 %397 to i64
  %399 = getelementptr inbounds i64, ptr %396, i64 %398
  %400 = load i64, ptr %399, align 8, !tbaa !13
  %401 = trunc i64 %400 to i32
  %402 = load ptr, ptr %34, align 8, !tbaa !9
  %403 = load i32, ptr %14, align 4, !tbaa !5
  %404 = zext i32 %403 to i64
  %405 = getelementptr inbounds i32, ptr %402, i64 %404
  store i32 %401, ptr %405, align 4, !tbaa !5
  br label %406

406:                                              ; preds = %386
  %407 = load i32, ptr %14, align 4, !tbaa !5
  %408 = add i32 %407, 1
  store i32 %408, ptr %14, align 4, !tbaa !5
  br label %382, !llvm.loop !20

409:                                              ; preds = %382
  br label %550

410:                                              ; preds = %362
  %411 = load i32, ptr %23, align 4, !tbaa !5
  %412 = icmp eq i32 %411, 1
  br i1 %412, label %413, label %458

413:                                              ; preds = %410
  %414 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %414, ptr %10, align 4, !tbaa !5
  %415 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %415, ptr %11, align 4, !tbaa !5
  %416 = load i32, ptr %8, align 4, !tbaa !5
  store i32 %416, ptr %12, align 4, !tbaa !5
  %417 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %417, ptr %13, align 4, !tbaa !5
  %418 = load i32, ptr %16, align 4, !tbaa !5
  store i32 %418, ptr %20, align 4, !tbaa !5
  %419 = load i32, ptr %19, align 4, !tbaa !5
  store i32 %419, ptr %21, align 4, !tbaa !5
  %420 = load i32, ptr %10, align 4, !tbaa !5
  %421 = zext i32 %420 to i64
  %422 = mul i64 %421, 8
  %423 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %422, i64 noundef 2097152)
  store ptr %423, ptr %33, align 8, !tbaa !9
  %424 = load i32, ptr %10, align 4, !tbaa !5
  %425 = zext i32 %424 to i64
  %426 = mul i64 %425, 4
  %427 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %426, i64 noundef 2097152)
  store ptr %427, ptr %34, align 8, !tbaa !9
  %428 = load ptr, ptr %35, align 8, !tbaa !9
  %429 = load i32, ptr %12, align 4, !tbaa !5
  call void @create_unique_random_array(ptr noundef %428, i32 noundef %429)
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %430

430:                                              ; preds = %454, %413
  %431 = load i32, ptr %14, align 4, !tbaa !5
  %432 = load i32, ptr %10, align 4, !tbaa !5
  %433 = icmp ult i32 %431, %432
  br i1 %433, label %434, label %457

434:                                              ; preds = %430
  %435 = load ptr, ptr %35, align 8, !tbaa !9
  %436 = load i32, ptr %14, align 4, !tbaa !5
  %437 = zext i32 %436 to i64
  %438 = getelementptr inbounds i64, ptr %435, i64 %437
  %439 = load i64, ptr %438, align 8, !tbaa !13
  %440 = load ptr, ptr %33, align 8, !tbaa !9
  %441 = load i32, ptr %14, align 4, !tbaa !5
  %442 = zext i32 %441 to i64
  %443 = getelementptr inbounds i64, ptr %440, i64 %442
  store i64 %439, ptr %443, align 8, !tbaa !13
  %444 = load ptr, ptr %33, align 8, !tbaa !9
  %445 = load i32, ptr %14, align 4, !tbaa !5
  %446 = zext i32 %445 to i64
  %447 = getelementptr inbounds i64, ptr %444, i64 %446
  %448 = load i64, ptr %447, align 8, !tbaa !13
  %449 = trunc i64 %448 to i32
  %450 = load ptr, ptr %34, align 8, !tbaa !9
  %451 = load i32, ptr %14, align 4, !tbaa !5
  %452 = zext i32 %451 to i64
  %453 = getelementptr inbounds i32, ptr %450, i64 %452
  store i32 %449, ptr %453, align 4, !tbaa !5
  br label %454

454:                                              ; preds = %434
  %455 = load i32, ptr %14, align 4, !tbaa !5
  %456 = add i32 %455, 1
  store i32 %456, ptr %14, align 4, !tbaa !5
  br label %430, !llvm.loop !21

457:                                              ; preds = %430
  br label %549

458:                                              ; preds = %410
  %459 = load i32, ptr %23, align 4, !tbaa !5
  %460 = icmp eq i32 %459, 2
  br i1 %460, label %461, label %545

461:                                              ; preds = %458
  %462 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %462, ptr %10, align 4, !tbaa !5
  %463 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %463, ptr %11, align 4, !tbaa !5
  %464 = load i32, ptr %8, align 4, !tbaa !5
  store i32 %464, ptr %12, align 4, !tbaa !5
  %465 = load i32, ptr %9, align 4, !tbaa !5
  store i32 %465, ptr %13, align 4, !tbaa !5
  %466 = load i32, ptr %16, align 4, !tbaa !5
  store i32 %466, ptr %20, align 4, !tbaa !5
  %467 = load i32, ptr %19, align 4, !tbaa !5
  store i32 %467, ptr %21, align 4, !tbaa !5
  %468 = load i32, ptr %10, align 4, !tbaa !5
  %469 = load i32, ptr %11, align 4, !tbaa !5
  %470 = mul i32 %468, %469
  %471 = zext i32 %470 to i64
  %472 = mul i64 %471, 8
  %473 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %472, i64 noundef 2097152)
  store ptr %473, ptr %33, align 8, !tbaa !9
  %474 = load i32, ptr %10, align 4, !tbaa !5
  %475 = load i32, ptr %11, align 4, !tbaa !5
  %476 = mul i32 %474, %475
  %477 = zext i32 %476 to i64
  %478 = mul i64 %477, 4
  %479 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %478, i64 noundef 2097152)
  store ptr %479, ptr %34, align 8, !tbaa !9
  %480 = load ptr, ptr %35, align 8, !tbaa !9
  %481 = load i32, ptr %12, align 4, !tbaa !5
  %482 = load i32, ptr %13, align 4, !tbaa !5
  %483 = mul i32 %481, %482
  call void @create_unique_random_array(ptr noundef %480, i32 noundef %483)
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %484

484:                                              ; preds = %541, %461
  %485 = load i32, ptr %15, align 4, !tbaa !5
  %486 = load i32, ptr %11, align 4, !tbaa !5
  %487 = icmp ult i32 %485, %486
  br i1 %487, label %488, label %544

488:                                              ; preds = %484
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %489

489:                                              ; preds = %537, %488
  %490 = load i32, ptr %14, align 4, !tbaa !5
  %491 = load i32, ptr %10, align 4, !tbaa !5
  %492 = icmp ult i32 %490, %491
  br i1 %492, label %493, label %540

493:                                              ; preds = %489
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #9
  %494 = load ptr, ptr %35, align 8, !tbaa !9
  %495 = load i32, ptr %14, align 4, !tbaa !5
  %496 = load i32, ptr %15, align 4, !tbaa !5
  %497 = load i32, ptr %10, align 4, !tbaa !5
  %498 = mul i32 %496, %497
  %499 = add i32 %495, %498
  %500 = zext i32 %499 to i64
  %501 = getelementptr inbounds i64, ptr %494, i64 %500
  %502 = load i64, ptr %501, align 8, !tbaa !13
  store i64 %502, ptr %44, align 8, !tbaa !13
  %503 = load i64, ptr %44, align 8, !tbaa !13
  %504 = load i32, ptr %12, align 4, !tbaa !5
  %505 = zext i32 %504 to i64
  %506 = udiv i64 %503, %505
  %507 = load i32, ptr %19, align 4, !tbaa !5
  %508 = sext i32 %507 to i64
  %509 = mul i64 %506, %508
  %510 = load i64, ptr %44, align 8, !tbaa !13
  %511 = load i32, ptr %12, align 4, !tbaa !5
  %512 = zext i32 %511 to i64
  %513 = urem i64 %510, %512
  %514 = add i64 %509, %513
  %515 = load ptr, ptr %33, align 8, !tbaa !9
  %516 = load i32, ptr %14, align 4, !tbaa !5
  %517 = load i32, ptr %15, align 4, !tbaa !5
  %518 = load i32, ptr %10, align 4, !tbaa !5
  %519 = mul i32 %517, %518
  %520 = add i32 %516, %519
  %521 = zext i32 %520 to i64
  %522 = getelementptr inbounds i64, ptr %515, i64 %521
  store i64 %514, ptr %522, align 8, !tbaa !13
  %523 = load ptr, ptr %33, align 8, !tbaa !9
  %524 = load i32, ptr %14, align 4, !tbaa !5
  %525 = zext i32 %524 to i64
  %526 = getelementptr inbounds i64, ptr %523, i64 %525
  %527 = load i64, ptr %526, align 8, !tbaa !13
  %528 = trunc i64 %527 to i32
  %529 = load ptr, ptr %34, align 8, !tbaa !9
  %530 = load i32, ptr %14, align 4, !tbaa !5
  %531 = load i32, ptr %15, align 4, !tbaa !5
  %532 = load i32, ptr %10, align 4, !tbaa !5
  %533 = mul i32 %531, %532
  %534 = add i32 %530, %533
  %535 = zext i32 %534 to i64
  %536 = getelementptr inbounds i32, ptr %529, i64 %535
  store i32 %528, ptr %536, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #9
  br label %537

537:                                              ; preds = %493
  %538 = load i32, ptr %14, align 4, !tbaa !5
  %539 = add i32 %538, 1
  store i32 %539, ptr %14, align 4, !tbaa !5
  br label %489, !llvm.loop !22

540:                                              ; preds = %489
  br label %541

541:                                              ; preds = %540
  %542 = load i32, ptr %15, align 4, !tbaa !5
  %543 = add i32 %542, 1
  store i32 %543, ptr %15, align 4, !tbaa !5
  br label %484, !llvm.loop !23

544:                                              ; preds = %484
  br label %548

545:                                              ; preds = %458
  %546 = load ptr, ptr @stdout, align 8, !tbaa !9
  %547 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %546, ptr noundef @.str.2) #9
  call void @exit(i32 noundef 1) #12
  unreachable

548:                                              ; preds = %544
  br label %549

549:                                              ; preds = %548, %457
  br label %550

550:                                              ; preds = %549, %409
  br label %554

551:                                              ; preds = %359
  %552 = load ptr, ptr @stdout, align 8, !tbaa !9
  %553 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %552, ptr noundef @.str.2) #9
  call void @exit(i32 noundef 1) #12
  unreachable

554:                                              ; preds = %550
  br label %555

555:                                              ; preds = %554, %358
  %556 = load i32, ptr %20, align 4, !tbaa !5
  %557 = load i32, ptr %11, align 4, !tbaa !5
  %558 = mul i32 %556, %557
  %559 = zext i32 %558 to i64
  %560 = mul i64 %559, 4
  %561 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %560, i64 noundef 2097152)
  store ptr %561, ptr %27, align 8, !tbaa !9
  %562 = load i32, ptr %21, align 4, !tbaa !5
  %563 = load i32, ptr %13, align 4, !tbaa !5
  %564 = mul i32 %562, %563
  %565 = zext i32 %564 to i64
  %566 = mul i64 %565, 4
  %567 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %566, i64 noundef 2097152)
  store ptr %567, ptr %28, align 8, !tbaa !9
  %568 = load i32, ptr %21, align 4, !tbaa !5
  %569 = load i32, ptr %13, align 4, !tbaa !5
  %570 = mul i32 %568, %569
  %571 = zext i32 %570 to i64
  %572 = mul i64 %571, 4
  %573 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %572, i64 noundef 2097152)
  store ptr %573, ptr %29, align 8, !tbaa !9
  %574 = load ptr, ptr %27, align 8, !tbaa !9
  %575 = load i32, ptr %20, align 4, !tbaa !5
  %576 = load i32, ptr %10, align 4, !tbaa !5
  %577 = load i32, ptr %11, align 4, !tbaa !5
  call void @sfill_matrix(ptr noundef %574, i32 noundef %575, i32 noundef %576, i32 noundef %577)
  %578 = load ptr, ptr %28, align 8, !tbaa !9
  %579 = load i32, ptr %21, align 4, !tbaa !5
  %580 = load i32, ptr %12, align 4, !tbaa !5
  %581 = load i32, ptr %13, align 4, !tbaa !5
  call void @sfill_matrix(ptr noundef %578, i32 noundef %579, i32 noundef %580, i32 noundef %581)
  %582 = load ptr, ptr %29, align 8, !tbaa !9
  %583 = load ptr, ptr %28, align 8, !tbaa !9
  %584 = load i32, ptr %21, align 4, !tbaa !5
  %585 = load i32, ptr %13, align 4, !tbaa !5
  %586 = mul i32 %584, %585
  %587 = zext i32 %586 to i64
  %588 = mul i64 %587, 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %582, ptr align 4 %583, i64 %588, i1 false)
  %589 = load i32, ptr %24, align 4, !tbaa !5
  %590 = icmp eq i32 %589, 1
  br i1 %590, label %591, label %628

591:                                              ; preds = %555
  %592 = load i32, ptr %20, align 4, !tbaa !5
  %593 = load i32, ptr %11, align 4, !tbaa !5
  %594 = mul i32 %592, %593
  %595 = zext i32 %594 to i64
  %596 = mul i64 %595, 2
  %597 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %596, i64 noundef 2097152)
  store ptr %597, ptr %30, align 8, !tbaa !9
  %598 = load i32, ptr %21, align 4, !tbaa !5
  %599 = load i32, ptr %13, align 4, !tbaa !5
  %600 = mul i32 %598, %599
  %601 = zext i32 %600 to i64
  %602 = mul i64 %601, 2
  %603 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %602, i64 noundef 2097152)
  store ptr %603, ptr %31, align 8, !tbaa !9
  %604 = load i32, ptr %21, align 4, !tbaa !5
  %605 = load i32, ptr %13, align 4, !tbaa !5
  %606 = mul i32 %604, %605
  %607 = zext i32 %606 to i64
  %608 = mul i64 %607, 2
  %609 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %608, i64 noundef 2097152)
  store ptr %609, ptr %32, align 8, !tbaa !9
  %610 = load ptr, ptr %27, align 8, !tbaa !9
  %611 = load ptr, ptr %30, align 8, !tbaa !9
  %612 = load i32, ptr %20, align 4, !tbaa !5
  %613 = load i32, ptr %11, align 4, !tbaa !5
  %614 = mul i32 %612, %613
  %615 = zext i32 %614 to i64
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %610, ptr noundef %611, i64 noundef %615)
  %616 = load ptr, ptr %28, align 8, !tbaa !9
  %617 = load ptr, ptr %31, align 8, !tbaa !9
  %618 = load i32, ptr %21, align 4, !tbaa !5
  %619 = load i32, ptr %13, align 4, !tbaa !5
  %620 = mul i32 %618, %619
  %621 = zext i32 %620 to i64
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %616, ptr noundef %617, i64 noundef %621)
  %622 = load ptr, ptr %29, align 8, !tbaa !9
  %623 = load ptr, ptr %32, align 8, !tbaa !9
  %624 = load i32, ptr %21, align 4, !tbaa !5
  %625 = load i32, ptr %13, align 4, !tbaa !5
  %626 = mul i32 %624, %625
  %627 = zext i32 %626 to i64
  call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %622, ptr noundef %623, i64 noundef %627)
  br label %628

628:                                              ; preds = %591, %555
  %629 = load ptr, ptr %27, align 8, !tbaa !9
  %630 = load ptr, ptr %29, align 8, !tbaa !9
  %631 = load ptr, ptr %30, align 8, !tbaa !9
  %632 = load ptr, ptr %32, align 8, !tbaa !9
  %633 = load ptr, ptr %33, align 8, !tbaa !9
  %634 = load ptr, ptr %34, align 8, !tbaa !9
  %635 = load i32, ptr %10, align 4, !tbaa !5
  %636 = load i32, ptr %11, align 4, !tbaa !5
  %637 = load i32, ptr %20, align 4, !tbaa !5
  %638 = load i32, ptr %12, align 4, !tbaa !5
  %639 = load i32, ptr %13, align 4, !tbaa !5
  %640 = load i32, ptr %21, align 4, !tbaa !5
  %641 = load i32, ptr %22, align 4, !tbaa !5
  %642 = load i32, ptr %23, align 4, !tbaa !5
  %643 = load i32, ptr %24, align 4, !tbaa !5
  %644 = load i32, ptr %25, align 4, !tbaa !5
  call void @reference_gather_scatter(ptr noundef %629, ptr noundef %630, ptr noundef %631, ptr noundef %632, ptr noundef %633, ptr noundef %634, i32 noundef %635, i32 noundef %636, i32 noundef %637, i32 noundef %638, i32 noundef %639, i32 noundef %640, i32 noundef %641, i32 noundef %642, i32 noundef %643, i32 noundef %644)
  %645 = load ptr, ptr %27, align 8, !tbaa !9
  %646 = load ptr, ptr %28, align 8, !tbaa !9
  %647 = load ptr, ptr %30, align 8, !tbaa !9
  %648 = load ptr, ptr %31, align 8, !tbaa !9
  %649 = load ptr, ptr %33, align 8, !tbaa !9
  %650 = load ptr, ptr %34, align 8, !tbaa !9
  %651 = load i32, ptr %10, align 4, !tbaa !5
  %652 = load i32, ptr %11, align 4, !tbaa !5
  %653 = load i32, ptr %20, align 4, !tbaa !5
  %654 = load i32, ptr %12, align 4, !tbaa !5
  %655 = load i32, ptr %13, align 4, !tbaa !5
  %656 = load i32, ptr %21, align 4, !tbaa !5
  %657 = load i32, ptr %22, align 4, !tbaa !5
  %658 = load i32, ptr %23, align 4, !tbaa !5
  %659 = load i32, ptr %24, align 4, !tbaa !5
  %660 = load i32, ptr %25, align 4, !tbaa !5
  call void @setup_tpp_kernel_and_param_struct(ptr noundef %36, ptr noundef %37, ptr noundef %645, ptr noundef %646, ptr noundef %647, ptr noundef %648, ptr noundef %649, ptr noundef %650, i32 noundef %651, i32 noundef %652, i32 noundef %653, i32 noundef %654, i32 noundef %655, i32 noundef %656, i32 noundef %657, i32 noundef %658, i32 noundef %659, i32 noundef %660)
  %661 = load ptr, ptr %36, align 8, !tbaa !9
  call void %661(ptr noundef %37)
  %662 = load ptr, ptr %28, align 8, !tbaa !9
  %663 = load ptr, ptr %29, align 8, !tbaa !9
  %664 = load ptr, ptr %31, align 8, !tbaa !9
  %665 = load ptr, ptr %32, align 8, !tbaa !9
  %666 = load i32, ptr %10, align 4, !tbaa !5
  %667 = load i32, ptr %11, align 4, !tbaa !5
  %668 = load i32, ptr %20, align 4, !tbaa !5
  %669 = load i32, ptr %12, align 4, !tbaa !5
  %670 = load i32, ptr %13, align 4, !tbaa !5
  %671 = load i32, ptr %21, align 4, !tbaa !5
  %672 = load i32, ptr %22, align 4, !tbaa !5
  %673 = load i32, ptr %23, align 4, !tbaa !5
  %674 = load i32, ptr %24, align 4, !tbaa !5
  %675 = load i32, ptr %25, align 4, !tbaa !5
  %676 = call i32 @compare_results(ptr noundef %662, ptr noundef %663, ptr noundef %664, ptr noundef %665, i32 noundef %666, i32 noundef %667, i32 noundef %668, i32 noundef %669, i32 noundef %670, i32 noundef %671, i32 noundef %672, i32 noundef %673, i32 noundef %674, i32 noundef %675)
  store i32 %676, ptr %38, align 4, !tbaa !5
  %677 = load ptr, ptr %27, align 8, !tbaa !9
  %678 = load ptr, ptr %29, align 8, !tbaa !9
  %679 = load ptr, ptr %30, align 8, !tbaa !9
  %680 = load ptr, ptr %32, align 8, !tbaa !9
  %681 = load ptr, ptr %33, align 8, !tbaa !9
  %682 = load ptr, ptr %34, align 8, !tbaa !9
  %683 = load i32, ptr %10, align 4, !tbaa !5
  %684 = load i32, ptr %11, align 4, !tbaa !5
  %685 = load i32, ptr %20, align 4, !tbaa !5
  %686 = load i32, ptr %12, align 4, !tbaa !5
  %687 = load i32, ptr %13, align 4, !tbaa !5
  %688 = load i32, ptr %21, align 4, !tbaa !5
  %689 = load i32, ptr %22, align 4, !tbaa !5
  %690 = load i32, ptr %23, align 4, !tbaa !5
  %691 = load i32, ptr %24, align 4, !tbaa !5
  %692 = load i32, ptr %25, align 4, !tbaa !5
  call void @reference_gather_scatter(ptr noundef %677, ptr noundef %678, ptr noundef %679, ptr noundef %680, ptr noundef %681, ptr noundef %682, i32 noundef %683, i32 noundef %684, i32 noundef %685, i32 noundef %686, i32 noundef %687, i32 noundef %688, i32 noundef %689, i32 noundef %690, i32 noundef %691, i32 noundef %692)
  %693 = call i64 @libxsmm_timer_tick()
  store i64 %693, ptr %39, align 8, !tbaa !13
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %694

694:                                              ; preds = %715, %628
  %695 = load i32, ptr %15, align 4, !tbaa !5
  %696 = load i32, ptr %26, align 4, !tbaa !5
  %697 = icmp ult i32 %695, %696
  br i1 %697, label %698, label %718

698:                                              ; preds = %694
  %699 = load ptr, ptr %27, align 8, !tbaa !9
  %700 = load ptr, ptr %29, align 8, !tbaa !9
  %701 = load ptr, ptr %30, align 8, !tbaa !9
  %702 = load ptr, ptr %32, align 8, !tbaa !9
  %703 = load ptr, ptr %33, align 8, !tbaa !9
  %704 = load ptr, ptr %34, align 8, !tbaa !9
  %705 = load i32, ptr %10, align 4, !tbaa !5
  %706 = load i32, ptr %11, align 4, !tbaa !5
  %707 = load i32, ptr %20, align 4, !tbaa !5
  %708 = load i32, ptr %12, align 4, !tbaa !5
  %709 = load i32, ptr %13, align 4, !tbaa !5
  %710 = load i32, ptr %21, align 4, !tbaa !5
  %711 = load i32, ptr %22, align 4, !tbaa !5
  %712 = load i32, ptr %23, align 4, !tbaa !5
  %713 = load i32, ptr %24, align 4, !tbaa !5
  %714 = load i32, ptr %25, align 4, !tbaa !5
  call void @reference_gather_scatter(ptr noundef %699, ptr noundef %700, ptr noundef %701, ptr noundef %702, ptr noundef %703, ptr noundef %704, i32 noundef %705, i32 noundef %706, i32 noundef %707, i32 noundef %708, i32 noundef %709, i32 noundef %710, i32 noundef %711, i32 noundef %712, i32 noundef %713, i32 noundef %714)
  br label %715

715:                                              ; preds = %698
  %716 = load i32, ptr %15, align 4, !tbaa !5
  %717 = add i32 %716, 1
  store i32 %717, ptr %15, align 4, !tbaa !5
  br label %694, !llvm.loop !24

718:                                              ; preds = %694
  %719 = call i64 @libxsmm_timer_tick()
  store i64 %719, ptr %40, align 8, !tbaa !13
  %720 = load i64, ptr %39, align 8, !tbaa !13
  %721 = load i64, ptr %40, align 8, !tbaa !13
  %722 = call double @libxsmm_timer_duration(i64 noundef %720, i64 noundef %721)
  store double %722, ptr %41, align 8, !tbaa !11
  %723 = load double, ptr %41, align 8, !tbaa !11
  %724 = call i32 (ptr, ...) @printf(ptr noundef @.str.3, double noundef %723)
  %725 = load ptr, ptr %36, align 8, !tbaa !9
  call void %725(ptr noundef %37)
  %726 = call i64 @libxsmm_timer_tick()
  store i64 %726, ptr %39, align 8, !tbaa !13
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %727

727:                                              ; preds = %733, %718
  %728 = load i32, ptr %15, align 4, !tbaa !5
  %729 = load i32, ptr %26, align 4, !tbaa !5
  %730 = icmp ult i32 %728, %729
  br i1 %730, label %731, label %736

731:                                              ; preds = %727
  %732 = load ptr, ptr %36, align 8, !tbaa !9
  call void %732(ptr noundef %37)
  br label %733

733:                                              ; preds = %731
  %734 = load i32, ptr %15, align 4, !tbaa !5
  %735 = add i32 %734, 1
  store i32 %735, ptr %15, align 4, !tbaa !5
  br label %727, !llvm.loop !25

736:                                              ; preds = %727
  %737 = call i64 @libxsmm_timer_tick()
  store i64 %737, ptr %40, align 8, !tbaa !13
  %738 = load i64, ptr %39, align 8, !tbaa !13
  %739 = load i64, ptr %40, align 8, !tbaa !13
  %740 = call double @libxsmm_timer_duration(i64 noundef %738, i64 noundef %739)
  store double %740, ptr %42, align 8, !tbaa !11
  %741 = load double, ptr %42, align 8, !tbaa !11
  %742 = call i32 (ptr, ...) @printf(ptr noundef @.str.4, double noundef %741)
  %743 = load double, ptr %42, align 8, !tbaa !11
  %744 = fcmp olt double 0.000000e+00, %743
  br i1 %744, label %745, label %750

745:                                              ; preds = %736
  %746 = load double, ptr %41, align 8, !tbaa !11
  %747 = load double, ptr %42, align 8, !tbaa !11
  %748 = fdiv double %746, %747
  %749 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, double noundef %748)
  br label %750

750:                                              ; preds = %745, %736
  %751 = load ptr, ptr %27, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %751)
  %752 = load ptr, ptr %28, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %752)
  %753 = load ptr, ptr %29, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %753)
  %754 = load i32, ptr %24, align 4, !tbaa !5
  %755 = icmp eq i32 %754, 1
  br i1 %755, label %756, label %760

756:                                              ; preds = %750
  %757 = load ptr, ptr %30, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %757)
  %758 = load ptr, ptr %31, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %758)
  %759 = load ptr, ptr %32, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %759)
  br label %760

760:                                              ; preds = %756, %750
  %761 = load ptr, ptr %33, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %761)
  %762 = load ptr, ptr %34, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %762)
  %763 = load ptr, ptr %35, align 8, !tbaa !9
  call void @free(ptr noundef %763) #9
  %764 = load i32, ptr %38, align 4, !tbaa !5
  %765 = icmp eq i32 %764, 1
  br i1 %765, label %766, label %777

766:                                              ; preds = %760
  %767 = load ptr, ptr @stderr, align 8, !tbaa !9
  %768 = load i32, ptr %6, align 4, !tbaa !5
  %769 = load i32, ptr %7, align 4, !tbaa !5
  %770 = load i32, ptr %16, align 4, !tbaa !5
  %771 = load i32, ptr %17, align 4, !tbaa !5
  %772 = load i32, ptr %22, align 4, !tbaa !5
  %773 = load i32, ptr %23, align 4, !tbaa !5
  %774 = load i32, ptr %24, align 4, !tbaa !5
  %775 = load i32, ptr %25, align 4, !tbaa !5
  %776 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %767, ptr noundef @.str.6, i32 noundef %768, i32 noundef %769, i32 noundef %770, i32 noundef %771, i32 noundef %772, i32 noundef %773, i32 noundef %774, i32 noundef %775) #9
  br label %777

777:                                              ; preds = %766, %760
  %778 = load i32, ptr %38, align 4, !tbaa !5
  %779 = icmp eq i32 %778, 0
  br i1 %779, label %780, label %783

780:                                              ; preds = %777
  %781 = load i32, ptr @is_reference_kernel, align 4, !tbaa !5
  %782 = call i32 @libxsmm_return_success_code(i32 noundef %781)
  br label %785

783:                                              ; preds = %777
  %784 = load i32, ptr %38, align 4, !tbaa !5
  br label %785

785:                                              ; preds = %783, %780
  %786 = phi i32 [ %782, %780 ], [ %784, %783 ]
  store i32 %786, ptr %38, align 4, !tbaa !5
  %787 = load i32, ptr %38, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #9
  call void @llvm.lifetime.end.p0(i64 128, ptr %37) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #9
  ret i32 %787
}

; 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

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

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #4

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @create_unique_random_array(ptr noundef, i32 noundef) #6

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @sfill_matrix(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #6

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @reference_gather_scatter(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #6

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @setup_tpp_kernel_and_param_struct(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #6

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @compare_results(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #6

declare i64 @libxsmm_timer_tick() #2

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

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

declare void @libxsmm_free(ptr noundef) #2

; Function Attrs: nounwind
declare void @free(ptr noundef) #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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint nounwind willreturn memory(read) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind allocsize(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 #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 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #9 = { nounwind }
attributes #10 = { nounwind willreturn memory(read) }
attributes #11 = { nounwind allocsize(0) }
attributes #12 = { 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 = !{!"long long", !7, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = distinct !{!17, !16}
!18 = distinct !{!18, !16}
!19 = distinct !{!19, !16}
!20 = distinct !{!20, !16}
!21 = distinct !{!21, !16}
!22 = distinct !{!22, !16}
!23 = distinct !{!23, !16}
!24 = distinct !{!24, !16}
!25 = distinct !{!25, !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_meltw_unary_param = type { %struct.libxsmm_matrix_op_arg, %struct.libxsmm_matrix_arg, %struct.libxsmm_matrix_arg }
%struct.libxsmm_matrix_op_arg = type { ptr, ptr, ptr, ptr }
%struct.libxsmm_matrix_arg = type { ptr, ptr, ptr, ptr, ptr, ptr }

@is_reference_kernel = external dso_local local_unnamed_addr global i32, align 4
@.str = external hidden unnamed_addr constant [28 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [96 x i8], align 1
@__PRETTY_FUNCTION__.main = external hidden unnamed_addr constant [23 x i8], align 1
@stdout = external local_unnamed_addr global ptr, align 8
@.str.2 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [19 x i8], align 1
@stderr = external local_unnamed_addr global ptr, align 8
@.str.6 = external hidden unnamed_addr constant [106 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 ptr, align 8
  %4 = alloca %struct.libxsmm_meltw_unary_param, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #11
  store ptr null, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %4) #11
  tail call void @libxsmm_init() #11
  %5 = icmp sgt i32 %0, 1
  br i1 %5, label %6, label %.thread459

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

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

15:                                               ; preds = %10
  %16 = getelementptr inbounds i8, ptr %1, i64 24
  %17 = load ptr, ptr %16, align 8, !tbaa !5
  %18 = tail call i32 @atoi(ptr nocapture noundef %17) #12
  %.not477 = icmp eq i32 %0, 4
  br i1 %.not477, label %.thread459, label %19

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

24:                                               ; preds = %19
  %25 = getelementptr inbounds i8, ptr %1, i64 40
  %26 = load ptr, ptr %25, align 8, !tbaa !5
  %27 = tail call i32 @atoi(ptr nocapture noundef %26) #12
  %.not478 = icmp eq i32 %0, 6
  br i1 %.not478, label %.thread459, label %28

28:                                               ; preds = %24
  %29 = getelementptr inbounds i8, ptr %1, i64 48
  %30 = load ptr, ptr %29, align 8, !tbaa !5
  %31 = tail call i32 @atoi(ptr nocapture noundef %30) #12
  %32 = icmp ugt i32 %0, 7
  br i1 %32, label %33, label %.thread459

33:                                               ; preds = %28
  %34 = getelementptr inbounds i8, ptr %1, i64 56
  %35 = load ptr, ptr %34, align 8, !tbaa !5
  %36 = tail call i32 @atoi(ptr nocapture noundef %35) #12
  %.not479 = icmp eq i32 %0, 8
  br i1 %.not479, label %.thread459, label %37

37:                                               ; preds = %33
  %38 = getelementptr inbounds i8, ptr %1, i64 64
  %39 = load ptr, ptr %38, align 8, !tbaa !5
  %40 = tail call i32 @atoi(ptr nocapture noundef %39) #12
  %41 = icmp ugt i32 %0, 9
  br i1 %41, label %42, label %.thread459

42:                                               ; preds = %37
  %43 = getelementptr inbounds i8, ptr %1, i64 72
  %44 = load ptr, ptr %43, align 8, !tbaa !5
  %45 = tail call i32 @atoi(ptr nocapture noundef %44) #12
  br label %.thread459

.thread459:                                       ; preds = %2, %6, %10, %15, %19, %24, %28, %33, %42, %37
  %.0363475 = phi i32 [ %40, %42 ], [ %40, %37 ], [ 0, %33 ], [ 0, %28 ], [ 0, %24 ], [ 0, %19 ], [ 0, %15 ], [ 0, %10 ], [ 0, %6 ], [ 0, %2 ]
  %.0365441451474 = phi i32 [ %31, %42 ], [ %31, %37 ], [ %31, %33 ], [ %31, %28 ], [ 0, %24 ], [ 0, %19 ], [ 0, %15 ], [ 0, %10 ], [ 0, %6 ], [ 0, %2 ]
  %.0370415423440452473 = phi i32 [ %22, %42 ], [ %22, %37 ], [ %22, %33 ], [ %22, %28 ], [ %22, %24 ], [ %22, %19 ], [ 64, %15 ], [ 64, %10 ], [ 64, %6 ], [ 64, %2 ]
  %.0356397403414424439453472 = phi i32 [ %13, %42 ], [ %13, %37 ], [ %13, %33 ], [ %13, %28 ], [ %13, %24 ], [ %13, %19 ], [ %13, %15 ], [ %13, %10 ], [ 64, %6 ], [ 64, %2 ]
  %.0392396404413425438454471 = phi i32 [ %9, %42 ], [ %9, %37 ], [ %9, %33 ], [ %9, %28 ], [ %9, %24 ], [ %9, %19 ], [ %9, %15 ], [ %9, %10 ], [ %9, %6 ], [ 64, %2 ]
  %.0371405412426437455470 = phi i32 [ %18, %42 ], [ %18, %37 ], [ %18, %33 ], [ %18, %28 ], [ %18, %24 ], [ %18, %19 ], [ %18, %15 ], [ 64, %10 ], [ 64, %6 ], [ 64, %2 ]
  %.0366427436456469 = phi i32 [ %27, %42 ], [ %27, %37 ], [ %27, %33 ], [ %27, %28 ], [ %27, %24 ], [ 0, %19 ], [ 0, %15 ], [ 0, %10 ], [ 0, %6 ], [ 0, %2 ]
  %.0364457468 = phi i32 [ %36, %42 ], [ %36, %37 ], [ %36, %33 ], [ 0, %28 ], [ 0, %24 ], [ 0, %19 ], [ 0, %15 ], [ 0, %10 ], [ 0, %6 ], [ 0, %2 ]
  %.0362 = phi i32 [ %45, %42 ], [ 100, %37 ], [ 100, %33 ], [ 100, %28 ], [ 100, %24 ], [ 100, %19 ], [ 100, %15 ], [ 100, %10 ], [ 100, %6 ], [ 100, %2 ]
  %46 = tail call i32 @llvm.umax.i32(i32 %.0392396404413425438454471, i32 1)
  %47 = tail call i32 @llvm.umax.i32(i32 %.0356397403414424439453472, i32 1)
  %48 = tail call i32 @llvm.smax.i32(i32 %.0371405412426437455470, i32 %46)
  %49 = tail call i32 @llvm.smax.i32(i32 %.0370415423440452473, i32 %46)
  %50 = shl i32 %46, 2
  %51 = shl i32 %47, 2
  %52 = shl nsw i32 %48, 2
  %53 = shl nsw i32 %49, 2
  %54 = mul i32 %50, %51
  %55 = zext i32 %54 to i64
  %56 = shl nuw nsw i64 %55, 3
  %57 = tail call noalias ptr @malloc(i64 noundef %56) #13
  switch i32 %.0366427436456469, label %198 [
    i32 0, label %58
    i32 1, label %129
  ]

58:                                               ; preds = %.thread459
  switch i32 %.0365441451474, label %126 [
    i32 0, label %59
    i32 1, label %80
    i32 2, label %99
  ]

59:                                               ; preds = %58
  %60 = zext i32 %47 to i64
  %61 = shl nuw nsw i64 %60, 3
  %62 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %61, i64 noundef 2097152) #11
  %63 = shl nuw nsw i64 %60, 2
  %64 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %63, i64 noundef 2097152) #11
  %.not = icmp eq ptr %57, null
  br i1 %.not, label %65, label %66

65:                                               ; preds = %59
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 527, ptr noundef nonnull @__PRETTY_FUNCTION__.main) #14
  unreachable

66:                                               ; preds = %59
  tail call void @create_unique_random_array(ptr noundef nonnull %57, i32 noundef %51)
  %67 = tail call i32 @llvm.umax.i32(i32 %.0356397403414424439453472, i32 1)
  %umax531 = zext i32 %67 to i64
  %68 = shl nuw nsw i64 %umax531, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %62, ptr noundef nonnull align 8 dereferenceable(1) %57, i64 %68, i1 false), !tbaa !9
  %min.iters.check578 = icmp ult i32 %.0356397403414424439453472, 4
  br i1 %min.iters.check578, label %scalar.ph577.preheader, label %vector.ph579

vector.ph579:                                     ; preds = %66
  %n.vec581 = and i64 %60, 4294967292
  br label %vector.body583

vector.body583:                                   ; preds = %vector.body583, %vector.ph579
  %index584 = phi i64 [ 0, %vector.ph579 ], [ %index.next587, %vector.body583 ]
  %69 = getelementptr inbounds i64, ptr %57, i64 %index584
  %70 = getelementptr inbounds i8, ptr %69, i64 16
  %wide.load585 = load <2 x i64>, ptr %69, align 8, !tbaa !9
  %wide.load586 = load <2 x i64>, ptr %70, align 8, !tbaa !9
  %71 = trunc <2 x i64> %wide.load585 to <2 x i32>
  %72 = trunc <2 x i64> %wide.load586 to <2 x i32>
  %73 = getelementptr inbounds i32, ptr %64, i64 %index584
  %74 = getelementptr inbounds i8, ptr %73, i64 8
  store <2 x i32> %71, ptr %73, align 4, !tbaa !11
  store <2 x i32> %72, ptr %74, align 4, !tbaa !11
  %index.next587 = add nuw i64 %index584, 4
  %75 = icmp eq i64 %index.next587, %n.vec581
  br i1 %75, label %middle.block576, label %vector.body583, !llvm.loop !13

middle.block576:                                  ; preds = %vector.body583
  %cmp.n588 = icmp eq i64 %n.vec581, %60
  br i1 %cmp.n588, label %.loopexit, label %scalar.ph577.preheader

scalar.ph577.preheader:                           ; preds = %middle.block576, %66
  %indvars.iv532.ph = phi i64 [ 0, %66 ], [ %n.vec581, %middle.block576 ]
  br label %scalar.ph577

scalar.ph577:                                     ; preds = %scalar.ph577.preheader, %scalar.ph577
  %indvars.iv532 = phi i64 [ %indvars.iv.next533, %scalar.ph577 ], [ %indvars.iv532.ph, %scalar.ph577.preheader ]
  %76 = getelementptr inbounds i64, ptr %57, i64 %indvars.iv532
  %77 = load i64, ptr %76, align 8, !tbaa !9
  %78 = trunc i64 %77 to i32
  %79 = getelementptr inbounds i32, ptr %64, i64 %indvars.iv532
  store i32 %78, ptr %79, align 4, !tbaa !11
  %indvars.iv.next533 = add nuw nsw i64 %indvars.iv532, 1
  %exitcond536.not = icmp eq i64 %indvars.iv.next533, %60
  br i1 %exitcond536.not, label %.loopexit, label %scalar.ph577, !llvm.loop !17

80:                                               ; preds = %58
  %81 = zext i32 %46 to i64
  %82 = shl nuw nsw i64 %81, 3
  %83 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %82, i64 noundef 2097152) #11
  %84 = shl nuw nsw i64 %81, 2
  %85 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %84, i64 noundef 2097152) #11
  tail call void @create_unique_random_array(ptr noundef %57, i32 noundef %50)
  %86 = tail call i32 @llvm.umax.i32(i32 %.0392396404413425438454471, i32 1)
  %umax525 = zext i32 %86 to i64
  %87 = shl nuw nsw i64 %umax525, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %83, ptr noundef nonnull align 8 dereferenceable(1) %57, i64 %87, i1 false), !tbaa !9
  %min.iters.check565 = icmp ult i32 %.0392396404413425438454471, 4
  br i1 %min.iters.check565, label %scalar.ph564.preheader, label %vector.ph566

vector.ph566:                                     ; preds = %80
  %n.vec568 = and i64 %81, 4294967292
  br label %vector.body570

vector.body570:                                   ; preds = %vector.body570, %vector.ph566
  %index571 = phi i64 [ 0, %vector.ph566 ], [ %index.next574, %vector.body570 ]
  %88 = getelementptr inbounds i64, ptr %57, i64 %index571
  %89 = getelementptr inbounds i8, ptr %88, i64 16
  %wide.load572 = load <2 x i64>, ptr %88, align 8, !tbaa !9
  %wide.load573 = load <2 x i64>, ptr %89, align 8, !tbaa !9
  %90 = trunc <2 x i64> %wide.load572 to <2 x i32>
  %91 = trunc <2 x i64> %wide.load573 to <2 x i32>
  %92 = getelementptr inbounds i32, ptr %85, i64 %index571
  %93 = getelementptr inbounds i8, ptr %92, i64 8
  store <2 x i32> %90, ptr %92, align 4, !tbaa !11
  store <2 x i32> %91, ptr %93, align 4, !tbaa !11
  %index.next574 = add nuw i64 %index571, 4
  %94 = icmp eq i64 %index.next574, %n.vec568
  br i1 %94, label %middle.block563, label %vector.body570, !llvm.loop !18

middle.block563:                                  ; preds = %vector.body570
  %cmp.n575 = icmp eq i64 %n.vec568, %81
  br i1 %cmp.n575, label %.loopexit, label %scalar.ph564.preheader

scalar.ph564.preheader:                           ; preds = %middle.block563, %80
  %indvars.iv526.ph = phi i64 [ 0, %80 ], [ %n.vec568, %middle.block563 ]
  br label %scalar.ph564

scalar.ph564:                                     ; preds = %scalar.ph564.preheader, %scalar.ph564
  %indvars.iv526 = phi i64 [ %indvars.iv.next527, %scalar.ph564 ], [ %indvars.iv526.ph, %scalar.ph564.preheader ]
  %95 = getelementptr inbounds i64, ptr %57, i64 %indvars.iv526
  %96 = load i64, ptr %95, align 8, !tbaa !9
  %97 = trunc i64 %96 to i32
  %98 = getelementptr inbounds i32, ptr %85, i64 %indvars.iv526
  store i32 %97, ptr %98, align 4, !tbaa !11
  %indvars.iv.next527 = add nuw nsw i64 %indvars.iv526, 1
  %exitcond530.not = icmp eq i64 %indvars.iv.next527, %81
  br i1 %exitcond530.not, label %.loopexit, label %scalar.ph564, !llvm.loop !19

99:                                               ; preds = %58
  %100 = mul i32 %46, %47
  %101 = zext i32 %100 to i64
  %102 = shl nuw nsw i64 %101, 3
  %103 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %102, i64 noundef 2097152) #11
  %104 = shl nuw nsw i64 %101, 2
  %105 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %104, i64 noundef 2097152) #11
  tail call void @create_unique_random_array(ptr noundef %57, i32 noundef %54)
  %106 = zext i32 %50 to i64
  %107 = sext i32 %52 to i64
  %wide.trip.count522 = zext i32 %46 to i64
  br label %.preheader

.preheader:                                       ; preds = %99, %124
  %.0372491 = phi i32 [ 0, %99 ], [ %125, %124 ]
  %108 = mul i32 %.0372491, %46
  br label %109

109:                                              ; preds = %.preheader, %109
  %indvars.iv519 = phi i64 [ 0, %.preheader ], [ %indvars.iv.next520, %109 ]
  %110 = trunc nuw i64 %indvars.iv519 to i32
  %111 = add i32 %108, %110
  %112 = zext i32 %111 to i64
  %113 = getelementptr inbounds i64, ptr %57, i64 %112
  %114 = load i64, ptr %113, align 8, !tbaa !9
  %115 = udiv i64 %114, %106
  %116 = mul i64 %115, %107
  %117 = urem i64 %114, %106
  %118 = add i64 %116, %117
  %119 = getelementptr inbounds i64, ptr %103, i64 %112
  store i64 %118, ptr %119, align 8, !tbaa !9
  %120 = getelementptr inbounds i64, ptr %103, i64 %indvars.iv519
  %121 = load i64, ptr %120, align 8, !tbaa !9
  %122 = trunc i64 %121 to i32
  %123 = getelementptr inbounds i32, ptr %105, i64 %112
  store i32 %122, ptr %123, align 4, !tbaa !11
  %indvars.iv.next520 = add nuw nsw i64 %indvars.iv519, 1
  %exitcond523.not = icmp eq i64 %indvars.iv.next520, %wide.trip.count522
  br i1 %exitcond523.not, label %124, label %109, !llvm.loop !20

124:                                              ; preds = %109
  %125 = add nuw i32 %.0372491, 1
  %exitcond524.not = icmp eq i32 %125, %47
  br i1 %exitcond524.not, label %.loopexit, label %.preheader, !llvm.loop !21

126:                                              ; preds = %58
  %127 = load ptr, ptr @stdout, align 8, !tbaa !5
  %128 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %127, ptr noundef nonnull @.str.2) #11
  tail call void @exit(i32 noundef 1) #14
  unreachable

129:                                              ; preds = %.thread459
  switch i32 %.0365441451474, label %195 [
    i32 0, label %130
    i32 1, label %149
    i32 2, label %168
  ]

130:                                              ; preds = %129
  %131 = zext i32 %47 to i64
  %132 = shl nuw nsw i64 %131, 3
  %133 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %132, i64 noundef 2097152) #11
  %134 = shl nuw nsw i64 %131, 2
  %135 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %134, i64 noundef 2097152) #11
  tail call void @create_unique_random_array(ptr noundef %57, i32 noundef %51)
  %136 = tail call i32 @llvm.umax.i32(i32 %.0356397403414424439453472, i32 1)
  %umax513 = zext i32 %136 to i64
  %137 = shl nuw nsw i64 %umax513, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %133, ptr noundef nonnull align 8 dereferenceable(1) %57, i64 %137, i1 false), !tbaa !9
  %min.iters.check552 = icmp ult i32 %.0356397403414424439453472, 4
  br i1 %min.iters.check552, label %scalar.ph551.preheader, label %vector.ph553

vector.ph553:                                     ; preds = %130
  %n.vec555 = and i64 %131, 4294967292
  br label %vector.body557

vector.body557:                                   ; preds = %vector.body557, %vector.ph553
  %index558 = phi i64 [ 0, %vector.ph553 ], [ %index.next561, %vector.body557 ]
  %138 = getelementptr inbounds i64, ptr %57, i64 %index558
  %139 = getelementptr inbounds i8, ptr %138, i64 16
  %wide.load559 = load <2 x i64>, ptr %138, align 8, !tbaa !9
  %wide.load560 = load <2 x i64>, ptr %139, align 8, !tbaa !9
  %140 = trunc <2 x i64> %wide.load559 to <2 x i32>
  %141 = trunc <2 x i64> %wide.load560 to <2 x i32>
  %142 = getelementptr inbounds i32, ptr %135, i64 %index558
  %143 = getelementptr inbounds i8, ptr %142, i64 8
  store <2 x i32> %140, ptr %142, align 4, !tbaa !11
  store <2 x i32> %141, ptr %143, align 4, !tbaa !11
  %index.next561 = add nuw i64 %index558, 4
  %144 = icmp eq i64 %index.next561, %n.vec555
  br i1 %144, label %middle.block550, label %vector.body557, !llvm.loop !22

middle.block550:                                  ; preds = %vector.body557
  %cmp.n562 = icmp eq i64 %n.vec555, %131
  br i1 %cmp.n562, label %.loopexit, label %scalar.ph551.preheader

scalar.ph551.preheader:                           ; preds = %middle.block550, %130
  %indvars.iv514.ph = phi i64 [ 0, %130 ], [ %n.vec555, %middle.block550 ]
  br label %scalar.ph551

scalar.ph551:                                     ; preds = %scalar.ph551.preheader, %scalar.ph551
  %indvars.iv514 = phi i64 [ %indvars.iv.next515, %scalar.ph551 ], [ %indvars.iv514.ph, %scalar.ph551.preheader ]
  %145 = getelementptr inbounds i64, ptr %57, i64 %indvars.iv514
  %146 = load i64, ptr %145, align 8, !tbaa !9
  %147 = trunc i64 %146 to i32
  %148 = getelementptr inbounds i32, ptr %135, i64 %indvars.iv514
  store i32 %147, ptr %148, align 4, !tbaa !11
  %indvars.iv.next515 = add nuw nsw i64 %indvars.iv514, 1
  %exitcond518.not = icmp eq i64 %indvars.iv.next515, %131
  br i1 %exitcond518.not, label %.loopexit, label %scalar.ph551, !llvm.loop !23

149:                                              ; preds = %129
  %150 = zext i32 %46 to i64
  %151 = shl nuw nsw i64 %150, 3
  %152 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %151, i64 noundef 2097152) #11
  %153 = shl nuw nsw i64 %150, 2
  %154 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %153, i64 noundef 2097152) #11
  tail call void @create_unique_random_array(ptr noundef %57, i32 noundef %50)
  %155 = tail call i32 @llvm.umax.i32(i32 %.0392396404413425438454471, i32 1)
  %umax = zext i32 %155 to i64
  %156 = shl nuw nsw i64 %umax, 3
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %152, ptr noundef nonnull align 8 dereferenceable(1) %57, i64 %156, i1 false), !tbaa !9
  %min.iters.check = icmp ult i32 %.0392396404413425438454471, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %149
  %n.vec = and i64 %150, 4294967292
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %157 = getelementptr inbounds i64, ptr %57, i64 %index
  %158 = getelementptr inbounds i8, ptr %157, i64 16
  %wide.load = load <2 x i64>, ptr %157, align 8, !tbaa !9
  %wide.load549 = load <2 x i64>, ptr %158, align 8, !tbaa !9
  %159 = trunc <2 x i64> %wide.load to <2 x i32>
  %160 = trunc <2 x i64> %wide.load549 to <2 x i32>
  %161 = getelementptr inbounds i32, ptr %154, i64 %index
  %162 = getelementptr inbounds i8, ptr %161, i64 8
  store <2 x i32> %159, ptr %161, align 4, !tbaa !11
  store <2 x i32> %160, ptr %162, align 4, !tbaa !11
  %index.next = add nuw i64 %index, 4
  %163 = icmp eq i64 %index.next, %n.vec
  br i1 %163, label %middle.block, label %vector.body, !llvm.loop !24

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %150
  br i1 %cmp.n, label %.loopexit, label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %middle.block, %149
  %indvars.iv508.ph = phi i64 [ 0, %149 ], [ %n.vec, %middle.block ]
  br label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %indvars.iv508 = phi i64 [ %indvars.iv.next509, %scalar.ph ], [ %indvars.iv508.ph, %scalar.ph.preheader ]
  %164 = getelementptr inbounds i64, ptr %57, i64 %indvars.iv508
  %165 = load i64, ptr %164, align 8, !tbaa !9
  %166 = trunc i64 %165 to i32
  %167 = getelementptr inbounds i32, ptr %154, i64 %indvars.iv508
  store i32 %166, ptr %167, align 4, !tbaa !11
  %indvars.iv.next509 = add nuw nsw i64 %indvars.iv508, 1
  %exitcond512.not = icmp eq i64 %indvars.iv.next509, %150
  br i1 %exitcond512.not, label %.loopexit, label %scalar.ph, !llvm.loop !25

168:                                              ; preds = %129
  %169 = mul i32 %46, %47
  %170 = zext i32 %169 to i64
  %171 = shl nuw nsw i64 %170, 3
  %172 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %171, i64 noundef 2097152) #11
  %173 = shl nuw nsw i64 %170, 2
  %174 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %173, i64 noundef 2097152) #11
  tail call void @create_unique_random_array(ptr noundef %57, i32 noundef %54)
  %175 = zext i32 %50 to i64
  %176 = sext i32 %53 to i64
  %wide.trip.count = zext i32 %46 to i64
  br label %.preheader484

.preheader484:                                    ; preds = %168, %193
  %.1487 = phi i32 [ 0, %168 ], [ %194, %193 ]
  %177 = mul i32 %.1487, %46
  br label %178

178:                                              ; preds = %.preheader484, %178
  %indvars.iv = phi i64 [ 0, %.preheader484 ], [ %indvars.iv.next, %178 ]
  %179 = trunc nuw i64 %indvars.iv to i32
  %180 = add i32 %177, %179
  %181 = zext i32 %180 to i64
  %182 = getelementptr inbounds i64, ptr %57, i64 %181
  %183 = load i64, ptr %182, align 8, !tbaa !9
  %184 = udiv i64 %183, %175
  %185 = mul i64 %184, %176
  %186 = urem i64 %183, %175
  %187 = add i64 %185, %186
  %188 = getelementptr inbounds i64, ptr %172, i64 %181
  store i64 %187, ptr %188, align 8, !tbaa !9
  %189 = getelementptr inbounds i64, ptr %172, i64 %indvars.iv
  %190 = load i64, ptr %189, align 8, !tbaa !9
  %191 = trunc i64 %190 to i32
  %192 = getelementptr inbounds i32, ptr %174, i64 %181
  store i32 %191, ptr %192, align 4, !tbaa !11
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %193, label %178, !llvm.loop !26

193:                                              ; preds = %178
  %194 = add nuw i32 %.1487, 1
  %exitcond507.not = icmp eq i32 %194, %47
  br i1 %exitcond507.not, label %.loopexit, label %.preheader484, !llvm.loop !27

195:                                              ; preds = %129
  %196 = load ptr, ptr @stdout, align 8, !tbaa !5
  %197 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %196, ptr noundef nonnull @.str.2) #11
  tail call void @exit(i32 noundef 1) #14
  unreachable

198:                                              ; preds = %.thread459
  %199 = load ptr, ptr @stdout, align 8, !tbaa !5
  %200 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %199, ptr noundef nonnull @.str.2) #11
  tail call void @exit(i32 noundef 1) #14
  unreachable

.loopexit:                                        ; preds = %193, %scalar.ph, %scalar.ph551, %124, %scalar.ph564, %scalar.ph577, %middle.block, %middle.block550, %middle.block563, %middle.block576
  %.0379 = phi i32 [ %51, %middle.block576 ], [ %47, %middle.block563 ], [ %47, %middle.block550 ], [ %47, %middle.block ], [ %51, %scalar.ph577 ], [ %47, %scalar.ph564 ], [ %51, %124 ], [ %47, %scalar.ph551 ], [ %47, %scalar.ph ], [ %47, %193 ]
  %.0378 = phi i32 [ %46, %middle.block576 ], [ %46, %middle.block563 ], [ %46, %middle.block550 ], [ %50, %middle.block ], [ %46, %scalar.ph577 ], [ %46, %scalar.ph564 ], [ %46, %124 ], [ %46, %scalar.ph551 ], [ %50, %scalar.ph ], [ %50, %193 ]
  %.0377 = phi i32 [ %47, %middle.block576 ], [ %47, %middle.block563 ], [ %51, %middle.block550 ], [ %47, %middle.block ], [ %47, %scalar.ph577 ], [ %47, %scalar.ph564 ], [ %47, %124 ], [ %51, %scalar.ph551 ], [ %47, %scalar.ph ], [ %51, %193 ]
  %.0369 = phi i32 [ %46, %middle.block576 ], [ %50, %middle.block563 ], [ %46, %middle.block550 ], [ %46, %middle.block ], [ %46, %scalar.ph577 ], [ %50, %scalar.ph564 ], [ %50, %124 ], [ %46, %scalar.ph551 ], [ %46, %scalar.ph ], [ %46, %193 ]
  %.0368 = phi i32 [ %48, %middle.block576 ], [ %52, %middle.block563 ], [ %48, %middle.block550 ], [ %48, %middle.block ], [ %48, %scalar.ph577 ], [ %52, %scalar.ph564 ], [ %52, %124 ], [ %48, %scalar.ph551 ], [ %48, %scalar.ph ], [ %48, %193 ]
  %.0367 = phi i32 [ %49, %middle.block576 ], [ %49, %middle.block563 ], [ %49, %middle.block550 ], [ %53, %middle.block ], [ %49, %scalar.ph577 ], [ %49, %scalar.ph564 ], [ %49, %124 ], [ %49, %scalar.ph551 ], [ %53, %scalar.ph ], [ %53, %193 ]
  %.0358 = phi ptr [ %62, %middle.block576 ], [ %83, %middle.block563 ], [ %133, %middle.block550 ], [ %152, %middle.block ], [ %62, %scalar.ph577 ], [ %83, %scalar.ph564 ], [ %103, %124 ], [ %133, %scalar.ph551 ], [ %152, %scalar.ph ], [ %172, %193 ]
  %.0357 = phi ptr [ %64, %middle.block576 ], [ %85, %middle.block563 ], [ %135, %middle.block550 ], [ %154, %middle.block ], [ %64, %scalar.ph577 ], [ %85, %scalar.ph564 ], [ %105, %124 ], [ %135, %scalar.ph551 ], [ %154, %scalar.ph ], [ %174, %193 ]
  %201 = mul i32 %.0368, %.0379
  %202 = zext i32 %201 to i64
  %203 = shl nuw nsw i64 %202, 2
  %204 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %203, i64 noundef 2097152) #11
  %205 = mul i32 %.0367, %.0377
  %206 = zext i32 %205 to i64
  %207 = shl nuw nsw i64 %206, 2
  %208 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %207, i64 noundef 2097152) #11
  %209 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %207, i64 noundef 2097152) #11
  tail call void @sfill_matrix(ptr noundef %204, i32 noundef %.0368, i32 noundef %.0369, i32 noundef %.0379)
  tail call void @sfill_matrix(ptr noundef %208, i32 noundef %.0367, i32 noundef %.0378, i32 noundef %.0377)
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 4 %209, ptr align 4 %208, i64 %207, i1 false)
  %210 = icmp eq i32 %.0364457468, 1
  br i1 %210, label %211, label %217

211:                                              ; preds = %.loopexit
  %212 = shl nuw nsw i64 %202, 1
  %213 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %212, i64 noundef 2097152) #11
  %214 = shl nuw nsw i64 %206, 1
  %215 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %214, i64 noundef 2097152) #11
  %216 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %214, i64 noundef 2097152) #11
  tail call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %204, ptr noundef %213, i64 noundef %202) #11
  tail call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %208, ptr noundef %215, i64 noundef %206) #11
  tail call void @libxsmm_rne_convert_fp32_bf16(ptr noundef %209, ptr noundef %216, i64 noundef %206) #11
  br label %217

217:                                              ; preds = %211, %.loopexit
  %.0361 = phi ptr [ %213, %211 ], [ null, %.loopexit ]
  %.0360 = phi ptr [ %215, %211 ], [ null, %.loopexit ]
  %.0359 = phi ptr [ %216, %211 ], [ null, %.loopexit ]
  tail call void @reference_gather_scatter(ptr noundef %204, ptr noundef %209, ptr noundef %.0361, ptr noundef %.0359, ptr noundef %.0358, ptr noundef nonnull %.0357, i32 noundef %.0369, i32 noundef %.0379, i32 noundef %.0368, i32 noundef %.0378, i32 noundef %.0377, i32 noundef %.0367, i32 noundef %.0366427436456469, i32 noundef %.0365441451474, i32 noundef %.0364457468, i32 noundef %.0363475)
  call void @setup_tpp_kernel_and_param_struct(ptr noundef nonnull %3, ptr noundef nonnull %4, ptr noundef %204, ptr noundef %208, ptr noundef %.0361, ptr noundef %.0360, ptr noundef %.0358, ptr noundef nonnull %.0357, i32 noundef %.0369, i32 noundef %.0379, i32 noundef %.0368, i32 noundef %.0378, i32 noundef %.0377, i32 noundef %.0367, i32 noundef %.0366427436456469, i32 noundef %.0365441451474, i32 noundef %.0364457468, i32 noundef %.0363475)
  %218 = load ptr, ptr %3, align 8, !tbaa !5
  call void %218(ptr noundef nonnull %4) #11
  %219 = call i32 @compare_results(ptr noundef %208, ptr noundef %209, ptr noundef %.0360, ptr noundef %.0359, i32 noundef %.0369, i32 noundef %.0379, i32 noundef %.0368, i32 noundef %.0378, i32 noundef %.0377, i32 noundef %.0367, i32 noundef %.0366427436456469, i32 noundef %.0365441451474, i32 noundef %.0364457468, i32 noundef %.0363475)
  call void @reference_gather_scatter(ptr noundef %204, ptr noundef %209, ptr noundef %.0361, ptr noundef %.0359, ptr noundef %.0358, ptr noundef nonnull %.0357, i32 noundef %.0369, i32 noundef %.0379, i32 noundef %.0368, i32 noundef %.0378, i32 noundef %.0377, i32 noundef %.0367, i32 noundef %.0366427436456469, i32 noundef %.0365441451474, i32 noundef %.0364457468, i32 noundef %.0363475)
  %220 = call i64 @libxsmm_timer_tick() #11
  %.not499 = icmp eq i32 %.0362, 0
  br i1 %.not499, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %217, %.lr.ph
  %.2494 = phi i32 [ %221, %.lr.ph ], [ 0, %217 ]
  call void @reference_gather_scatter(ptr noundef %204, ptr noundef %209, ptr noundef %.0361, ptr noundef %.0359, ptr noundef %.0358, ptr noundef %.0357, i32 noundef %.0369, i32 noundef %.0379, i32 noundef %.0368, i32 noundef %.0378, i32 noundef %.0377, i32 noundef %.0367, i32 noundef %.0366427436456469, i32 noundef %.0365441451474, i32 noundef %.0364457468, i32 noundef %.0363475)
  %221 = add nuw i32 %.2494, 1
  %exitcond537.not = icmp eq i32 %221, %.0362
  br i1 %exitcond537.not, label %._crit_edge, label %.lr.ph, !llvm.loop !28

._crit_edge:                                      ; preds = %.lr.ph, %217
  %222 = call i64 @libxsmm_timer_tick() #11
  %223 = call double @libxsmm_timer_duration(i64 noundef %220, i64 noundef %222) #11
  %224 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3, double noundef %223)
  %225 = load ptr, ptr %3, align 8, !tbaa !5
  call void %225(ptr noundef nonnull %4) #11
  %226 = call i64 @libxsmm_timer_tick() #11
  br i1 %.not499, label %._crit_edge498, label %.lr.ph497

.lr.ph497:                                        ; preds = %._crit_edge, %.lr.ph497
  %.3495 = phi i32 [ %228, %.lr.ph497 ], [ 0, %._crit_edge ]
  %227 = load ptr, ptr %3, align 8, !tbaa !5
  call void %227(ptr noundef nonnull %4) #11
  %228 = add nuw i32 %.3495, 1
  %exitcond538.not = icmp eq i32 %228, %.0362
  br i1 %exitcond538.not, label %._crit_edge498, label %.lr.ph497, !llvm.loop !29

._crit_edge498:                                   ; preds = %.lr.ph497, %._crit_edge
  %229 = call i64 @libxsmm_timer_tick() #11
  %230 = call double @libxsmm_timer_duration(i64 noundef %226, i64 noundef %229) #11
  %231 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.4, double noundef %230)
  %232 = fcmp ogt double %230, 0.000000e+00
  br i1 %232, label %233, label %236

233:                                              ; preds = %._crit_edge498
  %234 = fdiv double %223, %230
  %235 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, double noundef %234)
  br label %236

236:                                              ; preds = %233, %._crit_edge498
  call void @libxsmm_free(ptr noundef %204) #11
  call void @libxsmm_free(ptr noundef %208) #11
  call void @libxsmm_free(ptr noundef %209) #11
  br i1 %210, label %237, label %238

237:                                              ; preds = %236
  call void @libxsmm_free(ptr noundef %.0361) #11
  call void @libxsmm_free(ptr noundef %.0360) #11
  call void @libxsmm_free(ptr noundef %.0359) #11
  br label %238

238:                                              ; preds = %237, %236
  call void @libxsmm_free(ptr noundef %.0358) #11
  call void @libxsmm_free(ptr noundef %.0357) #11
  call void @free(ptr noundef %57) #11
  switch i32 %219, label %245 [
    i32 1, label %239
    i32 0, label %242
  ]

239:                                              ; preds = %238
  %240 = load ptr, ptr @stderr, align 8, !tbaa !5
  %241 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %240, ptr noundef nonnull @.str.6, i32 noundef %46, i32 noundef %47, i32 noundef %48, i32 noundef %49, i32 noundef %.0366427436456469, i32 noundef %.0365441451474, i32 noundef %.0364457468, i32 noundef %.0363475) #15
  br label %245

242:                                              ; preds = %238
  %243 = load i32, ptr @is_reference_kernel, align 4, !tbaa !11
  %244 = call i32 @libxsmm_return_success_code(i32 noundef %243)
  br label %245

245:                                              ; preds = %239, %238, %242
  %246 = phi i32 [ %244, %242 ], [ %219, %238 ], [ 1, %239 ]
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %4) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #11
  ret i32 %246
}

; 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

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

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #4

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

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

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

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

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

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @compare_results(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #6

declare i64 @libxsmm_timer_tick() local_unnamed_addr #2

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

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

declare void @libxsmm_free(ptr noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #9

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = distinct !{!13, !14, !15, !16}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!"llvm.loop.isvectorized", i32 1}
!16 = !{!"llvm.loop.unroll.runtime.disable"}
!17 = distinct !{!17, !14, !16, !15}
!18 = distinct !{!18, !14, !15, !16}
!19 = distinct !{!19, !14, !16, !15}
!20 = distinct !{!20, !14}
!21 = distinct !{!21, !14}
!22 = distinct !{!22, !14, !15, !16}
!23 = distinct !{!23, !14, !16, !15}
!24 = distinct !{!24, !14, !15, !16}
!25 = distinct !{!25, !14, !16, !15}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = distinct !{!28, !14}
!29 = distinct !{!29, !14}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopIdiomRecognizePass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass