; LLVM IR from libxsmm/libxsmm :: samples/utilities/math (math)

; 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_matdiff_info = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i32, i32, i32, i32 }

@.str = external hidden unnamed_addr constant [29 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [22 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 i64, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i32, align 4
  %16 = alloca i64, align 8
  %17 = alloca %struct.libxsmm_matdiff_info, align 8
  %18 = alloca i64, align 8
  %19 = 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) #6
  %20 = load i32, ptr %4, align 4, !tbaa !5
  %21 = icmp slt i32 1, %20
  br i1 %21, label %22, label %27

22:                                               ; preds = %2
  %23 = load ptr, ptr %5, align 8, !tbaa !9
  %24 = getelementptr inbounds ptr, ptr %23, i64 1
  %25 = load ptr, ptr %24, align 8, !tbaa !9
  %26 = call i32 @atoi(ptr noundef %25) #7
  br label %28

27:                                               ; preds = %2
  br label %28

28:                                               ; preds = %27, %22
  %29 = phi i32 [ %26, %22 ], [ 0, %27 ]
  store i32 %29, ptr %6, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #6
  %30 = load i32, ptr %4, align 4, !tbaa !5
  %31 = icmp slt i32 2, %30
  br i1 %31, label %32, label %37

32:                                               ; preds = %28
  %33 = load ptr, ptr %5, align 8, !tbaa !9
  %34 = getelementptr inbounds ptr, ptr %33, i64 2
  %35 = load ptr, ptr %34, align 8, !tbaa !9
  %36 = call i32 @atoi(ptr noundef %35) #7
  br label %38

37:                                               ; preds = %28
  br label %38

38:                                               ; preds = %37, %32
  %39 = phi i32 [ %36, %32 ], [ 1, %37 ]
  store i32 %39, ptr %7, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #6
  %40 = load i32, ptr %6, align 4, !tbaa !5
  %41 = icmp sge i32 0, %40
  br i1 %41, label %42, label %43

42:                                               ; preds = %38
  br label %46

43:                                               ; preds = %38
  %44 = load i32, ptr %6, align 4, !tbaa !5
  %45 = sext i32 %44 to i64
  br label %46

46:                                               ; preds = %43, %42
  %47 = phi i64 [ 536870912, %42 ], [ %45, %43 ]
  store i64 %47, ptr %8, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #6
  %48 = load i32, ptr %7, align 4, !tbaa !5
  %49 = icmp slt i32 0, %48
  br i1 %49, label %50, label %54

50:                                               ; preds = %46
  %51 = load i32, ptr %7, align 4, !tbaa !5
  %52 = sext i32 %51 to i64
  store i64 %52, ptr %14, align 8, !tbaa !11
  %53 = load i64, ptr %8, align 8, !tbaa !11
  store i64 %53, ptr %13, align 8, !tbaa !11
  br label %80

54:                                               ; preds = %46
  %55 = load i64, ptr %8, align 8, !tbaa !11
  store i64 %55, ptr %14, align 8, !tbaa !11
  %56 = load i32, ptr %7, align 4, !tbaa !5
  %57 = icmp sle i32 0, %56
  br i1 %57, label %58, label %60

58:                                               ; preds = %54
  %59 = load i32, ptr %7, align 4, !tbaa !5
  br label %63

60:                                               ; preds = %54
  %61 = load i32, ptr %7, align 4, !tbaa !5
  %62 = sub nsw i32 0, %61
  br label %63

63:                                               ; preds = %60, %58
  %64 = phi i32 [ %59, %58 ], [ %62, %60 ]
  %65 = icmp slt i32 %64, 1
  br i1 %65, label %66, label %67

66:                                               ; preds = %63
  br label %77

67:                                               ; preds = %63
  %68 = load i32, ptr %7, align 4, !tbaa !5
  %69 = icmp sle i32 0, %68
  br i1 %69, label %70, label %72

70:                                               ; preds = %67
  %71 = load i32, ptr %7, align 4, !tbaa !5
  br label %75

72:                                               ; preds = %67
  %73 = load i32, ptr %7, align 4, !tbaa !5
  %74 = sub nsw i32 0, %73
  br label %75

75:                                               ; preds = %72, %70
  %76 = phi i32 [ %71, %70 ], [ %74, %72 ]
  br label %77

77:                                               ; preds = %75, %66
  %78 = phi i32 [ 1, %66 ], [ %76, %75 ]
  %79 = sext i32 %78 to i64
  store i64 %79, ptr %13, align 8, !tbaa !11
  br label %80

80:                                               ; preds = %77, %50
  %81 = load i64, ptr %13, align 8, !tbaa !11
  %82 = mul i64 4, %81
  %83 = call noalias ptr @malloc(i64 noundef %82) #8
  store ptr %83, ptr %11, align 8, !tbaa !9
  %84 = load i64, ptr %13, align 8, !tbaa !11
  %85 = mul i64 4, %84
  %86 = call noalias ptr @malloc(i64 noundef %85) #8
  store ptr %86, ptr %10, align 8, !tbaa !9
  %87 = load i64, ptr %13, align 8, !tbaa !11
  %88 = mul i64 4, %87
  %89 = call noalias ptr @malloc(i64 noundef %88) #8
  store ptr %89, ptr %9, align 8, !tbaa !9
  %90 = load i64, ptr %13, align 8, !tbaa !11
  %91 = call noalias ptr @malloc(i64 noundef %90) #8
  store ptr %91, ptr %12, align 8, !tbaa !9
  %92 = load ptr, ptr %11, align 8, !tbaa !9
  %93 = icmp ne ptr null, %92
  br i1 %93, label %94, label %503

94:                                               ; preds = %80
  %95 = load ptr, ptr %10, align 8, !tbaa !9
  %96 = icmp ne ptr null, %95
  br i1 %96, label %97, label %503

97:                                               ; preds = %94
  %98 = load ptr, ptr %9, align 8, !tbaa !9
  %99 = icmp ne ptr null, %98
  br i1 %99, label %100, label %503

100:                                              ; preds = %97
  %101 = load ptr, ptr %12, align 8, !tbaa !9
  %102 = icmp ne ptr null, %101
  br i1 %102, label %103, label %503

103:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.start.p0(i64 192, ptr %17) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #6
  call void @libxsmm_rng_set_seed(i32 noundef 25071975)
  %104 = load ptr, ptr %9, align 8, !tbaa !9
  %105 = load i64, ptr %13, align 8, !tbaa !11
  %106 = trunc i64 %105 to i32
  call void @libxsmm_rng_f32_seq(ptr noundef %104, i32 noundef %106)
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %107

107:                                              ; preds = %121, %103
  %108 = load i64, ptr %18, align 8, !tbaa !11
  %109 = load i64, ptr %13, align 8, !tbaa !11
  %110 = icmp ult i64 %108, %109
  br i1 %110, label %111, label %124

111:                                              ; preds = %107
  %112 = load ptr, ptr %9, align 8, !tbaa !9
  %113 = load i64, ptr %18, align 8, !tbaa !11
  %114 = getelementptr inbounds float, ptr %112, i64 %113
  %115 = load float, ptr %114, align 4, !tbaa !13
  %116 = fmul float 2.550000e+02, %115
  %117 = fptoui float %116 to i8
  %118 = load ptr, ptr %12, align 8, !tbaa !9
  %119 = load i64, ptr %18, align 8, !tbaa !11
  %120 = getelementptr inbounds i8, ptr %118, i64 %119
  store i8 %117, ptr %120, align 1, !tbaa !15
  br label %121

121:                                              ; preds = %111
  %122 = load i64, ptr %18, align 8, !tbaa !11
  %123 = add i64 %122, 1
  store i64 %123, ptr %18, align 8, !tbaa !11
  br label %107, !llvm.loop !16

124:                                              ; preds = %107
  %125 = call i64 @libxsmm_timer_tick()
  store i64 %125, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %126

126:                                              ; preds = %150, %124
  %127 = load i64, ptr %19, align 8, !tbaa !11
  %128 = load i64, ptr %14, align 8, !tbaa !11
  %129 = icmp ult i64 %127, %128
  br i1 %129, label %130, label %153

130:                                              ; preds = %126
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %131

131:                                              ; preds = %146, %130
  %132 = load i64, ptr %18, align 8, !tbaa !11
  %133 = load i64, ptr %13, align 8, !tbaa !11
  %134 = icmp ult i64 %132, %133
  br i1 %134, label %135, label %149

135:                                              ; preds = %131
  %136 = load ptr, ptr %9, align 8, !tbaa !9
  %137 = load i64, ptr %18, align 8, !tbaa !11
  %138 = getelementptr inbounds float, ptr %136, i64 %137
  %139 = load float, ptr %138, align 4, !tbaa !13
  %140 = fpext float %139 to double
  %141 = call double @exp2(double noundef %140) #6
  %142 = fptrunc double %141 to float
  %143 = load ptr, ptr %11, align 8, !tbaa !9
  %144 = load i64, ptr %18, align 8, !tbaa !11
  %145 = getelementptr inbounds float, ptr %143, i64 %144
  store float %142, ptr %145, align 4, !tbaa !13
  br label %146

146:                                              ; preds = %135
  %147 = load i64, ptr %18, align 8, !tbaa !11
  %148 = add i64 %147, 1
  store i64 %148, ptr %18, align 8, !tbaa !11
  br label %131, !llvm.loop !20

149:                                              ; preds = %131
  br label %150

150:                                              ; preds = %149
  %151 = load i64, ptr %19, align 8, !tbaa !11
  %152 = add i64 %151, 1
  store i64 %152, ptr %19, align 8, !tbaa !11
  br label %126, !llvm.loop !21

153:                                              ; preds = %126
  %154 = load i64, ptr %16, align 8, !tbaa !18
  %155 = call i64 @libxsmm_timer_tick()
  %156 = call double @libxsmm_timer_duration(i64 noundef %154, i64 noundef %155)
  %157 = call i32 (ptr, ...) @printf(ptr noundef @.str, double noundef %156)
  %158 = call i64 @libxsmm_timer_tick()
  store i64 %158, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %159

159:                                              ; preds = %181, %153
  %160 = load i64, ptr %19, align 8, !tbaa !11
  %161 = load i64, ptr %14, align 8, !tbaa !11
  %162 = icmp ult i64 %160, %161
  br i1 %162, label %163, label %184

163:                                              ; preds = %159
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %164

164:                                              ; preds = %177, %163
  %165 = load i64, ptr %18, align 8, !tbaa !11
  %166 = load i64, ptr %13, align 8, !tbaa !11
  %167 = icmp ult i64 %165, %166
  br i1 %167, label %168, label %180

168:                                              ; preds = %164
  %169 = load ptr, ptr %9, align 8, !tbaa !9
  %170 = load i64, ptr %18, align 8, !tbaa !11
  %171 = getelementptr inbounds float, ptr %169, i64 %170
  %172 = load float, ptr %171, align 4, !tbaa !13
  %173 = call float @exp2f(float noundef %172) #6
  %174 = load ptr, ptr %10, align 8, !tbaa !9
  %175 = load i64, ptr %18, align 8, !tbaa !11
  %176 = getelementptr inbounds float, ptr %174, i64 %175
  store float %173, ptr %176, align 4, !tbaa !13
  br label %177

177:                                              ; preds = %168
  %178 = load i64, ptr %18, align 8, !tbaa !11
  %179 = add i64 %178, 1
  store i64 %179, ptr %18, align 8, !tbaa !11
  br label %164, !llvm.loop !22

180:                                              ; preds = %164
  br label %181

181:                                              ; preds = %180
  %182 = load i64, ptr %19, align 8, !tbaa !11
  %183 = add i64 %182, 1
  store i64 %183, ptr %19, align 8, !tbaa !11
  br label %159, !llvm.loop !23

184:                                              ; preds = %159
  %185 = load i64, ptr %16, align 8, !tbaa !18
  %186 = call i64 @libxsmm_timer_tick()
  %187 = call double @libxsmm_timer_duration(i64 noundef %185, i64 noundef %186)
  %188 = call i32 (ptr, ...) @printf(ptr noundef @.str.1, double noundef %187)
  %189 = load i64, ptr %13, align 8, !tbaa !11
  %190 = trunc i64 %189 to i32
  %191 = load ptr, ptr %11, align 8, !tbaa !9
  %192 = load ptr, ptr %10, align 8, !tbaa !9
  %193 = call i32 @libxsmm_matdiff(ptr noundef %17, i32 noundef 1, i32 noundef 1, i32 noundef %190, ptr noundef %191, ptr noundef %192, ptr noundef null, ptr noundef null)
  %194 = icmp eq i32 0, %193
  br i1 %194, label %195, label %201

195:                                              ; preds = %184
  %196 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 7
  %197 = load double, ptr %196, align 8, !tbaa !24
  %198 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 5
  %199 = load double, ptr %198, align 8, !tbaa !27
  %200 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %197, double noundef %199)
  br label %203

201:                                              ; preds = %184
  %202 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %203

203:                                              ; preds = %201, %195
  %204 = call i64 @libxsmm_timer_tick()
  store i64 %204, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %205

205:                                              ; preds = %227, %203
  %206 = load i64, ptr %19, align 8, !tbaa !11
  %207 = load i64, ptr %14, align 8, !tbaa !11
  %208 = icmp ult i64 %206, %207
  br i1 %208, label %209, label %230

209:                                              ; preds = %205
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %210

210:                                              ; preds = %223, %209
  %211 = load i64, ptr %18, align 8, !tbaa !11
  %212 = load i64, ptr %13, align 8, !tbaa !11
  %213 = icmp ult i64 %211, %212
  br i1 %213, label %214, label %226

214:                                              ; preds = %210
  %215 = load ptr, ptr %9, align 8, !tbaa !9
  %216 = load i64, ptr %18, align 8, !tbaa !11
  %217 = getelementptr inbounds float, ptr %215, i64 %216
  %218 = load float, ptr %217, align 4, !tbaa !13
  %219 = call float @libxsmm_sexp2(float noundef %218)
  %220 = load ptr, ptr %10, align 8, !tbaa !9
  %221 = load i64, ptr %18, align 8, !tbaa !11
  %222 = getelementptr inbounds float, ptr %220, i64 %221
  store float %219, ptr %222, align 4, !tbaa !13
  br label %223

223:                                              ; preds = %214
  %224 = load i64, ptr %18, align 8, !tbaa !11
  %225 = add i64 %224, 1
  store i64 %225, ptr %18, align 8, !tbaa !11
  br label %210, !llvm.loop !28

226:                                              ; preds = %210
  br label %227

227:                                              ; preds = %226
  %228 = load i64, ptr %19, align 8, !tbaa !11
  %229 = add i64 %228, 1
  store i64 %229, ptr %19, align 8, !tbaa !11
  br label %205, !llvm.loop !29

230:                                              ; preds = %205
  %231 = load i64, ptr %16, align 8, !tbaa !18
  %232 = call i64 @libxsmm_timer_tick()
  %233 = call double @libxsmm_timer_duration(i64 noundef %231, i64 noundef %232)
  %234 = call i32 (ptr, ...) @printf(ptr noundef @.str.4, double noundef %233)
  %235 = load i64, ptr %13, align 8, !tbaa !11
  %236 = trunc i64 %235 to i32
  %237 = load ptr, ptr %11, align 8, !tbaa !9
  %238 = load ptr, ptr %10, align 8, !tbaa !9
  %239 = call i32 @libxsmm_matdiff(ptr noundef %17, i32 noundef 1, i32 noundef 1, i32 noundef %236, ptr noundef %237, ptr noundef %238, ptr noundef null, ptr noundef null)
  %240 = icmp eq i32 0, %239
  br i1 %240, label %241, label %247

241:                                              ; preds = %230
  %242 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 7
  %243 = load double, ptr %242, align 8, !tbaa !24
  %244 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 5
  %245 = load double, ptr %244, align 8, !tbaa !27
  %246 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %243, double noundef %245)
  br label %249

247:                                              ; preds = %230
  %248 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %249

249:                                              ; preds = %247, %241
  %250 = call i64 @libxsmm_timer_tick()
  store i64 %250, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %251

251:                                              ; preds = %275, %249
  %252 = load i64, ptr %19, align 8, !tbaa !11
  %253 = load i64, ptr %14, align 8, !tbaa !11
  %254 = icmp ult i64 %252, %253
  br i1 %254, label %255, label %278

255:                                              ; preds = %251
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %256

256:                                              ; preds = %271, %255
  %257 = load i64, ptr %18, align 8, !tbaa !11
  %258 = load i64, ptr %13, align 8, !tbaa !11
  %259 = icmp ult i64 %257, %258
  br i1 %259, label %260, label %274

260:                                              ; preds = %256
  %261 = load ptr, ptr %12, align 8, !tbaa !9
  %262 = load i64, ptr %18, align 8, !tbaa !11
  %263 = getelementptr inbounds i8, ptr %261, i64 %262
  %264 = load i8, ptr %263, align 1, !tbaa !15
  %265 = uitofp i8 %264 to double
  %266 = call double @exp2(double noundef %265) #6
  %267 = fptrunc double %266 to float
  %268 = load ptr, ptr %11, align 8, !tbaa !9
  %269 = load i64, ptr %18, align 8, !tbaa !11
  %270 = getelementptr inbounds float, ptr %268, i64 %269
  store float %267, ptr %270, align 4, !tbaa !13
  br label %271

271:                                              ; preds = %260
  %272 = load i64, ptr %18, align 8, !tbaa !11
  %273 = add i64 %272, 1
  store i64 %273, ptr %18, align 8, !tbaa !11
  br label %256, !llvm.loop !30

274:                                              ; preds = %256
  br label %275

275:                                              ; preds = %274
  %276 = load i64, ptr %19, align 8, !tbaa !11
  %277 = add i64 %276, 1
  store i64 %277, ptr %19, align 8, !tbaa !11
  br label %251, !llvm.loop !31

278:                                              ; preds = %251
  %279 = load i64, ptr %16, align 8, !tbaa !18
  %280 = call i64 @libxsmm_timer_tick()
  %281 = call double @libxsmm_timer_duration(i64 noundef %279, i64 noundef %280)
  %282 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, double noundef %281)
  %283 = call i64 @libxsmm_timer_tick()
  store i64 %283, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %284

284:                                              ; preds = %306, %278
  %285 = load i64, ptr %19, align 8, !tbaa !11
  %286 = load i64, ptr %14, align 8, !tbaa !11
  %287 = icmp ult i64 %285, %286
  br i1 %287, label %288, label %309

288:                                              ; preds = %284
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %289

289:                                              ; preds = %302, %288
  %290 = load i64, ptr %18, align 8, !tbaa !11
  %291 = load i64, ptr %13, align 8, !tbaa !11
  %292 = icmp ult i64 %290, %291
  br i1 %292, label %293, label %305

293:                                              ; preds = %289
  %294 = load ptr, ptr %12, align 8, !tbaa !9
  %295 = load i64, ptr %18, align 8, !tbaa !11
  %296 = getelementptr inbounds i8, ptr %294, i64 %295
  %297 = load i8, ptr %296, align 1, !tbaa !15
  %298 = call float @libxsmm_sexp2_u8(i8 noundef zeroext %297)
  %299 = load ptr, ptr %10, align 8, !tbaa !9
  %300 = load i64, ptr %18, align 8, !tbaa !11
  %301 = getelementptr inbounds float, ptr %299, i64 %300
  store float %298, ptr %301, align 4, !tbaa !13
  br label %302

302:                                              ; preds = %293
  %303 = load i64, ptr %18, align 8, !tbaa !11
  %304 = add i64 %303, 1
  store i64 %304, ptr %18, align 8, !tbaa !11
  br label %289, !llvm.loop !32

305:                                              ; preds = %289
  br label %306

306:                                              ; preds = %305
  %307 = load i64, ptr %19, align 8, !tbaa !11
  %308 = add i64 %307, 1
  store i64 %308, ptr %19, align 8, !tbaa !11
  br label %284, !llvm.loop !33

309:                                              ; preds = %284
  %310 = load i64, ptr %16, align 8, !tbaa !18
  %311 = call i64 @libxsmm_timer_tick()
  %312 = call double @libxsmm_timer_duration(i64 noundef %310, i64 noundef %311)
  %313 = call i32 (ptr, ...) @printf(ptr noundef @.str.4, double noundef %312)
  %314 = load i64, ptr %13, align 8, !tbaa !11
  %315 = trunc i64 %314 to i32
  %316 = load ptr, ptr %11, align 8, !tbaa !9
  %317 = load ptr, ptr %10, align 8, !tbaa !9
  %318 = call i32 @libxsmm_matdiff(ptr noundef %17, i32 noundef 1, i32 noundef 1, i32 noundef %315, ptr noundef %316, ptr noundef %317, ptr noundef null, ptr noundef null)
  %319 = icmp eq i32 0, %318
  br i1 %319, label %320, label %326

320:                                              ; preds = %309
  %321 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 7
  %322 = load double, ptr %321, align 8, !tbaa !24
  %323 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 5
  %324 = load double, ptr %323, align 8, !tbaa !27
  %325 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %322, double noundef %324)
  br label %328

326:                                              ; preds = %309
  %327 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %328

328:                                              ; preds = %326, %320
  %329 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  %330 = call i64 @libxsmm_timer_tick()
  store i64 %330, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %331

331:                                              ; preds = %355, %328
  %332 = load i64, ptr %19, align 8, !tbaa !11
  %333 = load i64, ptr %14, align 8, !tbaa !11
  %334 = icmp ult i64 %332, %333
  br i1 %334, label %335, label %358

335:                                              ; preds = %331
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %336

336:                                              ; preds = %351, %335
  %337 = load i64, ptr %18, align 8, !tbaa !11
  %338 = load i64, ptr %13, align 8, !tbaa !11
  %339 = icmp ult i64 %337, %338
  br i1 %339, label %340, label %354

340:                                              ; preds = %336
  %341 = load ptr, ptr %9, align 8, !tbaa !9
  %342 = load i64, ptr %18, align 8, !tbaa !11
  %343 = getelementptr inbounds float, ptr %341, i64 %342
  %344 = load float, ptr %343, align 4, !tbaa !13
  %345 = fpext float %344 to double
  %346 = call double @sqrt(double noundef %345) #6
  %347 = fptrunc double %346 to float
  %348 = load ptr, ptr %11, align 8, !tbaa !9
  %349 = load i64, ptr %18, align 8, !tbaa !11
  %350 = getelementptr inbounds float, ptr %348, i64 %349
  store float %347, ptr %350, align 4, !tbaa !13
  br label %351

351:                                              ; preds = %340
  %352 = load i64, ptr %18, align 8, !tbaa !11
  %353 = add i64 %352, 1
  store i64 %353, ptr %18, align 8, !tbaa !11
  br label %336, !llvm.loop !34

354:                                              ; preds = %336
  br label %355

355:                                              ; preds = %354
  %356 = load i64, ptr %19, align 8, !tbaa !11
  %357 = add i64 %356, 1
  store i64 %357, ptr %19, align 8, !tbaa !11
  br label %331, !llvm.loop !35

358:                                              ; preds = %331
  %359 = load i64, ptr %16, align 8, !tbaa !18
  %360 = call i64 @libxsmm_timer_tick()
  %361 = call double @libxsmm_timer_duration(i64 noundef %359, i64 noundef %360)
  %362 = call i32 (ptr, ...) @printf(ptr noundef @.str.6, double noundef %361)
  %363 = call i64 @libxsmm_timer_tick()
  store i64 %363, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %364

364:                                              ; preds = %388, %358
  %365 = load i64, ptr %19, align 8, !tbaa !11
  %366 = load i64, ptr %14, align 8, !tbaa !11
  %367 = icmp ult i64 %365, %366
  br i1 %367, label %368, label %391

368:                                              ; preds = %364
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %369

369:                                              ; preds = %384, %368
  %370 = load i64, ptr %18, align 8, !tbaa !11
  %371 = load i64, ptr %13, align 8, !tbaa !11
  %372 = icmp ult i64 %370, %371
  br i1 %372, label %373, label %387

373:                                              ; preds = %369
  %374 = load ptr, ptr %9, align 8, !tbaa !9
  %375 = load i64, ptr %18, align 8, !tbaa !11
  %376 = getelementptr inbounds float, ptr %374, i64 %375
  %377 = load float, ptr %376, align 4, !tbaa !13
  %378 = fpext float %377 to double
  %379 = call double @libxsmm_dsqrt(double noundef %378)
  %380 = fptrunc double %379 to float
  %381 = load ptr, ptr %10, align 8, !tbaa !9
  %382 = load i64, ptr %18, align 8, !tbaa !11
  %383 = getelementptr inbounds float, ptr %381, i64 %382
  store float %380, ptr %383, align 4, !tbaa !13
  br label %384

384:                                              ; preds = %373
  %385 = load i64, ptr %18, align 8, !tbaa !11
  %386 = add i64 %385, 1
  store i64 %386, ptr %18, align 8, !tbaa !11
  br label %369, !llvm.loop !36

387:                                              ; preds = %369
  br label %388

388:                                              ; preds = %387
  %389 = load i64, ptr %19, align 8, !tbaa !11
  %390 = add i64 %389, 1
  store i64 %390, ptr %19, align 8, !tbaa !11
  br label %364, !llvm.loop !37

391:                                              ; preds = %364
  %392 = load i64, ptr %16, align 8, !tbaa !18
  %393 = call i64 @libxsmm_timer_tick()
  %394 = call double @libxsmm_timer_duration(i64 noundef %392, i64 noundef %393)
  %395 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %394)
  %396 = load i64, ptr %13, align 8, !tbaa !11
  %397 = trunc i64 %396 to i32
  %398 = load ptr, ptr %11, align 8, !tbaa !9
  %399 = load ptr, ptr %10, align 8, !tbaa !9
  %400 = call i32 @libxsmm_matdiff(ptr noundef %17, i32 noundef 1, i32 noundef 1, i32 noundef %397, ptr noundef %398, ptr noundef %399, ptr noundef null, ptr noundef null)
  %401 = icmp eq i32 0, %400
  br i1 %401, label %402, label %408

402:                                              ; preds = %391
  %403 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 7
  %404 = load double, ptr %403, align 8, !tbaa !24
  %405 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 5
  %406 = load double, ptr %405, align 8, !tbaa !27
  %407 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %404, double noundef %406)
  br label %410

408:                                              ; preds = %391
  %409 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %410

410:                                              ; preds = %408, %402
  %411 = call i64 @libxsmm_timer_tick()
  store i64 %411, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %412

412:                                              ; preds = %434, %410
  %413 = load i64, ptr %19, align 8, !tbaa !11
  %414 = load i64, ptr %14, align 8, !tbaa !11
  %415 = icmp ult i64 %413, %414
  br i1 %415, label %416, label %437

416:                                              ; preds = %412
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %417

417:                                              ; preds = %430, %416
  %418 = load i64, ptr %18, align 8, !tbaa !11
  %419 = load i64, ptr %13, align 8, !tbaa !11
  %420 = icmp ult i64 %418, %419
  br i1 %420, label %421, label %433

421:                                              ; preds = %417
  %422 = load ptr, ptr %9, align 8, !tbaa !9
  %423 = load i64, ptr %18, align 8, !tbaa !11
  %424 = getelementptr inbounds float, ptr %422, i64 %423
  %425 = load float, ptr %424, align 4, !tbaa !13
  %426 = call float @sqrtf(float noundef %425) #6
  %427 = load ptr, ptr %10, align 8, !tbaa !9
  %428 = load i64, ptr %18, align 8, !tbaa !11
  %429 = getelementptr inbounds float, ptr %427, i64 %428
  store float %426, ptr %429, align 4, !tbaa !13
  br label %430

430:                                              ; preds = %421
  %431 = load i64, ptr %18, align 8, !tbaa !11
  %432 = add i64 %431, 1
  store i64 %432, ptr %18, align 8, !tbaa !11
  br label %417, !llvm.loop !38

433:                                              ; preds = %417
  br label %434

434:                                              ; preds = %433
  %435 = load i64, ptr %19, align 8, !tbaa !11
  %436 = add i64 %435, 1
  store i64 %436, ptr %19, align 8, !tbaa !11
  br label %412, !llvm.loop !39

437:                                              ; preds = %412
  %438 = load i64, ptr %16, align 8, !tbaa !18
  %439 = call i64 @libxsmm_timer_tick()
  %440 = call double @libxsmm_timer_duration(i64 noundef %438, i64 noundef %439)
  %441 = call i32 (ptr, ...) @printf(ptr noundef @.str.8, double noundef %440)
  %442 = load i64, ptr %13, align 8, !tbaa !11
  %443 = trunc i64 %442 to i32
  %444 = load ptr, ptr %11, align 8, !tbaa !9
  %445 = load ptr, ptr %10, align 8, !tbaa !9
  %446 = call i32 @libxsmm_matdiff(ptr noundef %17, i32 noundef 1, i32 noundef 1, i32 noundef %443, ptr noundef %444, ptr noundef %445, ptr noundef null, ptr noundef null)
  %447 = icmp eq i32 0, %446
  br i1 %447, label %448, label %454

448:                                              ; preds = %437
  %449 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 7
  %450 = load double, ptr %449, align 8, !tbaa !24
  %451 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 5
  %452 = load double, ptr %451, align 8, !tbaa !27
  %453 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %450, double noundef %452)
  br label %456

454:                                              ; preds = %437
  %455 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %456

456:                                              ; preds = %454, %448
  %457 = call i64 @libxsmm_timer_tick()
  store i64 %457, ptr %16, align 8, !tbaa !18
  store i64 0, ptr %19, align 8, !tbaa !11
  br label %458

458:                                              ; preds = %480, %456
  %459 = load i64, ptr %19, align 8, !tbaa !11
  %460 = load i64, ptr %14, align 8, !tbaa !11
  %461 = icmp ult i64 %459, %460
  br i1 %461, label %462, label %483

462:                                              ; preds = %458
  store i64 0, ptr %18, align 8, !tbaa !11
  br label %463

463:                                              ; preds = %476, %462
  %464 = load i64, ptr %18, align 8, !tbaa !11
  %465 = load i64, ptr %13, align 8, !tbaa !11
  %466 = icmp ult i64 %464, %465
  br i1 %466, label %467, label %479

467:                                              ; preds = %463
  %468 = load ptr, ptr %9, align 8, !tbaa !9
  %469 = load i64, ptr %18, align 8, !tbaa !11
  %470 = getelementptr inbounds float, ptr %468, i64 %469
  %471 = load float, ptr %470, align 4, !tbaa !13
  %472 = call float @libxsmm_ssqrt(float noundef %471)
  %473 = load ptr, ptr %10, align 8, !tbaa !9
  %474 = load i64, ptr %18, align 8, !tbaa !11
  %475 = getelementptr inbounds float, ptr %473, i64 %474
  store float %472, ptr %475, align 4, !tbaa !13
  br label %476

476:                                              ; preds = %467
  %477 = load i64, ptr %18, align 8, !tbaa !11
  %478 = add i64 %477, 1
  store i64 %478, ptr %18, align 8, !tbaa !11
  br label %463, !llvm.loop !40

479:                                              ; preds = %463
  br label %480

480:                                              ; preds = %479
  %481 = load i64, ptr %19, align 8, !tbaa !11
  %482 = add i64 %481, 1
  store i64 %482, ptr %19, align 8, !tbaa !11
  br label %458, !llvm.loop !41

483:                                              ; preds = %458
  %484 = load i64, ptr %16, align 8, !tbaa !18
  %485 = call i64 @libxsmm_timer_tick()
  %486 = call double @libxsmm_timer_duration(i64 noundef %484, i64 noundef %485)
  %487 = call i32 (ptr, ...) @printf(ptr noundef @.str.9, double noundef %486)
  %488 = load i64, ptr %13, align 8, !tbaa !11
  %489 = trunc i64 %488 to i32
  %490 = load ptr, ptr %11, align 8, !tbaa !9
  %491 = load ptr, ptr %10, align 8, !tbaa !9
  %492 = call i32 @libxsmm_matdiff(ptr noundef %17, i32 noundef 1, i32 noundef 1, i32 noundef %489, ptr noundef %490, ptr noundef %491, ptr noundef null, ptr noundef null)
  %493 = icmp eq i32 0, %492
  br i1 %493, label %494, label %500

494:                                              ; preds = %483
  %495 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 7
  %496 = load double, ptr %495, align 8, !tbaa !24
  %497 = getelementptr inbounds %struct.libxsmm_matdiff_info, ptr %17, i32 0, i32 5
  %498 = load double, ptr %497, align 8, !tbaa !27
  %499 = call i32 (ptr, ...) @printf(ptr noundef @.str.2, double noundef %496, double noundef %498)
  br label %502

500:                                              ; preds = %483
  %501 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  br label %502

502:                                              ; preds = %500, %494
  store i32 0, ptr %15, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 192, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  br label %504

503:                                              ; preds = %100, %97, %94, %80
  store i32 1, ptr %15, align 4, !tbaa !5
  br label %504

504:                                              ; preds = %503, %502
  %505 = load ptr, ptr %11, align 8, !tbaa !9
  call void @free(ptr noundef %505) #6
  %506 = load ptr, ptr %10, align 8, !tbaa !9
  call void @free(ptr noundef %506) #6
  %507 = load ptr, ptr %9, align 8, !tbaa !9
  call void @free(ptr noundef %507) #6
  %508 = load ptr, ptr %12, align 8, !tbaa !9
  call void @free(ptr noundef %508) #6
  %509 = load i32, ptr %15, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #6
  ret i32 %509
}

; 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

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

declare void @libxsmm_rng_set_seed(i32 noundef) #4

declare void @libxsmm_rng_f32_seq(ptr noundef, i32 noundef) #4

declare i64 @libxsmm_timer_tick() #4

; Function Attrs: nounwind
declare double @exp2(double noundef) #5

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

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

; Function Attrs: nounwind
declare float @exp2f(float noundef) #5

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

declare float @libxsmm_sexp2(float noundef) #4

declare float @libxsmm_sexp2_u8(i8 noundef zeroext) #4

; Function Attrs: nounwind
declare double @sqrt(double noundef) #5

declare double @libxsmm_dsqrt(double noundef) #4

; Function Attrs: nounwind
declare float @sqrtf(float noundef) #5

declare float @libxsmm_ssqrt(float noundef) #4

; 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 void @free(ptr noundef) #5

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

!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 = !{!"long", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"float", !7, i64 0}
!15 = !{!7, !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}
!21 = distinct !{!21, !17}
!22 = distinct !{!22, !17}
!23 = distinct !{!23, !17}
!24 = !{!25, !26, i64 56}
!25 = !{!"libxsmm_matdiff_info", !26, i64 0, !26, i64 8, !26, i64 16, !26, i64 24, !26, i64 32, !26, i64 40, !26, i64 48, !26, i64 56, !26, i64 64, !26, i64 72, !26, i64 80, !26, i64 88, !26, i64 96, !26, i64 104, !26, i64 112, !26, i64 120, !26, i64 128, !26, i64 136, !26, i64 144, !26, i64 152, !26, i64 160, !26, i64 168, !6, i64 176, !6, i64 180, !6, i64 184, !6, i64 188}
!26 = !{!"double", !7, i64 0}
!27 = !{!25, !26, i64 40}
!28 = distinct !{!28, !17}
!29 = distinct !{!29, !17}
!30 = distinct !{!30, !17}
!31 = distinct !{!31, !17}
!32 = distinct !{!32, !17}
!33 = distinct !{!33, !17}
!34 = distinct !{!34, !17}
!35 = distinct !{!35, !17}
!36 = distinct !{!36, !17}
!37 = distinct !{!37, !17}
!38 = distinct !{!38, !17}
!39 = distinct !{!39, !17}
!40 = distinct !{!40, !17}
!41 = distinct !{!41, !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"

%struct.libxsmm_matdiff_info = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i32, i32, i32, i32 }

@.str = external hidden unnamed_addr constant [29 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [22 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @main(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #0 {
  %3 = alloca %struct.libxsmm_matdiff_info, align 8
  %4 = icmp sgt i32 %0, 1
  br i1 %4, label %5, label %.thread185.thread

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

.thread241:                                       ; preds = %5
  %9 = icmp slt i32 %.fr, 1
  %spec.select238 = select i1 %9, i32 536870912, i32 %.fr
  %10 = zext nneg i32 %spec.select238 to i64
  br label %.thread185.thread

11:                                               ; preds = %5
  %12 = getelementptr inbounds i8, ptr %1, i64 16
  %13 = load ptr, ptr %12, align 8, !tbaa !5
  %14 = tail call i32 @atoi(ptr nocapture noundef %13) #10
  %.fr190 = freeze i32 %14
  %15 = icmp slt i32 %.fr, 1
  %spec.select = select i1 %15, i32 536870912, i32 %.fr
  %16 = zext nneg i32 %spec.select to i64
  %17 = icmp sgt i32 %.fr190, -1
  br i1 %17, label %18, label %19

18:                                               ; preds = %11
  %.not245 = icmp eq i32 %.fr190, 0
  br i1 %.not245, label %.thread243, label %.thread185.thread

19:                                               ; preds = %11
  %20 = sub nsw i32 0, %.fr190
  %21 = zext nneg i32 %20 to i64
  br label %.thread243

.thread185.thread:                                ; preds = %.thread241, %18, %2
  %22 = phi i64 [ 536870912, %2 ], [ %16, %18 ], [ %10, %.thread241 ]
  %.shrunk = phi i32 [ 1, %2 ], [ %.fr190, %18 ], [ 1, %.thread241 ]
  %23 = zext nneg i32 %.shrunk to i64
  br label %.thread243

.thread243:                                       ; preds = %18, %19, %.thread185.thread
  %24 = phi i64 [ %22, %.thread185.thread ], [ %21, %19 ], [ 1, %18 ]
  %25 = phi i64 [ %23, %.thread185.thread ], [ %16, %19 ], [ %16, %18 ]
  %26 = shl nuw nsw i64 %24, 2
  %27 = tail call noalias ptr @malloc(i64 noundef %26) #11
  %28 = tail call noalias ptr @malloc(i64 noundef %26) #11
  %29 = tail call noalias ptr @malloc(i64 noundef %26) #11
  %30 = tail call noalias ptr @malloc(i64 noundef %24) #11
  %31 = insertelement <4 x ptr> poison, ptr %27, i64 0
  %32 = insertelement <4 x ptr> %31, ptr %28, i64 1
  %33 = insertelement <4 x ptr> %32, ptr %29, i64 2
  %34 = insertelement <4 x ptr> %33, ptr %30, i64 3
  %35 = icmp eq <4 x ptr> %34, zeroinitializer
  %36 = bitcast <4 x i1> %35 to i4
  %37 = icmp eq i4 %36, 0
  br i1 %37, label %38, label %310

38:                                               ; preds = %.thread243
  call void @llvm.lifetime.start.p0(i64 192, ptr nonnull %3) #12
  tail call void @libxsmm_rng_set_seed(i32 noundef 25071975) #12
  %39 = trunc nuw nsw i64 %24 to i32
  tail call void @libxsmm_rng_f32_seq(ptr noundef nonnull %29, i32 noundef %39) #12
  %min.iters.check = icmp ult i64 %24, 8
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %38
  %n.vec = and i64 %24, -8
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %40 = getelementptr inbounds float, ptr %29, i64 %index
  %41 = getelementptr inbounds i8, ptr %40, i64 16
  %wide.load = load <4 x float>, ptr %40, align 4, !tbaa !9
  %wide.load246 = load <4 x float>, ptr %41, align 4, !tbaa !9
  %42 = fmul <4 x float> %wide.load, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
  %43 = fmul <4 x float> %wide.load246, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
  %44 = fptoui <4 x float> %42 to <4 x i8>
  %45 = fptoui <4 x float> %43 to <4 x i8>
  %46 = getelementptr inbounds i8, ptr %30, i64 %index
  %47 = getelementptr inbounds i8, ptr %46, i64 4
  store <4 x i8> %44, ptr %46, align 1, !tbaa !11
  store <4 x i8> %45, ptr %47, align 1, !tbaa !11
  %index.next = add nuw i64 %index, 8
  %48 = icmp eq i64 %index.next, %n.vec
  br i1 %48, label %middle.block, label %vector.body, !llvm.loop !12

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

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

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0159199 = phi i64 [ %54, %scalar.ph ], [ %.0159199.ph, %scalar.ph.preheader ]
  %49 = getelementptr inbounds float, ptr %29, i64 %.0159199
  %50 = load float, ptr %49, align 4, !tbaa !9
  %51 = fmul float %50, 2.550000e+02
  %52 = fptoui float %51 to i8
  %53 = getelementptr inbounds i8, ptr %30, i64 %.0159199
  store i8 %52, ptr %53, align 1, !tbaa !11
  %54 = add nuw nsw i64 %.0159199, 1
  %exitcond.not = icmp eq i64 %54, %24
  br i1 %exitcond.not, label %.loopexit, label %scalar.ph, !llvm.loop !16

.loopexit:                                        ; preds = %scalar.ph, %middle.block
  %55 = tail call i64 @libxsmm_timer_tick() #12
  %umax219 = tail call i64 @llvm.umax.i64(i64 %25, i64 1)
  %56 = add nsw i64 %24, -1
  %xtraiter = and i64 %24, 1
  %57 = icmp eq i64 %56, 0
  %unroll_iter = and i64 %24, -2
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br label %.preheader198

.preheader198:                                    ; preds = %.loopexit, %78
  %.0201 = phi i64 [ 0, %.loopexit ], [ %79, %78 ]
  br i1 %57, label %.unr-lcssa, label %.preheader198.new

.preheader198.new:                                ; preds = %.preheader198, %.preheader198.new
  %.1160200 = phi i64 [ %71, %.preheader198.new ], [ 0, %.preheader198 ]
  %niter = phi i64 [ %niter.next.1, %.preheader198.new ], [ 0, %.preheader198 ]
  %58 = getelementptr inbounds float, ptr %29, i64 %.1160200
  %59 = load float, ptr %58, align 4, !tbaa !9
  %60 = fpext float %59 to double
  %61 = tail call double @exp2(double noundef %60) #12
  %62 = fptrunc double %61 to float
  %63 = getelementptr inbounds float, ptr %27, i64 %.1160200
  store float %62, ptr %63, align 4, !tbaa !9
  %64 = or disjoint i64 %.1160200, 1
  %65 = getelementptr inbounds float, ptr %29, i64 %64
  %66 = load float, ptr %65, align 4, !tbaa !9
  %67 = fpext float %66 to double
  %68 = tail call double @exp2(double noundef %67) #12
  %69 = fptrunc double %68 to float
  %70 = getelementptr inbounds float, ptr %27, i64 %64
  store float %69, ptr %70, align 4, !tbaa !9
  %71 = add nuw nsw i64 %.1160200, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.unr-lcssa, label %.preheader198.new, !llvm.loop !17

.unr-lcssa:                                       ; preds = %.preheader198.new, %.preheader198
  %.1160200.unr = phi i64 [ 0, %.preheader198 ], [ %71, %.preheader198.new ]
  br i1 %lcmp.mod.not, label %78, label %.epilog-lcssa

.epilog-lcssa:                                    ; preds = %.unr-lcssa
  %72 = getelementptr inbounds float, ptr %29, i64 %.1160200.unr
  %73 = load float, ptr %72, align 4, !tbaa !9
  %74 = fpext float %73 to double
  %75 = tail call double @exp2(double noundef %74) #12
  %76 = fptrunc double %75 to float
  %77 = getelementptr inbounds float, ptr %27, i64 %.1160200.unr
  store float %76, ptr %77, align 4, !tbaa !9
  br label %78

78:                                               ; preds = %.unr-lcssa, %.epilog-lcssa
  %79 = add nuw nsw i64 %.0201, 1
  %exitcond220.not = icmp eq i64 %79, %umax219
  br i1 %exitcond220.not, label %80, label %.preheader198, !llvm.loop !18

80:                                               ; preds = %78
  %81 = tail call i64 @libxsmm_timer_tick() #12
  %82 = tail call double @libxsmm_timer_duration(i64 noundef %55, i64 noundef %81) #12
  %83 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str, double noundef %82)
  %84 = tail call i64 @libxsmm_timer_tick() #12
  %xtraiter249 = and i64 %24, 3
  %85 = icmp ult i64 %56, 3
  %unroll_iter252 = and i64 %24, -4
  %lcmp.mod250.not = icmp eq i64 %xtraiter249, 0
  br label %.preheader197

.preheader197:                                    ; preds = %80, %.epilog-lcssa251
  %.1203 = phi i64 [ 0, %80 ], [ %111, %.epilog-lcssa251 ]
  br i1 %85, label %.unr-lcssa247, label %.preheader197.new

.preheader197.new:                                ; preds = %.preheader197, %.preheader197.new
  %.2161202 = phi i64 [ %105, %.preheader197.new ], [ 0, %.preheader197 ]
  %niter253 = phi i64 [ %niter253.next.3, %.preheader197.new ], [ 0, %.preheader197 ]
  %86 = getelementptr inbounds float, ptr %29, i64 %.2161202
  %87 = load float, ptr %86, align 4, !tbaa !9
  %88 = tail call float @exp2f(float noundef %87) #12
  %89 = getelementptr inbounds float, ptr %28, i64 %.2161202
  store float %88, ptr %89, align 4, !tbaa !9
  %90 = or disjoint i64 %.2161202, 1
  %91 = getelementptr inbounds float, ptr %29, i64 %90
  %92 = load float, ptr %91, align 4, !tbaa !9
  %93 = tail call float @exp2f(float noundef %92) #12
  %94 = getelementptr inbounds float, ptr %28, i64 %90
  store float %93, ptr %94, align 4, !tbaa !9
  %95 = or disjoint i64 %.2161202, 2
  %96 = getelementptr inbounds float, ptr %29, i64 %95
  %97 = load float, ptr %96, align 4, !tbaa !9
  %98 = tail call float @exp2f(float noundef %97) #12
  %99 = getelementptr inbounds float, ptr %28, i64 %95
  store float %98, ptr %99, align 4, !tbaa !9
  %100 = or disjoint i64 %.2161202, 3
  %101 = getelementptr inbounds float, ptr %29, i64 %100
  %102 = load float, ptr %101, align 4, !tbaa !9
  %103 = tail call float @exp2f(float noundef %102) #12
  %104 = getelementptr inbounds float, ptr %28, i64 %100
  store float %103, ptr %104, align 4, !tbaa !9
  %105 = add nuw nsw i64 %.2161202, 4
  %niter253.next.3 = add i64 %niter253, 4
  %niter253.ncmp.3 = icmp eq i64 %niter253.next.3, %unroll_iter252
  br i1 %niter253.ncmp.3, label %.unr-lcssa247, label %.preheader197.new, !llvm.loop !19

.unr-lcssa247:                                    ; preds = %.preheader197.new, %.preheader197
  %.2161202.unr = phi i64 [ 0, %.preheader197 ], [ %105, %.preheader197.new ]
  br i1 %lcmp.mod250.not, label %.epilog-lcssa251, label %.epil.preheader248

.epil.preheader248:                               ; preds = %.unr-lcssa247, %.epil.preheader248
  %.2161202.epil = phi i64 [ %110, %.epil.preheader248 ], [ %.2161202.unr, %.unr-lcssa247 ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader248 ], [ 0, %.unr-lcssa247 ]
  %106 = getelementptr inbounds float, ptr %29, i64 %.2161202.epil
  %107 = load float, ptr %106, align 4, !tbaa !9
  %108 = tail call float @exp2f(float noundef %107) #12
  %109 = getelementptr inbounds float, ptr %28, i64 %.2161202.epil
  store float %108, ptr %109, align 4, !tbaa !9
  %110 = add nuw nsw i64 %.2161202.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter249
  br i1 %epil.iter.cmp.not, label %.epilog-lcssa251, label %.epil.preheader248, !llvm.loop !20

.epilog-lcssa251:                                 ; preds = %.epil.preheader248, %.unr-lcssa247
  %111 = add nuw nsw i64 %.1203, 1
  %exitcond222.not = icmp eq i64 %111, %umax219
  br i1 %exitcond222.not, label %112, label %.preheader197, !llvm.loop !22

112:                                              ; preds = %.epilog-lcssa251
  %113 = tail call i64 @libxsmm_timer_tick() #12
  %114 = tail call double @libxsmm_timer_duration(i64 noundef %84, i64 noundef %113) #12
  %115 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.1, double noundef %114)
  %116 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef 1, i32 noundef %39, ptr noundef nonnull %27, ptr noundef nonnull %28, ptr noundef null, ptr noundef null) #12
  %117 = icmp eq i32 %116, 0
  br i1 %117, label %118, label %124

118:                                              ; preds = %112
  %119 = getelementptr inbounds i8, ptr %3, i64 56
  %120 = load double, ptr %119, align 8, !tbaa !23
  %121 = getelementptr inbounds i8, ptr %3, i64 40
  %122 = load double, ptr %121, align 8, !tbaa !27
  %123 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %120, double noundef %122)
  br label %126

124:                                              ; preds = %112
  %125 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  br label %126

126:                                              ; preds = %124, %118
  %127 = call i64 @libxsmm_timer_tick() #12
  br label %.preheader196

.preheader196:                                    ; preds = %126, %134
  %.2205 = phi i64 [ 0, %126 ], [ %135, %134 ]
  br label %128

128:                                              ; preds = %.preheader196, %128
  %.3162204 = phi i64 [ 0, %.preheader196 ], [ %133, %128 ]
  %129 = getelementptr inbounds float, ptr %29, i64 %.3162204
  %130 = load float, ptr %129, align 4, !tbaa !9
  %131 = call float @libxsmm_sexp2(float noundef %130) #12
  %132 = getelementptr inbounds float, ptr %28, i64 %.3162204
  store float %131, ptr %132, align 4, !tbaa !9
  %133 = add nuw nsw i64 %.3162204, 1
  %exitcond223.not = icmp eq i64 %133, %24
  br i1 %exitcond223.not, label %134, label %128, !llvm.loop !28

134:                                              ; preds = %128
  %135 = add nuw nsw i64 %.2205, 1
  %exitcond224.not = icmp eq i64 %135, %umax219
  br i1 %exitcond224.not, label %136, label %.preheader196, !llvm.loop !29

136:                                              ; preds = %134
  %137 = call i64 @libxsmm_timer_tick() #12
  %138 = call double @libxsmm_timer_duration(i64 noundef %127, i64 noundef %137) #12
  %139 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.4, double noundef %138)
  %140 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef 1, i32 noundef %39, ptr noundef nonnull %27, ptr noundef nonnull %28, ptr noundef null, ptr noundef null) #12
  %141 = icmp eq i32 %140, 0
  br i1 %141, label %142, label %148

142:                                              ; preds = %136
  %143 = getelementptr inbounds i8, ptr %3, i64 56
  %144 = load double, ptr %143, align 8, !tbaa !23
  %145 = getelementptr inbounds i8, ptr %3, i64 40
  %146 = load double, ptr %145, align 8, !tbaa !27
  %147 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %144, double noundef %146)
  br label %150

148:                                              ; preds = %136
  %149 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  br label %150

150:                                              ; preds = %148, %142
  %151 = call i64 @libxsmm_timer_tick() #12
  br label %.preheader195

.preheader195:                                    ; preds = %150, %159
  %.3207 = phi i64 [ 0, %150 ], [ %160, %159 ]
  br label %152

152:                                              ; preds = %.preheader195, %152
  %.4163206 = phi i64 [ 0, %.preheader195 ], [ %158, %152 ]
  %153 = getelementptr inbounds i8, ptr %30, i64 %.4163206
  %154 = load i8, ptr %153, align 1, !tbaa !11
  %155 = zext i8 %154 to i32
  %ldexp = call double @ldexp(double 1.000000e+00, i32 %155) #12
  %156 = fptrunc double %ldexp to float
  %157 = getelementptr inbounds float, ptr %27, i64 %.4163206
  store float %156, ptr %157, align 4, !tbaa !9
  %158 = add nuw nsw i64 %.4163206, 1
  %exitcond225.not = icmp eq i64 %158, %24
  br i1 %exitcond225.not, label %159, label %152, !llvm.loop !30

159:                                              ; preds = %152
  %160 = add nuw nsw i64 %.3207, 1
  %exitcond226.not = icmp eq i64 %160, %umax219
  br i1 %exitcond226.not, label %161, label %.preheader195, !llvm.loop !31

161:                                              ; preds = %159
  %162 = call i64 @libxsmm_timer_tick() #12
  %163 = call double @libxsmm_timer_duration(i64 noundef %151, i64 noundef %162) #12
  %164 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, double noundef %163)
  %165 = call i64 @libxsmm_timer_tick() #12
  br label %.preheader194

.preheader194:                                    ; preds = %161, %172
  %.4209 = phi i64 [ 0, %161 ], [ %173, %172 ]
  br label %166

166:                                              ; preds = %.preheader194, %166
  %.5164208 = phi i64 [ 0, %.preheader194 ], [ %171, %166 ]
  %167 = getelementptr inbounds i8, ptr %30, i64 %.5164208
  %168 = load i8, ptr %167, align 1, !tbaa !11
  %169 = call float @libxsmm_sexp2_u8(i8 noundef zeroext %168) #12
  %170 = getelementptr inbounds float, ptr %28, i64 %.5164208
  store float %169, ptr %170, align 4, !tbaa !9
  %171 = add nuw nsw i64 %.5164208, 1
  %exitcond227.not = icmp eq i64 %171, %24
  br i1 %exitcond227.not, label %172, label %166, !llvm.loop !32

172:                                              ; preds = %166
  %173 = add nuw nsw i64 %.4209, 1
  %exitcond228.not = icmp eq i64 %173, %umax219
  br i1 %exitcond228.not, label %174, label %.preheader194, !llvm.loop !33

174:                                              ; preds = %172
  %175 = call i64 @libxsmm_timer_tick() #12
  %176 = call double @libxsmm_timer_duration(i64 noundef %165, i64 noundef %175) #12
  %177 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.4, double noundef %176)
  %178 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef 1, i32 noundef %39, ptr noundef nonnull %27, ptr noundef nonnull %28, ptr noundef null, ptr noundef null) #12
  %179 = icmp eq i32 %178, 0
  br i1 %179, label %180, label %186

180:                                              ; preds = %174
  %181 = getelementptr inbounds i8, ptr %3, i64 56
  %182 = load double, ptr %181, align 8, !tbaa !23
  %183 = getelementptr inbounds i8, ptr %3, i64 40
  %184 = load double, ptr %183, align 8, !tbaa !27
  %185 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %182, double noundef %184)
  br label %188

186:                                              ; preds = %174
  %187 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  br label %188

188:                                              ; preds = %186, %180
  %189 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  %190 = call i64 @libxsmm_timer_tick() #12
  %xtraiter256 = and i64 %24, 3
  %191 = icmp ult i64 %56, 3
  %unroll_iter260 = and i64 %24, -4
  %lcmp.mod258.not = icmp eq i64 %xtraiter256, 0
  br label %.preheader193

.preheader193:                                    ; preds = %188, %.epilog-lcssa259
  %.5211 = phi i64 [ 0, %188 ], [ %212, %.epilog-lcssa259 ]
  br i1 %191, label %.unr-lcssa254, label %.preheader193.new

.preheader193.new:                                ; preds = %.preheader193, %.preheader193.new
  %.6165210 = phi i64 [ %207, %.preheader193.new ], [ 0, %.preheader193 ]
  %niter261 = phi i64 [ %niter261.next.3, %.preheader193.new ], [ 0, %.preheader193 ]
  %192 = getelementptr inbounds float, ptr %29, i64 %.6165210
  %193 = load float, ptr %192, align 4, !tbaa !9
  %sqrtf = call float @sqrtf(float noundef %193) #5
  %194 = getelementptr inbounds float, ptr %27, i64 %.6165210
  store float %sqrtf, ptr %194, align 4, !tbaa !9
  %195 = or disjoint i64 %.6165210, 1
  %196 = getelementptr inbounds float, ptr %29, i64 %195
  %197 = load float, ptr %196, align 4, !tbaa !9
  %sqrtf.1 = call float @sqrtf(float noundef %197) #5
  %198 = getelementptr inbounds float, ptr %27, i64 %195
  store float %sqrtf.1, ptr %198, align 4, !tbaa !9
  %199 = or disjoint i64 %.6165210, 2
  %200 = getelementptr inbounds float, ptr %29, i64 %199
  %201 = load float, ptr %200, align 4, !tbaa !9
  %sqrtf.2 = call float @sqrtf(float noundef %201) #5
  %202 = getelementptr inbounds float, ptr %27, i64 %199
  store float %sqrtf.2, ptr %202, align 4, !tbaa !9
  %203 = or disjoint i64 %.6165210, 3
  %204 = getelementptr inbounds float, ptr %29, i64 %203
  %205 = load float, ptr %204, align 4, !tbaa !9
  %sqrtf.3 = call float @sqrtf(float noundef %205) #5
  %206 = getelementptr inbounds float, ptr %27, i64 %203
  store float %sqrtf.3, ptr %206, align 4, !tbaa !9
  %207 = add nuw nsw i64 %.6165210, 4
  %niter261.next.3 = add i64 %niter261, 4
  %niter261.ncmp.3 = icmp eq i64 %niter261.next.3, %unroll_iter260
  br i1 %niter261.ncmp.3, label %.unr-lcssa254, label %.preheader193.new, !llvm.loop !34

.unr-lcssa254:                                    ; preds = %.preheader193.new, %.preheader193
  %.6165210.unr = phi i64 [ 0, %.preheader193 ], [ %207, %.preheader193.new ]
  br i1 %lcmp.mod258.not, label %.epilog-lcssa259, label %.epil.preheader255

.epil.preheader255:                               ; preds = %.unr-lcssa254, %.epil.preheader255
  %.6165210.epil = phi i64 [ %211, %.epil.preheader255 ], [ %.6165210.unr, %.unr-lcssa254 ]
  %epil.iter257 = phi i64 [ %epil.iter257.next, %.epil.preheader255 ], [ 0, %.unr-lcssa254 ]
  %208 = getelementptr inbounds float, ptr %29, i64 %.6165210.epil
  %209 = load float, ptr %208, align 4, !tbaa !9
  %sqrtf.epil = call float @sqrtf(float noundef %209) #5
  %210 = getelementptr inbounds float, ptr %27, i64 %.6165210.epil
  store float %sqrtf.epil, ptr %210, align 4, !tbaa !9
  %211 = add nuw nsw i64 %.6165210.epil, 1
  %epil.iter257.next = add i64 %epil.iter257, 1
  %epil.iter257.cmp.not = icmp eq i64 %epil.iter257.next, %xtraiter256
  br i1 %epil.iter257.cmp.not, label %.epilog-lcssa259, label %.epil.preheader255, !llvm.loop !35

.epilog-lcssa259:                                 ; preds = %.epil.preheader255, %.unr-lcssa254
  %212 = add nuw nsw i64 %.5211, 1
  %exitcond230.not = icmp eq i64 %212, %umax219
  br i1 %exitcond230.not, label %213, label %.preheader193, !llvm.loop !36

213:                                              ; preds = %.epilog-lcssa259
  %214 = call i64 @libxsmm_timer_tick() #12
  %215 = call double @libxsmm_timer_duration(i64 noundef %190, i64 noundef %214) #12
  %216 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6, double noundef %215)
  %217 = call i64 @libxsmm_timer_tick() #12
  br label %.preheader192

.preheader192:                                    ; preds = %213, %226
  %.6213 = phi i64 [ 0, %213 ], [ %227, %226 ]
  br label %218

218:                                              ; preds = %.preheader192, %218
  %.7166212 = phi i64 [ 0, %.preheader192 ], [ %225, %218 ]
  %219 = getelementptr inbounds float, ptr %29, i64 %.7166212
  %220 = load float, ptr %219, align 4, !tbaa !9
  %221 = fpext float %220 to double
  %222 = call double @libxsmm_dsqrt(double noundef %221) #12
  %223 = fptrunc double %222 to float
  %224 = getelementptr inbounds float, ptr %28, i64 %.7166212
  store float %223, ptr %224, align 4, !tbaa !9
  %225 = add nuw nsw i64 %.7166212, 1
  %exitcond231.not = icmp eq i64 %225, %24
  br i1 %exitcond231.not, label %226, label %218, !llvm.loop !37

226:                                              ; preds = %218
  %227 = add nuw nsw i64 %.6213, 1
  %exitcond232.not = icmp eq i64 %227, %umax219
  br i1 %exitcond232.not, label %228, label %.preheader192, !llvm.loop !38

228:                                              ; preds = %226
  %229 = call i64 @libxsmm_timer_tick() #12
  %230 = call double @libxsmm_timer_duration(i64 noundef %217, i64 noundef %229) #12
  %231 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %230)
  %232 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef 1, i32 noundef %39, ptr noundef nonnull %27, ptr noundef nonnull %28, ptr noundef null, ptr noundef null) #12
  %233 = icmp eq i32 %232, 0
  br i1 %233, label %234, label %240

234:                                              ; preds = %228
  %235 = getelementptr inbounds i8, ptr %3, i64 56
  %236 = load double, ptr %235, align 8, !tbaa !23
  %237 = getelementptr inbounds i8, ptr %3, i64 40
  %238 = load double, ptr %237, align 8, !tbaa !27
  %239 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %236, double noundef %238)
  br label %242

240:                                              ; preds = %228
  %241 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  br label %242

242:                                              ; preds = %240, %234
  %243 = call i64 @libxsmm_timer_tick() #12
  %xtraiter264 = and i64 %24, 3
  %244 = icmp ult i64 %56, 3
  %unroll_iter268 = and i64 %24, -4
  %lcmp.mod266.not = icmp eq i64 %xtraiter264, 0
  br label %.preheader191

.preheader191:                                    ; preds = %242, %.epilog-lcssa267
  %.7215 = phi i64 [ 0, %242 ], [ %270, %.epilog-lcssa267 ]
  br i1 %244, label %.unr-lcssa262, label %.preheader191.new

.preheader191.new:                                ; preds = %.preheader191, %.preheader191.new
  %.8167214 = phi i64 [ %264, %.preheader191.new ], [ 0, %.preheader191 ]
  %niter269 = phi i64 [ %niter269.next.3, %.preheader191.new ], [ 0, %.preheader191 ]
  %245 = getelementptr inbounds float, ptr %29, i64 %.8167214
  %246 = load float, ptr %245, align 4, !tbaa !9
  %247 = call float @sqrtf(float noundef %246) #12
  %248 = getelementptr inbounds float, ptr %28, i64 %.8167214
  store float %247, ptr %248, align 4, !tbaa !9
  %249 = or disjoint i64 %.8167214, 1
  %250 = getelementptr inbounds float, ptr %29, i64 %249
  %251 = load float, ptr %250, align 4, !tbaa !9
  %252 = call float @sqrtf(float noundef %251) #12
  %253 = getelementptr inbounds float, ptr %28, i64 %249
  store float %252, ptr %253, align 4, !tbaa !9
  %254 = or disjoint i64 %.8167214, 2
  %255 = getelementptr inbounds float, ptr %29, i64 %254
  %256 = load float, ptr %255, align 4, !tbaa !9
  %257 = call float @sqrtf(float noundef %256) #12
  %258 = getelementptr inbounds float, ptr %28, i64 %254
  store float %257, ptr %258, align 4, !tbaa !9
  %259 = or disjoint i64 %.8167214, 3
  %260 = getelementptr inbounds float, ptr %29, i64 %259
  %261 = load float, ptr %260, align 4, !tbaa !9
  %262 = call float @sqrtf(float noundef %261) #12
  %263 = getelementptr inbounds float, ptr %28, i64 %259
  store float %262, ptr %263, align 4, !tbaa !9
  %264 = add nuw nsw i64 %.8167214, 4
  %niter269.next.3 = add i64 %niter269, 4
  %niter269.ncmp.3 = icmp eq i64 %niter269.next.3, %unroll_iter268
  br i1 %niter269.ncmp.3, label %.unr-lcssa262, label %.preheader191.new, !llvm.loop !39

.unr-lcssa262:                                    ; preds = %.preheader191.new, %.preheader191
  %.8167214.unr = phi i64 [ 0, %.preheader191 ], [ %264, %.preheader191.new ]
  br i1 %lcmp.mod266.not, label %.epilog-lcssa267, label %.epil.preheader263

.epil.preheader263:                               ; preds = %.unr-lcssa262, %.epil.preheader263
  %.8167214.epil = phi i64 [ %269, %.epil.preheader263 ], [ %.8167214.unr, %.unr-lcssa262 ]
  %epil.iter265 = phi i64 [ %epil.iter265.next, %.epil.preheader263 ], [ 0, %.unr-lcssa262 ]
  %265 = getelementptr inbounds float, ptr %29, i64 %.8167214.epil
  %266 = load float, ptr %265, align 4, !tbaa !9
  %267 = call float @sqrtf(float noundef %266) #12
  %268 = getelementptr inbounds float, ptr %28, i64 %.8167214.epil
  store float %267, ptr %268, align 4, !tbaa !9
  %269 = add nuw nsw i64 %.8167214.epil, 1
  %epil.iter265.next = add i64 %epil.iter265, 1
  %epil.iter265.cmp.not = icmp eq i64 %epil.iter265.next, %xtraiter264
  br i1 %epil.iter265.cmp.not, label %.epilog-lcssa267, label %.epil.preheader263, !llvm.loop !40

.epilog-lcssa267:                                 ; preds = %.epil.preheader263, %.unr-lcssa262
  %270 = add nuw nsw i64 %.7215, 1
  %exitcond234.not = icmp eq i64 %270, %umax219
  br i1 %exitcond234.not, label %271, label %.preheader191, !llvm.loop !41

271:                                              ; preds = %.epilog-lcssa267
  %272 = call i64 @libxsmm_timer_tick() #12
  %273 = call double @libxsmm_timer_duration(i64 noundef %243, i64 noundef %272) #12
  %274 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8, double noundef %273)
  %275 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef 1, i32 noundef %39, ptr noundef nonnull %27, ptr noundef nonnull %28, ptr noundef null, ptr noundef null) #12
  %276 = icmp eq i32 %275, 0
  br i1 %276, label %277, label %283

277:                                              ; preds = %271
  %278 = getelementptr inbounds i8, ptr %3, i64 56
  %279 = load double, ptr %278, align 8, !tbaa !23
  %280 = getelementptr inbounds i8, ptr %3, i64 40
  %281 = load double, ptr %280, align 8, !tbaa !27
  %282 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %279, double noundef %281)
  br label %285

283:                                              ; preds = %271
  %284 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  br label %285

285:                                              ; preds = %283, %277
  %286 = call i64 @libxsmm_timer_tick() #12
  br label %.preheader

.preheader:                                       ; preds = %285, %293
  %.8217 = phi i64 [ 0, %285 ], [ %294, %293 ]
  br label %287

287:                                              ; preds = %.preheader, %287
  %.9216 = phi i64 [ 0, %.preheader ], [ %292, %287 ]
  %288 = getelementptr inbounds float, ptr %29, i64 %.9216
  %289 = load float, ptr %288, align 4, !tbaa !9
  %290 = call float @libxsmm_ssqrt(float noundef %289) #12
  %291 = getelementptr inbounds float, ptr %28, i64 %.9216
  store float %290, ptr %291, align 4, !tbaa !9
  %292 = add nuw nsw i64 %.9216, 1
  %exitcond235.not = icmp eq i64 %292, %24
  br i1 %exitcond235.not, label %293, label %287, !llvm.loop !42

293:                                              ; preds = %287
  %294 = add nuw nsw i64 %.8217, 1
  %exitcond236.not = icmp eq i64 %294, %umax219
  br i1 %exitcond236.not, label %295, label %.preheader, !llvm.loop !43

295:                                              ; preds = %293
  %296 = call i64 @libxsmm_timer_tick() #12
  %297 = call double @libxsmm_timer_duration(i64 noundef %286, i64 noundef %296) #12
  %298 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.9, double noundef %297)
  %299 = call i32 @libxsmm_matdiff(ptr noundef nonnull %3, i32 noundef 1, i32 noundef 1, i32 noundef %39, ptr noundef nonnull %27, ptr noundef nonnull %28, ptr noundef null, ptr noundef null) #12
  %300 = icmp eq i32 %299, 0
  br i1 %300, label %301, label %307

301:                                              ; preds = %295
  %302 = getelementptr inbounds i8, ptr %3, i64 56
  %303 = load double, ptr %302, align 8, !tbaa !23
  %304 = getelementptr inbounds i8, ptr %3, i64 40
  %305 = load double, ptr %304, align 8, !tbaa !27
  %306 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.2, double noundef %303, double noundef %305)
  br label %309

307:                                              ; preds = %295
  %308 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  br label %309

309:                                              ; preds = %307, %301
  call void @llvm.lifetime.end.p0(i64 192, ptr nonnull %3) #12
  br label %310

310:                                              ; preds = %.thread243, %309
  %.0168 = phi i32 [ 0, %309 ], [ 1, %.thread243 ]
  call void @free(ptr noundef %27) #12
  call void @free(ptr noundef %28) #12
  call void @free(ptr noundef %29) #12
  call void @free(ptr noundef %30) #12
  ret i32 %.0168
}

; 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

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

declare void @libxsmm_rng_set_seed(i32 noundef) local_unnamed_addr #4

declare void @libxsmm_rng_f32_seq(ptr noundef, i32 noundef) local_unnamed_addr #4

declare i64 @libxsmm_timer_tick() local_unnamed_addr #4

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @exp2(double noundef) local_unnamed_addr #5

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

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare float @exp2f(float noundef) local_unnamed_addr #5

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

declare float @libxsmm_sexp2(float noundef) local_unnamed_addr #4

declare float @libxsmm_sexp2_u8(i8 noundef zeroext) local_unnamed_addr #4

declare double @libxsmm_dsqrt(double noundef) local_unnamed_addr #4

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare float @sqrtf(float noundef) local_unnamed_addr #5

declare float @libxsmm_ssqrt(float 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

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

; Function Attrs: nofree willreturn
declare double @ldexp(double, i32) local_unnamed_addr #8

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

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 = { 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 #4 = { "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 = { mustprogress nofree nounwind willreturn memory(write) "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 = { 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 #7 = { 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 #8 = { nofree willreturn }
attributes #9 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #10 = { nounwind willreturn memory(read) }
attributes #11 = { nounwind allocsize(0) }
attributes #12 = { nounwind }

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

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


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalDCEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,SCCPPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass