; LLVM IR from libxsmm/libxsmm :: samples/magazine (magazine_batch)

; 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"

@.str = external hidden unnamed_addr constant [15 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [13 x i8], align 1

; 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 i8, align 1
  %14 = alloca i8, align 1
  %15 = alloca double, align 8
  %16 = alloca double, align 8
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca i32, align 4
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca double, align 8
  %28 = alloca i64, align 8
  %29 = alloca double, align 8
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, 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) #5
  %36 = load i32, ptr %4, align 4, !tbaa !5
  %37 = icmp slt i32 1, %36
  br i1 %37, label %38, label %43

38:                                               ; preds = %2
  %39 = load ptr, ptr %5, align 8, !tbaa !9
  %40 = getelementptr inbounds ptr, ptr %39, i64 1
  %41 = load ptr, ptr %40, align 8, !tbaa !9
  %42 = call i32 @atoi(ptr noundef %41) #6
  br label %44

43:                                               ; preds = %2
  br label %44

44:                                               ; preds = %43, %38
  %45 = phi i32 [ %42, %38 ], [ 0, %43 ]
  store i32 %45, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  %46 = load i32, ptr %4, align 4, !tbaa !5
  %47 = icmp slt i32 2, %46
  br i1 %47, label %48, label %53

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

53:                                               ; preds = %44
  br label %54

54:                                               ; preds = %53, %48
  %55 = phi i32 [ %52, %48 ], [ 13, %53 ]
  store i32 %55, ptr %7, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #5
  %56 = load i32, ptr %4, align 4, !tbaa !5
  %57 = icmp slt i32 3, %56
  br i1 %57, label %58, label %63

58:                                               ; preds = %54
  %59 = load ptr, ptr %5, align 8, !tbaa !9
  %60 = getelementptr inbounds ptr, ptr %59, i64 3
  %61 = load ptr, ptr %60, align 8, !tbaa !9
  %62 = call i32 @atoi(ptr noundef %61) #6
  br label %64

63:                                               ; preds = %54
  br label %64

64:                                               ; preds = %63, %58
  %65 = phi i32 [ %62, %58 ], [ 5, %63 ]
  store i32 %65, ptr %8, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  %66 = load i32, ptr %4, align 4, !tbaa !5
  %67 = icmp slt i32 4, %66
  br i1 %67, label %68, label %73

68:                                               ; preds = %64
  %69 = load ptr, ptr %5, align 8, !tbaa !9
  %70 = getelementptr inbounds ptr, ptr %69, i64 4
  %71 = load ptr, ptr %70, align 8, !tbaa !9
  %72 = call i32 @atoi(ptr noundef %71) #6
  br label %74

73:                                               ; preds = %64
  br label %74

74:                                               ; preds = %73, %68
  %75 = phi i32 [ %72, %68 ], [ 7, %73 ]
  store i32 %75, ptr %9, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #5
  %76 = load i32, ptr %4, align 4, !tbaa !5
  %77 = icmp slt i32 5, %76
  br i1 %77, label %78, label %94

78:                                               ; preds = %74
  %79 = load ptr, ptr %5, align 8, !tbaa !9
  %80 = getelementptr inbounds ptr, ptr %79, i64 5
  %81 = load ptr, ptr %80, align 8, !tbaa !9
  %82 = call i32 @atoi(ptr noundef %81) #6
  %83 = load i32, ptr %7, align 4, !tbaa !5
  %84 = icmp slt i32 %82, %83
  br i1 %84, label %85, label %87

85:                                               ; preds = %78
  %86 = load i32, ptr %7, align 4, !tbaa !5
  br label %92

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

92:                                               ; preds = %87, %85
  %93 = phi i32 [ %86, %85 ], [ %91, %87 ]
  br label %102

94:                                               ; preds = %74
  %95 = load i32, ptr %7, align 4, !tbaa !5
  %96 = sext i32 %95 to i64
  %97 = mul i64 8, %96
  %98 = add i64 %97, 0
  %99 = and i64 %98, -1
  %100 = udiv i64 %99, 8
  %101 = trunc i64 %100 to i32
  br label %102

102:                                              ; preds = %94, %92
  %103 = phi i32 [ %93, %92 ], [ %101, %94 ]
  store i32 %103, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  %104 = load i32, ptr %4, align 4, !tbaa !5
  %105 = icmp slt i32 6, %104
  br i1 %105, label %106, label %122

106:                                              ; preds = %102
  %107 = load ptr, ptr %5, align 8, !tbaa !9
  %108 = getelementptr inbounds ptr, ptr %107, i64 6
  %109 = load ptr, ptr %108, align 8, !tbaa !9
  %110 = call i32 @atoi(ptr noundef %109) #6
  %111 = load i32, ptr %9, align 4, !tbaa !5
  %112 = icmp slt i32 %110, %111
  br i1 %112, label %113, label %115

113:                                              ; preds = %106
  %114 = load i32, ptr %9, align 4, !tbaa !5
  br label %120

115:                                              ; preds = %106
  %116 = load ptr, ptr %5, align 8, !tbaa !9
  %117 = getelementptr inbounds ptr, ptr %116, i64 6
  %118 = load ptr, ptr %117, align 8, !tbaa !9
  %119 = call i32 @atoi(ptr noundef %118) #6
  br label %120

120:                                              ; preds = %115, %113
  %121 = phi i32 [ %114, %113 ], [ %119, %115 ]
  br label %130

122:                                              ; preds = %102
  %123 = load i32, ptr %9, align 4, !tbaa !5
  %124 = sext i32 %123 to i64
  %125 = mul i64 8, %124
  %126 = add i64 %125, 0
  %127 = and i64 %126, -1
  %128 = udiv i64 %127, 8
  %129 = trunc i64 %128 to i32
  br label %130

130:                                              ; preds = %122, %120
  %131 = phi i32 [ %121, %120 ], [ %129, %122 ]
  store i32 %131, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  %132 = load i32, ptr %4, align 4, !tbaa !5
  %133 = icmp slt i32 7, %132
  br i1 %133, label %134, label %150

134:                                              ; preds = %130
  %135 = load ptr, ptr %5, align 8, !tbaa !9
  %136 = getelementptr inbounds ptr, ptr %135, i64 7
  %137 = load ptr, ptr %136, align 8, !tbaa !9
  %138 = call i32 @atoi(ptr noundef %137) #6
  %139 = load i32, ptr %7, align 4, !tbaa !5
  %140 = icmp slt i32 %138, %139
  br i1 %140, label %141, label %143

141:                                              ; preds = %134
  %142 = load i32, ptr %7, align 4, !tbaa !5
  br label %148

143:                                              ; preds = %134
  %144 = load ptr, ptr %5, align 8, !tbaa !9
  %145 = getelementptr inbounds ptr, ptr %144, i64 7
  %146 = load ptr, ptr %145, align 8, !tbaa !9
  %147 = call i32 @atoi(ptr noundef %146) #6
  br label %148

148:                                              ; preds = %143, %141
  %149 = phi i32 [ %142, %141 ], [ %147, %143 ]
  br label %158

150:                                              ; preds = %130
  %151 = load i32, ptr %7, align 4, !tbaa !5
  %152 = sext i32 %151 to i64
  %153 = mul i64 8, %152
  %154 = add i64 %153, 0
  %155 = and i64 %154, -1
  %156 = udiv i64 %155, 8
  %157 = trunc i64 %156 to i32
  br label %158

158:                                              ; preds = %150, %148
  %159 = phi i32 [ %149, %148 ], [ %157, %150 ]
  store i32 %159, ptr %12, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #5
  store i8 110, ptr %13, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %14) #5
  store i8 110, ptr %14, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  store double 1.000000e+00, ptr %15, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #5
  store double 1.000000e+00, ptr %16, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  %160 = load i32, ptr %10, align 4, !tbaa !5
  %161 = sext i32 %160 to i64
  %162 = mul i64 8, %161
  %163 = load i32, ptr %9, align 4, !tbaa !5
  %164 = sext i32 %163 to i64
  %165 = mul i64 %162, %164
  %166 = add i64 %165, 0
  %167 = and i64 %166, -1
  %168 = udiv i64 %167, 8
  store i64 %168, ptr %17, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  %169 = load i32, ptr %11, align 4, !tbaa !5
  %170 = sext i32 %169 to i64
  %171 = mul i64 8, %170
  %172 = load i32, ptr %8, align 4, !tbaa !5
  %173 = sext i32 %172 to i64
  %174 = mul i64 %171, %173
  %175 = add i64 %174, 0
  %176 = and i64 %175, -1
  %177 = udiv i64 %176, 8
  store i64 %177, ptr %18, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  %178 = load i32, ptr %12, align 4, !tbaa !5
  %179 = sext i32 %178 to i64
  %180 = mul i64 8, %179
  %181 = load i32, ptr %8, align 4, !tbaa !5
  %182 = sext i32 %181 to i64
  %183 = mul i64 %180, %182
  %184 = add i64 %183, 0
  %185 = and i64 %184, -1
  %186 = udiv i64 %185, 8
  store i64 %186, ptr %19, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  %187 = load i32, ptr %6, align 4, !tbaa !5
  %188 = icmp sge i32 0, %187
  br i1 %188, label %189, label %198

189:                                              ; preds = %158
  %190 = load i64, ptr %17, align 8, !tbaa !14
  %191 = load i64, ptr %18, align 8, !tbaa !14
  %192 = add i64 %190, %191
  %193 = load i64, ptr %19, align 8, !tbaa !14
  %194 = add i64 %192, %193
  %195 = mul i64 8, %194
  %196 = udiv i64 2147483648, %195
  %197 = trunc i64 %196 to i32
  br label %200

198:                                              ; preds = %158
  %199 = load i32, ptr %6, align 4, !tbaa !5
  br label %200

200:                                              ; preds = %198, %189
  %201 = phi i32 [ %197, %189 ], [ %199, %198 ]
  store i32 %201, ptr %20, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  %202 = load i64, ptr %17, align 8, !tbaa !14
  %203 = mul i64 8, %202
  %204 = load i32, ptr %20, align 4, !tbaa !5
  %205 = sext i32 %204 to i64
  %206 = mul i64 %203, %205
  %207 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %206, i64 noundef 64)
  store ptr %207, ptr %21, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  %208 = load i64, ptr %18, align 8, !tbaa !14
  %209 = mul i64 8, %208
  %210 = load i32, ptr %20, align 4, !tbaa !5
  %211 = sext i32 %210 to i64
  %212 = mul i64 %209, %211
  %213 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %212, i64 noundef 64)
  store ptr %213, ptr %22, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  %214 = load i64, ptr %19, align 8, !tbaa !14
  %215 = mul i64 8, %214
  %216 = load i32, ptr %20, align 4, !tbaa !5
  %217 = sext i32 %216 to i64
  %218 = mul i64 %215, %217
  %219 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %218, i64 noundef 64)
  store ptr %219, ptr %23, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  %220 = load i32, ptr %20, align 4, !tbaa !5
  %221 = sext i32 %220 to i64
  %222 = mul i64 4, %221
  %223 = call noalias ptr @libxsmm_malloc(i64 noundef %222)
  store ptr %223, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  %224 = load i32, ptr %20, align 4, !tbaa !5
  %225 = sext i32 %224 to i64
  %226 = mul i64 4, %225
  %227 = call noalias ptr @libxsmm_malloc(i64 noundef %226)
  store ptr %227, ptr %25, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  %228 = load i32, ptr %20, align 4, !tbaa !5
  %229 = sext i32 %228 to i64
  %230 = mul i64 4, %229
  %231 = call noalias ptr @libxsmm_malloc(i64 noundef %230)
  store ptr %231, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  %232 = load i32, ptr %20, align 4, !tbaa !5
  %233 = sitofp i32 %232 to double
  %234 = fdiv double 1.000000e+00, %233
  store double %234, ptr %27, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #5
  %235 = load i32, ptr %20, align 4, !tbaa !5
  store i32 %235, ptr %30, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #5
  store i32 0, ptr %31, align 4, !tbaa !5
  br label %236

236:                                              ; preds = %305, %200
  %237 = load i32, ptr %31, align 4, !tbaa !5
  %238 = load i32, ptr %20, align 4, !tbaa !5
  %239 = icmp slt i32 %237, %238
  br i1 %239, label %240, label %308

240:                                              ; preds = %236
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #5
  %241 = load i32, ptr %31, align 4, !tbaa !5
  store i32 %241, ptr %32, align 4, !tbaa !5
  %242 = load i32, ptr %31, align 4, !tbaa !5
  %243 = add nsw i32 25, %242
  %244 = load ptr, ptr %21, align 8, !tbaa !9
  %245 = load i32, ptr %32, align 4, !tbaa !5
  %246 = sext i32 %245 to i64
  %247 = load i64, ptr %17, align 8, !tbaa !14
  %248 = mul i64 %246, %247
  %249 = getelementptr inbounds double, ptr %244, i64 %248
  %250 = load i32, ptr %7, align 4, !tbaa !5
  %251 = load i32, ptr %9, align 4, !tbaa !5
  %252 = load i32, ptr %10, align 4, !tbaa !5
  %253 = load double, ptr %27, align 8, !tbaa !12
  call void @init(i32 noundef %243, ptr noundef %249, i32 noundef %250, i32 noundef %251, i32 noundef %252, double noundef %253)
  %254 = load i32, ptr %31, align 4, !tbaa !5
  %255 = add nsw i32 75, %254
  %256 = load ptr, ptr %22, align 8, !tbaa !9
  %257 = load i32, ptr %32, align 4, !tbaa !5
  %258 = sext i32 %257 to i64
  %259 = load i64, ptr %18, align 8, !tbaa !14
  %260 = mul i64 %258, %259
  %261 = getelementptr inbounds double, ptr %256, i64 %260
  %262 = load i32, ptr %9, align 4, !tbaa !5
  %263 = load i32, ptr %8, align 4, !tbaa !5
  %264 = load i32, ptr %11, align 4, !tbaa !5
  %265 = load double, ptr %27, align 8, !tbaa !12
  call void @init(i32 noundef %255, ptr noundef %261, i32 noundef %262, i32 noundef %263, i32 noundef %264, double noundef %265)
  %266 = load i32, ptr %31, align 4, !tbaa !5
  %267 = add nsw i32 42, %266
  %268 = load ptr, ptr %23, align 8, !tbaa !9
  %269 = load i32, ptr %32, align 4, !tbaa !5
  %270 = sext i32 %269 to i64
  %271 = load i64, ptr %19, align 8, !tbaa !14
  %272 = mul i64 %270, %271
  %273 = getelementptr inbounds double, ptr %268, i64 %272
  %274 = load i32, ptr %7, align 4, !tbaa !5
  %275 = load i32, ptr %8, align 4, !tbaa !5
  %276 = load i32, ptr %12, align 4, !tbaa !5
  %277 = load double, ptr %27, align 8, !tbaa !12
  call void @init(i32 noundef %267, ptr noundef %273, i32 noundef %274, i32 noundef %275, i32 noundef %276, double noundef %277)
  %278 = load i32, ptr %32, align 4, !tbaa !5
  %279 = sext i32 %278 to i64
  %280 = load i64, ptr %17, align 8, !tbaa !14
  %281 = mul i64 %279, %280
  %282 = trunc i64 %281 to i32
  %283 = load ptr, ptr %24, align 8, !tbaa !9
  %284 = load i32, ptr %31, align 4, !tbaa !5
  %285 = sext i32 %284 to i64
  %286 = getelementptr inbounds i32, ptr %283, i64 %285
  store i32 %282, ptr %286, align 4, !tbaa !5
  %287 = load i32, ptr %32, align 4, !tbaa !5
  %288 = sext i32 %287 to i64
  %289 = load i64, ptr %18, align 8, !tbaa !14
  %290 = mul i64 %288, %289
  %291 = trunc i64 %290 to i32
  %292 = load ptr, ptr %25, align 8, !tbaa !9
  %293 = load i32, ptr %31, align 4, !tbaa !5
  %294 = sext i32 %293 to i64
  %295 = getelementptr inbounds i32, ptr %292, i64 %294
  store i32 %291, ptr %295, align 4, !tbaa !5
  %296 = load i32, ptr %32, align 4, !tbaa !5
  %297 = sext i32 %296 to i64
  %298 = load i64, ptr %19, align 8, !tbaa !14
  %299 = mul i64 %297, %298
  %300 = trunc i64 %299 to i32
  %301 = load ptr, ptr %26, align 8, !tbaa !9
  %302 = load i32, ptr %31, align 4, !tbaa !5
  %303 = sext i32 %302 to i64
  %304 = getelementptr inbounds i32, ptr %301, i64 %303
  store i32 %300, ptr %304, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #5
  br label %305

305:                                              ; preds = %240
  %306 = load i32, ptr %31, align 4, !tbaa !5
  %307 = add nsw i32 %306, 1
  store i32 %307, ptr %31, align 4, !tbaa !5
  br label %236, !llvm.loop !16

308:                                              ; preds = %236
  %309 = call i64 @libxsmm_timer_tick()
  store i64 %309, ptr %28, align 8, !tbaa !18
  %310 = load i32, ptr %7, align 4, !tbaa !5
  %311 = load i32, ptr %8, align 4, !tbaa !5
  %312 = load i32, ptr %9, align 4, !tbaa !5
  %313 = load ptr, ptr %21, align 8, !tbaa !9
  %314 = load ptr, ptr %24, align 8, !tbaa !9
  %315 = load ptr, ptr %22, align 8, !tbaa !9
  %316 = load ptr, ptr %25, align 8, !tbaa !9
  %317 = load ptr, ptr %23, align 8, !tbaa !9
  %318 = load ptr, ptr %26, align 8, !tbaa !9
  %319 = load i32, ptr %30, align 4, !tbaa !5
  call void @libxsmm_gemm_batch(i32 noundef 0, i32 noundef 0, ptr noundef %13, ptr noundef %14, i32 noundef %310, i32 noundef %311, i32 noundef %312, ptr noundef %15, ptr noundef %313, ptr noundef %10, ptr noundef %314, ptr noundef %315, ptr noundef %11, ptr noundef %316, ptr noundef %16, ptr noundef %317, ptr noundef %12, ptr noundef %318, i32 noundef 4, i32 noundef 0, i32 noundef %319, i32 noundef 0)
  %320 = load i64, ptr %28, align 8, !tbaa !18
  %321 = call i64 @libxsmm_timer_tick()
  %322 = call double @libxsmm_timer_duration(i64 noundef %320, i64 noundef %321)
  store double %322, ptr %29, align 8, !tbaa !12
  %323 = load double, ptr %29, align 8, !tbaa !12
  %324 = fcmp olt double 0.000000e+00, %323
  br i1 %324, label %325, label %343

325:                                              ; preds = %308
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #5
  %326 = load i32, ptr %7, align 4, !tbaa !5
  %327 = sitofp i32 %326 to double
  %328 = fmul double 2.000000e+00, %327
  %329 = load i32, ptr %8, align 4, !tbaa !5
  %330 = sitofp i32 %329 to double
  %331 = fmul double %328, %330
  %332 = load i32, ptr %9, align 4, !tbaa !5
  %333 = sitofp i32 %332 to double
  %334 = fmul double %331, %333
  %335 = fmul double %334, 1.000000e-09
  store double %335, ptr %33, align 8, !tbaa !12
  %336 = load double, ptr %33, align 8, !tbaa !12
  %337 = load double, ptr %29, align 8, !tbaa !12
  %338 = fdiv double %336, %337
  %339 = load i32, ptr %20, align 4, !tbaa !5
  %340 = sitofp i32 %339 to double
  %341 = fmul double %338, %340
  %342 = call i32 (ptr, ...) @printf(ptr noundef @.str, double noundef %341)
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  br label %343

343:                                              ; preds = %325, %308
  %344 = load double, ptr %29, align 8, !tbaa !12
  %345 = fmul double 1.000000e+03, %344
  %346 = call i32 (ptr, ...) @printf(ptr noundef @.str.1, double noundef %345)
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  store double 0.000000e+00, ptr %34, align 8, !tbaa !12
  store i32 0, ptr %31, align 4, !tbaa !5
  br label %347

347:                                              ; preds = %368, %343
  %348 = load i32, ptr %31, align 4, !tbaa !5
  %349 = load i32, ptr %20, align 4, !tbaa !5
  %350 = icmp slt i32 %348, %349
  br i1 %350, label %351, label %371

351:                                              ; preds = %347
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #5
  %352 = load ptr, ptr %23, align 8, !tbaa !9
  %353 = load i32, ptr %31, align 4, !tbaa !5
  %354 = sext i32 %353 to i64
  %355 = load i64, ptr %19, align 8, !tbaa !14
  %356 = mul i64 %354, %355
  %357 = getelementptr inbounds double, ptr %352, i64 %356
  %358 = load i32, ptr %7, align 4, !tbaa !5
  %359 = load i32, ptr %8, align 4, !tbaa !5
  %360 = load i32, ptr %12, align 4, !tbaa !5
  %361 = call double @norm(ptr noundef %357, i32 noundef %358, i32 noundef %359, i32 noundef %360)
  store double %361, ptr %35, align 8, !tbaa !12
  %362 = load double, ptr %34, align 8, !tbaa !12
  %363 = load double, ptr %35, align 8, !tbaa !12
  %364 = fcmp olt double %362, %363
  br i1 %364, label %365, label %367

365:                                              ; preds = %351
  %366 = load double, ptr %35, align 8, !tbaa !12
  store double %366, ptr %34, align 8, !tbaa !12
  br label %367

367:                                              ; preds = %365, %351
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #5
  br label %368

368:                                              ; preds = %367
  %369 = load i32, ptr %31, align 4, !tbaa !5
  %370 = add nsw i32 %369, 1
  store i32 %370, ptr %31, align 4, !tbaa !5
  br label %347, !llvm.loop !20

371:                                              ; preds = %347
  %372 = load double, ptr %34, align 8, !tbaa !12
  %373 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %372)
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  %374 = load ptr, ptr %24, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %374)
  %375 = load ptr, ptr %25, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %375)
  %376 = load ptr, ptr %26, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %376)
  %377 = load ptr, ptr %21, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %377)
  %378 = load ptr, ptr %22, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %378)
  %379 = load ptr, ptr %23, align 8, !tbaa !9
  call void @libxsmm_free(ptr noundef %379)
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  ret i32 0
}

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

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

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

declare noalias ptr @libxsmm_malloc(i64 noundef) #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, double noundef) #4

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

declare i64 @libxsmm_timer_tick() #3

declare void @libxsmm_gemm_batch(i32 noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #3

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden double @norm(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #4

declare void @libxsmm_free(ptr noundef) #3

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

!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 = !{!7, !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"double", !7, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"long", !7, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = !{!19, !19, i64 0}
!19 = !{!"long long", !7, i64 0}
!20 = distinct !{!20, !17}


; 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"

@.str = external hidden unnamed_addr constant [15 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [13 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @main(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #0 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i8, align 1
  %7 = alloca i8, align 1
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = icmp sgt i32 %0, 1
  br i1 %10, label %11, label %.thread141

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

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

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

.thread141:                                       ; preds = %20, %15, %11, %2
  %.ph138 = phi i32 [ %23, %20 ], [ 5, %15 ], [ 5, %11 ], [ 5, %2 ]
  %.ph139 = phi i32 [ %14, %20 ], [ %14, %15 ], [ %14, %11 ], [ 0, %2 ]
  %.ph140 = phi i32 [ %18, %20 ], [ %18, %15 ], [ 13, %11 ], [ 13, %2 ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #8
  br label %.thread148

24:                                               ; preds = %20
  %25 = getelementptr inbounds i8, ptr %1, i64 32
  %26 = load ptr, ptr %25, align 8, !tbaa !5
  %27 = tail call i32 @atoi(ptr nocapture noundef %26) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #8
  %28 = icmp ugt i32 %0, 5
  br i1 %28, label %29, label %.thread148

.thread148:                                       ; preds = %.thread141, %24
  %.ph143 = phi i32 [ 7, %.thread141 ], [ %27, %24 ]
  %.ph144 = phi i32 [ %.ph140, %.thread141 ], [ %18, %24 ]
  %.ph145 = phi i32 [ %.ph139, %.thread141 ], [ %14, %24 ]
  %.ph146 = phi i32 [ %.ph138, %.thread141 ], [ %23, %24 ]
  store i32 %.ph144, ptr %3, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #8
  br label %.thread156

29:                                               ; preds = %24
  %30 = getelementptr inbounds i8, ptr %1, i64 40
  %31 = load ptr, ptr %30, align 8, !tbaa !5
  %32 = tail call i32 @atoi(ptr nocapture noundef %31) #7
  %. = tail call i32 @llvm.smax.i32(i32 %32, i32 %18)
  store i32 %., ptr %3, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #8
  %.not158 = icmp eq i32 %0, 6
  br i1 %.not158, label %.thread156, label %33

.thread156:                                       ; preds = %.thread148, %29
  %.ph150 = phi i32 [ %.ph144, %.thread148 ], [ %., %29 ]
  %.ph151 = phi i32 [ %.ph146, %.thread148 ], [ %23, %29 ]
  %.ph152 = phi i32 [ %.ph145, %.thread148 ], [ %14, %29 ]
  %.ph153 = phi i32 [ %.ph144, %.thread148 ], [ %18, %29 ]
  %.ph154 = phi i32 [ %.ph143, %.thread148 ], [ %27, %29 ]
  store i32 %.ph154, ptr %4, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #8
  br label %42

33:                                               ; preds = %29
  %34 = getelementptr inbounds i8, ptr %1, i64 48
  %35 = load ptr, ptr %34, align 8, !tbaa !5
  %36 = tail call i32 @atoi(ptr nocapture noundef %35) #7
  %.130 = tail call i32 @llvm.smax.i32(i32 %36, i32 %27)
  store i32 %.130, ptr %4, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #8
  %37 = icmp ugt i32 %0, 7
  br i1 %37, label %38, label %42

38:                                               ; preds = %33
  %39 = getelementptr inbounds i8, ptr %1, i64 56
  %40 = load ptr, ptr %39, align 8, !tbaa !5
  %41 = tail call i32 @atoi(ptr nocapture noundef %40) #7
  %.131 = tail call i32 @llvm.smax.i32(i32 %41, i32 %18)
  br label %42

42:                                               ; preds = %.thread156, %33, %38
  %43 = phi i32 [ %.130, %38 ], [ %.130, %33 ], [ %.ph154, %.thread156 ]
  %44 = phi i32 [ %27, %38 ], [ %27, %33 ], [ %.ph154, %.thread156 ]
  %45 = phi i32 [ %18, %38 ], [ %18, %33 ], [ %.ph153, %.thread156 ]
  %46 = phi i32 [ %14, %38 ], [ %14, %33 ], [ %.ph152, %.thread156 ]
  %47 = phi i32 [ %23, %38 ], [ %23, %33 ], [ %.ph151, %.thread156 ]
  %48 = phi i32 [ %., %38 ], [ %., %33 ], [ %.ph150, %.thread156 ]
  %49 = phi i32 [ %.131, %38 ], [ %18, %33 ], [ %.ph153, %.thread156 ]
  store i32 %49, ptr %5, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %6) #8
  store i8 110, ptr %6, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %7) #8
  store i8 110, ptr %7, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #8
  store double 1.000000e+00, ptr %8, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #8
  store double 1.000000e+00, ptr %9, align 8, !tbaa !12
  %50 = sext i32 %48 to i64
  %51 = shl nsw i64 %50, 3
  %52 = sext i32 %44 to i64
  %53 = mul i64 %51, %52
  %54 = lshr exact i64 %53, 3
  %55 = sext i32 %43 to i64
  %56 = shl nsw i64 %55, 3
  %57 = sext i32 %47 to i64
  %58 = mul i64 %56, %57
  %59 = lshr exact i64 %58, 3
  %60 = sext i32 %49 to i64
  %61 = shl nsw i64 %60, 3
  %62 = mul i64 %61, %57
  %63 = lshr exact i64 %62, 3
  %64 = icmp slt i32 %46, 1
  br i1 %64, label %65, label %71

65:                                               ; preds = %42
  %66 = add nuw nsw i64 %54, %59
  %67 = add nuw nsw i64 %66, %63
  %68 = shl i64 %67, 3
  %69 = udiv i64 2147483648, %68
  %70 = trunc nuw i64 %69 to i32
  br label %71

71:                                               ; preds = %42, %65
  %72 = phi i32 [ %70, %65 ], [ %46, %42 ]
  %73 = sext i32 %72 to i64
  %74 = mul i64 %53, %73
  %75 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %74, i64 noundef 64) #8
  %76 = mul i64 %58, %73
  %77 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %76, i64 noundef 64) #8
  %78 = mul i64 %62, %73
  %79 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %78, i64 noundef 64) #8
  %80 = shl nsw i64 %73, 2
  %81 = tail call noalias ptr @libxsmm_malloc(i64 noundef %80) #8
  %82 = tail call noalias ptr @libxsmm_malloc(i64 noundef %80) #8
  %83 = tail call noalias ptr @libxsmm_malloc(i64 noundef %80) #8
  %84 = sitofp i32 %72 to double
  %85 = fdiv double 1.000000e+00, %84
  %86 = icmp sgt i32 %72, 0
  br i1 %86, label %.lr.ph, label %._crit_edge

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

87:                                               ; preds = %.lr.ph, %87
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %87 ]
  %88 = mul i64 %54, %indvars.iv
  %89 = getelementptr inbounds double, ptr %75, i64 %88
  %90 = trunc i64 %indvars.iv to i32
  %91 = add i32 %90, 25
  tail call void @init(i32 noundef %91, ptr noundef %89, i32 noundef %45, i32 noundef %44, i32 noundef %48, double noundef %85)
  %92 = mul i64 %59, %indvars.iv
  %93 = getelementptr inbounds double, ptr %77, i64 %92
  %94 = trunc i64 %indvars.iv to i32
  %95 = add i32 %94, 75
  tail call void @init(i32 noundef %95, ptr noundef %93, i32 noundef %44, i32 noundef %47, i32 noundef %43, double noundef %85)
  %96 = mul i64 %63, %indvars.iv
  %97 = getelementptr inbounds double, ptr %79, i64 %96
  %98 = trunc i64 %indvars.iv to i32
  %99 = add i32 %98, 42
  tail call void @init(i32 noundef %99, ptr noundef %97, i32 noundef %45, i32 noundef %47, i32 noundef %49, double noundef %85)
  %100 = trunc i64 %88 to i32
  %101 = getelementptr inbounds i32, ptr %81, i64 %indvars.iv
  store i32 %100, ptr %101, align 4, !tbaa !9
  %102 = trunc i64 %92 to i32
  %103 = getelementptr inbounds i32, ptr %82, i64 %indvars.iv
  store i32 %102, ptr %103, align 4, !tbaa !9
  %104 = trunc i64 %96 to i32
  %105 = getelementptr inbounds i32, ptr %83, i64 %indvars.iv
  store i32 %104, ptr %105, align 4, !tbaa !9
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %87, !llvm.loop !14

._crit_edge:                                      ; preds = %87, %71
  %106 = tail call i64 @libxsmm_timer_tick() #8
  call void @libxsmm_gemm_batch(i32 noundef 0, i32 noundef 0, ptr noundef nonnull %6, ptr noundef nonnull %7, i32 noundef %45, i32 noundef %47, i32 noundef %44, ptr noundef nonnull %8, ptr noundef %75, ptr noundef nonnull %3, ptr noundef %81, ptr noundef %77, ptr noundef nonnull %4, ptr noundef %82, ptr noundef nonnull %9, ptr noundef %79, ptr noundef nonnull %5, ptr noundef %83, i32 noundef 4, i32 noundef 0, i32 noundef %72, i32 noundef 0) #8
  %107 = call i64 @libxsmm_timer_tick() #8
  %108 = call double @libxsmm_timer_duration(i64 noundef %106, i64 noundef %107) #8
  %109 = fcmp ogt double %108, 0.000000e+00
  br i1 %109, label %110, label %121

110:                                              ; preds = %._crit_edge
  %111 = sitofp i32 %45 to double
  %112 = fmul double %111, 2.000000e+00
  %113 = sitofp i32 %47 to double
  %114 = fmul double %112, %113
  %115 = sitofp i32 %44 to double
  %116 = fmul double %114, %115
  %117 = fmul double %116, 1.000000e-09
  %118 = fdiv double %117, %108
  %119 = fmul double %118, %84
  %120 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str, double noundef %119)
  br label %121

121:                                              ; preds = %110, %._crit_edge
  %122 = fmul double %108, 1.000000e+03
  %123 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.1, double noundef %122)
  br i1 %86, label %.lr.ph163.preheader, label %._crit_edge164

.lr.ph163.preheader:                              ; preds = %121
  %wide.trip.count169 = zext nneg i32 %72 to i64
  br label %.lr.ph163

.lr.ph163:                                        ; preds = %.lr.ph163.preheader, %.lr.ph163
  %indvars.iv166 = phi i64 [ 0, %.lr.ph163.preheader ], [ %indvars.iv.next167, %.lr.ph163 ]
  %.0118160 = phi double [ 0.000000e+00, %.lr.ph163.preheader ], [ %.1119, %.lr.ph163 ]
  %124 = mul i64 %63, %indvars.iv166
  %125 = getelementptr inbounds double, ptr %79, i64 %124
  %126 = load i32, ptr %5, align 4, !tbaa !9
  %127 = call double @norm(ptr noundef %125, i32 noundef %45, i32 noundef %47, i32 noundef %126)
  %128 = fcmp olt double %.0118160, %127
  %.1119 = select i1 %128, double %127, double %.0118160
  %indvars.iv.next167 = add nuw nsw i64 %indvars.iv166, 1
  %exitcond170.not = icmp eq i64 %indvars.iv.next167, %wide.trip.count169
  br i1 %exitcond170.not, label %._crit_edge164, label %.lr.ph163, !llvm.loop !16

._crit_edge164:                                   ; preds = %.lr.ph163, %121
  %.0118.lcssa = phi double [ 0.000000e+00, %121 ], [ %.1119, %.lr.ph163 ]
  %129 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %.0118.lcssa)
  call void @libxsmm_free(ptr noundef %81) #8
  call void @libxsmm_free(ptr noundef %82) #8
  call void @libxsmm_free(ptr noundef %83) #8
  call void @libxsmm_free(ptr noundef %75) #8
  call void @libxsmm_free(ptr noundef %77) #8
  call void @libxsmm_free(ptr noundef %79) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %7) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %6) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3) #8
  ret i32 0
}

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

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

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

declare noalias ptr @libxsmm_malloc(i64 noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @init(i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, double noundef) local_unnamed_addr #4

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

declare i64 @libxsmm_timer_tick() local_unnamed_addr #3

declare void @libxsmm_gemm_batch(i32 noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #3

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden double @norm(ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #4

declare void @libxsmm_free(ptr noundef) local_unnamed_addr #3

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

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 = { 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 #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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 #5 = { 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 #6 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #7 = { nounwind willreturn memory(read) }
attributes #8 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"double", !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}


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