; LLVM IR from libxsmm/libxsmm :: src (generator_mateltwise_gather_scatter_aarch64)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.libxsmm_generated_code = type { ptr, i32, i32, i32, i32, i32, i32 }
%struct.libxsmm_mateltwise_gp_reg_mapping_struct = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

@.str = external hidden unnamed_addr constant [99 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [331 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [291 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [306 x i8], align 1
@__PRETTY_FUNCTION__.libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled = external hidden unnamed_addr constant [491 x i8], align 1

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

declare void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef zeroext, i8 noundef zeroext) #1

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

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

declare void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i64 noundef) #1

declare void @libxsmm_aarch64_instruction_sve_move(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #1

declare void @libxsmm_aarch64_instruction_sve_compute(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef zeroext, i32 noundef, i32 noundef, i32 noundef) #1

declare i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext) #1

declare void @libxsmm_generator_gather_scatter_vreg_asimd_aarch64(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled(ptr noundef %0, ptr noundef %1, i32 noundef %2, i32 noundef %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8, i32 noundef %9, i32 noundef %10, i32 noundef %11, i32 noundef %12, i32 noundef %13, i32 noundef %14, i32 noundef %15, i32 noundef %16, i32 noundef %17, i32 noundef %18, i32 noundef %19) #3 {
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %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 i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i8, align 1
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca i32, align 4
  %45 = alloca i32, align 4
  %46 = alloca i32, align 4
  %47 = alloca i32, align 4
  %48 = alloca i32, align 4
  %49 = alloca i32, align 4
  %50 = alloca i32, align 4
  %51 = alloca i32, align 4
  %52 = alloca i32, align 4
  %53 = alloca i32, align 4
  %54 = alloca i32, align 4
  %55 = alloca i32, align 4
  %56 = alloca i32, align 4
  %57 = alloca i32, align 4
  store ptr %0, ptr %21, align 8, !tbaa !5
  store ptr %1, ptr %22, align 8, !tbaa !5
  store i32 %2, ptr %23, align 4, !tbaa !9
  store i32 %3, ptr %24, align 4, !tbaa !9
  store i32 %4, ptr %25, align 4, !tbaa !9
  store i32 %5, ptr %26, align 4, !tbaa !9
  store i32 %6, ptr %27, align 4, !tbaa !9
  store i32 %7, ptr %28, align 4, !tbaa !9
  store i32 %8, ptr %29, align 4, !tbaa !9
  store i32 %9, ptr %30, align 4, !tbaa !9
  store i32 %10, ptr %31, align 4, !tbaa !9
  store i32 %11, ptr %32, align 4, !tbaa !9
  store i32 %12, ptr %33, align 4, !tbaa !9
  store i32 %13, ptr %34, align 4, !tbaa !9
  store i32 %14, ptr %35, align 4, !tbaa !9
  store i32 %15, ptr %36, align 4, !tbaa !9
  store i32 %16, ptr %37, align 4, !tbaa !9
  store i32 %17, ptr %38, align 4, !tbaa !9
  store i32 %18, ptr %39, align 4, !tbaa !9
  store i32 %19, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %41) #4
  %58 = load ptr, ptr %21, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %58, i32 0, i32 6
  %60 = load i32, ptr %59, align 4, !tbaa !11
  %61 = icmp uge i32 %60, 2201
  br i1 %61, label %62, label %67

62:                                               ; preds = %20
  %63 = load ptr, ptr %21, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.libxsmm_generated_code, ptr %63, i32 0, i32 6
  %65 = load i32, ptr %64, align 4, !tbaa !11
  %66 = icmp ult i32 %65, 2501
  br label %67

67:                                               ; preds = %62, %20
  %68 = phi i1 [ false, %20 ], [ %66, %62 ]
  %69 = zext i1 %68 to i32
  %70 = trunc i32 %69 to i8
  store i8 %70, ptr %41, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #4
  store i32 0, ptr %42, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #4
  store i32 0, ptr %43, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #4
  %71 = load i32, ptr %23, align 4, !tbaa !9
  %72 = load i32, ptr %24, align 4, !tbaa !9
  %73 = mul i32 %71, %72
  store i32 %73, ptr %44, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #4
  store i32 0, ptr %45, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #4
  %74 = load i32, ptr %29, align 4, !tbaa !9
  %75 = load i32, ptr %27, align 4, !tbaa !9
  %76 = mul i32 %74, %75
  store i32 %76, ptr %46, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #4
  %77 = load i32, ptr %33, align 4, !tbaa !9
  %78 = icmp eq i32 %77, 0
  br i1 %78, label %79, label %85

79:                                               ; preds = %67
  %80 = load i32, ptr %26, align 4, !tbaa !9
  %81 = load i32, ptr %27, align 4, !tbaa !9
  %82 = mul i32 %80, %81
  %83 = load i32, ptr %23, align 4, !tbaa !9
  %84 = mul i32 %82, %83
  br label %94

85:                                               ; preds = %67
  %86 = load i32, ptr %27, align 4, !tbaa !9
  %87 = load i32, ptr %26, align 4, !tbaa !9
  %88 = load i32, ptr %23, align 4, !tbaa !9
  %89 = sub i32 %88, 1
  %90 = mul i32 %87, %89
  %91 = load i32, ptr %33, align 4, !tbaa !9
  %92 = add i32 %90, %91
  %93 = mul i32 %86, %92
  br label %94

94:                                               ; preds = %85, %79
  %95 = phi i32 [ %84, %79 ], [ %93, %85 ]
  store i32 %95, ptr %47, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #4
  %96 = load i32, ptr %40, align 4, !tbaa !9
  %97 = load i32, ptr %39, align 4, !tbaa !9
  %98 = mul i32 %96, %97
  store i32 %98, ptr %48, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #4
  %99 = load i32, ptr %33, align 4, !tbaa !9
  %100 = icmp eq i32 %99, 0
  br i1 %100, label %101, label %107

101:                                              ; preds = %94
  %102 = load i32, ptr %32, align 4, !tbaa !9
  %103 = load i32, ptr %39, align 4, !tbaa !9
  %104 = mul i32 %102, %103
  %105 = load i32, ptr %23, align 4, !tbaa !9
  %106 = mul i32 %104, %105
  br label %116

107:                                              ; preds = %94
  %108 = load i32, ptr %39, align 4, !tbaa !9
  %109 = load i32, ptr %32, align 4, !tbaa !9
  %110 = load i32, ptr %23, align 4, !tbaa !9
  %111 = sub i32 %110, 1
  %112 = mul i32 %109, %111
  %113 = load i32, ptr %33, align 4, !tbaa !9
  %114 = add i32 %112, %113
  %115 = mul i32 %108, %114
  br label %116

116:                                              ; preds = %107, %101
  %117 = phi i32 [ %106, %101 ], [ %115, %107 ]
  store i32 %117, ptr %49, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #4
  %118 = load i32, ptr %39, align 4, !tbaa !9
  %119 = icmp eq i32 %118, 2
  %120 = zext i1 %119 to i64
  %121 = select i1 %119, i32 1, i32 0
  store i32 %121, ptr %50, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #4
  %122 = load i32, ptr %27, align 4, !tbaa !9
  %123 = icmp eq i32 %122, 8
  %124 = zext i1 %123 to i64
  %125 = select i1 %123, i32 1, i32 0
  store i32 %125, ptr %51, align 4, !tbaa !9
  store i32 0, ptr %43, align 4, !tbaa !9
  br label %126

126:                                              ; preds = %573, %116
  %127 = load i32, ptr %43, align 4, !tbaa !9
  %128 = load i32, ptr %24, align 4, !tbaa !9
  %129 = icmp ult i32 %127, %128
  br i1 %129, label %130, label %576

130:                                              ; preds = %126
  store i32 0, ptr %42, align 4, !tbaa !9
  br label %131

131:                                              ; preds = %537, %130
  %132 = load i32, ptr %42, align 4, !tbaa !9
  %133 = load i32, ptr %23, align 4, !tbaa !9
  %134 = icmp ult i32 %132, %133
  br i1 %134, label %135, label %540

135:                                              ; preds = %131
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #4
  %136 = load i32, ptr %45, align 4, !tbaa !9
  %137 = load i32, ptr %42, align 4, !tbaa !9
  %138 = add i32 %136, %137
  %139 = load i32, ptr %43, align 4, !tbaa !9
  %140 = load i32, ptr %23, align 4, !tbaa !9
  %141 = mul i32 %139, %140
  %142 = add i32 %138, %141
  store i32 %142, ptr %52, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #4
  %143 = load i32, ptr %44, align 4, !tbaa !9
  %144 = load i32, ptr %42, align 4, !tbaa !9
  %145 = add i32 %143, %144
  %146 = load i32, ptr %43, align 4, !tbaa !9
  %147 = load i32, ptr %23, align 4, !tbaa !9
  %148 = mul i32 %146, %147
  %149 = add i32 %145, %148
  store i32 %149, ptr %53, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #4
  %150 = load i32, ptr %42, align 4, !tbaa !9
  %151 = load i32, ptr %23, align 4, !tbaa !9
  %152 = sub i32 %151, 1
  %153 = icmp eq i32 %150, %152
  br i1 %153, label %154, label %156

154:                                              ; preds = %135
  %155 = load i32, ptr %33, align 4, !tbaa !9
  br label %157

156:                                              ; preds = %135
  br label %157

157:                                              ; preds = %156, %154
  %158 = phi i32 [ %155, %154 ], [ 0, %156 ]
  store i32 %158, ptr %54, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #4
  %159 = load i32, ptr %42, align 4, !tbaa !9
  %160 = load i32, ptr %23, align 4, !tbaa !9
  %161 = sub i32 %160, 1
  %162 = icmp eq i32 %159, %161
  br i1 %162, label %163, label %171

163:                                              ; preds = %157
  %164 = load i32, ptr %33, align 4, !tbaa !9
  %165 = icmp ugt i32 %164, 0
  br i1 %165, label %166, label %168

166:                                              ; preds = %163
  %167 = load i32, ptr %28, align 4, !tbaa !9
  br label %169

168:                                              ; preds = %163
  br label %169

169:                                              ; preds = %168, %166
  %170 = phi i32 [ %167, %166 ], [ 0, %168 ]
  br label %172

171:                                              ; preds = %157
  br label %172

172:                                              ; preds = %171, %169
  %173 = phi i32 [ %170, %169 ], [ 0, %171 ]
  store i32 %173, ptr %55, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #4
  %174 = load i32, ptr %50, align 4, !tbaa !9
  %175 = icmp eq i32 %174, 0
  br i1 %175, label %176, label %189

176:                                              ; preds = %172
  %177 = load i32, ptr %51, align 4, !tbaa !9
  %178 = icmp eq i32 %177, 0
  br i1 %178, label %179, label %189

179:                                              ; preds = %176
  %180 = load i32, ptr %42, align 4, !tbaa !9
  %181 = load i32, ptr %23, align 4, !tbaa !9
  %182 = sub i32 %181, 1
  %183 = icmp eq i32 %180, %182
  br i1 %183, label %184, label %186

184:                                              ; preds = %179
  %185 = load i32, ptr %33, align 4, !tbaa !9
  br label %187

186:                                              ; preds = %179
  br label %187

187:                                              ; preds = %186, %184
  %188 = phi i32 [ %185, %184 ], [ 0, %186 ]
  br label %207

189:                                              ; preds = %176, %172
  %190 = load i32, ptr %42, align 4, !tbaa !9
  %191 = load i32, ptr %23, align 4, !tbaa !9
  %192 = sub i32 %191, 1
  %193 = icmp eq i32 %190, %192
  br i1 %193, label %194, label %203

194:                                              ; preds = %189
  %195 = load i32, ptr %33, align 4, !tbaa !9
  %196 = icmp ugt i32 %195, 0
  br i1 %196, label %197, label %199

197:                                              ; preds = %194
  %198 = load i32, ptr %33, align 4, !tbaa !9
  br label %201

199:                                              ; preds = %194
  %200 = load i32, ptr %32, align 4, !tbaa !9
  br label %201

201:                                              ; preds = %199, %197
  %202 = phi i32 [ %198, %197 ], [ %200, %199 ]
  br label %205

203:                                              ; preds = %189
  %204 = load i32, ptr %32, align 4, !tbaa !9
  br label %205

205:                                              ; preds = %203, %201
  %206 = phi i32 [ %202, %201 ], [ %204, %203 ]
  br label %207

207:                                              ; preds = %205, %187
  %208 = phi i32 [ %188, %187 ], [ %206, %205 ]
  store i32 %208, ptr %56, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #4
  %209 = load i32, ptr %50, align 4, !tbaa !9
  %210 = icmp eq i32 %209, 0
  br i1 %210, label %211, label %230

211:                                              ; preds = %207
  %212 = load i32, ptr %51, align 4, !tbaa !9
  %213 = icmp eq i32 %212, 0
  br i1 %213, label %214, label %230

214:                                              ; preds = %211
  %215 = load i32, ptr %42, align 4, !tbaa !9
  %216 = load i32, ptr %23, align 4, !tbaa !9
  %217 = sub i32 %216, 1
  %218 = icmp eq i32 %215, %217
  br i1 %218, label %219, label %227

219:                                              ; preds = %214
  %220 = load i32, ptr %33, align 4, !tbaa !9
  %221 = icmp ugt i32 %220, 0
  br i1 %221, label %222, label %224

222:                                              ; preds = %219
  %223 = load i32, ptr %34, align 4, !tbaa !9
  br label %225

224:                                              ; preds = %219
  br label %225

225:                                              ; preds = %224, %222
  %226 = phi i32 [ %223, %222 ], [ 0, %224 ]
  br label %228

227:                                              ; preds = %214
  br label %228

228:                                              ; preds = %227, %225
  %229 = phi i32 [ %226, %225 ], [ 0, %227 ]
  br label %248

230:                                              ; preds = %211, %207
  %231 = load i32, ptr %42, align 4, !tbaa !9
  %232 = load i32, ptr %23, align 4, !tbaa !9
  %233 = sub i32 %232, 1
  %234 = icmp eq i32 %231, %233
  br i1 %234, label %235, label %244

235:                                              ; preds = %230
  %236 = load i32, ptr %33, align 4, !tbaa !9
  %237 = icmp ugt i32 %236, 0
  br i1 %237, label %238, label %240

238:                                              ; preds = %235
  %239 = load i32, ptr %34, align 4, !tbaa !9
  br label %242

240:                                              ; preds = %235
  %241 = load i32, ptr %35, align 4, !tbaa !9
  br label %242

242:                                              ; preds = %240, %238
  %243 = phi i32 [ %239, %238 ], [ %241, %240 ]
  br label %246

244:                                              ; preds = %230
  %245 = load i32, ptr %35, align 4, !tbaa !9
  br label %246

246:                                              ; preds = %244, %242
  %247 = phi i32 [ %243, %242 ], [ %245, %244 ]
  br label %248

248:                                              ; preds = %246, %228
  %249 = phi i32 [ %229, %228 ], [ %247, %246 ]
  store i32 %249, ptr %57, align 4, !tbaa !9
  %250 = load ptr, ptr %21, align 8, !tbaa !5
  %251 = load i32, ptr %25, align 4, !tbaa !9
  %252 = load ptr, ptr %22, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %252, i32 0, i32 35
  %254 = load i32, ptr %253, align 4, !tbaa !14
  %255 = load i32, ptr %52, align 4, !tbaa !9
  %256 = load i32, ptr %27, align 4, !tbaa !9
  %257 = load i32, ptr %54, align 4, !tbaa !9
  %258 = load i32, ptr %55, align 4, !tbaa !9
  %259 = trunc i32 %258 to i8
  %260 = zext i8 %259 to i32
  %261 = icmp eq i32 0, %260
  br i1 %261, label %267, label %262

262:                                              ; preds = %248
  %263 = load i32, ptr %55, align 4, !tbaa !9
  %264 = trunc i32 %263 to i8
  %265 = zext i8 %264 to i32
  %266 = icmp slt i32 0, %265
  br i1 %266, label %267, label %285

267:                                              ; preds = %262, %248
  %268 = load i32, ptr %55, align 4, !tbaa !9
  %269 = zext i32 %268 to i64
  %270 = mul i64 1, %269
  %271 = icmp ult i64 %270, 255
  br i1 %271, label %272, label %276

272:                                              ; preds = %267
  %273 = load i32, ptr %55, align 4, !tbaa !9
  %274 = zext i32 %273 to i64
  %275 = mul i64 1, %274
  br label %277

276:                                              ; preds = %267
  br label %277

277:                                              ; preds = %276, %272
  %278 = phi i64 [ %275, %272 ], [ 255, %276 ]
  %279 = icmp ule i64 %278, 255
  br i1 %279, label %280, label %285

280:                                              ; preds = %277
  %281 = load i32, ptr %55, align 4, !tbaa !9
  %282 = uitofp i32 %281 to double
  %283 = fcmp ole double 0.000000e+00, %282
  br i1 %283, label %284, label %285

284:                                              ; preds = %280
  br label %286

285:                                              ; preds = %280, %277, %262
  call void @__assert_fail(ptr noundef @.str.5, ptr noundef @.str, i32 noundef 533, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled) #5
  unreachable

286:                                              ; preds = %284
  %287 = load i32, ptr %55, align 4, !tbaa !9
  %288 = trunc i32 %287 to i8
  %289 = load i8, ptr %41, align 1, !tbaa !13
  call void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef %250, i32 noundef %251, i32 noundef %254, i32 noundef %255, i32 noundef %256, i32 noundef %257, i32 noundef 1, i32 noundef 0, i8 noundef zeroext %288, i8 noundef zeroext %289)
  %290 = load i32, ptr %36, align 4, !tbaa !9
  %291 = icmp eq i32 %290, 1
  br i1 %291, label %292, label %414

292:                                              ; preds = %286
  %293 = load i8, ptr %41, align 1, !tbaa !13
  %294 = zext i8 %293 to i32
  %295 = icmp sgt i32 %294, 0
  br i1 %295, label %296, label %358

296:                                              ; preds = %292
  %297 = load ptr, ptr %21, align 8, !tbaa !5
  %298 = load i32, ptr %30, align 4, !tbaa !9
  %299 = load i32, ptr %37, align 4, !tbaa !9
  %300 = load i32, ptr %52, align 4, !tbaa !9
  %301 = load i32, ptr %53, align 4, !tbaa !9
  %302 = load i32, ptr %55, align 4, !tbaa !9
  call void @libxsmm_aarch64_instruction_sve_move(ptr noundef %297, i32 noundef %298, i32 noundef %299, i32 noundef %300, i32 noundef 0, i32 noundef %301, i32 noundef %302)
  %303 = load i32, ptr %50, align 4, !tbaa !9
  %304 = icmp ne i32 %303, 0
  br i1 %304, label %308, label %305

305:                                              ; preds = %296
  %306 = load i32, ptr %51, align 4, !tbaa !9
  %307 = icmp ne i32 %306, 0
  br i1 %307, label %308, label %357

308:                                              ; preds = %305, %296
  %309 = load i32, ptr %50, align 4, !tbaa !9
  %310 = icmp ugt i32 %309, 0
  br i1 %310, label %311, label %320

311:                                              ; preds = %308
  %312 = load i32, ptr %51, align 4, !tbaa !9
  %313 = icmp ugt i32 %312, 0
  br i1 %313, label %314, label %320

314:                                              ; preds = %311
  %315 = load ptr, ptr %21, align 8, !tbaa !5
  %316 = load i32, ptr %53, align 4, !tbaa !9
  %317 = load i32, ptr %53, align 4, !tbaa !9
  %318 = load i32, ptr %53, align 4, !tbaa !9
  %319 = call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext 4)
  call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %315, i32 noundef 86009859, i32 noundef %316, i32 noundef %317, i8 noundef zeroext 0, i32 noundef %318, i32 noundef 0, i32 noundef %319)
  br label %320

320:                                              ; preds = %314, %311, %308
  %321 = load ptr, ptr %21, align 8, !tbaa !5
  %322 = load i32, ptr %53, align 4, !tbaa !9
  %323 = load i32, ptr %53, align 4, !tbaa !9
  %324 = load i32, ptr %53, align 4, !tbaa !9
  %325 = load i32, ptr %39, align 4, !tbaa !9
  %326 = trunc i32 %325 to i8
  %327 = zext i8 %326 to i32
  %328 = icmp eq i32 0, %327
  br i1 %328, label %334, label %329

329:                                              ; preds = %320
  %330 = load i32, ptr %39, align 4, !tbaa !9
  %331 = trunc i32 %330 to i8
  %332 = zext i8 %331 to i32
  %333 = icmp slt i32 0, %332
  br i1 %333, label %334, label %352

334:                                              ; preds = %329, %320
  %335 = load i32, ptr %39, align 4, !tbaa !9
  %336 = zext i32 %335 to i64
  %337 = mul i64 1, %336
  %338 = icmp ult i64 %337, 255
  br i1 %338, label %339, label %343

339:                                              ; preds = %334
  %340 = load i32, ptr %39, align 4, !tbaa !9
  %341 = zext i32 %340 to i64
  %342 = mul i64 1, %341
  br label %344

343:                                              ; preds = %334
  br label %344

344:                                              ; preds = %343, %339
  %345 = phi i64 [ %342, %339 ], [ 255, %343 ]
  %346 = icmp ule i64 %345, 255
  br i1 %346, label %347, label %352

347:                                              ; preds = %344
  %348 = load i32, ptr %39, align 4, !tbaa !9
  %349 = uitofp i32 %348 to double
  %350 = fcmp ole double 0.000000e+00, %349
  br i1 %350, label %351, label %352

351:                                              ; preds = %347
  br label %353

352:                                              ; preds = %347, %344, %329
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str, i32 noundef 542, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled) #5
  unreachable

353:                                              ; preds = %351
  %354 = load i32, ptr %39, align 4, !tbaa !9
  %355 = trunc i32 %354 to i8
  %356 = call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext %355)
  call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %321, i32 noundef 86009859, i32 noundef %322, i32 noundef %323, i8 noundef zeroext 0, i32 noundef %324, i32 noundef 0, i32 noundef %356)
  br label %357

357:                                              ; preds = %353, %305
  br label %373

358:                                              ; preds = %292
  %359 = load ptr, ptr %21, align 8, !tbaa !5
  %360 = load i32, ptr %37, align 4, !tbaa !9
  %361 = load ptr, ptr %22, align 8, !tbaa !5
  %362 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %361, i32 0, i32 35
  %363 = load i32, ptr %362, align 4, !tbaa !14
  %364 = load ptr, ptr %22, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %364, i32 0, i32 36
  %366 = load i32, ptr %365, align 4, !tbaa !16
  %367 = load i32, ptr %52, align 4, !tbaa !9
  %368 = load i32, ptr %27, align 4, !tbaa !9
  %369 = load i32, ptr %53, align 4, !tbaa !9
  %370 = load i32, ptr %39, align 4, !tbaa !9
  %371 = load i32, ptr %54, align 4, !tbaa !9
  %372 = load i32, ptr %36, align 4, !tbaa !9
  call void @libxsmm_generator_gather_scatter_vreg_asimd_aarch64(ptr noundef %359, i32 noundef %360, i32 noundef %363, i32 noundef %366, i32 noundef %367, i32 noundef %368, i32 noundef %369, i32 noundef %370, i32 noundef %371, i32 noundef %372)
  br label %373

373:                                              ; preds = %358, %357
  %374 = load ptr, ptr %21, align 8, !tbaa !5
  %375 = load i32, ptr %38, align 4, !tbaa !9
  %376 = load ptr, ptr %22, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %376, i32 0, i32 35
  %378 = load i32, ptr %377, align 4, !tbaa !14
  %379 = load i32, ptr %53, align 4, !tbaa !9
  %380 = load i32, ptr %39, align 4, !tbaa !9
  %381 = load i32, ptr %56, align 4, !tbaa !9
  %382 = load i32, ptr %57, align 4, !tbaa !9
  %383 = trunc i32 %382 to i8
  %384 = zext i8 %383 to i32
  %385 = icmp eq i32 0, %384
  br i1 %385, label %391, label %386

386:                                              ; preds = %373
  %387 = load i32, ptr %57, align 4, !tbaa !9
  %388 = trunc i32 %387 to i8
  %389 = zext i8 %388 to i32
  %390 = icmp slt i32 0, %389
  br i1 %390, label %391, label %409

391:                                              ; preds = %386, %373
  %392 = load i32, ptr %57, align 4, !tbaa !9
  %393 = zext i32 %392 to i64
  %394 = mul i64 1, %393
  %395 = icmp ult i64 %394, 255
  br i1 %395, label %396, label %400

396:                                              ; preds = %391
  %397 = load i32, ptr %57, align 4, !tbaa !9
  %398 = zext i32 %397 to i64
  %399 = mul i64 1, %398
  br label %401

400:                                              ; preds = %391
  br label %401

401:                                              ; preds = %400, %396
  %402 = phi i64 [ %399, %396 ], [ 255, %400 ]
  %403 = icmp ule i64 %402, 255
  br i1 %403, label %404, label %409

404:                                              ; preds = %401
  %405 = load i32, ptr %57, align 4, !tbaa !9
  %406 = uitofp i32 %405 to double
  %407 = fcmp ole double 0.000000e+00, %406
  br i1 %407, label %408, label %409

408:                                              ; preds = %404
  br label %410

409:                                              ; preds = %404, %401, %386
  call void @__assert_fail(ptr noundef @.str.3, ptr noundef @.str, i32 noundef 550, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled) #5
  unreachable

410:                                              ; preds = %408
  %411 = load i32, ptr %57, align 4, !tbaa !9
  %412 = trunc i32 %411 to i8
  %413 = load i8, ptr %41, align 1, !tbaa !13
  call void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef %374, i32 noundef %375, i32 noundef %378, i32 noundef %379, i32 noundef %380, i32 noundef %381, i32 noundef 1, i32 noundef 1, i8 noundef zeroext %412, i8 noundef zeroext %413)
  br label %536

414:                                              ; preds = %286
  %415 = load ptr, ptr %21, align 8, !tbaa !5
  %416 = load i32, ptr %38, align 4, !tbaa !9
  %417 = load ptr, ptr %22, align 8, !tbaa !5
  %418 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %417, i32 0, i32 35
  %419 = load i32, ptr %418, align 4, !tbaa !14
  %420 = load i32, ptr %53, align 4, !tbaa !9
  %421 = load i32, ptr %39, align 4, !tbaa !9
  %422 = load i32, ptr %56, align 4, !tbaa !9
  %423 = load i32, ptr %57, align 4, !tbaa !9
  %424 = trunc i32 %423 to i8
  %425 = zext i8 %424 to i32
  %426 = icmp eq i32 0, %425
  br i1 %426, label %432, label %427

427:                                              ; preds = %414
  %428 = load i32, ptr %57, align 4, !tbaa !9
  %429 = trunc i32 %428 to i8
  %430 = zext i8 %429 to i32
  %431 = icmp slt i32 0, %430
  br i1 %431, label %432, label %450

432:                                              ; preds = %427, %414
  %433 = load i32, ptr %57, align 4, !tbaa !9
  %434 = zext i32 %433 to i64
  %435 = mul i64 1, %434
  %436 = icmp ult i64 %435, 255
  br i1 %436, label %437, label %441

437:                                              ; preds = %432
  %438 = load i32, ptr %57, align 4, !tbaa !9
  %439 = zext i32 %438 to i64
  %440 = mul i64 1, %439
  br label %442

441:                                              ; preds = %432
  br label %442

442:                                              ; preds = %441, %437
  %443 = phi i64 [ %440, %437 ], [ 255, %441 ]
  %444 = icmp ule i64 %443, 255
  br i1 %444, label %445, label %450

445:                                              ; preds = %442
  %446 = load i32, ptr %57, align 4, !tbaa !9
  %447 = uitofp i32 %446 to double
  %448 = fcmp ole double 0.000000e+00, %447
  br i1 %448, label %449, label %450

449:                                              ; preds = %445
  br label %451

450:                                              ; preds = %445, %442, %427
  call void @__assert_fail(ptr noundef @.str.3, ptr noundef @.str, i32 noundef 554, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled) #5
  unreachable

451:                                              ; preds = %449
  %452 = load i32, ptr %57, align 4, !tbaa !9
  %453 = trunc i32 %452 to i8
  %454 = load i8, ptr %41, align 1, !tbaa !13
  call void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef %415, i32 noundef %416, i32 noundef %419, i32 noundef %420, i32 noundef %421, i32 noundef %422, i32 noundef 1, i32 noundef 0, i8 noundef zeroext %453, i8 noundef zeroext %454)
  %455 = load i8, ptr %41, align 1, !tbaa !13
  %456 = zext i8 %455 to i32
  %457 = icmp sgt i32 %456, 0
  br i1 %457, label %458, label %520

458:                                              ; preds = %451
  %459 = load i32, ptr %50, align 4, !tbaa !9
  %460 = icmp ne i32 %459, 0
  br i1 %460, label %464, label %461

461:                                              ; preds = %458
  %462 = load i32, ptr %51, align 4, !tbaa !9
  %463 = icmp ne i32 %462, 0
  br i1 %463, label %464, label %513

464:                                              ; preds = %461, %458
  %465 = load ptr, ptr %21, align 8, !tbaa !5
  %466 = load i32, ptr %53, align 4, !tbaa !9
  %467 = load i32, ptr %53, align 4, !tbaa !9
  %468 = load i32, ptr %53, align 4, !tbaa !9
  %469 = load i32, ptr %39, align 4, !tbaa !9
  %470 = trunc i32 %469 to i8
  %471 = zext i8 %470 to i32
  %472 = icmp eq i32 0, %471
  br i1 %472, label %478, label %473

473:                                              ; preds = %464
  %474 = load i32, ptr %39, align 4, !tbaa !9
  %475 = trunc i32 %474 to i8
  %476 = zext i8 %475 to i32
  %477 = icmp slt i32 0, %476
  br i1 %477, label %478, label %496

478:                                              ; preds = %473, %464
  %479 = load i32, ptr %39, align 4, !tbaa !9
  %480 = zext i32 %479 to i64
  %481 = mul i64 1, %480
  %482 = icmp ult i64 %481, 255
  br i1 %482, label %483, label %487

483:                                              ; preds = %478
  %484 = load i32, ptr %39, align 4, !tbaa !9
  %485 = zext i32 %484 to i64
  %486 = mul i64 1, %485
  br label %488

487:                                              ; preds = %478
  br label %488

488:                                              ; preds = %487, %483
  %489 = phi i64 [ %486, %483 ], [ 255, %487 ]
  %490 = icmp ule i64 %489, 255
  br i1 %490, label %491, label %496

491:                                              ; preds = %488
  %492 = load i32, ptr %39, align 4, !tbaa !9
  %493 = uitofp i32 %492 to double
  %494 = fcmp ole double 0.000000e+00, %493
  br i1 %494, label %495, label %496

495:                                              ; preds = %491
  br label %497

496:                                              ; preds = %491, %488, %473
  call void @__assert_fail(ptr noundef @.str.2, ptr noundef @.str, i32 noundef 558, ptr noundef @__PRETTY_FUNCTION__.libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled) #5
  unreachable

497:                                              ; preds = %495
  %498 = load i32, ptr %39, align 4, !tbaa !9
  %499 = trunc i32 %498 to i8
  %500 = call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext %499)
  call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %465, i32 noundef 86007811, i32 noundef %466, i32 noundef %467, i8 noundef zeroext 0, i32 noundef %468, i32 noundef 0, i32 noundef %500)
  %501 = load i32, ptr %50, align 4, !tbaa !9
  %502 = icmp ugt i32 %501, 0
  br i1 %502, label %503, label %512

503:                                              ; preds = %497
  %504 = load i32, ptr %51, align 4, !tbaa !9
  %505 = icmp ugt i32 %504, 0
  br i1 %505, label %506, label %512

506:                                              ; preds = %503
  %507 = load ptr, ptr %21, align 8, !tbaa !5
  %508 = load i32, ptr %53, align 4, !tbaa !9
  %509 = load i32, ptr %53, align 4, !tbaa !9
  %510 = load i32, ptr %53, align 4, !tbaa !9
  %511 = call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext 4)
  call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %507, i32 noundef 86007811, i32 noundef %508, i32 noundef %509, i8 noundef zeroext 0, i32 noundef %510, i32 noundef 0, i32 noundef %511)
  br label %512

512:                                              ; preds = %506, %503, %497
  br label %513

513:                                              ; preds = %512, %461
  %514 = load ptr, ptr %21, align 8, !tbaa !5
  %515 = load i32, ptr %31, align 4, !tbaa !9
  %516 = load i32, ptr %37, align 4, !tbaa !9
  %517 = load i32, ptr %52, align 4, !tbaa !9
  %518 = load i32, ptr %53, align 4, !tbaa !9
  %519 = load i32, ptr %55, align 4, !tbaa !9
  call void @libxsmm_aarch64_instruction_sve_move(ptr noundef %514, i32 noundef %515, i32 noundef %516, i32 noundef %517, i32 noundef 0, i32 noundef %518, i32 noundef %519)
  br label %535

520:                                              ; preds = %451
  %521 = load ptr, ptr %21, align 8, !tbaa !5
  %522 = load i32, ptr %37, align 4, !tbaa !9
  %523 = load ptr, ptr %22, align 8, !tbaa !5
  %524 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %523, i32 0, i32 35
  %525 = load i32, ptr %524, align 4, !tbaa !14
  %526 = load ptr, ptr %22, align 8, !tbaa !5
  %527 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %526, i32 0, i32 36
  %528 = load i32, ptr %527, align 4, !tbaa !16
  %529 = load i32, ptr %52, align 4, !tbaa !9
  %530 = load i32, ptr %27, align 4, !tbaa !9
  %531 = load i32, ptr %53, align 4, !tbaa !9
  %532 = load i32, ptr %39, align 4, !tbaa !9
  %533 = load i32, ptr %54, align 4, !tbaa !9
  %534 = load i32, ptr %36, align 4, !tbaa !9
  call void @libxsmm_generator_gather_scatter_vreg_asimd_aarch64(ptr noundef %521, i32 noundef %522, i32 noundef %525, i32 noundef %528, i32 noundef %529, i32 noundef %530, i32 noundef %531, i32 noundef %532, i32 noundef %533, i32 noundef %534)
  br label %535

535:                                              ; preds = %520, %513
  br label %536

536:                                              ; preds = %535, %410
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #4
  br label %537

537:                                              ; preds = %536
  %538 = load i32, ptr %42, align 4, !tbaa !9
  %539 = add i32 %538, 1
  store i32 %539, ptr %42, align 4, !tbaa !9
  br label %131, !llvm.loop !17

540:                                              ; preds = %131
  %541 = load i32, ptr %46, align 4, !tbaa !9
  %542 = load i32, ptr %47, align 4, !tbaa !9
  %543 = icmp ne i32 %541, %542
  br i1 %543, label %544, label %556

544:                                              ; preds = %540
  %545 = load ptr, ptr %21, align 8, !tbaa !5
  %546 = load i32, ptr %25, align 4, !tbaa !9
  %547 = load ptr, ptr %22, align 8, !tbaa !5
  %548 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %547, i32 0, i32 35
  %549 = load i32, ptr %548, align 4, !tbaa !14
  %550 = load i32, ptr %25, align 4, !tbaa !9
  %551 = load i32, ptr %46, align 4, !tbaa !9
  %552 = zext i32 %551 to i64
  %553 = load i32, ptr %47, align 4, !tbaa !9
  %554 = zext i32 %553 to i64
  %555 = sub nsw i64 %552, %554
  call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %545, i32 noundef 4096, i32 noundef %546, i32 noundef %549, i32 noundef %550, i64 noundef %555)
  br label %556

556:                                              ; preds = %544, %540
  %557 = load i32, ptr %48, align 4, !tbaa !9
  %558 = load i32, ptr %49, align 4, !tbaa !9
  %559 = icmp ne i32 %557, %558
  br i1 %559, label %560, label %572

560:                                              ; preds = %556
  %561 = load ptr, ptr %21, align 8, !tbaa !5
  %562 = load i32, ptr %38, align 4, !tbaa !9
  %563 = load ptr, ptr %22, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %563, i32 0, i32 35
  %565 = load i32, ptr %564, align 4, !tbaa !14
  %566 = load i32, ptr %38, align 4, !tbaa !9
  %567 = load i32, ptr %48, align 4, !tbaa !9
  %568 = zext i32 %567 to i64
  %569 = load i32, ptr %49, align 4, !tbaa !9
  %570 = zext i32 %569 to i64
  %571 = sub nsw i64 %568, %570
  call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %561, i32 noundef 4096, i32 noundef %562, i32 noundef %565, i32 noundef %566, i64 noundef %571)
  br label %572

572:                                              ; preds = %560, %556
  br label %573

573:                                              ; preds = %572
  %574 = load i32, ptr %43, align 4, !tbaa !9
  %575 = add i32 %574, 1
  store i32 %575, ptr %43, align 4, !tbaa !9
  br label %126, !llvm.loop !19

576:                                              ; preds = %126
  %577 = load ptr, ptr %21, align 8, !tbaa !5
  %578 = load i32, ptr %25, align 4, !tbaa !9
  %579 = load ptr, ptr %22, align 8, !tbaa !5
  %580 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %579, i32 0, i32 35
  %581 = load i32, ptr %580, align 4, !tbaa !14
  %582 = load i32, ptr %25, align 4, !tbaa !9
  %583 = load i32, ptr %46, align 4, !tbaa !9
  %584 = zext i32 %583 to i64
  %585 = load i32, ptr %24, align 4, !tbaa !9
  %586 = zext i32 %585 to i64
  %587 = mul nsw i64 %584, %586
  call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %577, i32 noundef 4097, i32 noundef %578, i32 noundef %581, i32 noundef %582, i64 noundef %587)
  %588 = load ptr, ptr %21, align 8, !tbaa !5
  %589 = load i32, ptr %38, align 4, !tbaa !9
  %590 = load ptr, ptr %22, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct.libxsmm_mateltwise_gp_reg_mapping_struct, ptr %590, i32 0, i32 35
  %592 = load i32, ptr %591, align 4, !tbaa !14
  %593 = load i32, ptr %38, align 4, !tbaa !9
  %594 = load i32, ptr %48, align 4, !tbaa !9
  %595 = zext i32 %594 to i64
  %596 = load i32, ptr %24, align 4, !tbaa !9
  %597 = zext i32 %596 to i64
  %598 = mul nsw i64 %595, %597
  call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %588, i32 noundef 4097, i32 noundef %589, i32 noundef %592, i32 noundef %593, i64 noundef %598)
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #4
  call void @llvm.lifetime.end.p0(i64 1, ptr %41) #4
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 #2 = { 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 #3 = { 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 #4 = { nounwind }
attributes #5 = { 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 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 28}
!12 = !{!"libxsmm_generated_code", !6, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28}
!13 = !{!7, !7, i64 0}
!14 = !{!15, !10, i64 140}
!15 = !{!"libxsmm_mateltwise_gp_reg_mapping_struct", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !10, i64 104, !10, i64 108, !10, i64 112, !10, i64 116, !10, i64 120, !10, i64 124, !10, i64 128, !10, i64 132, !10, i64 136, !10, i64 140, !10, i64 144}
!16 = !{!15, !10, i64 144}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18}


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

declare void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef zeroext, i8 noundef zeroext) local_unnamed_addr #0

declare void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i64 noundef) local_unnamed_addr #0

declare void @libxsmm_aarch64_instruction_sve_move(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

declare void @libxsmm_aarch64_instruction_sve_compute(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i8 noundef zeroext, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

declare i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext) local_unnamed_addr #0

declare void @libxsmm_generator_gather_scatter_vreg_asimd_aarch64(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local void @libxsmm_generator_gather_scatter_offs_aarch64_mn_loop_unrolled(ptr noundef %0, ptr nocapture noundef readonly %1, i32 noundef %2, i32 noundef %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8, i32 noundef %9, i32 noundef %10, i32 noundef %11, i32 noundef %12, i32 noundef %13, i32 noundef %14, i32 noundef %15, i32 noundef %16, i32 noundef %17, i32 noundef %18, i32 noundef %19) local_unnamed_addr #1 {
  %21 = getelementptr inbounds i8, ptr %0, i64 28
  %22 = load i32, ptr %21, align 4, !tbaa !5
  %23 = add i32 %22, -2201
  %spec.select = icmp ult i32 %23, 300
  %24 = zext i1 %spec.select to i8
  %25 = mul i32 %8, %6
  %26 = icmp eq i32 %12, 0
  br i1 %26, label %27, label %30

27:                                               ; preds = %20
  %28 = mul i32 %5, %2
  %29 = mul i32 %11, %2
  br label %36

30:                                               ; preds = %20
  %31 = add i32 %2, -1
  %32 = mul i32 %31, %5
  %33 = add i32 %32, %12
  %34 = mul i32 %31, %11
  %35 = add i32 %34, %12
  br label %36

36:                                               ; preds = %30, %27
  %.pn = phi i32 [ %28, %27 ], [ %33, %30 ]
  %.pn241 = phi i32 [ %29, %27 ], [ %35, %30 ]
  %37 = mul i32 %19, %18
  %.not242 = icmp eq i32 %3, 0
  br i1 %.not242, label %.._crit_edge236_crit_edge, label %.preheader.lr.ph

.._crit_edge236_crit_edge:                        ; preds = %36
  %.pre = zext i32 %25 to i64
  %.pre252 = zext i32 %37 to i64
  br label %._crit_edge236

.preheader.lr.ph:                                 ; preds = %36
  %38 = icmp eq i32 %6, 8
  %39 = icmp eq i32 %18, 2
  %40 = mul i32 %.pn241, %18
  %41 = mul i32 %.pn, %6
  %.not243 = icmp eq i32 %2, 0
  %42 = add i32 %2, -1
  %43 = select i1 %26, i32 0, i32 %7
  %or.cond.demorgan = or i1 %38, %39
  %44 = select i1 %26, i32 %11, i32 %12
  %45 = select i1 %26, i32 0, i32 %13
  %46 = select i1 %26, i32 %14, i32 %13
  %47 = getelementptr inbounds i8, ptr %1, i64 140
  %48 = icmp eq i32 %15, 1
  %49 = getelementptr inbounds i8, ptr %1, i64 144
  %50 = trunc i32 %18 to i8
  %or.cond11 = and i1 %38, %39
  %.not = icmp eq i32 %25, %41
  %51 = zext i32 %25 to i64
  %52 = zext i32 %41 to i64
  %53 = sub nsw i64 %51, %52
  %.not229 = icmp eq i32 %37, %40
  %54 = zext i32 %37 to i64
  %55 = zext i32 %40 to i64
  %56 = sub nsw i64 %54, %55
  br i1 %.not243, label %.preheader.lr.ph.split, label %.preheader.us

.preheader.us:                                    ; preds = %.preheader.lr.ph, %65
  %.0218235.us = phi i32 [ %66, %65 ], [ 0, %.preheader.lr.ph ]
  %57 = mul i32 %.0218235.us, %2
  %58 = add i32 %.0218235.us, %3
  %59 = mul i32 %58, %2
  br label %67

60:                                               ; preds = %._crit_edge.us
  %61 = load i32, ptr %47, align 4, !tbaa !11
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4096, i32 noundef %4, i32 noundef %61, i32 noundef %4, i64 noundef %53) #2
  br label %62

62:                                               ; preds = %60, %._crit_edge.us
  br i1 %.not229, label %65, label %63

63:                                               ; preds = %62
  %64 = load i32, ptr %47, align 4, !tbaa !11
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4096, i32 noundef %17, i32 noundef %64, i32 noundef %17, i64 noundef %56) #2
  br label %65

65:                                               ; preds = %63, %62
  %66 = add nuw i32 %.0218235.us, 1
  %exitcond248.not = icmp eq i32 %66, %3
  br i1 %exitcond248.not, label %._crit_edge236, label %.preheader.us, !llvm.loop !13

67:                                               ; preds = %.preheader.us, %102
  %.0234.us = phi i32 [ 0, %.preheader.us ], [ %103, %102 ]
  %68 = add i32 %.0234.us, %57
  %69 = add i32 %59, %.0234.us
  %70 = icmp eq i32 %.0234.us, %42
  %71 = select i1 %70, i32 %12, i32 0
  %72 = select i1 %70, i32 %43, i32 0
  %spec.select232.us = select i1 %70, i32 %44, i32 %11
  %73 = select i1 %or.cond.demorgan, i32 %spec.select232.us, i32 %71
  %spec.select231.us = select i1 %70, i32 %45, i32 0
  %spec.select233.us = select i1 %70, i32 %46, i32 %14
  %74 = select i1 %or.cond.demorgan, i32 %spec.select233.us, i32 %spec.select231.us
  %75 = load i32, ptr %47, align 4, !tbaa !11
  %76 = trunc i32 %72 to i8
  tail call void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef %0, i32 noundef %4, i32 noundef %75, i32 noundef %68, i32 noundef %6, i32 noundef %71, i32 noundef 1, i32 noundef 0, i8 noundef zeroext %76, i8 noundef zeroext %24) #2
  br i1 %48, label %89, label %77

77:                                               ; preds = %67
  %78 = load i32, ptr %47, align 4, !tbaa !11
  %79 = trunc i32 %74 to i8
  tail call void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef %0, i32 noundef %17, i32 noundef %78, i32 noundef %69, i32 noundef %18, i32 noundef %73, i32 noundef 1, i32 noundef 0, i8 noundef zeroext %79, i8 noundef zeroext %24) #2
  br i1 %spec.select, label %83, label %80

80:                                               ; preds = %77
  %81 = load i32, ptr %47, align 4, !tbaa !11
  %82 = load i32, ptr %49, align 4, !tbaa !15
  tail call void @libxsmm_generator_gather_scatter_vreg_asimd_aarch64(ptr noundef %0, i32 noundef %16, i32 noundef %81, i32 noundef %82, i32 noundef %68, i32 noundef %6, i32 noundef %69, i32 noundef %18, i32 noundef %71, i32 noundef %15) #2
  br label %102

83:                                               ; preds = %77
  br i1 %or.cond.demorgan, label %84, label %88

84:                                               ; preds = %83
  %85 = tail call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext %50) #2
  tail call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %0, i32 noundef 86007811, i32 noundef %69, i32 noundef %69, i8 noundef zeroext 0, i32 noundef %69, i32 noundef 0, i32 noundef %85) #2
  br i1 %or.cond11, label %86, label %88

86:                                               ; preds = %84
  %87 = tail call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext 4) #2
  tail call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %0, i32 noundef 86007811, i32 noundef %69, i32 noundef %69, i8 noundef zeroext 0, i32 noundef %69, i32 noundef 0, i32 noundef %87) #2
  br label %88

88:                                               ; preds = %86, %84, %83
  tail call void @libxsmm_aarch64_instruction_sve_move(ptr noundef %0, i32 noundef %10, i32 noundef %16, i32 noundef %68, i32 noundef 0, i32 noundef %69, i32 noundef %72) #2
  br label %102

89:                                               ; preds = %67
  br i1 %spec.select, label %93, label %90

90:                                               ; preds = %89
  %91 = load i32, ptr %47, align 4, !tbaa !11
  %92 = load i32, ptr %49, align 4, !tbaa !15
  tail call void @libxsmm_generator_gather_scatter_vreg_asimd_aarch64(ptr noundef %0, i32 noundef %16, i32 noundef %91, i32 noundef %92, i32 noundef %68, i32 noundef %6, i32 noundef %69, i32 noundef %18, i32 noundef %71, i32 noundef 1) #2
  br label %99

93:                                               ; preds = %89
  tail call void @libxsmm_aarch64_instruction_sve_move(ptr noundef %0, i32 noundef %9, i32 noundef %16, i32 noundef %68, i32 noundef 0, i32 noundef %69, i32 noundef %72) #2
  br i1 %or.cond.demorgan, label %94, label %99

94:                                               ; preds = %93
  br i1 %or.cond11, label %95, label %97

95:                                               ; preds = %94
  %96 = tail call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext 4) #2
  tail call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %0, i32 noundef 86009859, i32 noundef %69, i32 noundef %69, i8 noundef zeroext 0, i32 noundef %69, i32 noundef 0, i32 noundef %96) #2
  br label %97

97:                                               ; preds = %95, %94
  %98 = tail call i32 @libxsmm_generator_aarch64_get_sve_type(i8 noundef zeroext %50) #2
  tail call void @libxsmm_aarch64_instruction_sve_compute(ptr noundef %0, i32 noundef 86009859, i32 noundef %69, i32 noundef %69, i8 noundef zeroext 0, i32 noundef %69, i32 noundef 0, i32 noundef %98) #2
  br label %99

99:                                               ; preds = %97, %93, %90
  %100 = load i32, ptr %47, align 4, !tbaa !11
  %101 = trunc i32 %74 to i8
  tail call void @libxsmm_generator_vloadstore_masked_vreg_aarch64(ptr noundef %0, i32 noundef %17, i32 noundef %100, i32 noundef %69, i32 noundef %18, i32 noundef %73, i32 noundef 1, i32 noundef 1, i8 noundef zeroext %101, i8 noundef zeroext %24) #2
  br label %102

102:                                              ; preds = %99, %88, %80
  %103 = add nuw i32 %.0234.us, 1
  %exitcond.not = icmp eq i32 %103, %2
  br i1 %exitcond.not, label %._crit_edge.us, label %67, !llvm.loop !16

._crit_edge.us:                                   ; preds = %102
  br i1 %.not, label %62, label %60

.preheader.lr.ph.split:                           ; preds = %.preheader.lr.ph
  br i1 %.not, label %.preheader.lr.ph.split.split.us, label %.preheader.lr.ph.split.split

.preheader.lr.ph.split.split.us:                  ; preds = %.preheader.lr.ph.split
  br i1 %.not229, label %._crit_edge236, label %.preheader.us237

.preheader.us237:                                 ; preds = %.preheader.lr.ph.split.split.us, %.preheader.us237
  %.0218235.us238 = phi i32 [ %105, %.preheader.us237 ], [ 0, %.preheader.lr.ph.split.split.us ]
  %104 = load i32, ptr %47, align 4, !tbaa !11
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4096, i32 noundef %17, i32 noundef %104, i32 noundef %17, i64 noundef %56) #2
  %105 = add nuw i32 %.0218235.us238, 1
  %exitcond251.not = icmp eq i32 %105, %3
  br i1 %exitcond251.not, label %._crit_edge236, label %.preheader.us237, !llvm.loop !13

.preheader.lr.ph.split.split:                     ; preds = %.preheader.lr.ph.split
  br i1 %.not229, label %.preheader.us239, label %.preheader

.preheader.us239:                                 ; preds = %.preheader.lr.ph.split.split, %.preheader.us239
  %.0218235.us240 = phi i32 [ %107, %.preheader.us239 ], [ 0, %.preheader.lr.ph.split.split ]
  %106 = load i32, ptr %47, align 4, !tbaa !11
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4096, i32 noundef %4, i32 noundef %106, i32 noundef %4, i64 noundef %53) #2
  %107 = add nuw i32 %.0218235.us240, 1
  %exitcond250.not = icmp eq i32 %107, %3
  br i1 %exitcond250.not, label %._crit_edge236, label %.preheader.us239, !llvm.loop !13

.preheader:                                       ; preds = %.preheader.lr.ph.split.split, %.preheader
  %.0218235 = phi i32 [ %110, %.preheader ], [ 0, %.preheader.lr.ph.split.split ]
  %108 = load i32, ptr %47, align 4, !tbaa !11
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4096, i32 noundef %4, i32 noundef %108, i32 noundef %4, i64 noundef %53) #2
  %109 = load i32, ptr %47, align 4, !tbaa !11
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4096, i32 noundef %17, i32 noundef %109, i32 noundef %17, i64 noundef %56) #2
  %110 = add nuw i32 %.0218235, 1
  %exitcond249.not = icmp eq i32 %110, %3
  br i1 %exitcond249.not, label %._crit_edge236, label %.preheader, !llvm.loop !13

._crit_edge236:                                   ; preds = %65, %.preheader, %.preheader.us239, %.preheader.us237, %.preheader.lr.ph.split.split.us, %.._crit_edge236_crit_edge
  %.pre-phi253 = phi i64 [ %.pre252, %.._crit_edge236_crit_edge ], [ %54, %.preheader.lr.ph.split.split.us ], [ %54, %.preheader.us237 ], [ %54, %.preheader.us239 ], [ %54, %.preheader ], [ %54, %65 ]
  %.pre-phi = phi i64 [ %.pre, %.._crit_edge236_crit_edge ], [ %51, %.preheader.lr.ph.split.split.us ], [ %51, %.preheader.us237 ], [ %51, %.preheader.us239 ], [ %51, %.preheader ], [ %51, %65 ]
  %111 = getelementptr inbounds i8, ptr %1, i64 140
  %112 = load i32, ptr %111, align 4, !tbaa !11
  %113 = zext i32 %3 to i64
  %114 = mul nuw nsw i64 %.pre-phi, %113
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4097, i32 noundef %4, i32 noundef %112, i32 noundef %4, i64 noundef %114) #2
  %115 = load i32, ptr %111, align 4, !tbaa !11
  %116 = mul nuw nsw i64 %.pre-phi253, %113
  tail call void @libxsmm_aarch64_instruction_alu_compute_imm64(ptr noundef %0, i32 noundef 4097, i32 noundef %17, i32 noundef %115, i32 noundef %17, i64 noundef %116) #2
  ret void
}

attributes #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 = { 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 #2 = { 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, !10, i64 28}
!6 = !{!"libxsmm_generated_code", !7, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!12, !10, i64 140}
!12 = !{!"libxsmm_mateltwise_gp_reg_mapping_struct", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !10, i64 104, !10, i64 108, !10, i64 112, !10, i64 116, !10, i64 120, !10, i64 124, !10, i64 128, !10, i64 132, !10, i64 136, !10, i64 140, !10, i64 144}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!12, !10, i64 144}
!16 = distinct !{!16, !14}


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