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

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

%struct.libxsmm_meltw_descriptor = type <{ i32, i32, i32, i32, i32, i32, i8, i8, i8, i16, i16, i8 }>

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @libxsmm_elementwise_get_index(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %3, i32 noundef %4) #1 {
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  store i32 %0, ptr %6, align 4, !tbaa !5
  store i32 %1, ptr %7, align 4, !tbaa !5
  store i32 %2, ptr %8, align 4, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !9
  store i32 %4, ptr %10, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #2
  store i32 0, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #2
  %15 = load i32, ptr %10, align 4, !tbaa !5
  %16 = icmp eq i32 %15, 0
  br i1 %16, label %17, label %30

17:                                               ; preds = %5
  %18 = load ptr, ptr %9, align 8, !tbaa !9
  %19 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %18, i32 0, i32 11
  %20 = load i8, ptr %19, align 1, !tbaa !11
  %21 = zext i8 %20 to i32
  %22 = icmp eq i32 %21, 1
  br i1 %22, label %23, label %30

23:                                               ; preds = %17
  %24 = load ptr, ptr %9, align 8, !tbaa !9
  %25 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %24, i32 0, i32 9
  %26 = load i16, ptr %25, align 1, !tbaa !14
  %27 = zext i16 %26 to i32
  %28 = and i32 %27, 2
  %29 = icmp sgt i32 %28, 0
  br i1 %29, label %112, label %30

30:                                               ; preds = %23, %17, %5
  %31 = load i32, ptr %10, align 4, !tbaa !5
  %32 = icmp eq i32 %31, 0
  br i1 %32, label %33, label %46

33:                                               ; preds = %30
  %34 = load ptr, ptr %9, align 8, !tbaa !9
  %35 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %34, i32 0, i32 11
  %36 = load i8, ptr %35, align 1, !tbaa !11
  %37 = zext i8 %36 to i32
  %38 = icmp eq i32 %37, 2
  br i1 %38, label %39, label %46

39:                                               ; preds = %33
  %40 = load ptr, ptr %9, align 8, !tbaa !9
  %41 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %40, i32 0, i32 9
  %42 = load i16, ptr %41, align 1, !tbaa !14
  %43 = zext i16 %42 to i32
  %44 = and i32 %43, 1
  %45 = icmp sgt i32 %44, 0
  br i1 %45, label %112, label %46

46:                                               ; preds = %39, %33, %30
  %47 = load i32, ptr %10, align 4, !tbaa !5
  %48 = icmp eq i32 %47, 0
  br i1 %48, label %49, label %62

49:                                               ; preds = %46
  %50 = load ptr, ptr %9, align 8, !tbaa !9
  %51 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %50, i32 0, i32 11
  %52 = load i8, ptr %51, align 1, !tbaa !11
  %53 = zext i8 %52 to i32
  %54 = icmp eq i32 %53, 3
  br i1 %54, label %55, label %62

55:                                               ; preds = %49
  %56 = load ptr, ptr %9, align 8, !tbaa !9
  %57 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %56, i32 0, i32 9
  %58 = load i16, ptr %57, align 1, !tbaa !14
  %59 = zext i16 %58 to i32
  %60 = and i32 %59, 1
  %61 = icmp sgt i32 %60, 0
  br i1 %61, label %112, label %62

62:                                               ; preds = %55, %49, %46
  %63 = load i32, ptr %10, align 4, !tbaa !5
  %64 = icmp eq i32 %63, 1
  br i1 %64, label %65, label %78

65:                                               ; preds = %62
  %66 = load ptr, ptr %9, align 8, !tbaa !9
  %67 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %66, i32 0, i32 11
  %68 = load i8, ptr %67, align 1, !tbaa !11
  %69 = zext i8 %68 to i32
  %70 = icmp eq i32 %69, 2
  br i1 %70, label %71, label %78

71:                                               ; preds = %65
  %72 = load ptr, ptr %9, align 8, !tbaa !9
  %73 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %72, i32 0, i32 9
  %74 = load i16, ptr %73, align 1, !tbaa !14
  %75 = zext i16 %74 to i32
  %76 = and i32 %75, 2
  %77 = icmp sgt i32 %76, 0
  br i1 %77, label %112, label %78

78:                                               ; preds = %71, %65, %62
  %79 = load i32, ptr %10, align 4, !tbaa !5
  %80 = icmp eq i32 %79, 1
  br i1 %80, label %81, label %94

81:                                               ; preds = %78
  %82 = load ptr, ptr %9, align 8, !tbaa !9
  %83 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %82, i32 0, i32 11
  %84 = load i8, ptr %83, align 1, !tbaa !11
  %85 = zext i8 %84 to i32
  %86 = icmp eq i32 %85, 3
  br i1 %86, label %87, label %94

87:                                               ; preds = %81
  %88 = load ptr, ptr %9, align 8, !tbaa !9
  %89 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %88, i32 0, i32 9
  %90 = load i16, ptr %89, align 1, !tbaa !14
  %91 = zext i16 %90 to i32
  %92 = and i32 %91, 2
  %93 = icmp sgt i32 %92, 0
  br i1 %93, label %112, label %94

94:                                               ; preds = %87, %81, %78
  %95 = load i32, ptr %10, align 4, !tbaa !5
  %96 = icmp eq i32 %95, 2
  br i1 %96, label %97, label %110

97:                                               ; preds = %94
  %98 = load ptr, ptr %9, align 8, !tbaa !9
  %99 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %98, i32 0, i32 11
  %100 = load i8, ptr %99, align 1, !tbaa !11
  %101 = zext i8 %100 to i32
  %102 = icmp eq i32 %101, 3
  br i1 %102, label %103, label %110

103:                                              ; preds = %97
  %104 = load ptr, ptr %9, align 8, !tbaa !9
  %105 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %104, i32 0, i32 9
  %106 = load i16, ptr %105, align 1, !tbaa !14
  %107 = zext i16 %106 to i32
  %108 = and i32 %107, 4
  %109 = icmp sgt i32 %108, 0
  br label %110

110:                                              ; preds = %103, %97, %94
  %111 = phi i1 [ false, %97 ], [ false, %94 ], [ %109, %103 ]
  br label %112

112:                                              ; preds = %110, %87, %71, %55, %39, %23
  %113 = phi i1 [ true, %87 ], [ true, %71 ], [ true, %55 ], [ true, %39 ], [ true, %23 ], [ %111, %110 ]
  %114 = zext i1 %113 to i64
  %115 = select i1 %113, i32 1, i32 0
  store i32 %115, ptr %12, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #2
  %116 = load i32, ptr %10, align 4, !tbaa !5
  %117 = icmp eq i32 %116, 0
  br i1 %117, label %118, label %132

118:                                              ; preds = %112
  %119 = load ptr, ptr %9, align 8, !tbaa !9
  %120 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %119, i32 0, i32 11
  %121 = load i8, ptr %120, align 1, !tbaa !11
  %122 = zext i8 %121 to i32
  %123 = icmp eq i32 %122, 1
  br i1 %123, label %124, label %132

124:                                              ; preds = %118
  %125 = load ptr, ptr %9, align 8, !tbaa !9
  %126 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %125, i32 0, i32 10
  %127 = load i16, ptr %126, align 1, !tbaa !15
  %128 = zext i16 %127 to i32
  %129 = icmp eq i32 %128, 27
  %130 = zext i1 %129 to i32
  %131 = icmp sgt i32 %130, 0
  br i1 %131, label %230, label %132

132:                                              ; preds = %124, %118, %112
  %133 = load i32, ptr %10, align 4, !tbaa !5
  %134 = icmp eq i32 %133, 0
  br i1 %134, label %135, label %148

135:                                              ; preds = %132
  %136 = load ptr, ptr %9, align 8, !tbaa !9
  %137 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %136, i32 0, i32 11
  %138 = load i8, ptr %137, align 1, !tbaa !11
  %139 = zext i8 %138 to i32
  %140 = icmp eq i32 %139, 1
  br i1 %140, label %141, label %148

141:                                              ; preds = %135
  %142 = load ptr, ptr %9, align 8, !tbaa !9
  %143 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %142, i32 0, i32 9
  %144 = load i16, ptr %143, align 1, !tbaa !14
  %145 = zext i16 %144 to i32
  %146 = and i32 %145, 4
  %147 = icmp sgt i32 %146, 0
  br i1 %147, label %230, label %148

148:                                              ; preds = %141, %135, %132
  %149 = load i32, ptr %10, align 4, !tbaa !5
  %150 = icmp eq i32 %149, 0
  br i1 %150, label %151, label %164

151:                                              ; preds = %148
  %152 = load ptr, ptr %9, align 8, !tbaa !9
  %153 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %152, i32 0, i32 11
  %154 = load i8, ptr %153, align 1, !tbaa !11
  %155 = zext i8 %154 to i32
  %156 = icmp eq i32 %155, 2
  br i1 %156, label %157, label %164

157:                                              ; preds = %151
  %158 = load ptr, ptr %9, align 8, !tbaa !9
  %159 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %158, i32 0, i32 9
  %160 = load i16, ptr %159, align 1, !tbaa !14
  %161 = zext i16 %160 to i32
  %162 = and i32 %161, 4
  %163 = icmp sgt i32 %162, 0
  br i1 %163, label %230, label %164

164:                                              ; preds = %157, %151, %148
  %165 = load i32, ptr %10, align 4, !tbaa !5
  %166 = icmp eq i32 %165, 0
  br i1 %166, label %167, label %180

167:                                              ; preds = %164
  %168 = load ptr, ptr %9, align 8, !tbaa !9
  %169 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %168, i32 0, i32 11
  %170 = load i8, ptr %169, align 1, !tbaa !11
  %171 = zext i8 %170 to i32
  %172 = icmp eq i32 %171, 3
  br i1 %172, label %173, label %180

173:                                              ; preds = %167
  %174 = load ptr, ptr %9, align 8, !tbaa !9
  %175 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %174, i32 0, i32 9
  %176 = load i16, ptr %175, align 1, !tbaa !14
  %177 = zext i16 %176 to i32
  %178 = and i32 %177, 8
  %179 = icmp sgt i32 %178, 0
  br i1 %179, label %230, label %180

180:                                              ; preds = %173, %167, %164
  %181 = load i32, ptr %10, align 4, !tbaa !5
  %182 = icmp eq i32 %181, 1
  br i1 %182, label %183, label %196

183:                                              ; preds = %180
  %184 = load ptr, ptr %9, align 8, !tbaa !9
  %185 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %184, i32 0, i32 11
  %186 = load i8, ptr %185, align 1, !tbaa !11
  %187 = zext i8 %186 to i32
  %188 = icmp eq i32 %187, 2
  br i1 %188, label %189, label %196

189:                                              ; preds = %183
  %190 = load ptr, ptr %9, align 8, !tbaa !9
  %191 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %190, i32 0, i32 9
  %192 = load i16, ptr %191, align 1, !tbaa !14
  %193 = zext i16 %192 to i32
  %194 = and i32 %193, 8
  %195 = icmp sgt i32 %194, 0
  br i1 %195, label %230, label %196

196:                                              ; preds = %189, %183, %180
  %197 = load i32, ptr %10, align 4, !tbaa !5
  %198 = icmp eq i32 %197, 1
  br i1 %198, label %199, label %212

199:                                              ; preds = %196
  %200 = load ptr, ptr %9, align 8, !tbaa !9
  %201 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %200, i32 0, i32 11
  %202 = load i8, ptr %201, align 1, !tbaa !11
  %203 = zext i8 %202 to i32
  %204 = icmp eq i32 %203, 3
  br i1 %204, label %205, label %212

205:                                              ; preds = %199
  %206 = load ptr, ptr %9, align 8, !tbaa !9
  %207 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %206, i32 0, i32 9
  %208 = load i16, ptr %207, align 1, !tbaa !14
  %209 = zext i16 %208 to i32
  %210 = and i32 %209, 16
  %211 = icmp sgt i32 %210, 0
  br i1 %211, label %230, label %212

212:                                              ; preds = %205, %199, %196
  %213 = load i32, ptr %10, align 4, !tbaa !5
  %214 = icmp eq i32 %213, 2
  br i1 %214, label %215, label %228

215:                                              ; preds = %212
  %216 = load ptr, ptr %9, align 8, !tbaa !9
  %217 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %216, i32 0, i32 11
  %218 = load i8, ptr %217, align 1, !tbaa !11
  %219 = zext i8 %218 to i32
  %220 = icmp eq i32 %219, 3
  br i1 %220, label %221, label %228

221:                                              ; preds = %215
  %222 = load ptr, ptr %9, align 8, !tbaa !9
  %223 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %222, i32 0, i32 9
  %224 = load i16, ptr %223, align 1, !tbaa !14
  %225 = zext i16 %224 to i32
  %226 = and i32 %225, 32
  %227 = icmp sgt i32 %226, 0
  br label %228

228:                                              ; preds = %221, %215, %212
  %229 = phi i1 [ false, %215 ], [ false, %212 ], [ %227, %221 ]
  br label %230

230:                                              ; preds = %228, %205, %189, %173, %157, %141, %124
  %231 = phi i1 [ true, %205 ], [ true, %189 ], [ true, %173 ], [ true, %157 ], [ true, %141 ], [ true, %124 ], [ %229, %228 ]
  %232 = zext i1 %231 to i64
  %233 = select i1 %231, i32 1, i32 0
  store i32 %233, ptr %13, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #2
  %234 = load i32, ptr %10, align 4, !tbaa !5
  %235 = icmp eq i32 %234, 0
  br i1 %235, label %236, label %249

236:                                              ; preds = %230
  %237 = load ptr, ptr %9, align 8, !tbaa !9
  %238 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %237, i32 0, i32 11
  %239 = load i8, ptr %238, align 1, !tbaa !11
  %240 = zext i8 %239 to i32
  %241 = icmp eq i32 %240, 1
  br i1 %241, label %242, label %249

242:                                              ; preds = %236
  %243 = load ptr, ptr %9, align 8, !tbaa !9
  %244 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %243, i32 0, i32 9
  %245 = load i16, ptr %244, align 1, !tbaa !14
  %246 = zext i16 %245 to i32
  %247 = and i32 %246, 8
  %248 = icmp sgt i32 %247, 0
  br i1 %248, label %331, label %249

249:                                              ; preds = %242, %236, %230
  %250 = load i32, ptr %10, align 4, !tbaa !5
  %251 = icmp eq i32 %250, 0
  br i1 %251, label %252, label %265

252:                                              ; preds = %249
  %253 = load ptr, ptr %9, align 8, !tbaa !9
  %254 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %253, i32 0, i32 11
  %255 = load i8, ptr %254, align 1, !tbaa !11
  %256 = zext i8 %255 to i32
  %257 = icmp eq i32 %256, 2
  br i1 %257, label %258, label %265

258:                                              ; preds = %252
  %259 = load ptr, ptr %9, align 8, !tbaa !9
  %260 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %259, i32 0, i32 9
  %261 = load i16, ptr %260, align 1, !tbaa !14
  %262 = zext i16 %261 to i32
  %263 = and i32 %262, 16
  %264 = icmp sgt i32 %263, 0
  br i1 %264, label %331, label %265

265:                                              ; preds = %258, %252, %249
  %266 = load i32, ptr %10, align 4, !tbaa !5
  %267 = icmp eq i32 %266, 0
  br i1 %267, label %268, label %281

268:                                              ; preds = %265
  %269 = load ptr, ptr %9, align 8, !tbaa !9
  %270 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %269, i32 0, i32 11
  %271 = load i8, ptr %270, align 1, !tbaa !11
  %272 = zext i8 %271 to i32
  %273 = icmp eq i32 %272, 3
  br i1 %273, label %274, label %281

274:                                              ; preds = %268
  %275 = load ptr, ptr %9, align 8, !tbaa !9
  %276 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %275, i32 0, i32 9
  %277 = load i16, ptr %276, align 1, !tbaa !14
  %278 = zext i16 %277 to i32
  %279 = and i32 %278, 64
  %280 = icmp sgt i32 %279, 0
  br i1 %280, label %331, label %281

281:                                              ; preds = %274, %268, %265
  %282 = load i32, ptr %10, align 4, !tbaa !5
  %283 = icmp eq i32 %282, 1
  br i1 %283, label %284, label %297

284:                                              ; preds = %281
  %285 = load ptr, ptr %9, align 8, !tbaa !9
  %286 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %285, i32 0, i32 11
  %287 = load i8, ptr %286, align 1, !tbaa !11
  %288 = zext i8 %287 to i32
  %289 = icmp eq i32 %288, 2
  br i1 %289, label %290, label %297

290:                                              ; preds = %284
  %291 = load ptr, ptr %9, align 8, !tbaa !9
  %292 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %291, i32 0, i32 9
  %293 = load i16, ptr %292, align 1, !tbaa !14
  %294 = zext i16 %293 to i32
  %295 = and i32 %294, 32
  %296 = icmp sgt i32 %295, 0
  br i1 %296, label %331, label %297

297:                                              ; preds = %290, %284, %281
  %298 = load i32, ptr %10, align 4, !tbaa !5
  %299 = icmp eq i32 %298, 1
  br i1 %299, label %300, label %313

300:                                              ; preds = %297
  %301 = load ptr, ptr %9, align 8, !tbaa !9
  %302 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %301, i32 0, i32 11
  %303 = load i8, ptr %302, align 1, !tbaa !11
  %304 = zext i8 %303 to i32
  %305 = icmp eq i32 %304, 3
  br i1 %305, label %306, label %313

306:                                              ; preds = %300
  %307 = load ptr, ptr %9, align 8, !tbaa !9
  %308 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %307, i32 0, i32 9
  %309 = load i16, ptr %308, align 1, !tbaa !14
  %310 = zext i16 %309 to i32
  %311 = and i32 %310, 128
  %312 = icmp sgt i32 %311, 0
  br i1 %312, label %331, label %313

313:                                              ; preds = %306, %300, %297
  %314 = load i32, ptr %10, align 4, !tbaa !5
  %315 = icmp eq i32 %314, 2
  br i1 %315, label %316, label %329

316:                                              ; preds = %313
  %317 = load ptr, ptr %9, align 8, !tbaa !9
  %318 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %317, i32 0, i32 11
  %319 = load i8, ptr %318, align 1, !tbaa !11
  %320 = zext i8 %319 to i32
  %321 = icmp eq i32 %320, 3
  br i1 %321, label %322, label %329

322:                                              ; preds = %316
  %323 = load ptr, ptr %9, align 8, !tbaa !9
  %324 = getelementptr inbounds %struct.libxsmm_meltw_descriptor, ptr %323, i32 0, i32 9
  %325 = load i16, ptr %324, align 1, !tbaa !14
  %326 = zext i16 %325 to i32
  %327 = and i32 %326, 256
  %328 = icmp sgt i32 %327, 0
  br label %329

329:                                              ; preds = %322, %316, %313
  %330 = phi i1 [ false, %316 ], [ false, %313 ], [ %328, %322 ]
  br label %331

331:                                              ; preds = %329, %306, %290, %274, %258, %242
  %332 = phi i1 [ true, %306 ], [ true, %290 ], [ true, %274 ], [ true, %258 ], [ true, %242 ], [ %330, %329 ]
  %333 = zext i1 %332 to i64
  %334 = select i1 %332, i32 1, i32 0
  store i32 %334, ptr %14, align 4, !tbaa !5
  %335 = load i32, ptr %12, align 4, !tbaa !5
  %336 = icmp ugt i32 %335, 0
  br i1 %336, label %337, label %341

337:                                              ; preds = %331
  %338 = load i32, ptr %7, align 4, !tbaa !5
  %339 = load i32, ptr %8, align 4, !tbaa !5
  %340 = mul nsw i32 %338, %339
  store i32 %340, ptr %11, align 4, !tbaa !5
  br label %358

341:                                              ; preds = %331
  %342 = load i32, ptr %13, align 4, !tbaa !5
  %343 = icmp ugt i32 %342, 0
  br i1 %343, label %344, label %346

344:                                              ; preds = %341
  %345 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %345, ptr %11, align 4, !tbaa !5
  br label %357

346:                                              ; preds = %341
  %347 = load i32, ptr %14, align 4, !tbaa !5
  %348 = icmp ugt i32 %347, 0
  br i1 %348, label %349, label %350

349:                                              ; preds = %346
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %356

350:                                              ; preds = %346
  %351 = load i32, ptr %6, align 4, !tbaa !5
  %352 = load i32, ptr %7, align 4, !tbaa !5
  %353 = load i32, ptr %8, align 4, !tbaa !5
  %354 = mul nsw i32 %352, %353
  %355 = add nsw i32 %351, %354
  store i32 %355, ptr %11, align 4, !tbaa !5
  br label %356

356:                                              ; preds = %350, %349
  br label %357

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

358:                                              ; preds = %357, %337
  %359 = load i32, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #2
  ret i32 %359
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !7, i64 31}
!12 = !{!"libxsmm_meltw_descriptor", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !13, i64 27, !13, i64 29, !7, i64 31}
!13 = !{!"short", !7, i64 0}
!14 = !{!12, !13, i64 27}
!15 = !{!12, !13, i64 29}


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

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) uwtable
define dso_local i32 @libxsmm_elementwise_get_index(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr nocapture noundef readonly %3, i32 noundef %4) local_unnamed_addr #0 {
  switch i32 %4, label %.thread138 [
    i32 0, label %6
    i32 1, label %25
    i32 2, label %38
  ]

6:                                                ; preds = %5
  %7 = getelementptr inbounds i8, ptr %3, i64 31
  %8 = load i8, ptr %7, align 1, !tbaa !5
  switch i8 %8, label %.critedge93.thread160 [
    i8 1, label %.critedge.thread.thread
    i8 2, label %.critedge.thread.thread140
    i8 3, label %.critedge.thread.thread141
  ]

.critedge.thread.thread:                          ; preds = %6
  %9 = getelementptr inbounds i8, ptr %3, i64 27
  %10 = load i16, ptr %9, align 1, !tbaa !11
  %11 = and i16 %10, 2
  %.not = icmp ne i16 %11, 0
  %12 = getelementptr inbounds i8, ptr %3, i64 29
  %13 = load i16, ptr %12, align 1, !tbaa !12
  %14 = icmp eq i16 %13, 27
  br i1 %14, label %.critedge88.thread168, label %42

.critedge.thread.thread140:                       ; preds = %6
  %15 = getelementptr inbounds i8, ptr %3, i64 27
  %16 = load i16, ptr %15, align 1, !tbaa !11
  %17 = and i16 %16, 1
  %.not66 = icmp ne i16 %17, 0
  %18 = and i16 %16, 4
  %.not71 = icmp ne i16 %18, 0
  %19 = and i16 %16, 16
  %.not76 = icmp eq i16 %19, 0
  br i1 %.not76, label %.critedge93.thread, label %.critedge93

.critedge.thread.thread141:                       ; preds = %6
  %20 = getelementptr inbounds i8, ptr %3, i64 27
  %21 = load i16, ptr %20, align 1, !tbaa !11
  %22 = and i16 %21, 1
  %.not67 = icmp ne i16 %22, 0
  %23 = and i16 %21, 8
  %.not72 = icmp ne i16 %23, 0
  %24 = and i16 %21, 64
  %.not77 = icmp eq i16 %24, 0
  br i1 %.not77, label %.critedge93.thread, label %.critedge93

25:                                               ; preds = %5
  %26 = getelementptr inbounds i8, ptr %3, i64 31
  %27 = load i8, ptr %26, align 1, !tbaa !5
  switch i8 %27, label %.critedge93.thread160 [
    i8 2, label %.critedge86.thread143
    i8 3, label %.critedge86.thread144
  ]

.critedge86.thread143:                            ; preds = %25
  %28 = getelementptr inbounds i8, ptr %3, i64 27
  %29 = load i16, ptr %28, align 1, !tbaa !11
  %30 = and i16 %29, 2
  %.not68 = icmp ne i16 %30, 0
  %31 = and i16 %29, 8
  %.not73 = icmp ne i16 %31, 0
  %32 = and i16 %29, 32
  %.not78 = icmp eq i16 %32, 0
  br i1 %.not78, label %.critedge93.thread, label %.critedge93

.critedge86.thread144:                            ; preds = %25
  %33 = getelementptr inbounds i8, ptr %3, i64 27
  %34 = load i16, ptr %33, align 1, !tbaa !11
  %35 = and i16 %34, 2
  %.not69 = icmp ne i16 %35, 0
  %36 = and i16 %34, 16
  %.not74 = icmp ne i16 %36, 0
  %37 = and i16 %34, 128
  %.not79 = icmp eq i16 %37, 0
  br i1 %.not79, label %.critedge93.thread, label %.critedge93

38:                                               ; preds = %5
  %39 = getelementptr inbounds i8, ptr %3, i64 31
  %40 = load i8, ptr %39, align 1, !tbaa !5
  %41 = icmp eq i8 %40, 3
  br i1 %41, label %50, label %.critedge93.thread160

42:                                               ; preds = %.critedge.thread.thread
  %43 = getelementptr inbounds i8, ptr %3, i64 27
  %44 = load i16, ptr %43, align 1, !tbaa !11
  %45 = and i16 %44, 4
  %.not70 = icmp eq i16 %45, 0
  br i1 %.not70, label %.critedge88.thread, label %.critedge88.thread168

.critedge88.thread168:                            ; preds = %.critedge.thread.thread, %42
  br label %.critedge88.thread

.critedge88.thread:                               ; preds = %.critedge88.thread168, %42
  %46 = phi i1 [ false, %42 ], [ true, %.critedge88.thread168 ]
  %47 = getelementptr inbounds i8, ptr %3, i64 27
  %48 = load i16, ptr %47, align 1, !tbaa !11
  %49 = and i16 %48, 8
  %.not75 = icmp eq i16 %49, 0
  br i1 %.not75, label %.critedge93.thread, label %.critedge93

.critedge93.thread:                               ; preds = %.critedge86.thread144, %.critedge.thread.thread141, %.critedge.thread.thread140, %.critedge88.thread, %.critedge86.thread143
  %.ph = phi i1 [ %.not69, %.critedge86.thread144 ], [ %.not67, %.critedge.thread.thread141 ], [ %.not66, %.critedge.thread.thread140 ], [ %.not, %.critedge88.thread ], [ %.not68, %.critedge86.thread143 ]
  %.ph126 = phi i1 [ %.not74, %.critedge86.thread144 ], [ %.not72, %.critedge.thread.thread141 ], [ %.not71, %.critedge.thread.thread140 ], [ %46, %.critedge88.thread ], [ %.not73, %.critedge86.thread143 ]
  br i1 %.ph, label %60, label %.critedge93.thread160

50:                                               ; preds = %38
  %51 = getelementptr inbounds i8, ptr %3, i64 27
  %52 = load i16, ptr %51, align 1, !tbaa !11
  %53 = and i16 %52, 4
  %.not178 = icmp eq i16 %53, 0
  %54 = and i16 %52, 32
  %55 = icmp ne i16 %54, 0
  %56 = and i16 %52, 256
  %57 = icmp ne i16 %56, 0
  br i1 %.not178, label %.critedge93.thread160, label %60

.critedge93:                                      ; preds = %.critedge86.thread144, %.critedge86.thread143, %.critedge.thread.thread141, %.critedge.thread.thread140, %.critedge88.thread
  %58 = phi i1 [ %.not74, %.critedge86.thread144 ], [ %.not73, %.critedge86.thread143 ], [ %.not72, %.critedge.thread.thread141 ], [ %.not71, %.critedge.thread.thread140 ], [ %46, %.critedge88.thread ]
  %59 = phi i1 [ %.not69, %.critedge86.thread144 ], [ %.not68, %.critedge86.thread143 ], [ %.not67, %.critedge.thread.thread141 ], [ %.not66, %.critedge.thread.thread140 ], [ %.not, %.critedge88.thread ]
  br i1 %59, label %60, label %.thread161

.thread161:                                       ; preds = %.critedge93
  %.164 = select i1 %58, i32 %0, i32 0
  br label %66

60:                                               ; preds = %.critedge93.thread, %50, %.critedge93
  %61 = mul nsw i32 %2, %1
  br label %66

.critedge93.thread160:                            ; preds = %25, %6, %38, %.critedge93.thread, %50
  %62 = phi i1 [ %57, %50 ], [ false, %.critedge93.thread ], [ false, %38 ], [ false, %6 ], [ false, %25 ]
  %63 = phi i1 [ %55, %50 ], [ %.ph126, %.critedge93.thread ], [ false, %38 ], [ false, %6 ], [ false, %25 ]
  %cond.fr = freeze i1 %63
  %brmerge = or i1 %cond.fr, %62
  %. = select i1 %cond.fr, i32 %0, i32 0
  br i1 %brmerge, label %66, label %.thread138

.thread138:                                       ; preds = %.critedge93.thread160, %5
  %64 = mul nsw i32 %2, %1
  %65 = add nsw i32 %64, %0
  br label %66

66:                                               ; preds = %.thread161, %.critedge93.thread160, %.thread138, %60
  %.0 = phi i32 [ %61, %60 ], [ %65, %.thread138 ], [ %., %.critedge93.thread160 ], [ %.164, %.thread161 ]
  ret i32 %.0
}

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }

!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, !8, i64 31}
!6 = !{!"libxsmm_meltw_descriptor", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !8, i64 24, !8, i64 25, !8, i64 26, !10, i64 27, !10, i64 29, !8, i64 31}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"short", !8, i64 0}
!11 = !{!6, !10, i64 27}
!12 = !{!6, !10, i64 29}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass