; LLVM IR from libxsmm/libxsmm :: samples/spmm (spmm_kernel)

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

@.str = external hidden unnamed_addr constant [27 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [76 x i8], align 1
@__PRETTY_FUNCTION__.create_spmm_inputs = external hidden unnamed_addr constant [111 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local i32 @ullcompare(ptr noundef, ptr noundef) #0

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @shuffle_array(ptr noundef, i32 noundef) #0

; Function Attrs: nounwind uwtable
declare dso_local i32 @is_dense_grid_point(i64 noundef, i32 noundef, ptr noundef) #0

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

; Function Attrs: nounwind uwtable
define dso_local void @create_spmm_inputs(ptr noundef %0, double noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7) #0 {
  %9 = alloca ptr, align 8
  %10 = alloca double, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca %struct.spmm_def, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca ptr, align 8
  %32 = alloca i64, align 8
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca i32, align 4
  %45 = alloca i32, align 4
  %46 = alloca i32, align 4
  %47 = alloca i32, align 4
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca i32, align 4
  %52 = alloca i32, align 4
  %53 = alloca i32, align 4
  %54 = alloca i32, align 4
  %55 = alloca ptr, align 8
  %56 = alloca ptr, align 8
  %57 = alloca ptr, align 8
  %58 = alloca ptr, align 8
  %59 = alloca ptr, align 8
  %60 = alloca ptr, align 8
  %61 = alloca i32, align 4
  %62 = alloca i32, align 4
  %63 = alloca i32, align 4
  %64 = alloca ptr, align 8
  %65 = alloca i64, align 8
  %66 = alloca ptr, align 8
  %67 = alloca ptr, align 8
  %68 = alloca ptr, align 8
  %69 = alloca ptr, align 8
  store ptr %0, ptr %9, align 8, !tbaa !5
  store double %1, ptr %10, align 8, !tbaa !9
  store ptr %2, ptr %11, align 8, !tbaa !5
  store ptr %3, ptr %12, align 8, !tbaa !5
  store ptr %4, ptr %13, align 8, !tbaa !5
  store ptr %5, ptr %14, align 8, !tbaa !5
  store ptr %6, ptr %15, align 8, !tbaa !5
  store ptr %7, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 88, ptr %17) #8
  %70 = load ptr, ptr %9, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %17, ptr align 8 %70, i64 88, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #8
  %71 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 4
  %72 = load i32, ptr %71, align 8, !tbaa !14
  store i32 %72, ptr %18, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #8
  %73 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 5
  %74 = load i32, ptr %73, align 4, !tbaa !16
  store i32 %74, ptr %19, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #8
  %75 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 6
  %76 = load i32, ptr %75, align 8, !tbaa !17
  store i32 %76, ptr %20, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #8
  %77 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 8
  %78 = load i32, ptr %77, align 8, !tbaa !18
  store i32 %78, ptr %21, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #8
  %79 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 7
  %80 = load i32, ptr %79, align 4, !tbaa !19
  store i32 %80, ptr %22, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #8
  %81 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 14
  %82 = load i32, ptr %81, align 4, !tbaa !20
  store i32 %82, ptr %23, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #8
  %83 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 12
  %84 = load i32, ptr %83, align 4, !tbaa !21
  store i32 %84, ptr %24, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #8
  %85 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 9
  %86 = load i32, ptr %85, align 4, !tbaa !22
  store i32 %86, ptr %29, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #8
  %87 = load i32, ptr %19, align 4, !tbaa !12
  %88 = load i32, ptr %21, align 4, !tbaa !12
  %89 = sdiv i32 %87, %88
  %90 = load i32, ptr %20, align 4, !tbaa !12
  %91 = load i32, ptr %22, align 4, !tbaa !12
  %92 = sdiv i32 %90, %91
  %93 = mul nsw i32 %89, %92
  store i32 %93, ptr %30, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #8
  %94 = load i32, ptr %30, align 4, !tbaa !12
  %95 = zext i32 %94 to i64
  %96 = mul i64 %95, 8
  %97 = call noalias ptr @malloc(i64 noundef %96) #9
  store ptr %97, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #8
  %98 = load double, ptr %10, align 8, !tbaa !9
  %99 = fsub double 1.000000e+00, %98
  %100 = load i32, ptr %30, align 4, !tbaa !12
  %101 = uitofp i32 %100 to double
  %102 = fmul double %99, %101
  %103 = fptosi double %102 to i64
  store i64 %103, ptr %32, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #8
  store i32 0, ptr %33, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #8
  store i32 0, ptr %34, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #8
  store i32 0, ptr %35, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #8
  %104 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 0
  %105 = load i32, ptr %104, align 8, !tbaa !25
  %106 = call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %105)
  store i32 %106, ptr %36, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #8
  %107 = load i32, ptr %36, align 4, !tbaa !12
  %108 = icmp ne i32 %107, 1
  br i1 %108, label %109, label %310

109:                                              ; preds = %8
  store i32 0, ptr %28, align 4, !tbaa !12
  br label %110

110:                                              ; preds = %306, %109
  %111 = load i32, ptr %28, align 4, !tbaa !12
  %112 = load i32, ptr %29, align 4, !tbaa !12
  %113 = icmp slt i32 %111, %112
  br i1 %113, label %114, label %309

114:                                              ; preds = %110
  store i32 0, ptr %26, align 4, !tbaa !12
  br label %115

115:                                              ; preds = %302, %114
  %116 = load i32, ptr %26, align 4, !tbaa !12
  %117 = load i32, ptr %18, align 4, !tbaa !12
  %118 = icmp slt i32 %116, %117
  br i1 %118, label %119, label %305

119:                                              ; preds = %115
  store i32 0, ptr %25, align 4, !tbaa !12
  br label %120

120:                                              ; preds = %298, %119
  %121 = load i32, ptr %25, align 4, !tbaa !12
  %122 = load i32, ptr %20, align 4, !tbaa !12
  %123 = load i32, ptr %36, align 4, !tbaa !12
  %124 = sdiv i32 %122, %123
  %125 = icmp slt i32 %121, %124
  br i1 %125, label %126, label %301

126:                                              ; preds = %120
  store i32 0, ptr %27, align 4, !tbaa !12
  br label %127

127:                                              ; preds = %294, %126
  %128 = load i32, ptr %27, align 4, !tbaa !12
  %129 = load i32, ptr %36, align 4, !tbaa !12
  %130 = icmp slt i32 %128, %129
  br i1 %130, label %131, label %297

131:                                              ; preds = %127
  %132 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 0
  %133 = load i32, ptr %132, align 8, !tbaa !25
  %134 = icmp eq i32 %133, 2
  br i1 %134, label %135, label %211

135:                                              ; preds = %131
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #8
  %136 = load ptr, ptr %11, align 8, !tbaa !5
  %137 = load i32, ptr %28, align 4, !tbaa !12
  %138 = load i32, ptr %20, align 4, !tbaa !12
  %139 = mul nsw i32 %137, %138
  %140 = load i32, ptr %18, align 4, !tbaa !12
  %141 = mul nsw i32 %139, %140
  %142 = sext i32 %141 to i64
  %143 = getelementptr inbounds i16, ptr %136, i64 %142
  store ptr %143, ptr %40, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #8
  %144 = load ptr, ptr %13, align 8, !tbaa !5
  %145 = load i32, ptr %28, align 4, !tbaa !12
  %146 = load i32, ptr %20, align 4, !tbaa !12
  %147 = mul nsw i32 %145, %146
  %148 = load i32, ptr %18, align 4, !tbaa !12
  %149 = mul nsw i32 %147, %148
  %150 = sext i32 %149 to i64
  %151 = getelementptr inbounds i16, ptr %144, i64 %150
  store ptr %151, ptr %41, align 8, !tbaa !5
  %152 = load ptr, ptr %9, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.spmm_def, ptr %152, i32 0, i32 11
  %154 = load i32, ptr %153, align 8, !tbaa !26
  %155 = icmp sgt i32 %154, 0
  br i1 %155, label %156, label %182

156:                                              ; preds = %135
  %157 = load ptr, ptr %40, align 8, !tbaa !5
  %158 = load i32, ptr %25, align 4, !tbaa !12
  %159 = load i32, ptr %36, align 4, !tbaa !12
  %160 = mul nsw i32 %158, %159
  %161 = load i32, ptr %27, align 4, !tbaa !12
  %162 = add nsw i32 %160, %161
  %163 = load i32, ptr %26, align 4, !tbaa !12
  %164 = load i32, ptr %20, align 4, !tbaa !12
  %165 = mul nsw i32 %163, %164
  %166 = add nsw i32 %162, %165
  %167 = sext i32 %166 to i64
  %168 = getelementptr inbounds i16, ptr %157, i64 %167
  %169 = load i16, ptr %168, align 2, !tbaa !27
  %170 = load ptr, ptr %41, align 8, !tbaa !5
  %171 = load i32, ptr %25, align 4, !tbaa !12
  %172 = load i32, ptr %36, align 4, !tbaa !12
  %173 = mul nsw i32 %171, %172
  %174 = load i32, ptr %27, align 4, !tbaa !12
  %175 = add nsw i32 %173, %174
  %176 = load i32, ptr %26, align 4, !tbaa !12
  %177 = load i32, ptr %20, align 4, !tbaa !12
  %178 = mul nsw i32 %176, %177
  %179 = add nsw i32 %175, %178
  %180 = sext i32 %179 to i64
  %181 = getelementptr inbounds i16, ptr %170, i64 %180
  store i16 %169, ptr %181, align 2, !tbaa !27
  br label %210

182:                                              ; preds = %135
  %183 = load ptr, ptr %40, align 8, !tbaa !5
  %184 = load i32, ptr %25, align 4, !tbaa !12
  %185 = load i32, ptr %36, align 4, !tbaa !12
  %186 = mul nsw i32 %184, %185
  %187 = load i32, ptr %27, align 4, !tbaa !12
  %188 = add nsw i32 %186, %187
  %189 = load i32, ptr %18, align 4, !tbaa !12
  %190 = mul nsw i32 %188, %189
  %191 = load i32, ptr %26, align 4, !tbaa !12
  %192 = add nsw i32 %190, %191
  %193 = sext i32 %192 to i64
  %194 = getelementptr inbounds i16, ptr %183, i64 %193
  %195 = load i16, ptr %194, align 2, !tbaa !27
  %196 = load ptr, ptr %41, align 8, !tbaa !5
  %197 = load i32, ptr %25, align 4, !tbaa !12
  %198 = load i32, ptr %18, align 4, !tbaa !12
  %199 = load i32, ptr %36, align 4, !tbaa !12
  %200 = mul nsw i32 %198, %199
  %201 = mul nsw i32 %197, %200
  %202 = load i32, ptr %26, align 4, !tbaa !12
  %203 = load i32, ptr %36, align 4, !tbaa !12
  %204 = mul nsw i32 %202, %203
  %205 = add nsw i32 %201, %204
  %206 = load i32, ptr %27, align 4, !tbaa !12
  %207 = add nsw i32 %205, %206
  %208 = sext i32 %207 to i64
  %209 = getelementptr inbounds i16, ptr %196, i64 %208
  store i16 %195, ptr %209, align 2, !tbaa !27
  br label %210

210:                                              ; preds = %182, %156
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #8
  br label %293

211:                                              ; preds = %131
  %212 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 0
  %213 = load i32, ptr %212, align 8, !tbaa !25
  %214 = icmp eq i32 %213, 12
  br i1 %214, label %215, label %291

215:                                              ; preds = %211
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #8
  %216 = load ptr, ptr %11, align 8, !tbaa !5
  %217 = load i32, ptr %28, align 4, !tbaa !12
  %218 = load i32, ptr %20, align 4, !tbaa !12
  %219 = mul nsw i32 %217, %218
  %220 = load i32, ptr %18, align 4, !tbaa !12
  %221 = mul nsw i32 %219, %220
  %222 = sext i32 %221 to i64
  %223 = getelementptr inbounds i8, ptr %216, i64 %222
  store ptr %223, ptr %42, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #8
  %224 = load ptr, ptr %13, align 8, !tbaa !5
  %225 = load i32, ptr %28, align 4, !tbaa !12
  %226 = load i32, ptr %20, align 4, !tbaa !12
  %227 = mul nsw i32 %225, %226
  %228 = load i32, ptr %18, align 4, !tbaa !12
  %229 = mul nsw i32 %227, %228
  %230 = sext i32 %229 to i64
  %231 = getelementptr inbounds i8, ptr %224, i64 %230
  store ptr %231, ptr %43, align 8, !tbaa !5
  %232 = load ptr, ptr %9, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.spmm_def, ptr %232, i32 0, i32 11
  %234 = load i32, ptr %233, align 8, !tbaa !26
  %235 = icmp sgt i32 %234, 0
  br i1 %235, label %236, label %262

236:                                              ; preds = %215
  %237 = load ptr, ptr %42, align 8, !tbaa !5
  %238 = load i32, ptr %25, align 4, !tbaa !12
  %239 = load i32, ptr %36, align 4, !tbaa !12
  %240 = mul nsw i32 %238, %239
  %241 = load i32, ptr %27, align 4, !tbaa !12
  %242 = add nsw i32 %240, %241
  %243 = load i32, ptr %26, align 4, !tbaa !12
  %244 = load i32, ptr %20, align 4, !tbaa !12
  %245 = mul nsw i32 %243, %244
  %246 = add nsw i32 %242, %245
  %247 = sext i32 %246 to i64
  %248 = getelementptr inbounds i8, ptr %237, i64 %247
  %249 = load i8, ptr %248, align 1, !tbaa !29
  %250 = load ptr, ptr %43, align 8, !tbaa !5
  %251 = load i32, ptr %25, align 4, !tbaa !12
  %252 = load i32, ptr %36, align 4, !tbaa !12
  %253 = mul nsw i32 %251, %252
  %254 = load i32, ptr %27, align 4, !tbaa !12
  %255 = add nsw i32 %253, %254
  %256 = load i32, ptr %26, align 4, !tbaa !12
  %257 = load i32, ptr %20, align 4, !tbaa !12
  %258 = mul nsw i32 %256, %257
  %259 = add nsw i32 %255, %258
  %260 = sext i32 %259 to i64
  %261 = getelementptr inbounds i8, ptr %250, i64 %260
  store i8 %249, ptr %261, align 1, !tbaa !29
  br label %290

262:                                              ; preds = %215
  %263 = load ptr, ptr %42, align 8, !tbaa !5
  %264 = load i32, ptr %25, align 4, !tbaa !12
  %265 = load i32, ptr %36, align 4, !tbaa !12
  %266 = mul nsw i32 %264, %265
  %267 = load i32, ptr %27, align 4, !tbaa !12
  %268 = add nsw i32 %266, %267
  %269 = load i32, ptr %18, align 4, !tbaa !12
  %270 = mul nsw i32 %268, %269
  %271 = load i32, ptr %26, align 4, !tbaa !12
  %272 = add nsw i32 %270, %271
  %273 = sext i32 %272 to i64
  %274 = getelementptr inbounds i8, ptr %263, i64 %273
  %275 = load i8, ptr %274, align 1, !tbaa !29
  %276 = load ptr, ptr %43, align 8, !tbaa !5
  %277 = load i32, ptr %25, align 4, !tbaa !12
  %278 = load i32, ptr %18, align 4, !tbaa !12
  %279 = load i32, ptr %36, align 4, !tbaa !12
  %280 = mul nsw i32 %278, %279
  %281 = mul nsw i32 %277, %280
  %282 = load i32, ptr %26, align 4, !tbaa !12
  %283 = load i32, ptr %36, align 4, !tbaa !12
  %284 = mul nsw i32 %282, %283
  %285 = add nsw i32 %281, %284
  %286 = load i32, ptr %27, align 4, !tbaa !12
  %287 = add nsw i32 %285, %286
  %288 = sext i32 %287 to i64
  %289 = getelementptr inbounds i8, ptr %276, i64 %288
  store i8 %275, ptr %289, align 1, !tbaa !29
  br label %290

290:                                              ; preds = %262, %236
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #8
  br label %292

291:                                              ; preds = %211
  br label %292

292:                                              ; preds = %291, %290
  br label %293

293:                                              ; preds = %292, %210
  br label %294

294:                                              ; preds = %293
  %295 = load i32, ptr %27, align 4, !tbaa !12
  %296 = add nsw i32 %295, 1
  store i32 %296, ptr %27, align 4, !tbaa !12
  br label %127, !llvm.loop !30

297:                                              ; preds = %127
  br label %298

298:                                              ; preds = %297
  %299 = load i32, ptr %25, align 4, !tbaa !12
  %300 = add nsw i32 %299, 1
  store i32 %300, ptr %25, align 4, !tbaa !12
  br label %120, !llvm.loop !32

301:                                              ; preds = %120
  br label %302

302:                                              ; preds = %301
  %303 = load i32, ptr %26, align 4, !tbaa !12
  %304 = add nsw i32 %303, 1
  store i32 %304, ptr %26, align 4, !tbaa !12
  br label %115, !llvm.loop !33

305:                                              ; preds = %115
  br label %306

306:                                              ; preds = %305
  %307 = load i32, ptr %28, align 4, !tbaa !12
  %308 = add nsw i32 %307, 1
  store i32 %308, ptr %28, align 4, !tbaa !12
  br label %110, !llvm.loop !34

309:                                              ; preds = %110
  br label %310

310:                                              ; preds = %309, %8
  store i32 0, ptr %26, align 4, !tbaa !12
  br label %311

311:                                              ; preds = %322, %310
  %312 = load i32, ptr %26, align 4, !tbaa !12
  %313 = load i32, ptr %30, align 4, !tbaa !12
  %314 = icmp ult i32 %312, %313
  br i1 %314, label %315, label %325

315:                                              ; preds = %311
  %316 = load i32, ptr %26, align 4, !tbaa !12
  %317 = sext i32 %316 to i64
  %318 = load ptr, ptr %31, align 8, !tbaa !5
  %319 = load i32, ptr %26, align 4, !tbaa !12
  %320 = sext i32 %319 to i64
  %321 = getelementptr inbounds i64, ptr %318, i64 %320
  store i64 %317, ptr %321, align 8, !tbaa !23
  br label %322

322:                                              ; preds = %315
  %323 = load i32, ptr %26, align 4, !tbaa !12
  %324 = add nsw i32 %323, 1
  store i32 %324, ptr %26, align 4, !tbaa !12
  br label %311, !llvm.loop !35

325:                                              ; preds = %311
  %326 = load ptr, ptr %31, align 8, !tbaa !5
  %327 = load i32, ptr %30, align 4, !tbaa !12
  call void @shuffle_array(ptr noundef %326, i32 noundef %327)
  %328 = load ptr, ptr %31, align 8, !tbaa !5
  %329 = load i64, ptr %32, align 8, !tbaa !23
  call void @qsort(ptr noundef %328, i64 noundef %329, i64 noundef 8, ptr noundef @ullcompare)
  store i32 0, ptr %26, align 4, !tbaa !12
  br label %330

330:                                              ; preds = %450, %325
  %331 = load i32, ptr %26, align 4, !tbaa !12
  %332 = load i32, ptr %19, align 4, !tbaa !12
  %333 = load i32, ptr %21, align 4, !tbaa !12
  %334 = sdiv i32 %332, %333
  %335 = icmp slt i32 %331, %334
  br i1 %335, label %336, label %453

336:                                              ; preds = %330
  store i32 0, ptr %25, align 4, !tbaa !12
  br label %337

337:                                              ; preds = %446, %336
  %338 = load i32, ptr %25, align 4, !tbaa !12
  %339 = load i32, ptr %20, align 4, !tbaa !12
  %340 = load i32, ptr %22, align 4, !tbaa !12
  %341 = sdiv i32 %339, %340
  %342 = icmp slt i32 %338, %341
  br i1 %342, label %343, label %449

343:                                              ; preds = %337
  %344 = load i32, ptr %26, align 4, !tbaa !12
  %345 = load i32, ptr %20, align 4, !tbaa !12
  %346 = load i32, ptr %22, align 4, !tbaa !12
  %347 = sdiv i32 %345, %346
  %348 = mul nsw i32 %344, %347
  %349 = load i32, ptr %25, align 4, !tbaa !12
  %350 = add nsw i32 %348, %349
  %351 = sext i32 %350 to i64
  %352 = load i64, ptr %32, align 8, !tbaa !23
  %353 = trunc i64 %352 to i32
  %354 = load ptr, ptr %31, align 8, !tbaa !5
  %355 = call i32 @is_dense_grid_point(i64 noundef %351, i32 noundef %353, ptr noundef %354)
  %356 = icmp eq i32 %355, 0
  br i1 %356, label %357, label %439

357:                                              ; preds = %343
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #8
  %358 = load i32, ptr %26, align 4, !tbaa !12
  %359 = load i32, ptr %21, align 4, !tbaa !12
  %360 = mul nsw i32 %358, %359
  store i32 %360, ptr %44, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #8
  %361 = load i32, ptr %25, align 4, !tbaa !12
  %362 = load i32, ptr %22, align 4, !tbaa !12
  %363 = mul nsw i32 %361, %362
  store i32 %363, ptr %45, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #8
  store i32 0, ptr %46, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #8
  store i32 0, ptr %47, align 4, !tbaa !12
  store i32 0, ptr %46, align 4, !tbaa !12
  br label %364

364:                                              ; preds = %435, %357
  %365 = load i32, ptr %46, align 4, !tbaa !12
  %366 = load i32, ptr %21, align 4, !tbaa !12
  %367 = icmp ult i32 %365, %366
  br i1 %367, label %368, label %438

368:                                              ; preds = %364
  store i32 0, ptr %47, align 4, !tbaa !12
  br label %369

369:                                              ; preds = %431, %368
  %370 = load i32, ptr %47, align 4, !tbaa !12
  %371 = load i32, ptr %22, align 4, !tbaa !12
  %372 = icmp ult i32 %370, %371
  br i1 %372, label %373, label %434

373:                                              ; preds = %369
  %374 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %375 = load i32, ptr %374, align 4, !tbaa !36
  %376 = icmp eq i32 %375, 1
  br i1 %376, label %377, label %391

377:                                              ; preds = %373
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #8
  %378 = load ptr, ptr %12, align 8, !tbaa !5
  %379 = load i32, ptr %44, align 4, !tbaa !12
  %380 = load i32, ptr %46, align 4, !tbaa !12
  %381 = add i32 %379, %380
  %382 = load i32, ptr %20, align 4, !tbaa !12
  %383 = mul i32 %381, %382
  %384 = load i32, ptr %45, align 4, !tbaa !12
  %385 = load i32, ptr %47, align 4, !tbaa !12
  %386 = add i32 %384, %385
  %387 = add i32 %383, %386
  %388 = zext i32 %387 to i64
  %389 = getelementptr inbounds float, ptr %378, i64 %388
  store ptr %389, ptr %48, align 8, !tbaa !5
  %390 = load ptr, ptr %48, align 8, !tbaa !5
  store float 0.000000e+00, ptr %390, align 4, !tbaa !37
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #8
  br label %430

391:                                              ; preds = %373
  %392 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %393 = load i32, ptr %392, align 4, !tbaa !36
  %394 = icmp eq i32 %393, 2
  br i1 %394, label %395, label %409

395:                                              ; preds = %391
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #8
  %396 = load ptr, ptr %12, align 8, !tbaa !5
  %397 = load i32, ptr %44, align 4, !tbaa !12
  %398 = load i32, ptr %46, align 4, !tbaa !12
  %399 = add i32 %397, %398
  %400 = load i32, ptr %20, align 4, !tbaa !12
  %401 = mul i32 %399, %400
  %402 = load i32, ptr %45, align 4, !tbaa !12
  %403 = load i32, ptr %47, align 4, !tbaa !12
  %404 = add i32 %402, %403
  %405 = add i32 %401, %404
  %406 = zext i32 %405 to i64
  %407 = getelementptr inbounds i16, ptr %396, i64 %406
  store ptr %407, ptr %49, align 8, !tbaa !5
  %408 = load ptr, ptr %49, align 8, !tbaa !5
  store i16 0, ptr %408, align 2, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #8
  br label %429

409:                                              ; preds = %391
  %410 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %411 = load i32, ptr %410, align 4, !tbaa !36
  %412 = icmp eq i32 %411, 12
  br i1 %412, label %413, label %427

413:                                              ; preds = %409
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #8
  %414 = load ptr, ptr %12, align 8, !tbaa !5
  %415 = load i32, ptr %44, align 4, !tbaa !12
  %416 = load i32, ptr %46, align 4, !tbaa !12
  %417 = add i32 %415, %416
  %418 = load i32, ptr %20, align 4, !tbaa !12
  %419 = mul i32 %417, %418
  %420 = load i32, ptr %45, align 4, !tbaa !12
  %421 = load i32, ptr %47, align 4, !tbaa !12
  %422 = add i32 %420, %421
  %423 = add i32 %419, %422
  %424 = zext i32 %423 to i64
  %425 = getelementptr inbounds i8, ptr %414, i64 %424
  store ptr %425, ptr %50, align 8, !tbaa !5
  %426 = load ptr, ptr %50, align 8, !tbaa !5
  store i8 0, ptr %426, align 1, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #8
  br label %428

427:                                              ; preds = %409
  br label %428

428:                                              ; preds = %427, %413
  br label %429

429:                                              ; preds = %428, %395
  br label %430

430:                                              ; preds = %429, %377
  br label %431

431:                                              ; preds = %430
  %432 = load i32, ptr %47, align 4, !tbaa !12
  %433 = add i32 %432, 1
  store i32 %433, ptr %47, align 4, !tbaa !12
  br label %369, !llvm.loop !39

434:                                              ; preds = %369
  br label %435

435:                                              ; preds = %434
  %436 = load i32, ptr %46, align 4, !tbaa !12
  %437 = add i32 %436, 1
  store i32 %437, ptr %46, align 4, !tbaa !12
  br label %364, !llvm.loop !40

438:                                              ; preds = %364
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #8
  br label %445

439:                                              ; preds = %343
  %440 = load i32, ptr %21, align 4, !tbaa !12
  %441 = load i32, ptr %22, align 4, !tbaa !12
  %442 = mul nsw i32 %440, %441
  %443 = load i32, ptr %33, align 4, !tbaa !12
  %444 = add i32 %443, %442
  store i32 %444, ptr %33, align 4, !tbaa !12
  br label %445

445:                                              ; preds = %439, %438
  br label %446

446:                                              ; preds = %445
  %447 = load i32, ptr %25, align 4, !tbaa !12
  %448 = add nsw i32 %447, 1
  store i32 %448, ptr %25, align 4, !tbaa !12
  br label %337, !llvm.loop !41

449:                                              ; preds = %337
  br label %450

450:                                              ; preds = %449
  %451 = load i32, ptr %26, align 4, !tbaa !12
  %452 = add nsw i32 %451, 1
  store i32 %452, ptr %26, align 4, !tbaa !12
  br label %330, !llvm.loop !42

453:                                              ; preds = %330
  %454 = load i32, ptr %19, align 4, !tbaa !12
  %455 = load i32, ptr %21, align 4, !tbaa !12
  %456 = sdiv i32 %454, %455
  %457 = add nsw i32 %456, 1
  %458 = sext i32 %457 to i64
  %459 = mul i64 %458, 4
  %460 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %459, i64 noundef 64)
  store ptr %460, ptr %37, align 8, !tbaa !5
  %461 = load i32, ptr %33, align 4, !tbaa !12
  %462 = load i32, ptr %21, align 4, !tbaa !12
  %463 = load i32, ptr %22, align 4, !tbaa !12
  %464 = mul nsw i32 %462, %463
  %465 = udiv i32 %461, %464
  %466 = zext i32 %465 to i64
  %467 = mul i64 %466, 4
  %468 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %467, i64 noundef 64)
  store ptr %468, ptr %38, align 8, !tbaa !5
  %469 = load i32, ptr %33, align 4, !tbaa !12
  %470 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %471 = load i32, ptr %470, align 4, !tbaa !36
  %472 = icmp eq i32 0, %471
  br i1 %472, label %473, label %474

473:                                              ; preds = %453
  br label %567

474:                                              ; preds = %453
  %475 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %476 = load i32, ptr %475, align 4, !tbaa !36
  %477 = icmp eq i32 1, %476
  br i1 %477, label %478, label %479

478:                                              ; preds = %474
  br label %565

479:                                              ; preds = %474
  %480 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %481 = load i32, ptr %480, align 4, !tbaa !36
  %482 = icmp eq i32 2, %481
  br i1 %482, label %483, label %484

483:                                              ; preds = %479
  br label %563

484:                                              ; preds = %479
  %485 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %486 = load i32, ptr %485, align 4, !tbaa !36
  %487 = icmp eq i32 3, %486
  br i1 %487, label %488, label %489

488:                                              ; preds = %484
  br label %561

489:                                              ; preds = %484
  %490 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %491 = load i32, ptr %490, align 4, !tbaa !36
  %492 = icmp eq i32 4, %491
  br i1 %492, label %493, label %494

493:                                              ; preds = %489
  br label %559

494:                                              ; preds = %489
  %495 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %496 = load i32, ptr %495, align 4, !tbaa !36
  %497 = icmp eq i32 5, %496
  br i1 %497, label %498, label %499

498:                                              ; preds = %494
  br label %557

499:                                              ; preds = %494
  %500 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %501 = load i32, ptr %500, align 4, !tbaa !36
  %502 = icmp eq i32 6, %501
  br i1 %502, label %503, label %504

503:                                              ; preds = %499
  br label %555

504:                                              ; preds = %499
  %505 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %506 = load i32, ptr %505, align 4, !tbaa !36
  %507 = icmp eq i32 7, %506
  br i1 %507, label %508, label %509

508:                                              ; preds = %504
  br label %553

509:                                              ; preds = %504
  %510 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %511 = load i32, ptr %510, align 4, !tbaa !36
  %512 = icmp eq i32 8, %511
  br i1 %512, label %513, label %514

513:                                              ; preds = %509
  br label %551

514:                                              ; preds = %509
  %515 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %516 = load i32, ptr %515, align 4, !tbaa !36
  %517 = icmp eq i32 9, %516
  br i1 %517, label %518, label %519

518:                                              ; preds = %514
  br label %549

519:                                              ; preds = %514
  %520 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %521 = load i32, ptr %520, align 4, !tbaa !36
  %522 = icmp eq i32 10, %521
  br i1 %522, label %523, label %524

523:                                              ; preds = %519
  br label %547

524:                                              ; preds = %519
  %525 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %526 = load i32, ptr %525, align 4, !tbaa !36
  %527 = icmp eq i32 11, %526
  br i1 %527, label %528, label %529

528:                                              ; preds = %524
  br label %545

529:                                              ; preds = %524
  %530 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %531 = load i32, ptr %530, align 4, !tbaa !36
  %532 = icmp eq i32 12, %531
  br i1 %532, label %533, label %534

533:                                              ; preds = %529
  br label %543

534:                                              ; preds = %529
  %535 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %536 = load i32, ptr %535, align 4, !tbaa !36
  %537 = icmp eq i32 13, %536
  br i1 %537, label %538, label %539

538:                                              ; preds = %534
  br label %541

539:                                              ; preds = %534
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 304, ptr noundef @__PRETTY_FUNCTION__.create_spmm_inputs) #10
  unreachable

540:                                              ; No predecessors!
  br label %541

541:                                              ; preds = %540, %538
  %542 = phi i32 [ 1, %538 ], [ 0, %540 ]
  br label %543

543:                                              ; preds = %541, %533
  %544 = phi i32 [ 1, %533 ], [ %542, %541 ]
  br label %545

545:                                              ; preds = %543, %528
  %546 = phi i32 [ 2, %528 ], [ %544, %543 ]
  br label %547

547:                                              ; preds = %545, %523
  %548 = phi i32 [ 2, %523 ], [ %546, %545 ]
  br label %549

549:                                              ; preds = %547, %518
  %550 = phi i32 [ 4, %518 ], [ %548, %547 ]
  br label %551

551:                                              ; preds = %549, %513
  %552 = phi i32 [ 4, %513 ], [ %550, %549 ]
  br label %553

553:                                              ; preds = %551, %508
  %554 = phi i32 [ 8, %508 ], [ %552, %551 ]
  br label %555

555:                                              ; preds = %553, %503
  %556 = phi i32 [ 8, %503 ], [ %554, %553 ]
  br label %557

557:                                              ; preds = %555, %498
  %558 = phi i32 [ 1, %498 ], [ %556, %555 ]
  br label %559

559:                                              ; preds = %557, %493
  %560 = phi i32 [ 1, %493 ], [ %558, %557 ]
  br label %561

561:                                              ; preds = %559, %488
  %562 = phi i32 [ 2, %488 ], [ %560, %559 ]
  br label %563

563:                                              ; preds = %561, %483
  %564 = phi i32 [ 2, %483 ], [ %562, %561 ]
  br label %565

565:                                              ; preds = %563, %478
  %566 = phi i32 [ 4, %478 ], [ %564, %563 ]
  br label %567

567:                                              ; preds = %565, %473
  %568 = phi i32 [ 8, %473 ], [ %566, %565 ]
  %569 = mul i32 %469, %568
  %570 = zext i32 %569 to i64
  %571 = call noalias ptr @libxsmm_aligned_malloc(i64 noundef %570, i64 noundef 64)
  store ptr %571, ptr %39, align 8, !tbaa !5
  %572 = load ptr, ptr %37, align 8, !tbaa !5
  %573 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %572, ptr %573, align 8, !tbaa !5
  %574 = load ptr, ptr %38, align 8, !tbaa !5
  %575 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %574, ptr %575, align 8, !tbaa !5
  %576 = load ptr, ptr %39, align 8, !tbaa !5
  %577 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %576, ptr %577, align 8, !tbaa !5
  store i32 0, ptr %35, align 4, !tbaa !12
  %578 = load i32, ptr %33, align 4, !tbaa !12
  %579 = load i32, ptr %21, align 4, !tbaa !12
  %580 = load i32, ptr %22, align 4, !tbaa !12
  %581 = mul nsw i32 %579, %580
  %582 = udiv i32 %578, %581
  %583 = load ptr, ptr %37, align 8, !tbaa !5
  %584 = load i32, ptr %19, align 4, !tbaa !12
  %585 = load i32, ptr %21, align 4, !tbaa !12
  %586 = sdiv i32 %584, %585
  %587 = sext i32 %586 to i64
  %588 = getelementptr inbounds i32, ptr %583, i64 %587
  store i32 %582, ptr %588, align 4, !tbaa !12
  store i32 0, ptr %26, align 4, !tbaa !12
  br label %589

589:                                              ; preds = %735, %567
  %590 = load i32, ptr %26, align 4, !tbaa !12
  %591 = load i32, ptr %19, align 4, !tbaa !12
  %592 = load i32, ptr %21, align 4, !tbaa !12
  %593 = sdiv i32 %591, %592
  %594 = icmp slt i32 %590, %593
  br i1 %594, label %595, label %738

595:                                              ; preds = %589
  %596 = load i32, ptr %35, align 4, !tbaa !12
  %597 = load ptr, ptr %37, align 8, !tbaa !5
  %598 = load i32, ptr %26, align 4, !tbaa !12
  %599 = sext i32 %598 to i64
  %600 = getelementptr inbounds i32, ptr %597, i64 %599
  store i32 %596, ptr %600, align 4, !tbaa !12
  store i32 0, ptr %25, align 4, !tbaa !12
  br label %601

601:                                              ; preds = %731, %595
  %602 = load i32, ptr %25, align 4, !tbaa !12
  %603 = load i32, ptr %20, align 4, !tbaa !12
  %604 = load i32, ptr %22, align 4, !tbaa !12
  %605 = sdiv i32 %603, %604
  %606 = icmp slt i32 %602, %605
  br i1 %606, label %607, label %734

607:                                              ; preds = %601
  %608 = load i32, ptr %26, align 4, !tbaa !12
  %609 = load i32, ptr %20, align 4, !tbaa !12
  %610 = load i32, ptr %22, align 4, !tbaa !12
  %611 = sdiv i32 %609, %610
  %612 = mul nsw i32 %608, %611
  %613 = load i32, ptr %25, align 4, !tbaa !12
  %614 = add nsw i32 %612, %613
  %615 = sext i32 %614 to i64
  %616 = load i64, ptr %32, align 8, !tbaa !23
  %617 = trunc i64 %616 to i32
  %618 = load ptr, ptr %31, align 8, !tbaa !5
  %619 = call i32 @is_dense_grid_point(i64 noundef %615, i32 noundef %617, ptr noundef %618)
  %620 = icmp sgt i32 %619, 0
  br i1 %620, label %621, label %730

621:                                              ; preds = %607
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #8
  %622 = load i32, ptr %26, align 4, !tbaa !12
  %623 = load i32, ptr %21, align 4, !tbaa !12
  %624 = mul nsw i32 %622, %623
  store i32 %624, ptr %51, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #8
  %625 = load i32, ptr %25, align 4, !tbaa !12
  %626 = load i32, ptr %22, align 4, !tbaa !12
  %627 = mul nsw i32 %625, %626
  store i32 %627, ptr %52, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #8
  store i32 0, ptr %53, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #8
  store i32 0, ptr %54, align 4, !tbaa !12
  %628 = load i32, ptr %25, align 4, !tbaa !12
  %629 = load ptr, ptr %38, align 8, !tbaa !5
  %630 = load i32, ptr %35, align 4, !tbaa !12
  %631 = zext i32 %630 to i64
  %632 = getelementptr inbounds i32, ptr %629, i64 %631
  store i32 %628, ptr %632, align 4, !tbaa !12
  store i32 0, ptr %53, align 4, !tbaa !12
  br label %633

633:                                              ; preds = %724, %621
  %634 = load i32, ptr %53, align 4, !tbaa !12
  %635 = load i32, ptr %21, align 4, !tbaa !12
  %636 = icmp ult i32 %634, %635
  br i1 %636, label %637, label %727

637:                                              ; preds = %633
  store i32 0, ptr %54, align 4, !tbaa !12
  br label %638

638:                                              ; preds = %720, %637
  %639 = load i32, ptr %54, align 4, !tbaa !12
  %640 = load i32, ptr %22, align 4, !tbaa !12
  %641 = icmp ult i32 %639, %640
  br i1 %641, label %642, label %723

642:                                              ; preds = %638
  %643 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %644 = load i32, ptr %643, align 4, !tbaa !36
  %645 = icmp eq i32 %644, 1
  br i1 %645, label %646, label %666

646:                                              ; preds = %642
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #8
  %647 = load ptr, ptr %12, align 8, !tbaa !5
  %648 = load i32, ptr %51, align 4, !tbaa !12
  %649 = load i32, ptr %53, align 4, !tbaa !12
  %650 = add i32 %648, %649
  %651 = load i32, ptr %20, align 4, !tbaa !12
  %652 = mul i32 %650, %651
  %653 = load i32, ptr %52, align 4, !tbaa !12
  %654 = load i32, ptr %54, align 4, !tbaa !12
  %655 = add i32 %653, %654
  %656 = add i32 %652, %655
  %657 = zext i32 %656 to i64
  %658 = getelementptr inbounds float, ptr %647, i64 %657
  store ptr %658, ptr %55, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #8
  %659 = load ptr, ptr %39, align 8, !tbaa !5
  %660 = load i32, ptr %34, align 4, !tbaa !12
  %661 = zext i32 %660 to i64
  %662 = getelementptr inbounds float, ptr %659, i64 %661
  store ptr %662, ptr %56, align 8, !tbaa !5
  %663 = load ptr, ptr %55, align 8, !tbaa !5
  %664 = load float, ptr %663, align 4, !tbaa !37
  %665 = load ptr, ptr %56, align 8, !tbaa !5
  store float %664, ptr %665, align 4, !tbaa !37
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #8
  br label %717

666:                                              ; preds = %642
  %667 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %668 = load i32, ptr %667, align 4, !tbaa !36
  %669 = icmp eq i32 %668, 2
  br i1 %669, label %670, label %690

670:                                              ; preds = %666
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #8
  %671 = load ptr, ptr %12, align 8, !tbaa !5
  %672 = load i32, ptr %51, align 4, !tbaa !12
  %673 = load i32, ptr %53, align 4, !tbaa !12
  %674 = add i32 %672, %673
  %675 = load i32, ptr %20, align 4, !tbaa !12
  %676 = mul i32 %674, %675
  %677 = load i32, ptr %52, align 4, !tbaa !12
  %678 = load i32, ptr %54, align 4, !tbaa !12
  %679 = add i32 %677, %678
  %680 = add i32 %676, %679
  %681 = zext i32 %680 to i64
  %682 = getelementptr inbounds i16, ptr %671, i64 %681
  store ptr %682, ptr %57, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #8
  %683 = load ptr, ptr %39, align 8, !tbaa !5
  %684 = load i32, ptr %34, align 4, !tbaa !12
  %685 = zext i32 %684 to i64
  %686 = getelementptr inbounds i16, ptr %683, i64 %685
  store ptr %686, ptr %58, align 8, !tbaa !5
  %687 = load ptr, ptr %57, align 8, !tbaa !5
  %688 = load i16, ptr %687, align 2, !tbaa !27
  %689 = load ptr, ptr %58, align 8, !tbaa !5
  store i16 %688, ptr %689, align 2, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #8
  br label %716

690:                                              ; preds = %666
  %691 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %692 = load i32, ptr %691, align 4, !tbaa !36
  %693 = icmp eq i32 %692, 12
  br i1 %693, label %694, label %714

694:                                              ; preds = %690
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #8
  %695 = load ptr, ptr %12, align 8, !tbaa !5
  %696 = load i32, ptr %51, align 4, !tbaa !12
  %697 = load i32, ptr %53, align 4, !tbaa !12
  %698 = add i32 %696, %697
  %699 = load i32, ptr %20, align 4, !tbaa !12
  %700 = mul i32 %698, %699
  %701 = load i32, ptr %52, align 4, !tbaa !12
  %702 = load i32, ptr %54, align 4, !tbaa !12
  %703 = add i32 %701, %702
  %704 = add i32 %700, %703
  %705 = zext i32 %704 to i64
  %706 = getelementptr inbounds i8, ptr %695, i64 %705
  store ptr %706, ptr %59, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #8
  %707 = load ptr, ptr %39, align 8, !tbaa !5
  %708 = load i32, ptr %34, align 4, !tbaa !12
  %709 = zext i32 %708 to i64
  %710 = getelementptr inbounds i8, ptr %707, i64 %709
  store ptr %710, ptr %60, align 8, !tbaa !5
  %711 = load ptr, ptr %59, align 8, !tbaa !5
  %712 = load i8, ptr %711, align 1, !tbaa !29
  %713 = load ptr, ptr %60, align 8, !tbaa !5
  store i8 %712, ptr %713, align 1, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #8
  br label %715

714:                                              ; preds = %690
  br label %715

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

716:                                              ; preds = %715, %670
  br label %717

717:                                              ; preds = %716, %646
  %718 = load i32, ptr %34, align 4, !tbaa !12
  %719 = add i32 %718, 1
  store i32 %719, ptr %34, align 4, !tbaa !12
  br label %720

720:                                              ; preds = %717
  %721 = load i32, ptr %54, align 4, !tbaa !12
  %722 = add i32 %721, 1
  store i32 %722, ptr %54, align 4, !tbaa !12
  br label %638, !llvm.loop !43

723:                                              ; preds = %638
  br label %724

724:                                              ; preds = %723
  %725 = load i32, ptr %53, align 4, !tbaa !12
  %726 = add i32 %725, 1
  store i32 %726, ptr %53, align 4, !tbaa !12
  br label %633, !llvm.loop !44

727:                                              ; preds = %633
  %728 = load i32, ptr %35, align 4, !tbaa !12
  %729 = add i32 %728, 1
  store i32 %729, ptr %35, align 4, !tbaa !12
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #8
  br label %730

730:                                              ; preds = %727, %607
  br label %731

731:                                              ; preds = %730
  %732 = load i32, ptr %25, align 4, !tbaa !12
  %733 = add nsw i32 %732, 1
  store i32 %733, ptr %25, align 4, !tbaa !12
  br label %601, !llvm.loop !45

734:                                              ; preds = %601
  br label %735

735:                                              ; preds = %734
  %736 = load i32, ptr %26, align 4, !tbaa !12
  %737 = add nsw i32 %736, 1
  store i32 %737, ptr %26, align 4, !tbaa !12
  br label %589, !llvm.loop !46

738:                                              ; preds = %589
  %739 = load i32, ptr %23, align 4, !tbaa !12
  %740 = icmp sgt i32 %739, 0
  br i1 %740, label %741, label %1178

741:                                              ; preds = %738
  %742 = load i32, ptr %24, align 4, !tbaa !12
  %743 = icmp sgt i32 %742, 0
  br i1 %743, label %744, label %1178

744:                                              ; preds = %741
  call void @llvm.lifetime.start.p0(i64 4, ptr %61) #8
  store i32 0, ptr %61, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %62) #8
  store i32 0, ptr %62, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %63) #8
  %745 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %746 = load i32, ptr %745, align 4, !tbaa !36
  %747 = call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %746)
  store i32 %747, ptr %63, align 4, !tbaa !12
  store i32 0, ptr %26, align 4, !tbaa !12
  br label %748

748:                                              ; preds = %1174, %744
  %749 = load i32, ptr %26, align 4, !tbaa !12
  %750 = load i32, ptr %33, align 4, !tbaa !12
  %751 = load i32, ptr %22, align 4, !tbaa !12
  %752 = load i32, ptr %21, align 4, !tbaa !12
  %753 = mul nsw i32 %751, %752
  %754 = udiv i32 %750, %753
  %755 = icmp ult i32 %749, %754
  br i1 %755, label %756, label %1177

756:                                              ; preds = %748
  %757 = load i32, ptr %22, align 4, !tbaa !12
  %758 = load i32, ptr %21, align 4, !tbaa !12
  %759 = mul nsw i32 %757, %758
  %760 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %761 = load i32, ptr %760, align 4, !tbaa !36
  %762 = icmp eq i32 0, %761
  br i1 %762, label %763, label %764

763:                                              ; preds = %756
  br label %857

764:                                              ; preds = %756
  %765 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %766 = load i32, ptr %765, align 4, !tbaa !36
  %767 = icmp eq i32 1, %766
  br i1 %767, label %768, label %769

768:                                              ; preds = %764
  br label %855

769:                                              ; preds = %764
  %770 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %771 = load i32, ptr %770, align 4, !tbaa !36
  %772 = icmp eq i32 2, %771
  br i1 %772, label %773, label %774

773:                                              ; preds = %769
  br label %853

774:                                              ; preds = %769
  %775 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %776 = load i32, ptr %775, align 4, !tbaa !36
  %777 = icmp eq i32 3, %776
  br i1 %777, label %778, label %779

778:                                              ; preds = %774
  br label %851

779:                                              ; preds = %774
  %780 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %781 = load i32, ptr %780, align 4, !tbaa !36
  %782 = icmp eq i32 4, %781
  br i1 %782, label %783, label %784

783:                                              ; preds = %779
  br label %849

784:                                              ; preds = %779
  %785 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %786 = load i32, ptr %785, align 4, !tbaa !36
  %787 = icmp eq i32 5, %786
  br i1 %787, label %788, label %789

788:                                              ; preds = %784
  br label %847

789:                                              ; preds = %784
  %790 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %791 = load i32, ptr %790, align 4, !tbaa !36
  %792 = icmp eq i32 6, %791
  br i1 %792, label %793, label %794

793:                                              ; preds = %789
  br label %845

794:                                              ; preds = %789
  %795 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %796 = load i32, ptr %795, align 4, !tbaa !36
  %797 = icmp eq i32 7, %796
  br i1 %797, label %798, label %799

798:                                              ; preds = %794
  br label %843

799:                                              ; preds = %794
  %800 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %801 = load i32, ptr %800, align 4, !tbaa !36
  %802 = icmp eq i32 8, %801
  br i1 %802, label %803, label %804

803:                                              ; preds = %799
  br label %841

804:                                              ; preds = %799
  %805 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %806 = load i32, ptr %805, align 4, !tbaa !36
  %807 = icmp eq i32 9, %806
  br i1 %807, label %808, label %809

808:                                              ; preds = %804
  br label %839

809:                                              ; preds = %804
  %810 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %811 = load i32, ptr %810, align 4, !tbaa !36
  %812 = icmp eq i32 10, %811
  br i1 %812, label %813, label %814

813:                                              ; preds = %809
  br label %837

814:                                              ; preds = %809
  %815 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %816 = load i32, ptr %815, align 4, !tbaa !36
  %817 = icmp eq i32 11, %816
  br i1 %817, label %818, label %819

818:                                              ; preds = %814
  br label %835

819:                                              ; preds = %814
  %820 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %821 = load i32, ptr %820, align 4, !tbaa !36
  %822 = icmp eq i32 12, %821
  br i1 %822, label %823, label %824

823:                                              ; preds = %819
  br label %833

824:                                              ; preds = %819
  %825 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %826 = load i32, ptr %825, align 4, !tbaa !36
  %827 = icmp eq i32 13, %826
  br i1 %827, label %828, label %829

828:                                              ; preds = %824
  br label %831

829:                                              ; preds = %824
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 349, ptr noundef @__PRETTY_FUNCTION__.create_spmm_inputs) #10
  unreachable

830:                                              ; No predecessors!
  br label %831

831:                                              ; preds = %830, %828
  %832 = phi i32 [ 1, %828 ], [ 0, %830 ]
  br label %833

833:                                              ; preds = %831, %823
  %834 = phi i32 [ 1, %823 ], [ %832, %831 ]
  br label %835

835:                                              ; preds = %833, %818
  %836 = phi i32 [ 2, %818 ], [ %834, %833 ]
  br label %837

837:                                              ; preds = %835, %813
  %838 = phi i32 [ 2, %813 ], [ %836, %835 ]
  br label %839

839:                                              ; preds = %837, %808
  %840 = phi i32 [ 4, %808 ], [ %838, %837 ]
  br label %841

841:                                              ; preds = %839, %803
  %842 = phi i32 [ 4, %803 ], [ %840, %839 ]
  br label %843

843:                                              ; preds = %841, %798
  %844 = phi i32 [ 8, %798 ], [ %842, %841 ]
  br label %845

845:                                              ; preds = %843, %793
  %846 = phi i32 [ 8, %793 ], [ %844, %843 ]
  br label %847

847:                                              ; preds = %845, %788
  %848 = phi i32 [ 1, %788 ], [ %846, %845 ]
  br label %849

849:                                              ; preds = %847, %783
  %850 = phi i32 [ 1, %783 ], [ %848, %847 ]
  br label %851

851:                                              ; preds = %849, %778
  %852 = phi i32 [ 2, %778 ], [ %850, %849 ]
  br label %853

853:                                              ; preds = %851, %773
  %854 = phi i32 [ 2, %773 ], [ %852, %851 ]
  br label %855

855:                                              ; preds = %853, %768
  %856 = phi i32 [ 4, %768 ], [ %854, %853 ]
  br label %857

857:                                              ; preds = %855, %763
  %858 = phi i32 [ 8, %763 ], [ %856, %855 ]
  %859 = mul nsw i32 %759, %858
  %860 = zext i32 %859 to i64
  %861 = call ptr @llvm.stacksave.p0()
  store ptr %861, ptr %64, align 8
  %862 = alloca i8, i64 %860, align 16
  store i64 %860, ptr %65, align 8
  %863 = load ptr, ptr %39, align 8, !tbaa !5
  %864 = load i32, ptr %26, align 4, !tbaa !12
  %865 = load i32, ptr %22, align 4, !tbaa !12
  %866 = load i32, ptr %21, align 4, !tbaa !12
  %867 = mul nsw i32 %865, %866
  %868 = mul nsw i32 %864, %867
  %869 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %870 = load i32, ptr %869, align 4, !tbaa !36
  %871 = icmp eq i32 0, %870
  br i1 %871, label %872, label %873

872:                                              ; preds = %857
  br label %966

873:                                              ; preds = %857
  %874 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %875 = load i32, ptr %874, align 4, !tbaa !36
  %876 = icmp eq i32 1, %875
  br i1 %876, label %877, label %878

877:                                              ; preds = %873
  br label %964

878:                                              ; preds = %873
  %879 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %880 = load i32, ptr %879, align 4, !tbaa !36
  %881 = icmp eq i32 2, %880
  br i1 %881, label %882, label %883

882:                                              ; preds = %878
  br label %962

883:                                              ; preds = %878
  %884 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %885 = load i32, ptr %884, align 4, !tbaa !36
  %886 = icmp eq i32 3, %885
  br i1 %886, label %887, label %888

887:                                              ; preds = %883
  br label %960

888:                                              ; preds = %883
  %889 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %890 = load i32, ptr %889, align 4, !tbaa !36
  %891 = icmp eq i32 4, %890
  br i1 %891, label %892, label %893

892:                                              ; preds = %888
  br label %958

893:                                              ; preds = %888
  %894 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %895 = load i32, ptr %894, align 4, !tbaa !36
  %896 = icmp eq i32 5, %895
  br i1 %896, label %897, label %898

897:                                              ; preds = %893
  br label %956

898:                                              ; preds = %893
  %899 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %900 = load i32, ptr %899, align 4, !tbaa !36
  %901 = icmp eq i32 6, %900
  br i1 %901, label %902, label %903

902:                                              ; preds = %898
  br label %954

903:                                              ; preds = %898
  %904 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %905 = load i32, ptr %904, align 4, !tbaa !36
  %906 = icmp eq i32 7, %905
  br i1 %906, label %907, label %908

907:                                              ; preds = %903
  br label %952

908:                                              ; preds = %903
  %909 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %910 = load i32, ptr %909, align 4, !tbaa !36
  %911 = icmp eq i32 8, %910
  br i1 %911, label %912, label %913

912:                                              ; preds = %908
  br label %950

913:                                              ; preds = %908
  %914 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %915 = load i32, ptr %914, align 4, !tbaa !36
  %916 = icmp eq i32 9, %915
  br i1 %916, label %917, label %918

917:                                              ; preds = %913
  br label %948

918:                                              ; preds = %913
  %919 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %920 = load i32, ptr %919, align 4, !tbaa !36
  %921 = icmp eq i32 10, %920
  br i1 %921, label %922, label %923

922:                                              ; preds = %918
  br label %946

923:                                              ; preds = %918
  %924 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %925 = load i32, ptr %924, align 4, !tbaa !36
  %926 = icmp eq i32 11, %925
  br i1 %926, label %927, label %928

927:                                              ; preds = %923
  br label %944

928:                                              ; preds = %923
  %929 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %930 = load i32, ptr %929, align 4, !tbaa !36
  %931 = icmp eq i32 12, %930
  br i1 %931, label %932, label %933

932:                                              ; preds = %928
  br label %942

933:                                              ; preds = %928
  %934 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %935 = load i32, ptr %934, align 4, !tbaa !36
  %936 = icmp eq i32 13, %935
  br i1 %936, label %937, label %938

937:                                              ; preds = %933
  br label %940

938:                                              ; preds = %933
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 350, ptr noundef @__PRETTY_FUNCTION__.create_spmm_inputs) #10
  unreachable

939:                                              ; No predecessors!
  br label %940

940:                                              ; preds = %939, %937
  %941 = phi i32 [ 1, %937 ], [ 0, %939 ]
  br label %942

942:                                              ; preds = %940, %932
  %943 = phi i32 [ 1, %932 ], [ %941, %940 ]
  br label %944

944:                                              ; preds = %942, %927
  %945 = phi i32 [ 2, %927 ], [ %943, %942 ]
  br label %946

946:                                              ; preds = %944, %922
  %947 = phi i32 [ 2, %922 ], [ %945, %944 ]
  br label %948

948:                                              ; preds = %946, %917
  %949 = phi i32 [ 4, %917 ], [ %947, %946 ]
  br label %950

950:                                              ; preds = %948, %912
  %951 = phi i32 [ 4, %912 ], [ %949, %948 ]
  br label %952

952:                                              ; preds = %950, %907
  %953 = phi i32 [ 8, %907 ], [ %951, %950 ]
  br label %954

954:                                              ; preds = %952, %902
  %955 = phi i32 [ 8, %902 ], [ %953, %952 ]
  br label %956

956:                                              ; preds = %954, %897
  %957 = phi i32 [ 1, %897 ], [ %955, %954 ]
  br label %958

958:                                              ; preds = %956, %892
  %959 = phi i32 [ 1, %892 ], [ %957, %956 ]
  br label %960

960:                                              ; preds = %958, %887
  %961 = phi i32 [ 2, %887 ], [ %959, %958 ]
  br label %962

962:                                              ; preds = %960, %882
  %963 = phi i32 [ 2, %882 ], [ %961, %960 ]
  br label %964

964:                                              ; preds = %962, %877
  %965 = phi i32 [ 4, %877 ], [ %963, %962 ]
  br label %966

966:                                              ; preds = %964, %872
  %967 = phi i32 [ 8, %872 ], [ %965, %964 ]
  %968 = mul nsw i32 %868, %967
  %969 = sext i32 %968 to i64
  %970 = getelementptr inbounds i8, ptr %863, i64 %969
  %971 = load i32, ptr %22, align 4, !tbaa !12
  %972 = load i32, ptr %21, align 4, !tbaa !12
  %973 = mul nsw i32 %971, %972
  %974 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %975 = load i32, ptr %974, align 4, !tbaa !36
  %976 = icmp eq i32 0, %975
  br i1 %976, label %977, label %978

977:                                              ; preds = %966
  br label %1071

978:                                              ; preds = %966
  %979 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %980 = load i32, ptr %979, align 4, !tbaa !36
  %981 = icmp eq i32 1, %980
  br i1 %981, label %982, label %983

982:                                              ; preds = %978
  br label %1069

983:                                              ; preds = %978
  %984 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %985 = load i32, ptr %984, align 4, !tbaa !36
  %986 = icmp eq i32 2, %985
  br i1 %986, label %987, label %988

987:                                              ; preds = %983
  br label %1067

988:                                              ; preds = %983
  %989 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %990 = load i32, ptr %989, align 4, !tbaa !36
  %991 = icmp eq i32 3, %990
  br i1 %991, label %992, label %993

992:                                              ; preds = %988
  br label %1065

993:                                              ; preds = %988
  %994 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %995 = load i32, ptr %994, align 4, !tbaa !36
  %996 = icmp eq i32 4, %995
  br i1 %996, label %997, label %998

997:                                              ; preds = %993
  br label %1063

998:                                              ; preds = %993
  %999 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1000 = load i32, ptr %999, align 4, !tbaa !36
  %1001 = icmp eq i32 5, %1000
  br i1 %1001, label %1002, label %1003

1002:                                             ; preds = %998
  br label %1061

1003:                                             ; preds = %998
  %1004 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1005 = load i32, ptr %1004, align 4, !tbaa !36
  %1006 = icmp eq i32 6, %1005
  br i1 %1006, label %1007, label %1008

1007:                                             ; preds = %1003
  br label %1059

1008:                                             ; preds = %1003
  %1009 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1010 = load i32, ptr %1009, align 4, !tbaa !36
  %1011 = icmp eq i32 7, %1010
  br i1 %1011, label %1012, label %1013

1012:                                             ; preds = %1008
  br label %1057

1013:                                             ; preds = %1008
  %1014 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1015 = load i32, ptr %1014, align 4, !tbaa !36
  %1016 = icmp eq i32 8, %1015
  br i1 %1016, label %1017, label %1018

1017:                                             ; preds = %1013
  br label %1055

1018:                                             ; preds = %1013
  %1019 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1020 = load i32, ptr %1019, align 4, !tbaa !36
  %1021 = icmp eq i32 9, %1020
  br i1 %1021, label %1022, label %1023

1022:                                             ; preds = %1018
  br label %1053

1023:                                             ; preds = %1018
  %1024 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1025 = load i32, ptr %1024, align 4, !tbaa !36
  %1026 = icmp eq i32 10, %1025
  br i1 %1026, label %1027, label %1028

1027:                                             ; preds = %1023
  br label %1051

1028:                                             ; preds = %1023
  %1029 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1030 = load i32, ptr %1029, align 4, !tbaa !36
  %1031 = icmp eq i32 11, %1030
  br i1 %1031, label %1032, label %1033

1032:                                             ; preds = %1028
  br label %1049

1033:                                             ; preds = %1028
  %1034 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1035 = load i32, ptr %1034, align 4, !tbaa !36
  %1036 = icmp eq i32 12, %1035
  br i1 %1036, label %1037, label %1038

1037:                                             ; preds = %1033
  br label %1047

1038:                                             ; preds = %1033
  %1039 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1040 = load i32, ptr %1039, align 4, !tbaa !36
  %1041 = icmp eq i32 13, %1040
  br i1 %1041, label %1042, label %1043

1042:                                             ; preds = %1038
  br label %1045

1043:                                             ; preds = %1038
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 350, ptr noundef @__PRETTY_FUNCTION__.create_spmm_inputs) #10
  unreachable

1044:                                             ; No predecessors!
  br label %1045

1045:                                             ; preds = %1044, %1042
  %1046 = phi i32 [ 1, %1042 ], [ 0, %1044 ]
  br label %1047

1047:                                             ; preds = %1045, %1037
  %1048 = phi i32 [ 1, %1037 ], [ %1046, %1045 ]
  br label %1049

1049:                                             ; preds = %1047, %1032
  %1050 = phi i32 [ 2, %1032 ], [ %1048, %1047 ]
  br label %1051

1051:                                             ; preds = %1049, %1027
  %1052 = phi i32 [ 2, %1027 ], [ %1050, %1049 ]
  br label %1053

1053:                                             ; preds = %1051, %1022
  %1054 = phi i32 [ 4, %1022 ], [ %1052, %1051 ]
  br label %1055

1055:                                             ; preds = %1053, %1017
  %1056 = phi i32 [ 4, %1017 ], [ %1054, %1053 ]
  br label %1057

1057:                                             ; preds = %1055, %1012
  %1058 = phi i32 [ 8, %1012 ], [ %1056, %1055 ]
  br label %1059

1059:                                             ; preds = %1057, %1007
  %1060 = phi i32 [ 8, %1007 ], [ %1058, %1057 ]
  br label %1061

1061:                                             ; preds = %1059, %1002
  %1062 = phi i32 [ 1, %1002 ], [ %1060, %1059 ]
  br label %1063

1063:                                             ; preds = %1061, %997
  %1064 = phi i32 [ 1, %997 ], [ %1062, %1061 ]
  br label %1065

1065:                                             ; preds = %1063, %992
  %1066 = phi i32 [ 2, %992 ], [ %1064, %1063 ]
  br label %1067

1067:                                             ; preds = %1065, %987
  %1068 = phi i32 [ 2, %987 ], [ %1066, %1065 ]
  br label %1069

1069:                                             ; preds = %1067, %982
  %1070 = phi i32 [ 4, %982 ], [ %1068, %1067 ]
  br label %1071

1071:                                             ; preds = %1069, %977
  %1072 = phi i32 [ 8, %977 ], [ %1070, %1069 ]
  %1073 = mul nsw i32 %973, %1072
  %1074 = sext i32 %1073 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %862, ptr align 1 %970, i64 %1074, i1 false)
  store i32 0, ptr %61, align 4, !tbaa !12
  br label %1075

1075:                                             ; preds = %1169, %1071
  %1076 = load i32, ptr %61, align 4, !tbaa !12
  %1077 = load i32, ptr %21, align 4, !tbaa !12
  %1078 = icmp ult i32 %1076, %1077
  br i1 %1078, label %1079, label %1172

1079:                                             ; preds = %1075
  store i32 0, ptr %62, align 4, !tbaa !12
  br label %1080

1080:                                             ; preds = %1165, %1079
  %1081 = load i32, ptr %62, align 4, !tbaa !12
  %1082 = load i32, ptr %22, align 4, !tbaa !12
  %1083 = icmp ult i32 %1081, %1082
  br i1 %1083, label %1084, label %1168

1084:                                             ; preds = %1080
  %1085 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1086 = load i32, ptr %1085, align 4, !tbaa !36
  %1087 = icmp eq i32 %1086, 2
  br i1 %1087, label %1088, label %1123

1088:                                             ; preds = %1084
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #8
  store ptr %862, ptr %66, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #8
  %1089 = load ptr, ptr %39, align 8, !tbaa !5
  store ptr %1089, ptr %67, align 8, !tbaa !5
  %1090 = load ptr, ptr %66, align 8, !tbaa !5
  %1091 = load i32, ptr %61, align 4, !tbaa !12
  %1092 = load i32, ptr %22, align 4, !tbaa !12
  %1093 = mul i32 %1091, %1092
  %1094 = load i32, ptr %62, align 4, !tbaa !12
  %1095 = add i32 %1093, %1094
  %1096 = zext i32 %1095 to i64
  %1097 = getelementptr inbounds i16, ptr %1090, i64 %1096
  %1098 = load i16, ptr %1097, align 2, !tbaa !27
  %1099 = load ptr, ptr %67, align 8, !tbaa !5
  %1100 = load i32, ptr %26, align 4, !tbaa !12
  %1101 = load i32, ptr %22, align 4, !tbaa !12
  %1102 = load i32, ptr %21, align 4, !tbaa !12
  %1103 = mul nsw i32 %1101, %1102
  %1104 = mul nsw i32 %1100, %1103
  %1105 = load i32, ptr %62, align 4, !tbaa !12
  %1106 = load i32, ptr %63, align 4, !tbaa !12
  %1107 = udiv i32 %1105, %1106
  %1108 = load i32, ptr %21, align 4, !tbaa !12
  %1109 = load i32, ptr %63, align 4, !tbaa !12
  %1110 = mul nsw i32 %1108, %1109
  %1111 = mul i32 %1107, %1110
  %1112 = add i32 %1104, %1111
  %1113 = load i32, ptr %61, align 4, !tbaa !12
  %1114 = load i32, ptr %63, align 4, !tbaa !12
  %1115 = mul i32 %1113, %1114
  %1116 = add i32 %1112, %1115
  %1117 = load i32, ptr %62, align 4, !tbaa !12
  %1118 = load i32, ptr %63, align 4, !tbaa !12
  %1119 = urem i32 %1117, %1118
  %1120 = add i32 %1116, %1119
  %1121 = zext i32 %1120 to i64
  %1122 = getelementptr inbounds i16, ptr %1099, i64 %1121
  store i16 %1098, ptr %1122, align 2, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #8
  br label %1164

1123:                                             ; preds = %1084
  %1124 = getelementptr inbounds %struct.spmm_def, ptr %17, i32 0, i32 1
  %1125 = load i32, ptr %1124, align 4, !tbaa !36
  %1126 = icmp eq i32 %1125, 12
  br i1 %1126, label %1127, label %1162

1127:                                             ; preds = %1123
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #8
  store ptr %862, ptr %68, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %69) #8
  %1128 = load ptr, ptr %39, align 8, !tbaa !5
  store ptr %1128, ptr %69, align 8, !tbaa !5
  %1129 = load ptr, ptr %68, align 8, !tbaa !5
  %1130 = load i32, ptr %61, align 4, !tbaa !12
  %1131 = load i32, ptr %22, align 4, !tbaa !12
  %1132 = mul i32 %1130, %1131
  %1133 = load i32, ptr %62, align 4, !tbaa !12
  %1134 = add i32 %1132, %1133
  %1135 = zext i32 %1134 to i64
  %1136 = getelementptr inbounds i8, ptr %1129, i64 %1135
  %1137 = load i8, ptr %1136, align 1, !tbaa !29
  %1138 = load ptr, ptr %69, align 8, !tbaa !5
  %1139 = load i32, ptr %26, align 4, !tbaa !12
  %1140 = load i32, ptr %22, align 4, !tbaa !12
  %1141 = load i32, ptr %21, align 4, !tbaa !12
  %1142 = mul nsw i32 %1140, %1141
  %1143 = mul nsw i32 %1139, %1142
  %1144 = load i32, ptr %62, align 4, !tbaa !12
  %1145 = load i32, ptr %63, align 4, !tbaa !12
  %1146 = udiv i32 %1144, %1145
  %1147 = load i32, ptr %21, align 4, !tbaa !12
  %1148 = load i32, ptr %63, align 4, !tbaa !12
  %1149 = mul nsw i32 %1147, %1148
  %1150 = mul i32 %1146, %1149
  %1151 = add i32 %1143, %1150
  %1152 = load i32, ptr %61, align 4, !tbaa !12
  %1153 = load i32, ptr %63, align 4, !tbaa !12
  %1154 = mul i32 %1152, %1153
  %1155 = add i32 %1151, %1154
  %1156 = load i32, ptr %62, align 4, !tbaa !12
  %1157 = load i32, ptr %63, align 4, !tbaa !12
  %1158 = urem i32 %1156, %1157
  %1159 = add i32 %1155, %1158
  %1160 = zext i32 %1159 to i64
  %1161 = getelementptr inbounds i8, ptr %1138, i64 %1160
  store i8 %1137, ptr %1161, align 1, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #8
  br label %1163

1162:                                             ; preds = %1123
  br label %1163

1163:                                             ; preds = %1162, %1127
  br label %1164

1164:                                             ; preds = %1163, %1088
  br label %1165

1165:                                             ; preds = %1164
  %1166 = load i32, ptr %62, align 4, !tbaa !12
  %1167 = add i32 %1166, 1
  store i32 %1167, ptr %62, align 4, !tbaa !12
  br label %1080, !llvm.loop !47

1168:                                             ; preds = %1080
  br label %1169

1169:                                             ; preds = %1168
  %1170 = load i32, ptr %61, align 4, !tbaa !12
  %1171 = add i32 %1170, 1
  store i32 %1171, ptr %61, align 4, !tbaa !12
  br label %1075, !llvm.loop !48

1172:                                             ; preds = %1075
  %1173 = load ptr, ptr %64, align 8
  call void @llvm.stackrestore.p0(ptr %1173)
  br label %1174

1174:                                             ; preds = %1172
  %1175 = load i32, ptr %26, align 4, !tbaa !12
  %1176 = add nsw i32 %1175, 1
  store i32 %1176, ptr %26, align 4, !tbaa !12
  br label %748, !llvm.loop !49

1177:                                             ; preds = %748
  call void @llvm.lifetime.end.p0(i64 4, ptr %63) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %62) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %61) #8
  br label %1178

1178:                                             ; preds = %1177, %741, %738
  %1179 = load ptr, ptr %31, align 8, !tbaa !5
  call void @free(ptr noundef %1179) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 88, ptr %17) #8
  ret void
}

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

declare i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef) #4

declare void @qsort(ptr noundef, i64 noundef, i64 noundef, ptr noundef) #4

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

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

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #6

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #6

; Function Attrs: nounwind
declare void @free(ptr noundef) #7

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

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

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


; 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 [27 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [76 x i8], align 1
@__PRETTY_FUNCTION__.create_spmm_inputs = external hidden unnamed_addr constant [111 x i8], align 1
@switch.table.create_spmm_inputs = private unnamed_addr constant [11 x i32] [i32 2, i32 2, i32 1, i32 2, i32 8, i32 2, i32 4, i32 2, i32 2, i32 2, i32 1], align 4

; Function Attrs: nounwind uwtable
declare dso_local i32 @ullcompare(ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare dso_local void @shuffle_array(ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local i32 @is_dense_grid_point(i64 noundef, i32 noundef, ptr noundef) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local void @create_spmm_inputs(ptr nocapture noundef readonly %0, double noundef %1, ptr nocapture noundef readonly %2, ptr nocapture noundef %3, ptr nocapture noundef writeonly %4, ptr nocapture noundef writeonly %5, ptr nocapture noundef writeonly %6, ptr nocapture noundef writeonly %7) local_unnamed_addr #0 {
  %9 = ptrtoint ptr %2 to i64
  %10 = ptrtoint ptr %4 to i64
  %11 = ptrtoint ptr %2 to i64
  %12 = ptrtoint ptr %4 to i64
  %.sroa.0.0.copyload = load i32, ptr %0, align 8, !tbaa !5
  %.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 4
  %.sroa.6.0.copyload = load i32, ptr %.sroa.6.0..sroa_idx, align 4, !tbaa !5
  %.sroa.71406.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 16
  %.sroa.71406.0.copyload = load i32, ptr %.sroa.71406.0..sroa_idx, align 8, !tbaa !5
  %.sroa.72.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 20
  %.sroa.72.0.copyload = load i32, ptr %.sroa.72.0..sroa_idx, align 4, !tbaa !5
  %.sroa.73.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 24
  %.sroa.73.0.copyload = load i32, ptr %.sroa.73.0..sroa_idx, align 8, !tbaa !5
  %.sroa.74.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 28
  %.sroa.74.0.copyload = load i32, ptr %.sroa.74.0..sroa_idx, align 4, !tbaa !5
  %.sroa.75.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.75.0.copyload = load i32, ptr %.sroa.75.0..sroa_idx, align 8, !tbaa !5
  %.sroa.76.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 36
  %.sroa.76.0.copyload = load i32, ptr %.sroa.76.0..sroa_idx, align 4, !tbaa !5
  %.sroa.77407.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 52
  %.sroa.77407.0.copyload = load i32, ptr %.sroa.77407.0..sroa_idx, align 4, !tbaa !5
  %.sroa.78408.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 60
  %.sroa.78408.0.copyload = load i32, ptr %.sroa.78408.0..sroa_idx, align 4, !tbaa !5
  %13 = sdiv i32 %.sroa.72.0.copyload, %.sroa.75.0.copyload
  %14 = sdiv i32 %.sroa.73.0.copyload, %.sroa.74.0.copyload
  %15 = mul nsw i32 %14, %13
  %16 = zext i32 %15 to i64
  %17 = shl nuw nsw i64 %16, 3
  %18 = tail call noalias ptr @malloc(i64 noundef %17) #10
  %19 = fsub double 1.000000e+00, %1
  %20 = uitofp i32 %15 to double
  %21 = fmul double %19, %20
  %22 = fptosi double %21 to i64
  %23 = tail call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %.sroa.0.0.copyload) #11
  %.not = icmp eq i32 %23, 1
  br i1 %.not, label %.loopexit500, label %.preheader499

.preheader499:                                    ; preds = %8
  %factor.op.mul = mul i32 %.sroa.73.0.copyload, %.sroa.71406.0.copyload
  %24 = icmp sgt i32 %.sroa.76.0.copyload, 0
  br i1 %24, label %.preheader498.lr.ph, label %.loopexit500

.preheader498.lr.ph:                              ; preds = %.preheader499
  %25 = icmp sgt i32 %.sroa.71406.0.copyload, 0
  %26 = getelementptr inbounds i8, ptr %0, i64 48
  br i1 %25, label %.preheader498.lr.ph.split.us, label %.loopexit500

.preheader498.lr.ph.split.us:                     ; preds = %.preheader498.lr.ph
  %27 = icmp slt i32 %23, 1
  %28 = sdiv i32 %.sroa.73.0.copyload, %23
  %29 = icmp slt i32 %28, 1
  %brmerge = or i1 %29, %27
  br i1 %brmerge, label %.loopexit500, label %.preheader498.us.us.us.preheader

.preheader498.us.us.us.preheader:                 ; preds = %.preheader498.lr.ph.split.us
  %30 = zext nneg i32 %.sroa.71406.0.copyload to i64
  %31 = zext nneg i32 %23 to i64
  %wide.trip.count739 = zext nneg i32 %.sroa.76.0.copyload to i64
  %wide.trip.count712 = zext nneg i32 %.sroa.71406.0.copyload to i64
  %wide.trip.count707 = zext nneg i32 %28 to i64
  %wide.trip.count = zext nneg i32 %23 to i64
  %wide.trip.count727 = zext nneg i32 %.sroa.71406.0.copyload to i64
  %wide.trip.count722 = zext nneg i32 %28 to i64
  %wide.trip.count717 = zext nneg i32 %23 to i64
  %wide.trip.count732 = zext nneg i32 %23 to i64
  %32 = add nsw i64 %wide.trip.count, -1
  %33 = sub i64 %12, %11
  %34 = add nsw i64 %wide.trip.count, -1
  %35 = mul nsw i64 %wide.trip.count, -2
  %min.iters.check904 = icmp ult i32 %23, 16
  %ident.check = icmp ne i32 %.sroa.71406.0.copyload, 1
  %36 = trunc nsw i64 %34 to i32
  %37 = icmp ugt i64 %34, 4294967295
  %n.vec907 = and i64 %wide.trip.count, 2147483632
  %cmp.n914 = icmp eq i64 %n.vec907, %wide.trip.count
  %xtraiter = and i64 %wide.trip.count, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %38 = add nsw i64 %wide.trip.count, -1
  %min.iters.check = icmp ult i32 %23, 16
  %39 = trunc nsw i64 %32 to i32
  %40 = icmp ugt i64 %32, 4294967295
  %diff.check = icmp ult i64 %33, 32
  %n.vec = and i64 %wide.trip.count, 2147483632
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  %xtraiter1037 = and i64 %wide.trip.count, 3
  %lcmp.mod1038.not = icmp eq i64 %xtraiter1037, 0
  br label %.preheader498.us.us.us

.preheader498.us.us.us:                           ; preds = %.preheader498.us.us.us.preheader, %._crit_edge.split.us.split.us.us.us.us
  %indvars.iv736 = phi i64 [ 0, %.preheader498.us.us.us.preheader ], [ %indvars.iv.next737, %._crit_edge.split.us.split.us.us.us.us ]
  %41 = trunc nuw nsw i64 %indvars.iv736 to i32
  %factor.op.mul516.reass.us.us.us = mul i32 %factor.op.mul, %41
  %42 = sext i32 %factor.op.mul516.reass.us.us.us to i64
  %43 = getelementptr inbounds i8, ptr %2, i64 %42
  %44 = getelementptr inbounds i8, ptr %4, i64 %42
  %45 = getelementptr inbounds i16, ptr %2, i64 %42
  %46 = getelementptr inbounds i16, ptr %4, i64 %42
  switch i32 %.sroa.0.0.copyload, label %._crit_edge.split.us.split.us.us.us.us [
    i32 2, label %.preheader497.lr.ph.split.us.split.us.split.us.us.us.us
    i32 12, label %.preheader497.us.us.us539.us.us.us
  ]

._crit_edge.split.us.split.us.us.us.us:           ; preds = %._crit_edge508.split.us.us.us.split.split.us.us.us.us.us, %._crit_edge508.split.us.us.us.split.us.split.us536.us.us.us, %._crit_edge508.split.us.us.us.split.us.split.us.us.us.us.us.us, %.preheader498.us.us.us
  %indvars.iv.next737 = add nuw nsw i64 %indvars.iv736, 1
  %exitcond740.not = icmp eq i64 %indvars.iv.next737, %wide.trip.count739
  br i1 %exitcond740.not, label %.loopexit500, label %.preheader498.us.us.us, !llvm.loop !9

.preheader497.lr.ph.split.us.split.us.split.us.us.us.us: ; preds = %.preheader498.us.us.us
  %47 = load i32, ptr %26, align 8, !tbaa !11
  %48 = icmp sgt i32 %47, 0
  br i1 %48, label %.preheader497.us.us.us.us.us.us.us, label %.preheader497.us.us.us.us558.us.us

.preheader497.us.us.us.us558.us.us:               ; preds = %.preheader497.lr.ph.split.us.split.us.split.us.us.us.us, %._crit_edge508.split.us.us.us.split.us.split.us536.us.us.us
  %indvars.iv724 = phi i64 [ %indvars.iv.next725, %._crit_edge508.split.us.us.us.split.us.split.us536.us.us.us ], [ 0, %.preheader497.lr.ph.split.us.split.us.split.us.us.us.us ]
  %49 = shl nuw i64 %indvars.iv724, 1
  %50 = add i64 %49, %9
  %51 = sub i64 %10, %50
  %52 = trunc nuw nsw i64 %indvars.iv724 to i32
  %invariant.gep880 = getelementptr inbounds i16, ptr %45, i64 %indvars.iv724
  br label %.preheader496.us.us.us.us.us534.us.us.us

.preheader496.us.us.us.us.us534.us.us.us:         ; preds = %._crit_edge.split.us.split.us514.us.us.us.us.us.us.us, %.preheader497.us.us.us.us558.us.us
  %indvars.iv719 = phi i64 [ %indvars.iv.next720, %._crit_edge.split.us.split.us514.us.us.us.us.us.us.us ], [ 0, %.preheader497.us.us.us.us558.us.us ]
  %53 = mul nuw nsw i64 %indvars.iv719, %31
  %54 = trunc nuw nsw i64 %indvars.iv719 to i32
  %55 = mul i32 %.sroa.71406.0.copyload, %54
  %reass.add486.us.us.us.us.us.us.us.us = add i32 %55, %52
  %reass.mul487.us.us.us.us.us.us.us.us = mul i32 %reass.add486.us.us.us.us.us.us.us.us, %23
  br i1 %min.iters.check904, label %scalar.ph903.preheader, label %vector.scevcheck899

vector.scevcheck899:                              ; preds = %.preheader496.us.us.us.us.us534.us.us.us
  %56 = mul i64 %35, %indvars.iv719
  %57 = add i64 %51, %56
  %58 = add nuw i64 %indvars.iv724, %indvars.iv719
  %59 = trunc i64 %58 to i32
  %60 = mul i32 %23, %59
  %61 = sext i32 %60 to i64
  %62 = shl nsw i64 %61, 1
  %63 = add i64 %57, %62
  %64 = add nuw i64 %indvars.iv724, %indvars.iv719
  %65 = trunc i64 %64 to i32
  %66 = mul i32 %23, %65
  %67 = add i32 %66, %36
  %68 = icmp slt i32 %67, %66
  %69 = or i1 %68, %37
  %70 = or i1 %ident.check, %69
  %diff.check901 = icmp ult i64 %63, 32
  %or.cond1024 = select i1 %70, i1 true, i1 %diff.check901
  br i1 %or.cond1024, label %scalar.ph903.preheader, label %vector.ph905

vector.ph905:                                     ; preds = %vector.scevcheck899
  %invariant.gep1063 = getelementptr i16, ptr %invariant.gep880, i64 %53
  br label %vector.body909

vector.body909:                                   ; preds = %vector.body909, %vector.ph905
  %index910 = phi i64 [ 0, %vector.ph905 ], [ %index.next913, %vector.body909 ]
  %71 = trunc i64 %index910 to i32
  %gep1064 = getelementptr i16, ptr %invariant.gep1063, i64 %index910
  %72 = getelementptr inbounds i8, ptr %gep1064, i64 16
  %wide.load911 = load <8 x i16>, ptr %gep1064, align 2, !tbaa !14
  %wide.load912 = load <8 x i16>, ptr %72, align 2, !tbaa !14
  %73 = add i32 %reass.mul487.us.us.us.us.us.us.us.us, %71
  %74 = sext i32 %73 to i64
  %75 = getelementptr inbounds i16, ptr %46, i64 %74
  %76 = getelementptr inbounds i8, ptr %75, i64 16
  store <8 x i16> %wide.load911, ptr %75, align 2, !tbaa !14
  store <8 x i16> %wide.load912, ptr %76, align 2, !tbaa !14
  %index.next913 = add nuw i64 %index910, 16
  %77 = icmp eq i64 %index.next913, %n.vec907
  br i1 %77, label %middle.block902, label %vector.body909, !llvm.loop !16

middle.block902:                                  ; preds = %vector.body909
  br i1 %cmp.n914, label %._crit_edge.split.us.split.us514.us.us.us.us.us.us.us, label %scalar.ph903.preheader

scalar.ph903.preheader:                           ; preds = %middle.block902, %vector.scevcheck899, %.preheader496.us.us.us.us.us534.us.us.us
  %indvars.iv714.ph = phi i64 [ 0, %vector.scevcheck899 ], [ 0, %.preheader496.us.us.us.us.us534.us.us.us ], [ %n.vec907, %middle.block902 ]
  br i1 %lcmp.mod.not, label %scalar.ph903.prol.loopexit, label %scalar.ph903.prol

scalar.ph903.prol:                                ; preds = %scalar.ph903.preheader
  %78 = add nuw nsw i64 %indvars.iv714.ph, %53
  %79 = mul nuw nsw i64 %78, %30
  %gep881.prol = getelementptr inbounds i16, ptr %invariant.gep880, i64 %79
  %80 = load i16, ptr %gep881.prol, align 2, !tbaa !14
  %81 = trunc nuw nsw i64 %indvars.iv714.ph to i32
  %82 = add i32 %reass.mul487.us.us.us.us.us.us.us.us, %81
  %83 = sext i32 %82 to i64
  %84 = getelementptr inbounds i16, ptr %46, i64 %83
  store i16 %80, ptr %84, align 2, !tbaa !14
  %indvars.iv.next715.prol = or disjoint i64 %indvars.iv714.ph, 1
  br label %scalar.ph903.prol.loopexit

scalar.ph903.prol.loopexit:                       ; preds = %scalar.ph903.prol, %scalar.ph903.preheader
  %indvars.iv714.unr = phi i64 [ %indvars.iv714.ph, %scalar.ph903.preheader ], [ %indvars.iv.next715.prol, %scalar.ph903.prol ]
  %85 = icmp eq i64 %indvars.iv714.ph, %38
  br i1 %85, label %._crit_edge.split.us.split.us514.us.us.us.us.us.us.us, label %scalar.ph903

scalar.ph903:                                     ; preds = %scalar.ph903.prol.loopexit, %scalar.ph903
  %indvars.iv714 = phi i64 [ %indvars.iv.next715.1, %scalar.ph903 ], [ %indvars.iv714.unr, %scalar.ph903.prol.loopexit ]
  %86 = add nuw nsw i64 %indvars.iv714, %53
  %87 = mul nuw nsw i64 %86, %30
  %gep881 = getelementptr inbounds i16, ptr %invariant.gep880, i64 %87
  %88 = load i16, ptr %gep881, align 2, !tbaa !14
  %89 = trunc nuw nsw i64 %indvars.iv714 to i32
  %90 = add i32 %reass.mul487.us.us.us.us.us.us.us.us, %89
  %91 = sext i32 %90 to i64
  %92 = getelementptr inbounds i16, ptr %46, i64 %91
  store i16 %88, ptr %92, align 2, !tbaa !14
  %indvars.iv.next715 = add nuw nsw i64 %indvars.iv714, 1
  %93 = add nuw nsw i64 %indvars.iv.next715, %53
  %94 = mul nuw nsw i64 %93, %30
  %gep881.1 = getelementptr inbounds i16, ptr %invariant.gep880, i64 %94
  %95 = load i16, ptr %gep881.1, align 2, !tbaa !14
  %96 = trunc nuw nsw i64 %indvars.iv.next715 to i32
  %97 = add i32 %reass.mul487.us.us.us.us.us.us.us.us, %96
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds i16, ptr %46, i64 %98
  store i16 %95, ptr %99, align 2, !tbaa !14
  %indvars.iv.next715.1 = add nuw nsw i64 %indvars.iv714, 2
  %exitcond718.not.1 = icmp eq i64 %indvars.iv.next715.1, %wide.trip.count717
  br i1 %exitcond718.not.1, label %._crit_edge.split.us.split.us514.us.us.us.us.us.us.us, label %scalar.ph903, !llvm.loop !19

._crit_edge.split.us.split.us514.us.us.us.us.us.us.us: ; preds = %scalar.ph903.prol.loopexit, %scalar.ph903, %middle.block902
  %indvars.iv.next720 = add nuw nsw i64 %indvars.iv719, 1
  %exitcond723.not = icmp eq i64 %indvars.iv.next720, %wide.trip.count722
  br i1 %exitcond723.not, label %._crit_edge508.split.us.us.us.split.us.split.us536.us.us.us, label %.preheader496.us.us.us.us.us534.us.us.us, !llvm.loop !20

._crit_edge508.split.us.us.us.split.us.split.us536.us.us.us: ; preds = %._crit_edge.split.us.split.us514.us.us.us.us.us.us.us
  %indvars.iv.next725 = add nuw nsw i64 %indvars.iv724, 1
  %exitcond728.not = icmp eq i64 %indvars.iv.next725, %wide.trip.count727
  br i1 %exitcond728.not, label %._crit_edge.split.us.split.us.us.us.us, label %.preheader497.us.us.us.us558.us.us, !llvm.loop !21

.preheader497.us.us.us539.us.us.us:               ; preds = %.preheader498.us.us.us, %._crit_edge508.split.us.us.us.split.split.us.us.us.us.us
  %indvars.iv709 = phi i64 [ %indvars.iv.next710, %._crit_edge508.split.us.us.us.split.split.us.us.us.us.us ], [ 0, %.preheader498.us.us.us ]
  %100 = trunc nuw nsw i64 %indvars.iv709 to i32
  %101 = trunc i64 %indvars.iv709 to i32
  %102 = mul i32 %.sroa.73.0.copyload, %101
  %invariant.gep = getelementptr inbounds i8, ptr %43, i64 %indvars.iv709
  br label %.preheader496.us.us.us.us525.us.us.us.us

.preheader496.us.us.us.us525.us.us.us.us:         ; preds = %._crit_edge.split.split.us.us.us.us.us.us.us.us.us, %.preheader497.us.us.us539.us.us.us
  %indvars.iv704 = phi i64 [ %indvars.iv.next705, %._crit_edge.split.split.us.us.us.us.us.us.us.us.us ], [ 0, %.preheader497.us.us.us539.us.us.us ]
  %103 = mul nuw nsw i64 %indvars.iv704, %31
  %104 = trunc nuw nsw i64 %indvars.iv704 to i32
  %105 = mul i32 %.sroa.71406.0.copyload, %104
  %reass.add.us.us.us.us527.us.us.us.us = add i32 %105, %100
  %reass.mul.us.us.us.us528.us.us.us.us = mul i32 %reass.add.us.us.us.us527.us.us.us.us, %23
  %106 = trunc nsw i64 %103 to i32
  %107 = add i32 %102, %106
  br label %108

108:                                              ; preds = %122, %.preheader496.us.us.us.us525.us.us.us.us
  %indvars.iv = phi i64 [ %indvars.iv.next, %122 ], [ 0, %.preheader496.us.us.us.us525.us.us.us.us ]
  %109 = load i32, ptr %26, align 8, !tbaa !11
  %110 = icmp sgt i32 %109, 0
  br i1 %110, label %117, label %111

111:                                              ; preds = %108
  %112 = add nuw nsw i64 %indvars.iv, %103
  %113 = mul nuw nsw i64 %112, %30
  %gep = getelementptr inbounds i8, ptr %invariant.gep, i64 %113
  %114 = trunc nuw nsw i64 %indvars.iv to i32
  %115 = add i32 %reass.mul.us.us.us.us528.us.us.us.us, %114
  %116 = sext i32 %115 to i64
  br label %122

117:                                              ; preds = %108
  %118 = trunc nuw nsw i64 %indvars.iv to i32
  %119 = add i32 %107, %118
  %120 = sext i32 %119 to i64
  %121 = getelementptr inbounds i8, ptr %43, i64 %120
  br label %122

122:                                              ; preds = %117, %111
  %.sink885 = phi i64 [ %120, %117 ], [ %116, %111 ]
  %.sink.in = phi ptr [ %121, %117 ], [ %gep, %111 ]
  %.sink = load i8, ptr %.sink.in, align 1, !tbaa !22
  %123 = getelementptr inbounds i8, ptr %44, i64 %.sink885
  store i8 %.sink, ptr %123, align 1, !tbaa !22
  %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.split.split.us.us.us.us.us.us.us.us.us, label %108, !llvm.loop !23

._crit_edge.split.split.us.us.us.us.us.us.us.us.us: ; preds = %122
  %indvars.iv.next705 = add nuw nsw i64 %indvars.iv704, 1
  %exitcond708.not = icmp eq i64 %indvars.iv.next705, %wide.trip.count707
  br i1 %exitcond708.not, label %._crit_edge508.split.us.us.us.split.split.us.us.us.us.us, label %.preheader496.us.us.us.us525.us.us.us.us, !llvm.loop !20

._crit_edge508.split.us.us.us.split.split.us.us.us.us.us: ; preds = %._crit_edge.split.split.us.us.us.us.us.us.us.us.us
  %indvars.iv.next710 = add nuw nsw i64 %indvars.iv709, 1
  %exitcond713.not = icmp eq i64 %indvars.iv.next710, %wide.trip.count712
  br i1 %exitcond713.not, label %._crit_edge.split.us.split.us.us.us.us, label %.preheader497.us.us.us539.us.us.us, !llvm.loop !21

.preheader497.us.us.us.us.us.us.us:               ; preds = %.preheader497.lr.ph.split.us.split.us.split.us.us.us.us, %._crit_edge508.split.us.us.us.split.us.split.us.us.us.us.us.us
  %.0426518.us.us.us.us.us.us.us = phi i32 [ %177, %._crit_edge508.split.us.us.us.split.us.split.us.us.us.us.us.us ], [ 0, %.preheader497.lr.ph.split.us.split.us.split.us.us.us.us ]
  %124 = mul i32 %.sroa.73.0.copyload, %.0426518.us.us.us.us.us.us.us
  %125 = mul nsw i32 %.0426518.us.us.us.us.us.us.us, %.sroa.73.0.copyload
  br label %.preheader496.us.us.us.us.us.us.us.us.us.us

.preheader496.us.us.us.us.us.us.us.us.us.us:      ; preds = %._crit_edge.split.us.split.us.us.us.us.us.us.us.us.us.us.us, %.preheader497.us.us.us.us.us.us.us
  %.0507.us.us.us.us.us.us.us.us.us.us = phi i32 [ 0, %.preheader497.us.us.us.us.us.us.us ], [ %176, %._crit_edge.split.us.split.us.us.us.us.us.us.us.us.us.us.us ]
  %126 = mul nuw nsw i32 %.0507.us.us.us.us.us.us.us.us.us.us, %23
  %127 = add i32 %126, %125
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.scevcheck

vector.scevcheck:                                 ; preds = %.preheader496.us.us.us.us.us.us.us.us.us.us
  %128 = mul i32 %23, %.0507.us.us.us.us.us.us.us.us.us.us
  %129 = add i32 %124, %128
  %130 = add i32 %129, %39
  %131 = icmp slt i32 %130, %129
  %132 = or i1 %131, %40
  %or.cond1025 = or i1 %132, %diff.check
  br i1 %or.cond1025, label %scalar.ph.preheader, label %vector.body

vector.body:                                      ; preds = %vector.scevcheck, %vector.body
  %index = phi i64 [ %index.next, %vector.body ], [ 0, %vector.scevcheck ]
  %133 = trunc i64 %index to i32
  %134 = add i32 %127, %133
  %135 = sext i32 %134 to i64
  %136 = getelementptr inbounds i16, ptr %45, i64 %135
  %137 = getelementptr inbounds i8, ptr %136, i64 16
  %wide.load = load <8 x i16>, ptr %136, align 2, !tbaa !14
  %wide.load898 = load <8 x i16>, ptr %137, align 2, !tbaa !14
  %138 = getelementptr inbounds i16, ptr %46, i64 %135
  %139 = getelementptr inbounds i8, ptr %138, i64 16
  store <8 x i16> %wide.load, ptr %138, align 2, !tbaa !14
  store <8 x i16> %wide.load898, ptr %139, align 2, !tbaa !14
  %index.next = add nuw i64 %index, 16
  %140 = icmp eq i64 %index.next, %n.vec
  br i1 %140, label %middle.block, label %vector.body, !llvm.loop !24

middle.block:                                     ; preds = %vector.body
  br i1 %cmp.n, label %._crit_edge.split.us.split.us.us.us.us.us.us.us.us.us.us.us, label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %middle.block, %vector.scevcheck, %.preheader496.us.us.us.us.us.us.us.us.us.us
  %indvars.iv729.ph = phi i64 [ 0, %vector.scevcheck ], [ 0, %.preheader496.us.us.us.us.us.us.us.us.us.us ], [ %n.vec, %middle.block ]
  br i1 %lcmp.mod1038.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader, %scalar.ph.prol
  %indvars.iv729.prol = phi i64 [ %indvars.iv.next730.prol, %scalar.ph.prol ], [ %indvars.iv729.ph, %scalar.ph.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph.prol ], [ 0, %scalar.ph.preheader ]
  %141 = trunc nuw nsw i64 %indvars.iv729.prol to i32
  %142 = add i32 %127, %141
  %143 = sext i32 %142 to i64
  %144 = getelementptr inbounds i16, ptr %45, i64 %143
  %145 = load i16, ptr %144, align 2, !tbaa !14
  %146 = getelementptr inbounds i16, ptr %46, i64 %143
  store i16 %145, ptr %146, align 2, !tbaa !14
  %indvars.iv.next730.prol = add nuw nsw i64 %indvars.iv729.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter1037
  br i1 %prol.iter.cmp.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol, !llvm.loop !25

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv729.unr = phi i64 [ %indvars.iv729.ph, %scalar.ph.preheader ], [ %indvars.iv.next730.prol, %scalar.ph.prol ]
  %147 = sub nsw i64 %indvars.iv729.ph, %wide.trip.count
  %148 = icmp ugt i64 %147, -4
  br i1 %148, label %._crit_edge.split.us.split.us.us.us.us.us.us.us.us.us.us.us, label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv729 = phi i64 [ %indvars.iv.next730.3, %scalar.ph ], [ %indvars.iv729.unr, %scalar.ph.prol.loopexit ]
  %149 = trunc nuw nsw i64 %indvars.iv729 to i32
  %150 = add i32 %127, %149
  %151 = sext i32 %150 to i64
  %152 = getelementptr inbounds i16, ptr %45, i64 %151
  %153 = load i16, ptr %152, align 2, !tbaa !14
  %154 = getelementptr inbounds i16, ptr %46, i64 %151
  store i16 %153, ptr %154, align 2, !tbaa !14
  %155 = trunc i64 %indvars.iv729 to i32
  %156 = add i32 %155, 1
  %157 = add i32 %127, %156
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds i16, ptr %45, i64 %158
  %160 = load i16, ptr %159, align 2, !tbaa !14
  %161 = getelementptr inbounds i16, ptr %46, i64 %158
  store i16 %160, ptr %161, align 2, !tbaa !14
  %162 = trunc i64 %indvars.iv729 to i32
  %163 = add i32 %162, 2
  %164 = add i32 %127, %163
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds i16, ptr %45, i64 %165
  %167 = load i16, ptr %166, align 2, !tbaa !14
  %168 = getelementptr inbounds i16, ptr %46, i64 %165
  store i16 %167, ptr %168, align 2, !tbaa !14
  %169 = trunc i64 %indvars.iv729 to i32
  %170 = add i32 %169, 3
  %171 = add i32 %127, %170
  %172 = sext i32 %171 to i64
  %173 = getelementptr inbounds i16, ptr %45, i64 %172
  %174 = load i16, ptr %173, align 2, !tbaa !14
  %175 = getelementptr inbounds i16, ptr %46, i64 %172
  store i16 %174, ptr %175, align 2, !tbaa !14
  %indvars.iv.next730.3 = add nuw nsw i64 %indvars.iv729, 4
  %exitcond733.not.3 = icmp eq i64 %indvars.iv.next730.3, %wide.trip.count732
  br i1 %exitcond733.not.3, label %._crit_edge.split.us.split.us.us.us.us.us.us.us.us.us.us.us, label %scalar.ph, !llvm.loop !27

._crit_edge.split.us.split.us.us.us.us.us.us.us.us.us.us.us: ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block
  %176 = add nuw nsw i32 %.0507.us.us.us.us.us.us.us.us.us.us, 1
  %exitcond734.not = icmp eq i32 %176, %28
  br i1 %exitcond734.not, label %._crit_edge508.split.us.us.us.split.us.split.us.us.us.us.us.us, label %.preheader496.us.us.us.us.us.us.us.us.us.us, !llvm.loop !20

._crit_edge508.split.us.us.us.split.us.split.us.us.us.us.us.us: ; preds = %._crit_edge.split.us.split.us.us.us.us.us.us.us.us.us.us.us
  %177 = add nuw nsw i32 %.0426518.us.us.us.us.us.us.us, 1
  %exitcond735.not = icmp eq i32 %177, %.sroa.71406.0.copyload
  br i1 %exitcond735.not, label %._crit_edge.split.us.split.us.us.us.us, label %.preheader497.us.us.us.us.us.us.us, !llvm.loop !21

.loopexit500:                                     ; preds = %._crit_edge.split.us.split.us.us.us.us, %.preheader498.lr.ph.split.us, %.preheader498.lr.ph, %.preheader499, %8
  %.not682 = icmp eq i32 %15, 0
  br i1 %.not682, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %.loopexit500
  %min.iters.check917 = icmp ult i32 %15, 4
  br i1 %min.iters.check917, label %.lr.ph.preheader1034, label %vector.ph918

vector.ph918:                                     ; preds = %.lr.ph.preheader
  %n.vec920 = and i64 %16, 4294967292
  br label %vector.body922

vector.body922:                                   ; preds = %vector.body922, %vector.ph918
  %index923 = phi i64 [ 0, %vector.ph918 ], [ %index.next925, %vector.body922 ]
  %vec.ind = phi <2 x i64> [ <i64 0, i64 1>, %vector.ph918 ], [ %vec.ind.next, %vector.body922 ]
  %step.add = add <2 x i64> %vec.ind, <i64 2, i64 2>
  %178 = getelementptr inbounds i64, ptr %18, i64 %index923
  %179 = getelementptr inbounds i8, ptr %178, i64 16
  store <2 x i64> %vec.ind, ptr %178, align 8, !tbaa !28
  store <2 x i64> %step.add, ptr %179, align 8, !tbaa !28
  %index.next925 = add nuw i64 %index923, 4
  %vec.ind.next = add <2 x i64> %vec.ind, <i64 4, i64 4>
  %180 = icmp eq i64 %index.next925, %n.vec920
  br i1 %180, label %middle.block915, label %vector.body922, !llvm.loop !30

middle.block915:                                  ; preds = %vector.body922
  %cmp.n926 = icmp eq i64 %n.vec920, %16
  br i1 %cmp.n926, label %._crit_edge, label %.lr.ph.preheader1034

.lr.ph.preheader1034:                             ; preds = %middle.block915, %.lr.ph.preheader
  %indvars.iv741.ph = phi i64 [ 0, %.lr.ph.preheader ], [ %n.vec920, %middle.block915 ]
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader1034, %.lr.ph
  %indvars.iv741 = phi i64 [ %indvars.iv.next742, %.lr.ph ], [ %indvars.iv741.ph, %.lr.ph.preheader1034 ]
  %181 = getelementptr inbounds i64, ptr %18, i64 %indvars.iv741
  store i64 %indvars.iv741, ptr %181, align 8, !tbaa !28
  %indvars.iv.next742 = add nuw nsw i64 %indvars.iv741, 1
  %exitcond745.not = icmp eq i64 %indvars.iv.next742, %16
  br i1 %exitcond745.not, label %._crit_edge, label %.lr.ph, !llvm.loop !31

._crit_edge:                                      ; preds = %.lr.ph, %middle.block915, %.loopexit500
  tail call void @shuffle_array(ptr noundef %18, i32 noundef %15)
  tail call void @qsort(ptr noundef %18, i64 noundef %22, i64 noundef 8, ptr noundef nonnull @ullcompare) #11
  %182 = icmp sgt i32 %13, 0
  br i1 %182, label %.preheader495.lr.ph, label %._crit_edge.._crit_edge588_crit_edge

._crit_edge.._crit_edge588_crit_edge:             ; preds = %._crit_edge
  %.pre = mul nsw i32 %.sroa.75.0.copyload, %.sroa.74.0.copyload
  br label %._crit_edge588

.preheader495.lr.ph:                              ; preds = %._crit_edge
  %183 = icmp sgt i32 %14, 0
  %184 = trunc i64 %22 to i32
  %185 = mul nsw i32 %.sroa.75.0.copyload, %.sroa.74.0.copyload
  br i1 %183, label %.preheader495.us.preheader, label %._crit_edge588

.preheader495.us.preheader:                       ; preds = %.preheader495.lr.ph
  %umax = tail call i32 @llvm.umax.i32(i32 %.sroa.74.0.copyload, i32 1)
  %umax751 = tail call i32 @llvm.umax.i32(i32 %.sroa.75.0.copyload, i32 1)
  %186 = zext i32 %.sroa.74.0.copyload to i64
  %187 = zext nneg i32 %14 to i64
  %188 = zext i32 %.sroa.75.0.copyload to i64
  %wide.trip.count775 = zext nneg i32 %13 to i64
  %wide.trip.count749 = zext i32 %umax to i64
  %wide.trip.count756 = zext i32 %umax to i64
  %wide.trip.count763 = zext i32 %umax to i64
  %189 = add nsw i64 %wide.trip.count749, -1
  %190 = mul i32 %.sroa.75.0.copyload, %.sroa.73.0.copyload
  %191 = zext i32 %190 to i64
  %192 = add nsw i64 %wide.trip.count749, -1
  %193 = zext i32 %190 to i64
  %194 = add nsw i64 %wide.trip.count749, -1
  %195 = zext i32 %190 to i64
  %min.iters.check954 = icmp ult i32 %.sroa.74.0.copyload, 8
  %196 = trunc i64 %194 to i32
  %197 = icmp ugt i64 %194, 4294967295
  %min.iters.check956 = icmp ult i32 %.sroa.74.0.copyload, 32
  %n.vec959 = and i64 %wide.trip.count749, 4294967264
  %cmp.n963 = icmp eq i64 %n.vec959, %wide.trip.count749
  %n.vec.remaining = and i64 %wide.trip.count749, 24
  %min.epilog.iters.check = icmp eq i64 %n.vec.remaining, 0
  %n.vec965 = and i64 %wide.trip.count749, 4294967288
  %cmp.n969 = icmp eq i64 %n.vec965, %wide.trip.count749
  %xtraiter1039 = and i64 %wide.trip.count749, 3
  %lcmp.mod1040.not = icmp eq i64 %xtraiter1039, 0
  %min.iters.check942 = icmp ult i32 %.sroa.74.0.copyload, 16
  %198 = trunc i64 %192 to i32
  %199 = icmp ugt i64 %192, 4294967295
  %n.vec945 = and i64 %wide.trip.count749, 4294967280
  %cmp.n950 = icmp eq i64 %n.vec945, %wide.trip.count749
  %xtraiter1042 = and i64 %wide.trip.count749, 3
  %lcmp.mod1043.not = icmp eq i64 %xtraiter1042, 0
  %min.iters.check930 = icmp ult i32 %.sroa.74.0.copyload, 8
  %200 = trunc i64 %189 to i32
  %201 = icmp ugt i64 %189, 4294967295
  %n.vec933 = and i64 %wide.trip.count749, 4294967288
  %cmp.n938 = icmp eq i64 %n.vec933, %wide.trip.count749
  %xtraiter1045 = and i64 %wide.trip.count749, 3
  %lcmp.mod1046.not = icmp eq i64 %xtraiter1045, 0
  br label %.preheader495.us

.preheader495.us:                                 ; preds = %.preheader495.us.preheader, %._crit_edge585.us
  %indvars.iv772 = phi i64 [ 0, %.preheader495.us.preheader ], [ %indvars.iv.next773, %._crit_edge585.us ]
  %.0431586.us = phi i32 [ 0, %.preheader495.us.preheader ], [ %.2433.us, %._crit_edge585.us ]
  %202 = mul i64 %indvars.iv772, %195
  %203 = mul i64 %indvars.iv772, %193
  %204 = mul i64 %indvars.iv772, %191
  %205 = mul nuw nsw i64 %indvars.iv772, %187
  %206 = mul i64 %indvars.iv772, %188
  %207 = trunc i64 %206 to i32
  %208 = trunc i64 %206 to i32
  %209 = trunc i64 %206 to i32
  br label %210

210:                                              ; preds = %.preheader495.us, %.loopexit494.us
  %indvars.iv767 = phi i64 [ 0, %.preheader495.us ], [ %indvars.iv.next768, %.loopexit494.us ]
  %.1432582.us = phi i32 [ %.0431586.us, %.preheader495.us ], [ %.2433.us, %.loopexit494.us ]
  %211 = mul i64 %indvars.iv767, %186
  %212 = add i64 %202, %211
  %213 = trunc i64 %212 to i32
  %214 = mul i64 %indvars.iv767, %186
  %215 = add i64 %203, %214
  %216 = trunc i64 %215 to i32
  %217 = mul i64 %indvars.iv767, %186
  %218 = add i64 %204, %217
  %219 = trunc i64 %218 to i32
  %220 = add nuw nsw i64 %indvars.iv767, %205
  %221 = tail call i32 @is_dense_grid_point(i64 noundef %220, i32 noundef %184, ptr noundef %18)
  %222 = icmp eq i32 %221, 0
  br i1 %222, label %225, label %223

223:                                              ; preds = %210
  %224 = add i32 %.1432582.us, %185
  br label %.loopexit494.us

225:                                              ; preds = %210
  %226 = mul i64 %indvars.iv767, %186
  switch i32 %.sroa.6.0.copyload, label %.loopexit494.us [
    i32 1, label %.preheader493.us.us.preheader
    i32 2, label %.preheader493.us573.us.preheader
    i32 12, label %.preheader493.us578.us.preheader
  ]

.preheader493.us578.us.preheader:                 ; preds = %225
  %227 = trunc i64 %226 to i32
  br label %iter.check

.preheader493.us573.us.preheader:                 ; preds = %225
  %228 = trunc i64 %226 to i32
  br label %.preheader493.us573.us

.preheader493.us.us.preheader:                    ; preds = %225
  %229 = trunc i64 %226 to i32
  br label %.preheader493.us.us

.loopexit494.us:                                  ; preds = %.split.split.split.us.us.us, %.split.split.us.us.us, %.split.us.us.us, %225, %223
  %.2433.us = phi i32 [ %224, %223 ], [ %.1432582.us, %225 ], [ %.1432582.us, %.split.us.us.us ], [ %.1432582.us, %.split.split.us.us.us ], [ %.1432582.us, %.split.split.split.us.us.us ]
  %indvars.iv.next768 = add nuw nsw i64 %indvars.iv767, 1
  %exitcond771.not = icmp eq i64 %indvars.iv.next768, %187
  br i1 %exitcond771.not, label %._crit_edge585.us, label %210, !llvm.loop !32

.preheader493.us.us:                              ; preds = %.preheader493.us.us.preheader, %.split.us.us.us
  %.0444568.us.us = phi i32 [ %269, %.split.us.us.us ], [ 0, %.preheader493.us.us.preheader ]
  %230 = add i32 %.0444568.us.us, %209
  %231 = mul i32 %230, %.sroa.73.0.copyload
  %232 = add i32 %231, %229
  br i1 %min.iters.check930, label %scalar.ph929.preheader, label %vector.scevcheck927

vector.scevcheck927:                              ; preds = %.preheader493.us.us
  %233 = mul i32 %.sroa.73.0.copyload, %.0444568.us.us
  %234 = add i32 %233, %219
  %235 = xor i32 %234, -1
  %236 = icmp ult i32 %235, %200
  %237 = or i1 %236, %201
  br i1 %237, label %scalar.ph929.preheader, label %vector.body935

vector.body935:                                   ; preds = %vector.scevcheck927, %vector.body935
  %index936 = phi i64 [ %index.next937, %vector.body935 ], [ 0, %vector.scevcheck927 ]
  %238 = trunc i64 %index936 to i32
  %239 = add i32 %232, %238
  %240 = zext i32 %239 to i64
  %241 = getelementptr inbounds float, ptr %3, i64 %240
  %242 = getelementptr inbounds i8, ptr %241, i64 16
  store <4 x float> zeroinitializer, ptr %241, align 4, !tbaa !33
  store <4 x float> zeroinitializer, ptr %242, align 4, !tbaa !33
  %index.next937 = add nuw i64 %index936, 8
  %243 = icmp eq i64 %index.next937, %n.vec933
  br i1 %243, label %middle.block928, label %vector.body935, !llvm.loop !35

middle.block928:                                  ; preds = %vector.body935
  br i1 %cmp.n938, label %.split.us.us.us, label %scalar.ph929.preheader

scalar.ph929.preheader:                           ; preds = %middle.block928, %vector.scevcheck927, %.preheader493.us.us
  %indvars.iv760.ph = phi i64 [ 0, %vector.scevcheck927 ], [ 0, %.preheader493.us.us ], [ %n.vec933, %middle.block928 ]
  br i1 %lcmp.mod1046.not, label %scalar.ph929.prol.loopexit, label %scalar.ph929.prol

scalar.ph929.prol:                                ; preds = %scalar.ph929.preheader, %scalar.ph929.prol
  %indvars.iv760.prol = phi i64 [ %indvars.iv.next761.prol, %scalar.ph929.prol ], [ %indvars.iv760.ph, %scalar.ph929.preheader ]
  %prol.iter1047 = phi i64 [ %prol.iter1047.next, %scalar.ph929.prol ], [ 0, %scalar.ph929.preheader ]
  %244 = trunc nuw i64 %indvars.iv760.prol to i32
  %245 = add i32 %232, %244
  %246 = zext i32 %245 to i64
  %247 = getelementptr inbounds float, ptr %3, i64 %246
  store float 0.000000e+00, ptr %247, align 4, !tbaa !33
  %indvars.iv.next761.prol = add nuw nsw i64 %indvars.iv760.prol, 1
  %prol.iter1047.next = add i64 %prol.iter1047, 1
  %prol.iter1047.cmp.not = icmp eq i64 %prol.iter1047.next, %xtraiter1045
  br i1 %prol.iter1047.cmp.not, label %scalar.ph929.prol.loopexit, label %scalar.ph929.prol, !llvm.loop !36

scalar.ph929.prol.loopexit:                       ; preds = %scalar.ph929.prol, %scalar.ph929.preheader
  %indvars.iv760.unr = phi i64 [ %indvars.iv760.ph, %scalar.ph929.preheader ], [ %indvars.iv.next761.prol, %scalar.ph929.prol ]
  %248 = sub nsw i64 %indvars.iv760.ph, %wide.trip.count749
  %249 = icmp ugt i64 %248, -4
  br i1 %249, label %.split.us.us.us, label %scalar.ph929

scalar.ph929:                                     ; preds = %scalar.ph929.prol.loopexit, %scalar.ph929
  %indvars.iv760 = phi i64 [ %indvars.iv.next761.3, %scalar.ph929 ], [ %indvars.iv760.unr, %scalar.ph929.prol.loopexit ]
  %250 = trunc nuw i64 %indvars.iv760 to i32
  %251 = add i32 %232, %250
  %252 = zext i32 %251 to i64
  %253 = getelementptr inbounds float, ptr %3, i64 %252
  store float 0.000000e+00, ptr %253, align 4, !tbaa !33
  %254 = trunc i64 %indvars.iv760 to i32
  %255 = add i32 %254, 1
  %256 = add i32 %232, %255
  %257 = zext i32 %256 to i64
  %258 = getelementptr inbounds float, ptr %3, i64 %257
  store float 0.000000e+00, ptr %258, align 4, !tbaa !33
  %259 = trunc i64 %indvars.iv760 to i32
  %260 = add i32 %259, 2
  %261 = add i32 %232, %260
  %262 = zext i32 %261 to i64
  %263 = getelementptr inbounds float, ptr %3, i64 %262
  store float 0.000000e+00, ptr %263, align 4, !tbaa !33
  %264 = trunc i64 %indvars.iv760 to i32
  %265 = add i32 %264, 3
  %266 = add i32 %232, %265
  %267 = zext i32 %266 to i64
  %268 = getelementptr inbounds float, ptr %3, i64 %267
  store float 0.000000e+00, ptr %268, align 4, !tbaa !33
  %indvars.iv.next761.3 = add nuw nsw i64 %indvars.iv760, 4
  %exitcond764.not.3 = icmp eq i64 %indvars.iv.next761.3, %wide.trip.count763
  br i1 %exitcond764.not.3, label %.split.us.us.us, label %scalar.ph929, !llvm.loop !37

.split.us.us.us:                                  ; preds = %scalar.ph929.prol.loopexit, %scalar.ph929, %middle.block928
  %269 = add nuw i32 %.0444568.us.us, 1
  %exitcond766.not = icmp eq i32 %269, %umax751
  br i1 %exitcond766.not, label %.loopexit494.us, label %.preheader493.us.us, !llvm.loop !38

.preheader493.us573.us:                           ; preds = %.preheader493.us573.us.preheader, %.split.split.us.us.us
  %.0444568.us574.us = phi i32 [ %309, %.split.split.us.us.us ], [ 0, %.preheader493.us573.us.preheader ]
  %270 = add i32 %.0444568.us574.us, %208
  %271 = mul i32 %270, %.sroa.73.0.copyload
  %272 = add i32 %271, %228
  br i1 %min.iters.check942, label %scalar.ph941.preheader, label %vector.scevcheck939

vector.scevcheck939:                              ; preds = %.preheader493.us573.us
  %273 = mul i32 %.sroa.73.0.copyload, %.0444568.us574.us
  %274 = add i32 %273, %216
  %275 = xor i32 %274, -1
  %276 = icmp ult i32 %275, %198
  %277 = or i1 %276, %199
  br i1 %277, label %scalar.ph941.preheader, label %vector.body947

vector.body947:                                   ; preds = %vector.scevcheck939, %vector.body947
  %index948 = phi i64 [ %index.next949, %vector.body947 ], [ 0, %vector.scevcheck939 ]
  %278 = trunc i64 %index948 to i32
  %279 = add i32 %272, %278
  %280 = zext i32 %279 to i64
  %281 = getelementptr inbounds i16, ptr %3, i64 %280
  %282 = getelementptr inbounds i8, ptr %281, i64 16
  store <8 x i16> zeroinitializer, ptr %281, align 2, !tbaa !14
  store <8 x i16> zeroinitializer, ptr %282, align 2, !tbaa !14
  %index.next949 = add nuw i64 %index948, 16
  %283 = icmp eq i64 %index.next949, %n.vec945
  br i1 %283, label %middle.block940, label %vector.body947, !llvm.loop !39

middle.block940:                                  ; preds = %vector.body947
  br i1 %cmp.n950, label %.split.split.us.us.us, label %scalar.ph941.preheader

scalar.ph941.preheader:                           ; preds = %middle.block940, %vector.scevcheck939, %.preheader493.us573.us
  %indvars.iv753.ph = phi i64 [ 0, %vector.scevcheck939 ], [ 0, %.preheader493.us573.us ], [ %n.vec945, %middle.block940 ]
  br i1 %lcmp.mod1043.not, label %scalar.ph941.prol.loopexit, label %scalar.ph941.prol

scalar.ph941.prol:                                ; preds = %scalar.ph941.preheader, %scalar.ph941.prol
  %indvars.iv753.prol = phi i64 [ %indvars.iv.next754.prol, %scalar.ph941.prol ], [ %indvars.iv753.ph, %scalar.ph941.preheader ]
  %prol.iter1044 = phi i64 [ %prol.iter1044.next, %scalar.ph941.prol ], [ 0, %scalar.ph941.preheader ]
  %284 = trunc nuw i64 %indvars.iv753.prol to i32
  %285 = add i32 %272, %284
  %286 = zext i32 %285 to i64
  %287 = getelementptr inbounds i16, ptr %3, i64 %286
  store i16 0, ptr %287, align 2, !tbaa !14
  %indvars.iv.next754.prol = add nuw nsw i64 %indvars.iv753.prol, 1
  %prol.iter1044.next = add i64 %prol.iter1044, 1
  %prol.iter1044.cmp.not = icmp eq i64 %prol.iter1044.next, %xtraiter1042
  br i1 %prol.iter1044.cmp.not, label %scalar.ph941.prol.loopexit, label %scalar.ph941.prol, !llvm.loop !40

scalar.ph941.prol.loopexit:                       ; preds = %scalar.ph941.prol, %scalar.ph941.preheader
  %indvars.iv753.unr = phi i64 [ %indvars.iv753.ph, %scalar.ph941.preheader ], [ %indvars.iv.next754.prol, %scalar.ph941.prol ]
  %288 = sub nsw i64 %indvars.iv753.ph, %wide.trip.count749
  %289 = icmp ugt i64 %288, -4
  br i1 %289, label %.split.split.us.us.us, label %scalar.ph941

scalar.ph941:                                     ; preds = %scalar.ph941.prol.loopexit, %scalar.ph941
  %indvars.iv753 = phi i64 [ %indvars.iv.next754.3, %scalar.ph941 ], [ %indvars.iv753.unr, %scalar.ph941.prol.loopexit ]
  %290 = trunc nuw i64 %indvars.iv753 to i32
  %291 = add i32 %272, %290
  %292 = zext i32 %291 to i64
  %293 = getelementptr inbounds i16, ptr %3, i64 %292
  store i16 0, ptr %293, align 2, !tbaa !14
  %294 = trunc i64 %indvars.iv753 to i32
  %295 = add i32 %294, 1
  %296 = add i32 %272, %295
  %297 = zext i32 %296 to i64
  %298 = getelementptr inbounds i16, ptr %3, i64 %297
  store i16 0, ptr %298, align 2, !tbaa !14
  %299 = trunc i64 %indvars.iv753 to i32
  %300 = add i32 %299, 2
  %301 = add i32 %272, %300
  %302 = zext i32 %301 to i64
  %303 = getelementptr inbounds i16, ptr %3, i64 %302
  store i16 0, ptr %303, align 2, !tbaa !14
  %304 = trunc i64 %indvars.iv753 to i32
  %305 = add i32 %304, 3
  %306 = add i32 %272, %305
  %307 = zext i32 %306 to i64
  %308 = getelementptr inbounds i16, ptr %3, i64 %307
  store i16 0, ptr %308, align 2, !tbaa !14
  %indvars.iv.next754.3 = add nuw nsw i64 %indvars.iv753, 4
  %exitcond757.not.3 = icmp eq i64 %indvars.iv.next754.3, %wide.trip.count756
  br i1 %exitcond757.not.3, label %.split.split.us.us.us, label %scalar.ph941, !llvm.loop !41

.split.split.us.us.us:                            ; preds = %scalar.ph941.prol.loopexit, %scalar.ph941, %middle.block940
  %309 = add nuw i32 %.0444568.us574.us, 1
  %exitcond759.not = icmp eq i32 %309, %umax751
  br i1 %exitcond759.not, label %.loopexit494.us, label %.preheader493.us573.us, !llvm.loop !38

iter.check:                                       ; preds = %.preheader493.us578.us.preheader, %.split.split.split.us.us.us
  %.0444568.us579.us = phi i32 [ %354, %.split.split.split.us.us.us ], [ 0, %.preheader493.us578.us.preheader ]
  %310 = add i32 %.0444568.us579.us, %207
  %311 = mul i32 %310, %.sroa.73.0.copyload
  %312 = add i32 %311, %227
  br i1 %min.iters.check954, label %vec.epilog.scalar.ph.preheader, label %vector.scevcheck951

vector.scevcheck951:                              ; preds = %iter.check
  %313 = mul i32 %.sroa.73.0.copyload, %.0444568.us579.us
  %314 = add i32 %313, %213
  %315 = xor i32 %314, -1
  %316 = icmp ult i32 %315, %196
  %317 = or i1 %316, %197
  br i1 %317, label %vec.epilog.scalar.ph.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %vector.scevcheck951
  br i1 %min.iters.check956, label %vec.epilog.ph, label %vector.body960

vector.body960:                                   ; preds = %vector.main.loop.iter.check, %vector.body960
  %index961 = phi i64 [ %index.next962, %vector.body960 ], [ 0, %vector.main.loop.iter.check ]
  %318 = trunc i64 %index961 to i32
  %319 = add i32 %312, %318
  %320 = zext i32 %319 to i64
  %321 = getelementptr inbounds i8, ptr %3, i64 %320
  %322 = getelementptr inbounds i8, ptr %321, i64 16
  store <16 x i8> zeroinitializer, ptr %321, align 1, !tbaa !22
  store <16 x i8> zeroinitializer, ptr %322, align 1, !tbaa !22
  %index.next962 = add nuw i64 %index961, 32
  %323 = icmp eq i64 %index.next962, %n.vec959
  br i1 %323, label %middle.block952, label %vector.body960, !llvm.loop !42

middle.block952:                                  ; preds = %vector.body960
  br i1 %cmp.n963, label %.split.split.split.us.us.us, label %vec.epilog.iter.check

vec.epilog.iter.check:                            ; preds = %middle.block952
  br i1 %min.epilog.iters.check, label %vec.epilog.scalar.ph.preheader, label %vec.epilog.ph

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %vec.epilog.resume.val = phi i64 [ %n.vec959, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %vec.epilog.vector.body, %vec.epilog.ph
  %index967 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next968, %vec.epilog.vector.body ]
  %324 = trunc i64 %index967 to i32
  %325 = add i32 %312, %324
  %326 = zext i32 %325 to i64
  %327 = getelementptr inbounds i8, ptr %3, i64 %326
  store <8 x i8> zeroinitializer, ptr %327, align 1, !tbaa !22
  %index.next968 = add nuw i64 %index967, 8
  %328 = icmp eq i64 %index.next968, %n.vec965
  br i1 %328, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !43

vec.epilog.middle.block:                          ; preds = %vec.epilog.vector.body
  br i1 %cmp.n969, label %.split.split.split.us.us.us, label %vec.epilog.scalar.ph.preheader

vec.epilog.scalar.ph.preheader:                   ; preds = %vec.epilog.middle.block, %vector.scevcheck951, %iter.check, %vec.epilog.iter.check
  %indvars.iv746.ph = phi i64 [ 0, %iter.check ], [ 0, %vector.scevcheck951 ], [ %n.vec959, %vec.epilog.iter.check ], [ %n.vec965, %vec.epilog.middle.block ]
  br i1 %lcmp.mod1040.not, label %vec.epilog.scalar.ph.prol.loopexit, label %vec.epilog.scalar.ph.prol

vec.epilog.scalar.ph.prol:                        ; preds = %vec.epilog.scalar.ph.preheader, %vec.epilog.scalar.ph.prol
  %indvars.iv746.prol = phi i64 [ %indvars.iv.next747.prol, %vec.epilog.scalar.ph.prol ], [ %indvars.iv746.ph, %vec.epilog.scalar.ph.preheader ]
  %prol.iter1041 = phi i64 [ %prol.iter1041.next, %vec.epilog.scalar.ph.prol ], [ 0, %vec.epilog.scalar.ph.preheader ]
  %329 = trunc nuw i64 %indvars.iv746.prol to i32
  %330 = add i32 %312, %329
  %331 = zext i32 %330 to i64
  %332 = getelementptr inbounds i8, ptr %3, i64 %331
  store i8 0, ptr %332, align 1, !tbaa !22
  %indvars.iv.next747.prol = add nuw nsw i64 %indvars.iv746.prol, 1
  %prol.iter1041.next = add i64 %prol.iter1041, 1
  %prol.iter1041.cmp.not = icmp eq i64 %prol.iter1041.next, %xtraiter1039
  br i1 %prol.iter1041.cmp.not, label %vec.epilog.scalar.ph.prol.loopexit, label %vec.epilog.scalar.ph.prol, !llvm.loop !44

vec.epilog.scalar.ph.prol.loopexit:               ; preds = %vec.epilog.scalar.ph.prol, %vec.epilog.scalar.ph.preheader
  %indvars.iv746.unr = phi i64 [ %indvars.iv746.ph, %vec.epilog.scalar.ph.preheader ], [ %indvars.iv.next747.prol, %vec.epilog.scalar.ph.prol ]
  %333 = sub nsw i64 %indvars.iv746.ph, %wide.trip.count749
  %334 = icmp ugt i64 %333, -4
  br i1 %334, label %.split.split.split.us.us.us, label %vec.epilog.scalar.ph

vec.epilog.scalar.ph:                             ; preds = %vec.epilog.scalar.ph.prol.loopexit, %vec.epilog.scalar.ph
  %indvars.iv746 = phi i64 [ %indvars.iv.next747.3, %vec.epilog.scalar.ph ], [ %indvars.iv746.unr, %vec.epilog.scalar.ph.prol.loopexit ]
  %335 = trunc nuw i64 %indvars.iv746 to i32
  %336 = add i32 %312, %335
  %337 = zext i32 %336 to i64
  %338 = getelementptr inbounds i8, ptr %3, i64 %337
  store i8 0, ptr %338, align 1, !tbaa !22
  %339 = trunc i64 %indvars.iv746 to i32
  %340 = add i32 %339, 1
  %341 = add i32 %312, %340
  %342 = zext i32 %341 to i64
  %343 = getelementptr inbounds i8, ptr %3, i64 %342
  store i8 0, ptr %343, align 1, !tbaa !22
  %344 = trunc i64 %indvars.iv746 to i32
  %345 = add i32 %344, 2
  %346 = add i32 %312, %345
  %347 = zext i32 %346 to i64
  %348 = getelementptr inbounds i8, ptr %3, i64 %347
  store i8 0, ptr %348, align 1, !tbaa !22
  %349 = trunc i64 %indvars.iv746 to i32
  %350 = add i32 %349, 3
  %351 = add i32 %312, %350
  %352 = zext i32 %351 to i64
  %353 = getelementptr inbounds i8, ptr %3, i64 %352
  store i8 0, ptr %353, align 1, !tbaa !22
  %indvars.iv.next747.3 = add nuw nsw i64 %indvars.iv746, 4
  %exitcond750.not.3 = icmp eq i64 %indvars.iv.next747.3, %wide.trip.count749
  br i1 %exitcond750.not.3, label %.split.split.split.us.us.us, label %vec.epilog.scalar.ph, !llvm.loop !45

.split.split.split.us.us.us:                      ; preds = %vec.epilog.scalar.ph.prol.loopexit, %vec.epilog.scalar.ph, %vec.epilog.middle.block, %middle.block952
  %354 = add nuw i32 %.0444568.us579.us, 1
  %exitcond752.not = icmp eq i32 %354, %umax751
  br i1 %exitcond752.not, label %.loopexit494.us, label %iter.check, !llvm.loop !38

._crit_edge585.us:                                ; preds = %.loopexit494.us
  %indvars.iv.next773 = add nuw nsw i64 %indvars.iv772, 1
  %exitcond776.not = icmp eq i64 %indvars.iv.next773, %wide.trip.count775
  br i1 %exitcond776.not, label %._crit_edge588, label %.preheader495.us, !llvm.loop !46

._crit_edge588:                                   ; preds = %._crit_edge585.us, %.preheader495.lr.ph, %._crit_edge.._crit_edge588_crit_edge
  %.pre-phi = phi i32 [ %.pre, %._crit_edge.._crit_edge588_crit_edge ], [ %185, %.preheader495.lr.ph ], [ %185, %._crit_edge585.us ]
  %.0431.lcssa = phi i32 [ 0, %._crit_edge.._crit_edge588_crit_edge ], [ 0, %.preheader495.lr.ph ], [ %.2433.us, %._crit_edge585.us ]
  %355 = add nsw i32 %13, 1
  %356 = sext i32 %355 to i64
  %357 = shl nsw i64 %356, 2
  %358 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %357, i64 noundef 64) #11
  %359 = udiv i32 %.0431.lcssa, %.pre-phi
  %360 = zext i32 %359 to i64
  %361 = shl nuw nsw i64 %360, 2
  %362 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %361, i64 noundef 64) #11
  %363 = icmp eq i32 %.sroa.6.0.copyload, 0
  br i1 %363, label %371, label %364

364:                                              ; preds = %._crit_edge588
  %365 = icmp eq i32 %.sroa.6.0.copyload, 1
  br i1 %365, label %371, label %366

366:                                              ; preds = %364
  %367 = and i32 %.sroa.6.0.copyload, -2
  %switch.tableidx = add i32 %367, -2
  %368 = icmp ult i32 %switch.tableidx, 11
  br i1 %368, label %switch.hole_check, label %369

369:                                              ; preds = %switch.hole_check, %366
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 304, ptr noundef nonnull @__PRETTY_FUNCTION__.create_spmm_inputs) #12
  unreachable

switch.hole_check:                                ; preds = %366
  %switch.maskindex = trunc nuw i32 %switch.tableidx to i16
  %switch.shifted = lshr i16 1365, %switch.maskindex
  %switch.lobit = trunc i16 %switch.shifted to i1
  br i1 %switch.lobit, label %switch.lookup, label %369

switch.lookup:                                    ; preds = %switch.hole_check
  %370 = zext nneg i32 %switch.tableidx to i64
  %switch.gep = getelementptr inbounds [11 x i32], ptr @switch.table.create_spmm_inputs, i64 0, i64 %370
  %switch.load = load i32, ptr %switch.gep, align 4
  br label %371

371:                                              ; preds = %switch.lookup, %364, %._crit_edge588
  %372 = phi i32 [ 8, %._crit_edge588 ], [ 4, %364 ], [ %switch.load, %switch.lookup ]
  %373 = mul i32 %372, %.0431.lcssa
  %374 = zext i32 %373 to i64
  %375 = tail call noalias ptr @libxsmm_aligned_malloc(i64 noundef %374, i64 noundef 64) #11
  store ptr %358, ptr %6, align 8, !tbaa !47
  store ptr %362, ptr %7, align 8, !tbaa !47
  store ptr %375, ptr %5, align 8, !tbaa !47
  %376 = sext i32 %13 to i64
  %377 = getelementptr inbounds i32, ptr %358, i64 %376
  store i32 %359, ptr %377, align 4, !tbaa !5
  br i1 %182, label %.lr.ph651, label %._crit_edge652

.lr.ph651:                                        ; preds = %371
  %378 = icmp sgt i32 %14, 0
  %379 = trunc i64 %22 to i32
  br i1 %378, label %.lr.ph644.us.preheader, label %.lr.ph651.split.preheader

.lr.ph651.split.preheader:                        ; preds = %.lr.ph651
  %380 = zext nneg i32 %13 to i64
  %381 = shl nuw nsw i64 %380, 2
  tail call void @llvm.memset.p0.i64(ptr nonnull align 4 %358, i8 0, i64 %381, i1 false), !tbaa !5
  br label %._crit_edge652

.lr.ph644.us.preheader:                           ; preds = %.lr.ph651
  %umax783 = tail call i32 @llvm.umax.i32(i32 %.sroa.74.0.copyload, i32 1)
  %umax786 = tail call i32 @llvm.umax.i32(i32 %.sroa.75.0.copyload, i32 1)
  %382 = mul i32 %umax783, %umax786
  %383 = zext i32 %.sroa.74.0.copyload to i64
  %384 = zext nneg i32 %14 to i64
  %385 = zext i32 %.sroa.75.0.copyload to i64
  %wide.trip.count811 = zext nneg i32 %13 to i64
  %wide.trip.count784 = zext i32 %umax783 to i64
  %wide.trip.count791 = zext i32 %umax783 to i64
  %wide.trip.count798 = zext i32 %umax783 to i64
  %386 = add nsw i64 %wide.trip.count784, -1
  %387 = mul i32 %.sroa.75.0.copyload, %.sroa.73.0.copyload
  %388 = zext i32 %387 to i64
  %389 = add nsw i64 %wide.trip.count784, -1
  %390 = zext i32 %387 to i64
  %391 = add nsw i64 %wide.trip.count784, -1
  %392 = zext i32 %387 to i64
  %min.iters.check1008 = icmp ult i32 %.sroa.74.0.copyload, 32
  %393 = trunc i64 %391 to i32
  %394 = trunc i64 %391 to i32
  %395 = icmp ugt i64 %391, 4294967295
  %n.vec1011 = and i64 %wide.trip.count784, 4294967264
  %.cast1013 = trunc nuw i64 %n.vec1011 to i32
  %cmp.n1023 = icmp eq i64 %n.vec1011, %wide.trip.count784
  %xtraiter1048 = and i64 %wide.trip.count784, 3
  %lcmp.mod1049.not = icmp eq i64 %xtraiter1048, 0
  %min.iters.check989 = icmp ult i32 %.sroa.74.0.copyload, 16
  %396 = trunc i64 %389 to i32
  %397 = trunc i64 %389 to i32
  %398 = icmp ugt i64 %389, 4294967295
  %n.vec992 = and i64 %wide.trip.count784, 4294967280
  %.cast994 = trunc nuw i64 %n.vec992 to i32
  %cmp.n1004 = icmp eq i64 %n.vec992, %wide.trip.count784
  %xtraiter1051 = and i64 %wide.trip.count784, 3
  %lcmp.mod1052.not = icmp eq i64 %xtraiter1051, 0
  %min.iters.check973 = icmp ult i32 %.sroa.74.0.copyload, 16
  %399 = trunc i64 %386 to i32
  %400 = trunc i64 %386 to i32
  %401 = icmp ugt i64 %386, 4294967295
  %n.vec976 = and i64 %wide.trip.count784, 4294967288
  %.cast = trunc nuw i64 %n.vec976 to i32
  %cmp.n985 = icmp eq i64 %n.vec976, %wide.trip.count784
  %xtraiter1054 = and i64 %wide.trip.count784, 3
  %lcmp.mod1055.not = icmp eq i64 %xtraiter1054, 0
  br label %.lr.ph644.us

.lr.ph644.us:                                     ; preds = %.lr.ph644.us.preheader, %._crit_edge645.us
  %indvars.iv808 = phi i64 [ 0, %.lr.ph644.us.preheader ], [ %indvars.iv.next809, %._crit_edge645.us ]
  %.0434648.us = phi i32 [ 0, %.lr.ph644.us.preheader ], [ %.4438.us, %._crit_edge645.us ]
  %.0439647.us = phi i32 [ 0, %.lr.ph644.us.preheader ], [ %.2441.us, %._crit_edge645.us ]
  %402 = mul i64 %indvars.iv808, %392
  %403 = mul i64 %indvars.iv808, %390
  %404 = mul i64 %indvars.iv808, %388
  %405 = getelementptr inbounds i32, ptr %358, i64 %indvars.iv808
  store i32 %.0439647.us, ptr %405, align 4, !tbaa !5
  %406 = mul nuw nsw i64 %indvars.iv808, %384
  %407 = mul i64 %indvars.iv808, %385
  %408 = trunc i64 %407 to i32
  %409 = trunc i64 %407 to i32
  %410 = trunc i64 %407 to i32
  br label %411

411:                                              ; preds = %.lr.ph644.us, %433
  %indvars.iv803 = phi i64 [ 0, %.lr.ph644.us ], [ %indvars.iv.next804, %433 ]
  %.1435641.us = phi i32 [ %.0434648.us, %.lr.ph644.us ], [ %.4438.us, %433 ]
  %.1440640.us = phi i32 [ %.0439647.us, %.lr.ph644.us ], [ %.2441.us, %433 ]
  %412 = mul i64 %indvars.iv803, %383
  %413 = add i64 %402, %412
  %414 = trunc i64 %413 to i32
  %415 = mul i64 %indvars.iv803, %383
  %416 = add i64 %403, %415
  %417 = trunc i64 %416 to i32
  %418 = mul i64 %indvars.iv803, %383
  %419 = add i64 %404, %418
  %420 = trunc i64 %419 to i32
  %421 = add nuw nsw i64 %indvars.iv803, %406
  %422 = tail call i32 @is_dense_grid_point(i64 noundef %421, i32 noundef %379, ptr noundef %18)
  %423 = icmp sgt i32 %422, 0
  br i1 %423, label %424, label %433

424:                                              ; preds = %411
  %425 = mul i64 %indvars.iv803, %383
  %426 = zext i32 %.1440640.us to i64
  %427 = getelementptr inbounds i32, ptr %362, i64 %426
  %428 = trunc nuw nsw i64 %indvars.iv803 to i32
  store i32 %428, ptr %427, align 4, !tbaa !5
  switch i32 %.sroa.6.0.copyload, label %.preheader492.us656.preheader [
    i32 1, label %.preheader492.us.us.preheader
    i32 2, label %.preheader492.us619.us.preheader
    i32 12, label %.preheader492.us630.us.preheader
  ]

.preheader492.us630.us.preheader:                 ; preds = %424
  %429 = trunc i64 %425 to i32
  br label %.preheader492.us630.us

.preheader492.us619.us.preheader:                 ; preds = %424
  %430 = trunc i64 %425 to i32
  br label %.preheader492.us619.us

.preheader492.us.us.preheader:                    ; preds = %424
  %431 = trunc i64 %425 to i32
  br label %.preheader492.us.us

.preheader492.us656.preheader:                    ; preds = %424
  %432 = add i32 %382, %.1435641.us
  br label %.split616.us660

433:                                              ; preds = %.split616.us660, %411
  %.2441.us = phi i32 [ %434, %.split616.us660 ], [ %.1440640.us, %411 ]
  %.4438.us = phi i32 [ %.us-phi617.us, %.split616.us660 ], [ %.1435641.us, %411 ]
  %indvars.iv.next804 = add nuw nsw i64 %indvars.iv803, 1
  %exitcond807.not = icmp eq i64 %indvars.iv.next804, %384
  br i1 %exitcond807.not, label %._crit_edge645.us, label %411, !llvm.loop !49

.split616.us660:                                  ; preds = %.split.split.split.us607.us.us, %.split.split.us.us.us663, %.split.us.us.us662, %.preheader492.us656.preheader
  %.us-phi617.us = phi i32 [ %432, %.preheader492.us656.preheader ], [ %.lcssa897, %.split.us.us.us662 ], [ %.lcssa896, %.split.split.us.us.us663 ], [ %.lcssa, %.split.split.split.us607.us.us ]
  %434 = add i32 %.1440640.us, 1
  br label %433

.preheader492.us.us:                              ; preds = %.preheader492.us.us.preheader, %.split.us.us.us662
  %.2436611.us.us = phi i32 [ %.lcssa897, %.split.us.us.us662 ], [ %.1435641.us, %.preheader492.us.us.preheader ]
  %.0446610.us.us = phi i32 [ %500, %.split.us.us.us662 ], [ 0, %.preheader492.us.us.preheader ]
  %435 = add i32 %.0446610.us.us, %410
  %436 = mul i32 %435, %.sroa.73.0.copyload
  %437 = add i32 %436, %431
  br i1 %min.iters.check973, label %scalar.ph972.preheader, label %vector.scevcheck970

vector.scevcheck970:                              ; preds = %.preheader492.us.us
  %438 = mul i32 %.sroa.73.0.copyload, %.0446610.us.us
  %439 = add i32 %438, %420
  %440 = xor i32 %439, -1
  %441 = icmp ult i32 %440, %399
  %442 = xor i32 %.2436611.us.us, -1
  %443 = icmp ult i32 %442, %400
  %444 = or i1 %443, %401
  %445 = or i1 %441, %444
  br i1 %445, label %scalar.ph972.preheader, label %vector.ph974

vector.ph974:                                     ; preds = %vector.scevcheck970
  %ind.end = add i32 %.2436611.us.us, %.cast
  br label %vector.body979

vector.body979:                                   ; preds = %vector.body979, %vector.ph974
  %index980 = phi i64 [ 0, %vector.ph974 ], [ %index.next984, %vector.body979 ]
  %.cast981 = trunc i64 %index980 to i32
  %offset.idx = add i32 %.2436611.us.us, %.cast981
  %446 = trunc i64 %index980 to i32
  %447 = add i32 %437, %446
  %448 = zext i32 %447 to i64
  %449 = getelementptr inbounds float, ptr %3, i64 %448
  %450 = zext i32 %offset.idx to i64
  %451 = getelementptr inbounds float, ptr %375, i64 %450
  %452 = getelementptr inbounds i8, ptr %449, i64 16
  %wide.load982 = load <4 x float>, ptr %449, align 4, !tbaa !33
  %wide.load983 = load <4 x float>, ptr %452, align 4, !tbaa !33
  %453 = getelementptr inbounds i8, ptr %451, i64 16
  store <4 x float> %wide.load982, ptr %451, align 4, !tbaa !33
  store <4 x float> %wide.load983, ptr %453, align 4, !tbaa !33
  %index.next984 = add nuw i64 %index980, 8
  %454 = icmp eq i64 %index.next984, %n.vec976
  br i1 %454, label %middle.block971, label %vector.body979, !llvm.loop !50

middle.block971:                                  ; preds = %vector.body979
  br i1 %cmp.n985, label %.split.us.us.us662, label %scalar.ph972.preheader

scalar.ph972.preheader:                           ; preds = %middle.block971, %vector.scevcheck970, %.preheader492.us.us
  %indvars.iv795.ph = phi i64 [ 0, %vector.scevcheck970 ], [ 0, %.preheader492.us.us ], [ %n.vec976, %middle.block971 ]
  %.3437597.us.us.us.ph = phi i32 [ %.2436611.us.us, %vector.scevcheck970 ], [ %.2436611.us.us, %.preheader492.us.us ], [ %ind.end, %middle.block971 ]
  br i1 %lcmp.mod1055.not, label %scalar.ph972.prol.loopexit, label %scalar.ph972.prol

scalar.ph972.prol:                                ; preds = %scalar.ph972.preheader, %scalar.ph972.prol
  %indvars.iv795.prol = phi i64 [ %indvars.iv.next796.prol, %scalar.ph972.prol ], [ %indvars.iv795.ph, %scalar.ph972.preheader ]
  %.3437597.us.us.us.prol = phi i32 [ %462, %scalar.ph972.prol ], [ %.3437597.us.us.us.ph, %scalar.ph972.preheader ]
  %prol.iter1056 = phi i64 [ %prol.iter1056.next, %scalar.ph972.prol ], [ 0, %scalar.ph972.preheader ]
  %455 = trunc nuw i64 %indvars.iv795.prol to i32
  %456 = add i32 %437, %455
  %457 = zext i32 %456 to i64
  %458 = getelementptr inbounds float, ptr %3, i64 %457
  %459 = zext i32 %.3437597.us.us.us.prol to i64
  %460 = getelementptr inbounds float, ptr %375, i64 %459
  %461 = load float, ptr %458, align 4, !tbaa !33
  store float %461, ptr %460, align 4, !tbaa !33
  %462 = add i32 %.3437597.us.us.us.prol, 1
  %indvars.iv.next796.prol = add nuw nsw i64 %indvars.iv795.prol, 1
  %prol.iter1056.next = add i64 %prol.iter1056, 1
  %prol.iter1056.cmp.not = icmp eq i64 %prol.iter1056.next, %xtraiter1054
  br i1 %prol.iter1056.cmp.not, label %scalar.ph972.prol.loopexit, label %scalar.ph972.prol, !llvm.loop !51

scalar.ph972.prol.loopexit:                       ; preds = %scalar.ph972.prol, %scalar.ph972.preheader
  %.lcssa1031.unr = phi i32 [ poison, %scalar.ph972.preheader ], [ %462, %scalar.ph972.prol ]
  %indvars.iv795.unr = phi i64 [ %indvars.iv795.ph, %scalar.ph972.preheader ], [ %indvars.iv.next796.prol, %scalar.ph972.prol ]
  %.3437597.us.us.us.unr = phi i32 [ %.3437597.us.us.us.ph, %scalar.ph972.preheader ], [ %462, %scalar.ph972.prol ]
  %463 = sub nsw i64 %indvars.iv795.ph, %wide.trip.count784
  %464 = icmp ugt i64 %463, -4
  br i1 %464, label %.split.us.us.us662, label %scalar.ph972

scalar.ph972:                                     ; preds = %scalar.ph972.prol.loopexit, %scalar.ph972
  %indvars.iv795 = phi i64 [ %indvars.iv.next796.3, %scalar.ph972 ], [ %indvars.iv795.unr, %scalar.ph972.prol.loopexit ]
  %.3437597.us.us.us = phi i32 [ %499, %scalar.ph972 ], [ %.3437597.us.us.us.unr, %scalar.ph972.prol.loopexit ]
  %465 = trunc nuw i64 %indvars.iv795 to i32
  %466 = add i32 %437, %465
  %467 = zext i32 %466 to i64
  %468 = getelementptr inbounds float, ptr %3, i64 %467
  %469 = zext i32 %.3437597.us.us.us to i64
  %470 = getelementptr inbounds float, ptr %375, i64 %469
  %471 = load float, ptr %468, align 4, !tbaa !33
  store float %471, ptr %470, align 4, !tbaa !33
  %472 = add i32 %.3437597.us.us.us, 1
  %473 = trunc i64 %indvars.iv795 to i32
  %474 = add i32 %473, 1
  %475 = add i32 %437, %474
  %476 = zext i32 %475 to i64
  %477 = getelementptr inbounds float, ptr %3, i64 %476
  %478 = zext i32 %472 to i64
  %479 = getelementptr inbounds float, ptr %375, i64 %478
  %480 = load float, ptr %477, align 4, !tbaa !33
  store float %480, ptr %479, align 4, !tbaa !33
  %481 = add i32 %.3437597.us.us.us, 2
  %482 = trunc i64 %indvars.iv795 to i32
  %483 = add i32 %482, 2
  %484 = add i32 %437, %483
  %485 = zext i32 %484 to i64
  %486 = getelementptr inbounds float, ptr %3, i64 %485
  %487 = zext i32 %481 to i64
  %488 = getelementptr inbounds float, ptr %375, i64 %487
  %489 = load float, ptr %486, align 4, !tbaa !33
  store float %489, ptr %488, align 4, !tbaa !33
  %490 = add i32 %.3437597.us.us.us, 3
  %491 = trunc i64 %indvars.iv795 to i32
  %492 = add i32 %491, 3
  %493 = add i32 %437, %492
  %494 = zext i32 %493 to i64
  %495 = getelementptr inbounds float, ptr %3, i64 %494
  %496 = zext i32 %490 to i64
  %497 = getelementptr inbounds float, ptr %375, i64 %496
  %498 = load float, ptr %495, align 4, !tbaa !33
  store float %498, ptr %497, align 4, !tbaa !33
  %499 = add i32 %.3437597.us.us.us, 4
  %indvars.iv.next796.3 = add nuw nsw i64 %indvars.iv795, 4
  %exitcond799.not.3 = icmp eq i64 %indvars.iv.next796.3, %wide.trip.count798
  br i1 %exitcond799.not.3, label %.split.us.us.us662, label %scalar.ph972, !llvm.loop !52

.split.us.us.us662:                               ; preds = %scalar.ph972.prol.loopexit, %scalar.ph972, %middle.block971
  %.lcssa897 = phi i32 [ %ind.end, %middle.block971 ], [ %.lcssa1031.unr, %scalar.ph972.prol.loopexit ], [ %499, %scalar.ph972 ]
  %500 = add nuw i32 %.0446610.us.us, 1
  %exitcond801.not = icmp eq i32 %500, %umax786
  br i1 %exitcond801.not, label %.split616.us660, label %.preheader492.us.us, !llvm.loop !53

.preheader492.us619.us:                           ; preds = %.preheader492.us619.us.preheader, %.split.split.us.us.us663
  %.2436611.us620.us = phi i32 [ %.lcssa896, %.split.split.us.us.us663 ], [ %.1435641.us, %.preheader492.us619.us.preheader ]
  %.0446610.us621.us = phi i32 [ %566, %.split.split.us.us.us663 ], [ 0, %.preheader492.us619.us.preheader ]
  %501 = add i32 %.0446610.us621.us, %409
  %502 = mul i32 %501, %.sroa.73.0.copyload
  %503 = add i32 %502, %430
  br i1 %min.iters.check989, label %scalar.ph988.preheader, label %vector.scevcheck986

vector.scevcheck986:                              ; preds = %.preheader492.us619.us
  %504 = mul i32 %.sroa.73.0.copyload, %.0446610.us621.us
  %505 = add i32 %504, %417
  %506 = xor i32 %505, -1
  %507 = icmp ult i32 %506, %396
  %508 = xor i32 %.2436611.us620.us, -1
  %509 = icmp ult i32 %508, %397
  %510 = or i1 %509, %398
  %511 = or i1 %507, %510
  br i1 %511, label %scalar.ph988.preheader, label %vector.ph990

vector.ph990:                                     ; preds = %vector.scevcheck986
  %ind.end995 = add i32 %.2436611.us620.us, %.cast994
  br label %vector.body997

vector.body997:                                   ; preds = %vector.body997, %vector.ph990
  %index998 = phi i64 [ 0, %vector.ph990 ], [ %index.next1003, %vector.body997 ]
  %.cast999 = trunc i64 %index998 to i32
  %offset.idx1000 = add i32 %.2436611.us620.us, %.cast999
  %512 = trunc i64 %index998 to i32
  %513 = add i32 %503, %512
  %514 = zext i32 %513 to i64
  %515 = getelementptr inbounds i16, ptr %3, i64 %514
  %516 = zext i32 %offset.idx1000 to i64
  %517 = getelementptr inbounds i16, ptr %375, i64 %516
  %518 = getelementptr inbounds i8, ptr %515, i64 16
  %wide.load1001 = load <8 x i16>, ptr %515, align 2, !tbaa !14
  %wide.load1002 = load <8 x i16>, ptr %518, align 2, !tbaa !14
  %519 = getelementptr inbounds i8, ptr %517, i64 16
  store <8 x i16> %wide.load1001, ptr %517, align 2, !tbaa !14
  store <8 x i16> %wide.load1002, ptr %519, align 2, !tbaa !14
  %index.next1003 = add nuw i64 %index998, 16
  %520 = icmp eq i64 %index.next1003, %n.vec992
  br i1 %520, label %middle.block987, label %vector.body997, !llvm.loop !54

middle.block987:                                  ; preds = %vector.body997
  br i1 %cmp.n1004, label %.split.split.us.us.us663, label %scalar.ph988.preheader

scalar.ph988.preheader:                           ; preds = %middle.block987, %vector.scevcheck986, %.preheader492.us619.us
  %indvars.iv788.ph = phi i64 [ 0, %vector.scevcheck986 ], [ 0, %.preheader492.us619.us ], [ %n.vec992, %middle.block987 ]
  %.3437597.us600.us.us.ph = phi i32 [ %.2436611.us620.us, %vector.scevcheck986 ], [ %.2436611.us620.us, %.preheader492.us619.us ], [ %ind.end995, %middle.block987 ]
  br i1 %lcmp.mod1052.not, label %scalar.ph988.prol.loopexit, label %scalar.ph988.prol

scalar.ph988.prol:                                ; preds = %scalar.ph988.preheader, %scalar.ph988.prol
  %indvars.iv788.prol = phi i64 [ %indvars.iv.next789.prol, %scalar.ph988.prol ], [ %indvars.iv788.ph, %scalar.ph988.preheader ]
  %.3437597.us600.us.us.prol = phi i32 [ %528, %scalar.ph988.prol ], [ %.3437597.us600.us.us.ph, %scalar.ph988.preheader ]
  %prol.iter1053 = phi i64 [ %prol.iter1053.next, %scalar.ph988.prol ], [ 0, %scalar.ph988.preheader ]
  %521 = trunc nuw i64 %indvars.iv788.prol to i32
  %522 = add i32 %503, %521
  %523 = zext i32 %522 to i64
  %524 = getelementptr inbounds i16, ptr %3, i64 %523
  %525 = zext i32 %.3437597.us600.us.us.prol to i64
  %526 = getelementptr inbounds i16, ptr %375, i64 %525
  %527 = load i16, ptr %524, align 2, !tbaa !14
  store i16 %527, ptr %526, align 2, !tbaa !14
  %528 = add i32 %.3437597.us600.us.us.prol, 1
  %indvars.iv.next789.prol = add nuw nsw i64 %indvars.iv788.prol, 1
  %prol.iter1053.next = add i64 %prol.iter1053, 1
  %prol.iter1053.cmp.not = icmp eq i64 %prol.iter1053.next, %xtraiter1051
  br i1 %prol.iter1053.cmp.not, label %scalar.ph988.prol.loopexit, label %scalar.ph988.prol, !llvm.loop !55

scalar.ph988.prol.loopexit:                       ; preds = %scalar.ph988.prol, %scalar.ph988.preheader
  %.lcssa1030.unr = phi i32 [ poison, %scalar.ph988.preheader ], [ %528, %scalar.ph988.prol ]
  %indvars.iv788.unr = phi i64 [ %indvars.iv788.ph, %scalar.ph988.preheader ], [ %indvars.iv.next789.prol, %scalar.ph988.prol ]
  %.3437597.us600.us.us.unr = phi i32 [ %.3437597.us600.us.us.ph, %scalar.ph988.preheader ], [ %528, %scalar.ph988.prol ]
  %529 = sub nsw i64 %indvars.iv788.ph, %wide.trip.count784
  %530 = icmp ugt i64 %529, -4
  br i1 %530, label %.split.split.us.us.us663, label %scalar.ph988

scalar.ph988:                                     ; preds = %scalar.ph988.prol.loopexit, %scalar.ph988
  %indvars.iv788 = phi i64 [ %indvars.iv.next789.3, %scalar.ph988 ], [ %indvars.iv788.unr, %scalar.ph988.prol.loopexit ]
  %.3437597.us600.us.us = phi i32 [ %565, %scalar.ph988 ], [ %.3437597.us600.us.us.unr, %scalar.ph988.prol.loopexit ]
  %531 = trunc nuw i64 %indvars.iv788 to i32
  %532 = add i32 %503, %531
  %533 = zext i32 %532 to i64
  %534 = getelementptr inbounds i16, ptr %3, i64 %533
  %535 = zext i32 %.3437597.us600.us.us to i64
  %536 = getelementptr inbounds i16, ptr %375, i64 %535
  %537 = load i16, ptr %534, align 2, !tbaa !14
  store i16 %537, ptr %536, align 2, !tbaa !14
  %538 = add i32 %.3437597.us600.us.us, 1
  %539 = trunc i64 %indvars.iv788 to i32
  %540 = add i32 %539, 1
  %541 = add i32 %503, %540
  %542 = zext i32 %541 to i64
  %543 = getelementptr inbounds i16, ptr %3, i64 %542
  %544 = zext i32 %538 to i64
  %545 = getelementptr inbounds i16, ptr %375, i64 %544
  %546 = load i16, ptr %543, align 2, !tbaa !14
  store i16 %546, ptr %545, align 2, !tbaa !14
  %547 = add i32 %.3437597.us600.us.us, 2
  %548 = trunc i64 %indvars.iv788 to i32
  %549 = add i32 %548, 2
  %550 = add i32 %503, %549
  %551 = zext i32 %550 to i64
  %552 = getelementptr inbounds i16, ptr %3, i64 %551
  %553 = zext i32 %547 to i64
  %554 = getelementptr inbounds i16, ptr %375, i64 %553
  %555 = load i16, ptr %552, align 2, !tbaa !14
  store i16 %555, ptr %554, align 2, !tbaa !14
  %556 = add i32 %.3437597.us600.us.us, 3
  %557 = trunc i64 %indvars.iv788 to i32
  %558 = add i32 %557, 3
  %559 = add i32 %503, %558
  %560 = zext i32 %559 to i64
  %561 = getelementptr inbounds i16, ptr %3, i64 %560
  %562 = zext i32 %556 to i64
  %563 = getelementptr inbounds i16, ptr %375, i64 %562
  %564 = load i16, ptr %561, align 2, !tbaa !14
  store i16 %564, ptr %563, align 2, !tbaa !14
  %565 = add i32 %.3437597.us600.us.us, 4
  %indvars.iv.next789.3 = add nuw nsw i64 %indvars.iv788, 4
  %exitcond792.not.3 = icmp eq i64 %indvars.iv.next789.3, %wide.trip.count791
  br i1 %exitcond792.not.3, label %.split.split.us.us.us663, label %scalar.ph988, !llvm.loop !56

.split.split.us.us.us663:                         ; preds = %scalar.ph988.prol.loopexit, %scalar.ph988, %middle.block987
  %.lcssa896 = phi i32 [ %ind.end995, %middle.block987 ], [ %.lcssa1030.unr, %scalar.ph988.prol.loopexit ], [ %565, %scalar.ph988 ]
  %566 = add nuw i32 %.0446610.us621.us, 1
  %exitcond794.not = icmp eq i32 %566, %umax786
  br i1 %exitcond794.not, label %.split616.us660, label %.preheader492.us619.us, !llvm.loop !53

.preheader492.us630.us:                           ; preds = %.preheader492.us630.us.preheader, %.split.split.split.us607.us.us
  %.2436611.us631.us = phi i32 [ %.lcssa, %.split.split.split.us607.us.us ], [ %.1435641.us, %.preheader492.us630.us.preheader ]
  %.0446610.us632.us = phi i32 [ %632, %.split.split.split.us607.us.us ], [ 0, %.preheader492.us630.us.preheader ]
  %567 = add i32 %.0446610.us632.us, %408
  %568 = mul i32 %567, %.sroa.73.0.copyload
  %569 = add i32 %568, %429
  br i1 %min.iters.check1008, label %scalar.ph1007.preheader, label %vector.scevcheck1005

vector.scevcheck1005:                             ; preds = %.preheader492.us630.us
  %570 = mul i32 %.sroa.73.0.copyload, %.0446610.us632.us
  %571 = add i32 %570, %414
  %572 = xor i32 %571, -1
  %573 = icmp ult i32 %572, %393
  %574 = xor i32 %.2436611.us631.us, -1
  %575 = icmp ult i32 %574, %394
  %576 = or i1 %575, %395
  %577 = or i1 %573, %576
  br i1 %577, label %scalar.ph1007.preheader, label %vector.ph1009

vector.ph1009:                                    ; preds = %vector.scevcheck1005
  %ind.end1014 = add i32 %.2436611.us631.us, %.cast1013
  br label %vector.body1016

vector.body1016:                                  ; preds = %vector.body1016, %vector.ph1009
  %index1017 = phi i64 [ 0, %vector.ph1009 ], [ %index.next1022, %vector.body1016 ]
  %.cast1018 = trunc i64 %index1017 to i32
  %offset.idx1019 = add i32 %.2436611.us631.us, %.cast1018
  %578 = trunc i64 %index1017 to i32
  %579 = add i32 %569, %578
  %580 = zext i32 %579 to i64
  %581 = getelementptr inbounds i8, ptr %3, i64 %580
  %582 = zext i32 %offset.idx1019 to i64
  %583 = getelementptr inbounds i8, ptr %375, i64 %582
  %584 = getelementptr inbounds i8, ptr %581, i64 16
  %wide.load1020 = load <16 x i8>, ptr %581, align 1, !tbaa !22
  %wide.load1021 = load <16 x i8>, ptr %584, align 1, !tbaa !22
  %585 = getelementptr inbounds i8, ptr %583, i64 16
  store <16 x i8> %wide.load1020, ptr %583, align 1, !tbaa !22
  store <16 x i8> %wide.load1021, ptr %585, align 1, !tbaa !22
  %index.next1022 = add nuw i64 %index1017, 32
  %586 = icmp eq i64 %index.next1022, %n.vec1011
  br i1 %586, label %middle.block1006, label %vector.body1016, !llvm.loop !57

middle.block1006:                                 ; preds = %vector.body1016
  br i1 %cmp.n1023, label %.split.split.split.us607.us.us, label %scalar.ph1007.preheader

scalar.ph1007.preheader:                          ; preds = %middle.block1006, %vector.scevcheck1005, %.preheader492.us630.us
  %indvars.iv780.ph = phi i64 [ 0, %vector.scevcheck1005 ], [ 0, %.preheader492.us630.us ], [ %n.vec1011, %middle.block1006 ]
  %.3437597.us605.us.us.ph = phi i32 [ %.2436611.us631.us, %vector.scevcheck1005 ], [ %.2436611.us631.us, %.preheader492.us630.us ], [ %ind.end1014, %middle.block1006 ]
  br i1 %lcmp.mod1049.not, label %scalar.ph1007.prol.loopexit, label %scalar.ph1007.prol

scalar.ph1007.prol:                               ; preds = %scalar.ph1007.preheader, %scalar.ph1007.prol
  %indvars.iv780.prol = phi i64 [ %indvars.iv.next781.prol, %scalar.ph1007.prol ], [ %indvars.iv780.ph, %scalar.ph1007.preheader ]
  %.3437597.us605.us.us.prol = phi i32 [ %594, %scalar.ph1007.prol ], [ %.3437597.us605.us.us.ph, %scalar.ph1007.preheader ]
  %prol.iter1050 = phi i64 [ %prol.iter1050.next, %scalar.ph1007.prol ], [ 0, %scalar.ph1007.preheader ]
  %587 = trunc nuw i64 %indvars.iv780.prol to i32
  %588 = add i32 %569, %587
  %589 = zext i32 %588 to i64
  %590 = getelementptr inbounds i8, ptr %3, i64 %589
  %591 = zext i32 %.3437597.us605.us.us.prol to i64
  %592 = getelementptr inbounds i8, ptr %375, i64 %591
  %593 = load i8, ptr %590, align 1, !tbaa !22
  store i8 %593, ptr %592, align 1, !tbaa !22
  %594 = add i32 %.3437597.us605.us.us.prol, 1
  %indvars.iv.next781.prol = add nuw nsw i64 %indvars.iv780.prol, 1
  %prol.iter1050.next = add i64 %prol.iter1050, 1
  %prol.iter1050.cmp.not = icmp eq i64 %prol.iter1050.next, %xtraiter1048
  br i1 %prol.iter1050.cmp.not, label %scalar.ph1007.prol.loopexit, label %scalar.ph1007.prol, !llvm.loop !58

scalar.ph1007.prol.loopexit:                      ; preds = %scalar.ph1007.prol, %scalar.ph1007.preheader
  %.lcssa1029.unr = phi i32 [ poison, %scalar.ph1007.preheader ], [ %594, %scalar.ph1007.prol ]
  %indvars.iv780.unr = phi i64 [ %indvars.iv780.ph, %scalar.ph1007.preheader ], [ %indvars.iv.next781.prol, %scalar.ph1007.prol ]
  %.3437597.us605.us.us.unr = phi i32 [ %.3437597.us605.us.us.ph, %scalar.ph1007.preheader ], [ %594, %scalar.ph1007.prol ]
  %595 = sub nsw i64 %indvars.iv780.ph, %wide.trip.count784
  %596 = icmp ugt i64 %595, -4
  br i1 %596, label %.split.split.split.us607.us.us, label %scalar.ph1007

scalar.ph1007:                                    ; preds = %scalar.ph1007.prol.loopexit, %scalar.ph1007
  %indvars.iv780 = phi i64 [ %indvars.iv.next781.3, %scalar.ph1007 ], [ %indvars.iv780.unr, %scalar.ph1007.prol.loopexit ]
  %.3437597.us605.us.us = phi i32 [ %631, %scalar.ph1007 ], [ %.3437597.us605.us.us.unr, %scalar.ph1007.prol.loopexit ]
  %597 = trunc nuw i64 %indvars.iv780 to i32
  %598 = add i32 %569, %597
  %599 = zext i32 %598 to i64
  %600 = getelementptr inbounds i8, ptr %3, i64 %599
  %601 = zext i32 %.3437597.us605.us.us to i64
  %602 = getelementptr inbounds i8, ptr %375, i64 %601
  %603 = load i8, ptr %600, align 1, !tbaa !22
  store i8 %603, ptr %602, align 1, !tbaa !22
  %604 = add i32 %.3437597.us605.us.us, 1
  %605 = trunc i64 %indvars.iv780 to i32
  %606 = add i32 %605, 1
  %607 = add i32 %569, %606
  %608 = zext i32 %607 to i64
  %609 = getelementptr inbounds i8, ptr %3, i64 %608
  %610 = zext i32 %604 to i64
  %611 = getelementptr inbounds i8, ptr %375, i64 %610
  %612 = load i8, ptr %609, align 1, !tbaa !22
  store i8 %612, ptr %611, align 1, !tbaa !22
  %613 = add i32 %.3437597.us605.us.us, 2
  %614 = trunc i64 %indvars.iv780 to i32
  %615 = add i32 %614, 2
  %616 = add i32 %569, %615
  %617 = zext i32 %616 to i64
  %618 = getelementptr inbounds i8, ptr %3, i64 %617
  %619 = zext i32 %613 to i64
  %620 = getelementptr inbounds i8, ptr %375, i64 %619
  %621 = load i8, ptr %618, align 1, !tbaa !22
  store i8 %621, ptr %620, align 1, !tbaa !22
  %622 = add i32 %.3437597.us605.us.us, 3
  %623 = trunc i64 %indvars.iv780 to i32
  %624 = add i32 %623, 3
  %625 = add i32 %569, %624
  %626 = zext i32 %625 to i64
  %627 = getelementptr inbounds i8, ptr %3, i64 %626
  %628 = zext i32 %622 to i64
  %629 = getelementptr inbounds i8, ptr %375, i64 %628
  %630 = load i8, ptr %627, align 1, !tbaa !22
  store i8 %630, ptr %629, align 1, !tbaa !22
  %631 = add i32 %.3437597.us605.us.us, 4
  %indvars.iv.next781.3 = add nuw nsw i64 %indvars.iv780, 4
  %exitcond785.not.3 = icmp eq i64 %indvars.iv.next781.3, %wide.trip.count784
  br i1 %exitcond785.not.3, label %.split.split.split.us607.us.us, label %scalar.ph1007, !llvm.loop !59

.split.split.split.us607.us.us:                   ; preds = %scalar.ph1007.prol.loopexit, %scalar.ph1007, %middle.block1006
  %.lcssa = phi i32 [ %ind.end1014, %middle.block1006 ], [ %.lcssa1029.unr, %scalar.ph1007.prol.loopexit ], [ %631, %scalar.ph1007 ]
  %632 = add nuw i32 %.0446610.us632.us, 1
  %exitcond787.not = icmp eq i32 %632, %umax786
  br i1 %exitcond787.not, label %.split616.us660, label %.preheader492.us630.us, !llvm.loop !53

._crit_edge645.us:                                ; preds = %433
  %indvars.iv.next809 = add nuw nsw i64 %indvars.iv808, 1
  %exitcond812.not = icmp eq i64 %indvars.iv.next809, %wide.trip.count811
  br i1 %exitcond812.not, label %._crit_edge652, label %.lr.ph644.us, !llvm.loop !60

._crit_edge652:                                   ; preds = %._crit_edge645.us, %.lr.ph651.split.preheader, %371
  %633 = icmp sgt i32 %.sroa.78408.0.copyload, 0
  %634 = icmp sgt i32 %.sroa.77407.0.copyload, 0
  %or.cond = select i1 %633, i1 %634, i1 false
  br i1 %or.cond, label %635, label %.loopexit

635:                                              ; preds = %._crit_edge652
  %636 = tail call i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef %.sroa.6.0.copyload) #11
  %.not683 = icmp ugt i32 %.pre-phi, %.0431.lcssa
  br i1 %.not683, label %.loopexit, label %.lr.ph681

.lr.ph681:                                        ; preds = %635
  %637 = icmp eq i32 %.sroa.6.0.copyload, 1
  %638 = and i32 %.sroa.6.0.copyload, -2
  %639 = shl nsw i32 %.pre-phi, 2
  %640 = zext i32 %639 to i64
  %641 = shl nsw i32 %.pre-phi, 3
  %642 = zext i32 %641 to i64
  %umax816 = tail call i32 @llvm.umax.i32(i32 %.sroa.74.0.copyload, i32 1)
  %umax819 = tail call i32 @llvm.umax.i32(i32 %.sroa.75.0.copyload, i32 1)
  %643 = sext i32 %.pre-phi to i64
  %644 = zext i32 %.pre-phi to i64
  %645 = shl nsw i32 %.pre-phi, 2
  %646 = zext i32 %645 to i64
  %647 = shl nsw i32 %.pre-phi, 3
  %648 = zext i32 %647 to i64
  %649 = zext i32 %.pre-phi to i64
  %650 = shl nsw i32 %.pre-phi, 1
  %651 = zext i32 %650 to i64
  %wide.trip.count817 = zext i32 %umax816 to i64
  %wide.trip.count824 = zext i32 %umax816 to i64
  br label %652

652:                                              ; preds = %.lr.ph681, %.split673.us
  %indvars.iv828 = phi i64 [ 0, %.lr.ph681 ], [ %indvars.iv.next829, %.split673.us ]
  br i1 %363, label %674, label %653

653:                                              ; preds = %652
  br i1 %637, label %677, label %654

654:                                              ; preds = %653
  switch i32 %638, label %655 [
    i32 2, label %669
    i32 4, label %.thread
    i32 6, label %.thread832
    i32 8, label %.thread834
    i32 10, label %669
    i32 12, label %.thread836
  ]

655:                                              ; preds = %654
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 349, ptr noundef nonnull @__PRETTY_FUNCTION__.create_spmm_inputs) #12
  unreachable

.thread:                                          ; preds = %654
  %656 = tail call ptr @llvm.stacksave.p0()
  %657 = alloca i8, i64 %649, align 16
  %658 = mul nsw i64 %indvars.iv828, %643
  br label %.thread841

.thread832:                                       ; preds = %654
  %659 = tail call ptr @llvm.stacksave.p0()
  %660 = alloca i8, i64 %648, align 16
  %661 = mul nsw i64 %indvars.iv828, %643
  br label %.thread848

.thread834:                                       ; preds = %654
  %662 = tail call ptr @llvm.stacksave.p0()
  %663 = alloca i8, i64 %646, align 16
  %664 = mul nsw i64 %indvars.iv828, %643
  br label %.thread855

.thread836:                                       ; preds = %654
  %665 = tail call ptr @llvm.stacksave.p0()
  %666 = alloca i8, i64 %644, align 16
  %667 = mul nsw i64 %indvars.iv828, %643
  %668 = getelementptr inbounds i8, ptr %375, i64 %667
  br label %694

669:                                              ; preds = %654, %654
  %670 = tail call ptr @llvm.stacksave.p0()
  %671 = alloca i8, i64 %651, align 16
  %672 = mul nsw i64 %indvars.iv828, %643
  switch i32 %638, label %673 [
    i32 2, label %685
    i32 4, label %.thread841
    i32 6, label %.thread848
    i32 8, label %.thread855
    i32 10, label %685
  ]

673:                                              ; preds = %669
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 350, ptr noundef nonnull @__PRETTY_FUNCTION__.create_spmm_inputs) #12
  unreachable

674:                                              ; preds = %652
  %675 = tail call ptr @llvm.stacksave.p0()
  %676 = alloca i8, i64 %642, align 16
  br label %.thread870

677:                                              ; preds = %653
  %678 = tail call ptr @llvm.stacksave.p0()
  %679 = alloca i8, i64 %640, align 16
  br label %.thread870

.thread841:                                       ; preds = %.thread, %669
  %.ph = phi i64 [ %658, %.thread ], [ %672, %669 ]
  %.ph839 = phi ptr [ %657, %.thread ], [ %671, %669 ]
  %.ph840 = phi ptr [ %656, %.thread ], [ %670, %669 ]
  %680 = getelementptr inbounds i8, ptr %375, i64 %.ph
  br label %694

.thread848:                                       ; preds = %.thread832, %669
  %.ph844 = phi i64 [ %661, %.thread832 ], [ %672, %669 ]
  %.ph846 = phi ptr [ %660, %.thread832 ], [ %671, %669 ]
  %.ph847 = phi ptr [ %659, %.thread832 ], [ %670, %669 ]
  %681 = shl nsw i64 %.ph844, 3
  %682 = getelementptr inbounds i8, ptr %375, i64 %681
  br label %694

.thread855:                                       ; preds = %.thread834, %669
  %.ph851 = phi i64 [ %664, %.thread834 ], [ %672, %669 ]
  %.ph853 = phi ptr [ %663, %.thread834 ], [ %671, %669 ]
  %.ph854 = phi ptr [ %662, %.thread834 ], [ %670, %669 ]
  %683 = shl nsw i64 %.ph851, 2
  %684 = getelementptr inbounds i8, ptr %375, i64 %683
  br label %694

685:                                              ; preds = %669, %669
  %686 = shl nsw i64 %672, 1
  %687 = getelementptr inbounds i8, ptr %375, i64 %686
  switch i32 %638, label %688 [
    i32 2, label %694
    i32 4, label %.fold.split482
    i32 6, label %.fold.split483
    i32 8, label %.fold.split484
    i32 10, label %694
  ]

688:                                              ; preds = %685
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 350, ptr noundef nonnull @__PRETTY_FUNCTION__.create_spmm_inputs) #12
  unreachable

.fold.split482:                                   ; preds = %685
  br label %694

.fold.split483:                                   ; preds = %685
  br label %694

.fold.split484:                                   ; preds = %685
  br label %694

.thread870:                                       ; preds = %677, %674
  %.sink888 = phi i64 [ 2, %677 ], [ 3, %674 ]
  %.ph866 = phi ptr [ %678, %677 ], [ %675, %674 ]
  %.ph867 = phi ptr [ %679, %677 ], [ %676, %674 ]
  %.ph869 = phi i32 [ 4, %677 ], [ 8, %674 ]
  %689 = mul nsw i64 %indvars.iv828, %643
  %690 = shl nsw i64 %689, %.sink888
  %691 = getelementptr inbounds i8, ptr %375, i64 %690
  %692 = mul nsw i32 %.ph869, %.pre-phi
  %693 = sext i32 %692 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %.ph867, ptr align 1 %691, i64 %693, i1 false)
  br label %.split673.us

694:                                              ; preds = %.thread836, %.thread855, %.thread848, %.thread841, %685, %685, %.fold.split484, %.fold.split483, %.fold.split482
  %695 = phi ptr [ %687, %685 ], [ %687, %685 ], [ %680, %.thread841 ], [ %687, %.fold.split482 ], [ %682, %.thread848 ], [ %687, %.fold.split483 ], [ %684, %.thread855 ], [ %687, %.fold.split484 ], [ %668, %.thread836 ]
  %696 = phi ptr [ %670, %685 ], [ %670, %685 ], [ %.ph840, %.thread841 ], [ %670, %.fold.split482 ], [ %.ph847, %.thread848 ], [ %670, %.fold.split483 ], [ %.ph854, %.thread855 ], [ %670, %.fold.split484 ], [ %665, %.thread836 ]
  %697 = phi ptr [ %671, %685 ], [ %671, %685 ], [ %.ph839, %.thread841 ], [ %671, %.fold.split482 ], [ %.ph846, %.thread848 ], [ %671, %.fold.split483 ], [ %.ph853, %.thread855 ], [ %671, %.fold.split484 ], [ %666, %.thread836 ]
  %.in = phi i64 [ %672, %685 ], [ %672, %685 ], [ %.ph, %.thread841 ], [ %672, %.fold.split482 ], [ %.ph844, %.thread848 ], [ %672, %.fold.split483 ], [ %.ph851, %.thread855 ], [ %672, %.fold.split484 ], [ %667, %.thread836 ]
  %698 = phi i32 [ 2, %685 ], [ 2, %685 ], [ 1, %.thread841 ], [ 1, %.fold.split482 ], [ 8, %.thread848 ], [ 8, %.fold.split483 ], [ 4, %.thread855 ], [ 4, %.fold.split484 ], [ 1, %.thread836 ]
  %699 = trunc i64 %.in to i32
  %700 = mul nsw i32 %698, %.pre-phi
  %701 = sext i32 %700 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %697, ptr align 1 %695, i64 %701, i1 false)
  switch i32 %.sroa.6.0.copyload, label %.split673.us [
    i32 2, label %.preheader.us
    i32 12, label %.preheader.us675
  ]

.preheader.us:                                    ; preds = %694, %.split.us.us
  %.0443668.us = phi i32 [ %716, %.split.us.us ], [ 0, %694 ]
  %702 = mul i32 %.0443668.us, %.sroa.74.0.copyload
  br label %703

703:                                              ; preds = %703, %.preheader.us
  %indvars.iv821 = phi i64 [ %indvars.iv.next822, %703 ], [ 0, %.preheader.us ]
  %704 = trunc nuw i64 %indvars.iv821 to i32
  %705 = add i32 %702, %704
  %706 = zext i32 %705 to i64
  %707 = getelementptr inbounds i16, ptr %697, i64 %706
  %708 = load i16, ptr %707, align 2, !tbaa !14
  %709 = udiv i32 %704, %636
  %710 = mul i32 %709, %.sroa.75.0.copyload
  %711 = urem i32 %704, %636
  %reass.add490.us.us = add i32 %710, %.0443668.us
  %reass.mul491.us.us = mul i32 %reass.add490.us.us, %636
  %712 = add i32 %711, %699
  %713 = add i32 %712, %reass.mul491.us.us
  %714 = zext i32 %713 to i64
  %715 = getelementptr inbounds i16, ptr %375, i64 %714
  store i16 %708, ptr %715, align 2, !tbaa !14
  %indvars.iv.next822 = add nuw nsw i64 %indvars.iv821, 1
  %exitcond825.not = icmp eq i64 %indvars.iv.next822, %wide.trip.count824
  br i1 %exitcond825.not, label %.split.us.us, label %703, !llvm.loop !61

.split.us.us:                                     ; preds = %703
  %716 = add nuw i32 %.0443668.us, 1
  %exitcond827.not = icmp eq i32 %716, %umax819
  br i1 %exitcond827.not, label %.split673.us, label %.preheader.us, !llvm.loop !62

.preheader.us675:                                 ; preds = %694, %.split.split.us.us
  %.0443668.us676 = phi i32 [ %731, %.split.split.us.us ], [ 0, %694 ]
  %717 = mul i32 %.0443668.us676, %.sroa.74.0.copyload
  br label %718

718:                                              ; preds = %718, %.preheader.us675
  %indvars.iv813 = phi i64 [ %indvars.iv.next814, %718 ], [ 0, %.preheader.us675 ]
  %719 = trunc nuw i64 %indvars.iv813 to i32
  %720 = add i32 %717, %719
  %721 = zext i32 %720 to i64
  %722 = getelementptr inbounds i8, ptr %697, i64 %721
  %723 = load i8, ptr %722, align 1, !tbaa !22
  %724 = udiv i32 %719, %636
  %725 = mul i32 %724, %.sroa.75.0.copyload
  %726 = urem i32 %719, %636
  %reass.add488.us.us = add i32 %725, %.0443668.us676
  %reass.mul489.us.us = mul i32 %reass.add488.us.us, %636
  %727 = add i32 %726, %699
  %728 = add i32 %727, %reass.mul489.us.us
  %729 = zext i32 %728 to i64
  %730 = getelementptr inbounds i8, ptr %375, i64 %729
  store i8 %723, ptr %730, align 1, !tbaa !22
  %indvars.iv.next814 = add nuw nsw i64 %indvars.iv813, 1
  %exitcond818.not = icmp eq i64 %indvars.iv.next814, %wide.trip.count817
  br i1 %exitcond818.not, label %.split.split.us.us, label %718, !llvm.loop !61

.split.split.us.us:                               ; preds = %718
  %731 = add nuw i32 %.0443668.us676, 1
  %exitcond820.not = icmp eq i32 %731, %umax819
  br i1 %exitcond820.not, label %.split673.us, label %.preheader.us675, !llvm.loop !62

.split673.us:                                     ; preds = %.split.split.us.us, %.split.us.us, %694, %.thread870
  %732 = phi ptr [ %.ph866, %.thread870 ], [ %696, %694 ], [ %696, %.split.us.us ], [ %696, %.split.split.us.us ]
  tail call void @llvm.stackrestore.p0(ptr %732)
  %indvars.iv.next829 = add nuw nsw i64 %indvars.iv828, 1
  %733 = icmp ult i64 %indvars.iv.next829, %360
  br i1 %733, label %652, label %.loopexit, !llvm.loop !63

.loopexit:                                        ; preds = %.split673.us, %635, %._crit_edge652
  tail call void @free(ptr noundef %18) #11
  ret void
}

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

declare i32 @libxsmm_cpuid_dot_pack_factor(i32 noundef) local_unnamed_addr #3

; Function Attrs: nofree
declare void @qsort(ptr noundef, i64 noundef, i64 noundef, ptr nocapture noundef) local_unnamed_addr #4

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #6

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #6

; 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: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.umax.i32(i32, i32) #8

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #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 nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #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 = { nofree "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { mustprogress nocallback nofree nosync nounwind willreturn }
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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #9 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #10 = { nounwind allocsize(0) }
attributes #11 = { nounwind }
attributes #12 = { noreturn nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = distinct !{!9, !10}
!10 = !{!"llvm.loop.mustprogress"}
!11 = !{!12, !6, i64 48}
!12 = !{!"spmm_def", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28, !6, i64 32, !6, i64 36, !13, i64 40, !6, i64 48, !6, i64 52, !6, i64 56, !6, i64 60, !6, i64 64, !6, i64 68, !6, i64 72, !6, i64 76, !6, i64 80, !6, i64 84}
!13 = !{!"double", !7, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"short", !7, i64 0}
!16 = distinct !{!16, !10, !17, !18}
!17 = !{!"llvm.loop.isvectorized", i32 1}
!18 = !{!"llvm.loop.unroll.runtime.disable"}
!19 = distinct !{!19, !10, !17}
!20 = distinct !{!20, !10}
!21 = distinct !{!21, !10}
!22 = !{!7, !7, i64 0}
!23 = distinct !{!23, !10}
!24 = distinct !{!24, !10, !17, !18}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.unroll.disable"}
!27 = distinct !{!27, !10, !17}
!28 = !{!29, !29, i64 0}
!29 = !{!"long long", !7, i64 0}
!30 = distinct !{!30, !10, !17, !18}
!31 = distinct !{!31, !10, !18, !17}
!32 = distinct !{!32, !10}
!33 = !{!34, !34, i64 0}
!34 = !{!"float", !7, i64 0}
!35 = distinct !{!35, !10, !17, !18}
!36 = distinct !{!36, !26}
!37 = distinct !{!37, !10, !17}
!38 = distinct !{!38, !10}
!39 = distinct !{!39, !10, !17, !18}
!40 = distinct !{!40, !26}
!41 = distinct !{!41, !10, !17}
!42 = distinct !{!42, !10, !17, !18}
!43 = distinct !{!43, !10, !17, !18}
!44 = distinct !{!44, !26}
!45 = distinct !{!45, !10, !17}
!46 = distinct !{!46, !10}
!47 = !{!48, !48, i64 0}
!48 = !{!"any pointer", !7, i64 0}
!49 = distinct !{!49, !10}
!50 = distinct !{!50, !10, !17, !18}
!51 = distinct !{!51, !26}
!52 = distinct !{!52, !10, !17}
!53 = distinct !{!53, !10}
!54 = distinct !{!54, !10, !17, !18}
!55 = distinct !{!55, !26}
!56 = distinct !{!56, !10, !17}
!57 = distinct !{!57, !10, !17, !18}
!58 = distinct !{!58, !26}
!59 = distinct !{!59, !10, !17}
!60 = distinct !{!60, !10}
!61 = distinct !{!61, !10}
!62 = distinct !{!62, !10}
!63 = distinct !{!63, !10}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopIdiomRecognizePass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass