; LLVM IR from XiaoMi/mace :: micro/ops/utils (gemm)

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

%"class.micro::ops::MatrixMap" = type { ptr, i32, i32, i32, i32 }
%"class.micro::ops::MatrixMap.0" = type { ptr, i32, i32, i32, i32 }

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_ZN5micro3ops4GemmIfE7ComputeEPKfS4_iiiiNS0_11MatrixMajorES5_S5_bbPf(ptr noundef nonnull align 1 dereferenceable(1) %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8, i32 noundef %9, i1 noundef zeroext %10, i1 noundef zeroext %11, ptr noundef %12) #0 align 2 {
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %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 i8, align 1
  %25 = alloca i8, align 1
  %26 = alloca ptr, align 8
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca %"class.micro::ops::MatrixMap", align 8
  %30 = alloca %"class.micro::ops::MatrixMap", align 8
  %31 = alloca %"class.micro::ops::MatrixMap.0", align 8
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca [4 x i32], align 16
  %36 = alloca i32, align 4
  %37 = alloca [16 x float], align 16
  %38 = alloca [4 x i32], align 16
  %39 = alloca i32, align 4
  %40 = alloca float, align 4
  %41 = alloca float, align 4
  %42 = alloca float, align 4
  %43 = alloca float, align 4
  %44 = alloca float, align 4
  %45 = alloca float, align 4
  %46 = alloca float, align 4
  %47 = alloca float, 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 float, align 4
  %54 = alloca i32, align 4
  %55 = alloca i32, align 4
  %56 = alloca i32, align 4
  %57 = alloca float, align 4
  %58 = alloca i32, align 4
  store ptr %0, ptr %14, align 8, !tbaa !5
  store ptr %1, ptr %15, align 8, !tbaa !5
  store ptr %2, ptr %16, align 8, !tbaa !5
  store i32 %3, ptr %17, align 4, !tbaa !9
  store i32 %4, ptr %18, align 4, !tbaa !9
  store i32 %5, ptr %19, align 4, !tbaa !9
  store i32 %6, ptr %20, align 4, !tbaa !9
  store i32 %7, ptr %21, align 4, !tbaa !11
  store i32 %8, ptr %22, align 4, !tbaa !11
  store i32 %9, ptr %23, align 4, !tbaa !11
  %59 = zext i1 %10 to i8
  store i8 %59, ptr %24, align 1, !tbaa !13
  %60 = zext i1 %11 to i8
  store i8 %60, ptr %25, align 1, !tbaa !13
  store ptr %12, ptr %26, align 8, !tbaa !5
  %61 = load ptr, ptr %14, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #5
  store i32 0, ptr %27, align 4, !tbaa !9
  br label %62

62:                                               ; preds = %424, %13
  %63 = load i32, ptr %27, align 4, !tbaa !9
  %64 = load i32, ptr %17, align 4, !tbaa !9
  %65 = icmp slt i32 %63, %64
  br i1 %65, label %67, label %66

66:                                               ; preds = %62
  store i32 2, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #5
  br label %427

67:                                               ; preds = %62
  call void @llvm.lifetime.start.p0(i64 24, ptr %29) #5
  %68 = load ptr, ptr %15, align 8, !tbaa !5
  %69 = load i8, ptr %24, align 1, !tbaa !13, !range !15, !noundef !16
  %70 = trunc i8 %69 to i1
  %71 = zext i1 %70 to i32
  %72 = load i32, ptr %27, align 4, !tbaa !9
  %73 = mul nsw i32 %71, %72
  %74 = load i32, ptr %18, align 4, !tbaa !9
  %75 = mul nsw i32 %73, %74
  %76 = load i32, ptr %20, align 4, !tbaa !9
  %77 = mul nsw i32 %75, %76
  %78 = sext i32 %77 to i64
  %79 = getelementptr inbounds float, ptr %68, i64 %78
  %80 = load i32, ptr %21, align 4, !tbaa !11
  %81 = load i32, ptr %18, align 4, !tbaa !9
  %82 = load i32, ptr %20, align 4, !tbaa !9
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %29, ptr noundef %79, i32 noundef %80, i32 noundef %81, i32 noundef %82)
  call void @llvm.lifetime.start.p0(i64 24, ptr %30) #5
  %83 = load ptr, ptr %16, align 8, !tbaa !5
  %84 = load i8, ptr %25, align 1, !tbaa !13, !range !15, !noundef !16
  %85 = trunc i8 %84 to i1
  %86 = zext i1 %85 to i32
  %87 = load i32, ptr %27, align 4, !tbaa !9
  %88 = mul nsw i32 %86, %87
  %89 = load i32, ptr %20, align 4, !tbaa !9
  %90 = mul nsw i32 %88, %89
  %91 = load i32, ptr %19, align 4, !tbaa !9
  %92 = mul nsw i32 %90, %91
  %93 = sext i32 %92 to i64
  %94 = getelementptr inbounds float, ptr %83, i64 %93
  %95 = load i32, ptr %22, align 4, !tbaa !11
  %96 = load i32, ptr %20, align 4, !tbaa !9
  %97 = load i32, ptr %19, align 4, !tbaa !9
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef %94, i32 noundef %95, i32 noundef %96, i32 noundef %97)
  call void @llvm.lifetime.start.p0(i64 24, ptr %31) #5
  %98 = load ptr, ptr %26, align 8, !tbaa !5
  %99 = load i32, ptr %27, align 4, !tbaa !9
  %100 = load i32, ptr %18, align 4, !tbaa !9
  %101 = mul nsw i32 %99, %100
  %102 = load i32, ptr %19, align 4, !tbaa !9
  %103 = mul nsw i32 %101, %102
  %104 = sext i32 %103 to i64
  %105 = getelementptr inbounds float, ptr %98, i64 %104
  %106 = load i32, ptr %23, align 4, !tbaa !11
  %107 = load i32, ptr %18, align 4, !tbaa !9
  %108 = load i32, ptr %19, align 4, !tbaa !9
  call void @_ZN5micro3ops9MatrixMapIfEC2EPfNS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %31, ptr noundef %105, i32 noundef %106, i32 noundef %107, i32 noundef %108)
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #5
  %109 = load i32, ptr %18, align 4, !tbaa !9
  %110 = sdiv i32 %109, 4
  %111 = mul nsw i32 %110, 4
  store i32 %111, ptr %32, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #5
  %112 = load i32, ptr %19, align 4, !tbaa !9
  %113 = sdiv i32 %112, 4
  %114 = mul nsw i32 %113, 4
  store i32 %114, ptr %33, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #5
  store i32 0, ptr %34, align 4, !tbaa !9
  br label %115

115:                                              ; preds = %420, %67
  %116 = load i32, ptr %34, align 4, !tbaa !9
  %117 = load i32, ptr %18, align 4, !tbaa !9
  %118 = icmp slt i32 %116, %117
  br i1 %118, label %120, label %119

119:                                              ; preds = %115
  store i32 5, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #5
  br label %423

120:                                              ; preds = %115
  %121 = load i32, ptr %34, align 4, !tbaa !9
  %122 = load i32, ptr %32, align 4, !tbaa !9
  %123 = icmp slt i32 %121, %122
  br i1 %123, label %124, label %373

124:                                              ; preds = %120
  call void @llvm.lifetime.start.p0(i64 16, ptr %35) #5
  %125 = load i32, ptr %34, align 4, !tbaa !9
  store i32 %125, ptr %35, align 4, !tbaa !9
  %126 = getelementptr inbounds i32, ptr %35, i64 1
  %127 = load i32, ptr %34, align 4, !tbaa !9
  %128 = add nsw i32 %127, 1
  store i32 %128, ptr %126, align 4, !tbaa !9
  %129 = getelementptr inbounds i32, ptr %35, i64 2
  %130 = load i32, ptr %34, align 4, !tbaa !9
  %131 = add nsw i32 %130, 2
  store i32 %131, ptr %129, align 4, !tbaa !9
  %132 = getelementptr inbounds i32, ptr %35, i64 3
  %133 = load i32, ptr %34, align 4, !tbaa !9
  %134 = add nsw i32 %133, 3
  store i32 %134, ptr %132, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #5
  store i32 0, ptr %36, align 4, !tbaa !9
  br label %135

135:                                              ; preds = %369, %124
  %136 = load i32, ptr %36, align 4, !tbaa !9
  %137 = load i32, ptr %19, align 4, !tbaa !9
  %138 = icmp slt i32 %136, %137
  br i1 %138, label %140, label %139

139:                                              ; preds = %135
  store i32 8, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #5
  br label %372

140:                                              ; preds = %135
  %141 = load i32, ptr %36, align 4, !tbaa !9
  %142 = load i32, ptr %33, align 4, !tbaa !9
  %143 = icmp slt i32 %141, %142
  br i1 %143, label %144, label %320

144:                                              ; preds = %140
  call void @llvm.lifetime.start.p0(i64 64, ptr %37) #5
  call void @llvm.memset.p0.i64(ptr align 16 %37, i8 0, i64 64, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %38) #5
  %145 = load i32, ptr %36, align 4, !tbaa !9
  store i32 %145, ptr %38, align 4, !tbaa !9
  %146 = getelementptr inbounds i32, ptr %38, i64 1
  %147 = load i32, ptr %36, align 4, !tbaa !9
  %148 = add nsw i32 %147, 1
  store i32 %148, ptr %146, align 4, !tbaa !9
  %149 = getelementptr inbounds i32, ptr %38, i64 2
  %150 = load i32, ptr %36, align 4, !tbaa !9
  %151 = add nsw i32 %150, 2
  store i32 %151, ptr %149, align 4, !tbaa !9
  %152 = getelementptr inbounds i32, ptr %38, i64 3
  %153 = load i32, ptr %36, align 4, !tbaa !9
  %154 = add nsw i32 %153, 3
  store i32 %154, ptr %152, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #5
  store i32 0, ptr %39, align 4, !tbaa !9
  br label %155

155:                                              ; preds = %281, %144
  %156 = load i32, ptr %39, align 4, !tbaa !9
  %157 = load i32, ptr %20, align 4, !tbaa !9
  %158 = icmp slt i32 %156, %157
  br i1 %158, label %160, label %159

159:                                              ; preds = %155
  store i32 11, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #5
  br label %284

160:                                              ; preds = %155
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #5
  %161 = getelementptr inbounds [4 x i32], ptr %35, i64 0, i64 0
  %162 = load i32, ptr %161, align 16, !tbaa !9
  %163 = load i32, ptr %39, align 4, !tbaa !9
  %164 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %29, i32 noundef %162, i32 noundef %163)
  %165 = load float, ptr %164, align 4, !tbaa !17
  store float %165, ptr %40, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #5
  %166 = getelementptr inbounds [4 x i32], ptr %35, i64 0, i64 1
  %167 = load i32, ptr %166, align 4, !tbaa !9
  %168 = load i32, ptr %39, align 4, !tbaa !9
  %169 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %29, i32 noundef %167, i32 noundef %168)
  %170 = load float, ptr %169, align 4, !tbaa !17
  store float %170, ptr %41, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #5
  %171 = getelementptr inbounds [4 x i32], ptr %35, i64 0, i64 2
  %172 = load i32, ptr %171, align 8, !tbaa !9
  %173 = load i32, ptr %39, align 4, !tbaa !9
  %174 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %29, i32 noundef %172, i32 noundef %173)
  %175 = load float, ptr %174, align 4, !tbaa !17
  store float %175, ptr %42, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #5
  %176 = getelementptr inbounds [4 x i32], ptr %35, i64 0, i64 3
  %177 = load i32, ptr %176, align 4, !tbaa !9
  %178 = load i32, ptr %39, align 4, !tbaa !9
  %179 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %29, i32 noundef %177, i32 noundef %178)
  %180 = load float, ptr %179, align 4, !tbaa !17
  store float %180, ptr %43, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #5
  %181 = load i32, ptr %39, align 4, !tbaa !9
  %182 = getelementptr inbounds [4 x i32], ptr %38, i64 0, i64 0
  %183 = load i32, ptr %182, align 16, !tbaa !9
  %184 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %30, i32 noundef %181, i32 noundef %183)
  %185 = load float, ptr %184, align 4, !tbaa !17
  store float %185, ptr %44, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #5
  %186 = load i32, ptr %39, align 4, !tbaa !9
  %187 = getelementptr inbounds [4 x i32], ptr %38, i64 0, i64 1
  %188 = load i32, ptr %187, align 4, !tbaa !9
  %189 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %30, i32 noundef %186, i32 noundef %188)
  %190 = load float, ptr %189, align 4, !tbaa !17
  store float %190, ptr %45, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #5
  %191 = load i32, ptr %39, align 4, !tbaa !9
  %192 = getelementptr inbounds [4 x i32], ptr %38, i64 0, i64 2
  %193 = load i32, ptr %192, align 8, !tbaa !9
  %194 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %30, i32 noundef %191, i32 noundef %193)
  %195 = load float, ptr %194, align 4, !tbaa !17
  store float %195, ptr %46, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #5
  %196 = load i32, ptr %39, align 4, !tbaa !9
  %197 = getelementptr inbounds [4 x i32], ptr %38, i64 0, i64 3
  %198 = load i32, ptr %197, align 4, !tbaa !9
  %199 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %30, i32 noundef %196, i32 noundef %198)
  %200 = load float, ptr %199, align 4, !tbaa !17
  store float %200, ptr %47, align 4, !tbaa !17
  %201 = load float, ptr %40, align 4, !tbaa !17
  %202 = load float, ptr %44, align 4, !tbaa !17
  %203 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 0
  %204 = load float, ptr %203, align 16, !tbaa !17
  %205 = call float @llvm.fmuladd.f32(float %201, float %202, float %204)
  store float %205, ptr %203, align 16, !tbaa !17
  %206 = load float, ptr %40, align 4, !tbaa !17
  %207 = load float, ptr %45, align 4, !tbaa !17
  %208 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 1
  %209 = load float, ptr %208, align 4, !tbaa !17
  %210 = call float @llvm.fmuladd.f32(float %206, float %207, float %209)
  store float %210, ptr %208, align 4, !tbaa !17
  %211 = load float, ptr %40, align 4, !tbaa !17
  %212 = load float, ptr %46, align 4, !tbaa !17
  %213 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 2
  %214 = load float, ptr %213, align 8, !tbaa !17
  %215 = call float @llvm.fmuladd.f32(float %211, float %212, float %214)
  store float %215, ptr %213, align 8, !tbaa !17
  %216 = load float, ptr %40, align 4, !tbaa !17
  %217 = load float, ptr %47, align 4, !tbaa !17
  %218 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 3
  %219 = load float, ptr %218, align 4, !tbaa !17
  %220 = call float @llvm.fmuladd.f32(float %216, float %217, float %219)
  store float %220, ptr %218, align 4, !tbaa !17
  %221 = load float, ptr %41, align 4, !tbaa !17
  %222 = load float, ptr %44, align 4, !tbaa !17
  %223 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 4
  %224 = load float, ptr %223, align 16, !tbaa !17
  %225 = call float @llvm.fmuladd.f32(float %221, float %222, float %224)
  store float %225, ptr %223, align 16, !tbaa !17
  %226 = load float, ptr %41, align 4, !tbaa !17
  %227 = load float, ptr %45, align 4, !tbaa !17
  %228 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 5
  %229 = load float, ptr %228, align 4, !tbaa !17
  %230 = call float @llvm.fmuladd.f32(float %226, float %227, float %229)
  store float %230, ptr %228, align 4, !tbaa !17
  %231 = load float, ptr %41, align 4, !tbaa !17
  %232 = load float, ptr %46, align 4, !tbaa !17
  %233 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 6
  %234 = load float, ptr %233, align 8, !tbaa !17
  %235 = call float @llvm.fmuladd.f32(float %231, float %232, float %234)
  store float %235, ptr %233, align 8, !tbaa !17
  %236 = load float, ptr %41, align 4, !tbaa !17
  %237 = load float, ptr %47, align 4, !tbaa !17
  %238 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 7
  %239 = load float, ptr %238, align 4, !tbaa !17
  %240 = call float @llvm.fmuladd.f32(float %236, float %237, float %239)
  store float %240, ptr %238, align 4, !tbaa !17
  %241 = load float, ptr %42, align 4, !tbaa !17
  %242 = load float, ptr %44, align 4, !tbaa !17
  %243 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 8
  %244 = load float, ptr %243, align 16, !tbaa !17
  %245 = call float @llvm.fmuladd.f32(float %241, float %242, float %244)
  store float %245, ptr %243, align 16, !tbaa !17
  %246 = load float, ptr %42, align 4, !tbaa !17
  %247 = load float, ptr %45, align 4, !tbaa !17
  %248 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 9
  %249 = load float, ptr %248, align 4, !tbaa !17
  %250 = call float @llvm.fmuladd.f32(float %246, float %247, float %249)
  store float %250, ptr %248, align 4, !tbaa !17
  %251 = load float, ptr %42, align 4, !tbaa !17
  %252 = load float, ptr %46, align 4, !tbaa !17
  %253 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 10
  %254 = load float, ptr %253, align 8, !tbaa !17
  %255 = call float @llvm.fmuladd.f32(float %251, float %252, float %254)
  store float %255, ptr %253, align 8, !tbaa !17
  %256 = load float, ptr %42, align 4, !tbaa !17
  %257 = load float, ptr %47, align 4, !tbaa !17
  %258 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 11
  %259 = load float, ptr %258, align 4, !tbaa !17
  %260 = call float @llvm.fmuladd.f32(float %256, float %257, float %259)
  store float %260, ptr %258, align 4, !tbaa !17
  %261 = load float, ptr %43, align 4, !tbaa !17
  %262 = load float, ptr %44, align 4, !tbaa !17
  %263 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 12
  %264 = load float, ptr %263, align 16, !tbaa !17
  %265 = call float @llvm.fmuladd.f32(float %261, float %262, float %264)
  store float %265, ptr %263, align 16, !tbaa !17
  %266 = load float, ptr %43, align 4, !tbaa !17
  %267 = load float, ptr %45, align 4, !tbaa !17
  %268 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 13
  %269 = load float, ptr %268, align 4, !tbaa !17
  %270 = call float @llvm.fmuladd.f32(float %266, float %267, float %269)
  store float %270, ptr %268, align 4, !tbaa !17
  %271 = load float, ptr %43, align 4, !tbaa !17
  %272 = load float, ptr %46, align 4, !tbaa !17
  %273 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 14
  %274 = load float, ptr %273, align 8, !tbaa !17
  %275 = call float @llvm.fmuladd.f32(float %271, float %272, float %274)
  store float %275, ptr %273, align 8, !tbaa !17
  %276 = load float, ptr %43, align 4, !tbaa !17
  %277 = load float, ptr %47, align 4, !tbaa !17
  %278 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 15
  %279 = load float, ptr %278, align 4, !tbaa !17
  %280 = call float @llvm.fmuladd.f32(float %276, float %277, float %279)
  store float %280, ptr %278, align 4, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #5
  br label %281

281:                                              ; preds = %160
  %282 = load i32, ptr %39, align 4, !tbaa !9
  %283 = add nsw i32 %282, 1
  store i32 %283, ptr %39, align 4, !tbaa !9
  br label %155, !llvm.loop !19

284:                                              ; preds = %159
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #5
  store i32 0, ptr %48, align 4, !tbaa !9
  br label %285

285:                                              ; preds = %316, %284
  %286 = load i32, ptr %48, align 4, !tbaa !9
  %287 = icmp slt i32 %286, 4
  br i1 %287, label %289, label %288

288:                                              ; preds = %285
  store i32 14, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #5
  br label %319

289:                                              ; preds = %285
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #5
  %290 = load i32, ptr %48, align 4, !tbaa !9
  %291 = mul nsw i32 %290, 4
  store i32 %291, ptr %49, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #5
  store i32 0, ptr %50, align 4, !tbaa !9
  br label %292

292:                                              ; preds = %312, %289
  %293 = load i32, ptr %50, align 4, !tbaa !9
  %294 = icmp slt i32 %293, 4
  br i1 %294, label %296, label %295

295:                                              ; preds = %292
  store i32 17, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #5
  br label %315

296:                                              ; preds = %292
  %297 = load i32, ptr %49, align 4, !tbaa !9
  %298 = load i32, ptr %50, align 4, !tbaa !9
  %299 = add nsw i32 %297, %298
  %300 = sext i32 %299 to i64
  %301 = getelementptr inbounds [16 x float], ptr %37, i64 0, i64 %300
  %302 = load float, ptr %301, align 4, !tbaa !17
  %303 = load i32, ptr %48, align 4, !tbaa !9
  %304 = sext i32 %303 to i64
  %305 = getelementptr inbounds [4 x i32], ptr %35, i64 0, i64 %304
  %306 = load i32, ptr %305, align 4, !tbaa !9
  %307 = load i32, ptr %50, align 4, !tbaa !9
  %308 = sext i32 %307 to i64
  %309 = getelementptr inbounds [4 x i32], ptr %38, i64 0, i64 %308
  %310 = load i32, ptr %309, align 4, !tbaa !9
  %311 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %31, i32 noundef %306, i32 noundef %310)
  store float %302, ptr %311, align 4, !tbaa !17
  br label %312

312:                                              ; preds = %296
  %313 = load i32, ptr %50, align 4, !tbaa !9
  %314 = add nsw i32 %313, 1
  store i32 %314, ptr %50, align 4, !tbaa !9
  br label %292, !llvm.loop !21

315:                                              ; preds = %295
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #5
  br label %316

316:                                              ; preds = %315
  %317 = load i32, ptr %48, align 4, !tbaa !9
  %318 = add nsw i32 %317, 1
  store i32 %318, ptr %48, align 4, !tbaa !9
  br label %285, !llvm.loop !22

319:                                              ; preds = %288
  call void @llvm.lifetime.end.p0(i64 16, ptr %38) #5
  call void @llvm.lifetime.end.p0(i64 64, ptr %37) #5
  br label %368

320:                                              ; preds = %140
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #5
  %321 = load i32, ptr %34, align 4, !tbaa !9
  store i32 %321, ptr %51, align 4, !tbaa !9
  br label %322

322:                                              ; preds = %364, %320
  %323 = load i32, ptr %51, align 4, !tbaa !9
  %324 = load i32, ptr %34, align 4, !tbaa !9
  %325 = add nsw i32 %324, 4
  %326 = icmp slt i32 %323, %325
  br i1 %326, label %328, label %327

327:                                              ; preds = %322
  store i32 20, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #5
  br label %367

328:                                              ; preds = %322
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #5
  %329 = load i32, ptr %33, align 4, !tbaa !9
  store i32 %329, ptr %52, align 4, !tbaa !9
  br label %330

330:                                              ; preds = %360, %328
  %331 = load i32, ptr %52, align 4, !tbaa !9
  %332 = load i32, ptr %19, align 4, !tbaa !9
  %333 = icmp slt i32 %331, %332
  br i1 %333, label %335, label %334

334:                                              ; preds = %330
  store i32 23, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #5
  br label %363

335:                                              ; preds = %330
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #5
  store float 0.000000e+00, ptr %53, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #5
  store i32 0, ptr %54, align 4, !tbaa !9
  br label %336

336:                                              ; preds = %352, %335
  %337 = load i32, ptr %54, align 4, !tbaa !9
  %338 = load i32, ptr %20, align 4, !tbaa !9
  %339 = icmp slt i32 %337, %338
  br i1 %339, label %341, label %340

340:                                              ; preds = %336
  store i32 26, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #5
  br label %355

341:                                              ; preds = %336
  %342 = load i32, ptr %51, align 4, !tbaa !9
  %343 = load i32, ptr %54, align 4, !tbaa !9
  %344 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %29, i32 noundef %342, i32 noundef %343)
  %345 = load float, ptr %344, align 4, !tbaa !17
  %346 = load i32, ptr %54, align 4, !tbaa !9
  %347 = load i32, ptr %52, align 4, !tbaa !9
  %348 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %30, i32 noundef %346, i32 noundef %347)
  %349 = load float, ptr %348, align 4, !tbaa !17
  %350 = load float, ptr %53, align 4, !tbaa !17
  %351 = call float @llvm.fmuladd.f32(float %345, float %349, float %350)
  store float %351, ptr %53, align 4, !tbaa !17
  br label %352

352:                                              ; preds = %341
  %353 = load i32, ptr %54, align 4, !tbaa !9
  %354 = add nsw i32 %353, 1
  store i32 %354, ptr %54, align 4, !tbaa !9
  br label %336, !llvm.loop !23

355:                                              ; preds = %340
  %356 = load float, ptr %53, align 4, !tbaa !17
  %357 = load i32, ptr %51, align 4, !tbaa !9
  %358 = load i32, ptr %52, align 4, !tbaa !9
  %359 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %31, i32 noundef %357, i32 noundef %358)
  store float %356, ptr %359, align 4, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #5
  br label %360

360:                                              ; preds = %355
  %361 = load i32, ptr %52, align 4, !tbaa !9
  %362 = add nsw i32 %361, 1
  store i32 %362, ptr %52, align 4, !tbaa !9
  br label %330, !llvm.loop !24

363:                                              ; preds = %334
  br label %364

364:                                              ; preds = %363
  %365 = load i32, ptr %51, align 4, !tbaa !9
  %366 = add nsw i32 %365, 1
  store i32 %366, ptr %51, align 4, !tbaa !9
  br label %322, !llvm.loop !25

367:                                              ; preds = %327
  br label %368

368:                                              ; preds = %367, %319
  br label %369

369:                                              ; preds = %368
  %370 = load i32, ptr %36, align 4, !tbaa !9
  %371 = add nsw i32 %370, 4
  store i32 %371, ptr %36, align 4, !tbaa !9
  br label %135, !llvm.loop !26

372:                                              ; preds = %139
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #5
  br label %419

373:                                              ; preds = %120
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #5
  %374 = load i32, ptr %32, align 4, !tbaa !9
  store i32 %374, ptr %55, align 4, !tbaa !9
  br label %375

375:                                              ; preds = %415, %373
  %376 = load i32, ptr %55, align 4, !tbaa !9
  %377 = load i32, ptr %18, align 4, !tbaa !9
  %378 = icmp slt i32 %376, %377
  br i1 %378, label %380, label %379

379:                                              ; preds = %375
  store i32 29, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #5
  br label %418

380:                                              ; preds = %375
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #5
  store i32 0, ptr %56, align 4, !tbaa !9
  br label %381

381:                                              ; preds = %411, %380
  %382 = load i32, ptr %56, align 4, !tbaa !9
  %383 = load i32, ptr %19, align 4, !tbaa !9
  %384 = icmp slt i32 %382, %383
  br i1 %384, label %386, label %385

385:                                              ; preds = %381
  store i32 32, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #5
  br label %414

386:                                              ; preds = %381
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #5
  store float 0.000000e+00, ptr %57, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #5
  store i32 0, ptr %58, align 4, !tbaa !9
  br label %387

387:                                              ; preds = %403, %386
  %388 = load i32, ptr %58, align 4, !tbaa !9
  %389 = load i32, ptr %20, align 4, !tbaa !9
  %390 = icmp slt i32 %388, %389
  br i1 %390, label %392, label %391

391:                                              ; preds = %387
  store i32 35, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #5
  br label %406

392:                                              ; preds = %387
  %393 = load i32, ptr %55, align 4, !tbaa !9
  %394 = load i32, ptr %58, align 4, !tbaa !9
  %395 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %29, i32 noundef %393, i32 noundef %394)
  %396 = load float, ptr %395, align 4, !tbaa !17
  %397 = load i32, ptr %58, align 4, !tbaa !9
  %398 = load i32, ptr %56, align 4, !tbaa !9
  %399 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %30, i32 noundef %397, i32 noundef %398)
  %400 = load float, ptr %399, align 4, !tbaa !17
  %401 = load float, ptr %57, align 4, !tbaa !17
  %402 = call float @llvm.fmuladd.f32(float %396, float %400, float %401)
  store float %402, ptr %57, align 4, !tbaa !17
  br label %403

403:                                              ; preds = %392
  %404 = load i32, ptr %58, align 4, !tbaa !9
  %405 = add nsw i32 %404, 1
  store i32 %405, ptr %58, align 4, !tbaa !9
  br label %387, !llvm.loop !27

406:                                              ; preds = %391
  %407 = load float, ptr %57, align 4, !tbaa !17
  %408 = load i32, ptr %55, align 4, !tbaa !9
  %409 = load i32, ptr %56, align 4, !tbaa !9
  %410 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %31, i32 noundef %408, i32 noundef %409)
  store float %407, ptr %410, align 4, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #5
  br label %411

411:                                              ; preds = %406
  %412 = load i32, ptr %56, align 4, !tbaa !9
  %413 = add nsw i32 %412, 1
  store i32 %413, ptr %56, align 4, !tbaa !9
  br label %381, !llvm.loop !28

414:                                              ; preds = %385
  br label %415

415:                                              ; preds = %414
  %416 = load i32, ptr %55, align 4, !tbaa !9
  %417 = add nsw i32 %416, 1
  store i32 %417, ptr %55, align 4, !tbaa !9
  br label %375, !llvm.loop !29

418:                                              ; preds = %379
  br label %419

419:                                              ; preds = %418, %372
  br label %420

420:                                              ; preds = %419
  %421 = load i32, ptr %34, align 4, !tbaa !9
  %422 = add nsw i32 %421, 4
  store i32 %422, ptr %34, align 4, !tbaa !9
  br label %115, !llvm.loop !30

423:                                              ; preds = %119
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %29) #5
  br label %424

424:                                              ; preds = %423
  %425 = load i32, ptr %27, align 4, !tbaa !9
  %426 = add nsw i32 %425, 1
  store i32 %426, ptr %27, align 4, !tbaa !9
  br label %62, !llvm.loop !31

427:                                              ; preds = %66
  ret i32 0
}

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef, i32 noundef, i32 noundef, i32 noundef) unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5micro3ops9MatrixMapIfEC2EPfNS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef, i32 noundef, i32 noundef, i32 noundef) unnamed_addr #2 align 2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #3

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24), i32 noundef, i32 noundef) #0 align 2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #4

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24), i32 noundef, i32 noundef) #0 align 2

attributes #0 = { mustprogress 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 = { mustprogress 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 #3 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { 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++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"_ZTSN5micro3ops11MatrixMajorE", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"bool", !7, i64 0}
!15 = !{i8 0, i8 2}
!16 = !{}
!17 = !{!18, !18, i64 0}
!18 = !{!"float", !7, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = distinct !{!21, !20}
!22 = distinct !{!22, !20}
!23 = distinct !{!23, !20}
!24 = distinct !{!24, !20}
!25 = distinct !{!25, !20}
!26 = distinct !{!26, !20}
!27 = distinct !{!27, !20}
!28 = distinct !{!28, !20}
!29 = distinct !{!29, !20}
!30 = distinct !{!30, !20}
!31 = distinct !{!31, !20}


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

%"class.micro::ops::MatrixMap" = type { ptr, i32, i32, i32, i32 }
%"class.micro::ops::MatrixMap.0" = type { ptr, i32, i32, i32, i32 }

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_ZN5micro3ops4GemmIfE7ComputeEPKfS4_iiiiNS0_11MatrixMajorES5_S5_bbPf(ptr nocapture noundef nonnull readnone align 1 dereferenceable(1) %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8, i32 noundef %9, i1 noundef zeroext %10, i1 noundef zeroext %11, ptr noundef %12) local_unnamed_addr #0 align 2 {
  %14 = alloca %"class.micro::ops::MatrixMap", align 8
  %15 = alloca %"class.micro::ops::MatrixMap", align 8
  %16 = alloca %"class.micro::ops::MatrixMap.0", align 8
  %17 = icmp sgt i32 %3, 0
  br i1 %17, label %.lr.ph224, label %._crit_edge225

.lr.ph224:                                        ; preds = %13
  %18 = mul i32 %6, %4
  %19 = mul i32 %6, %5
  %20 = mul i32 %5, %4
  %21 = sdiv i32 %4, 4
  %22 = shl nsw i32 %21, 2
  %23 = sdiv i32 %5, 4
  %24 = shl nsw i32 %23, 2
  %25 = icmp sgt i32 %4, 0
  %26 = icmp sge i32 %22, %4
  %27 = icmp slt i32 %5, 1
  %28 = icmp sgt i32 %6, 0
  %29 = icmp slt i32 %24, %5
  %wide.trip.count304 = zext nneg i32 %3 to i64
  br i1 %25, label %.lr.ph220.us.preheader, label %.lr.ph224.split

.lr.ph220.us.preheader:                           ; preds = %.lr.ph224
  %brmerge = or i1 %26, %27
  br label %.lr.ph220.us

.lr.ph220.us:                                     ; preds = %.lr.ph220.us.preheader, %._crit_edge221.us
  %indvars.iv301 = phi i64 [ %indvars.iv.next302, %._crit_edge221.us ], [ 0, %.lr.ph220.us.preheader ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %14) #5
  %30 = trunc nuw nsw i64 %indvars.iv301 to i32
  %31 = select i1 %10, i32 %30, i32 0
  %32 = mul i32 %18, %31
  %33 = sext i32 %32 to i64
  %34 = getelementptr inbounds float, ptr %1, i64 %33
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %14, ptr noundef %34, i32 noundef %7, i32 noundef %4, i32 noundef %6)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %15) #5
  %35 = select i1 %11, i32 %30, i32 0
  %36 = mul i32 %19, %35
  %37 = sext i32 %36 to i64
  %38 = getelementptr inbounds float, ptr %2, i64 %37
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %15, ptr noundef %38, i32 noundef %8, i32 noundef %6, i32 noundef %5)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %16) #5
  %39 = mul i32 %20, %30
  %40 = sext i32 %39 to i64
  %41 = getelementptr inbounds float, ptr %12, i64 %40
  call void @_ZN5micro3ops9MatrixMapIfEC2EPfNS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %16, ptr noundef %41, i32 noundef %9, i32 noundef %4, i32 noundef %5)
  br label %42

42:                                               ; preds = %.lr.ph220.us, %.loopexit158.us
  %.0145217.us = phi i32 [ 0, %.lr.ph220.us ], [ %48, %.loopexit158.us ]
  %43 = icmp slt i32 %.0145217.us, %22
  br i1 %43, label %44, label %.preheader157.us

44:                                               ; preds = %42
  %45 = or disjoint i32 %.0145217.us, 1
  %46 = or disjoint i32 %.0145217.us, 2
  %47 = or disjoint i32 %.0145217.us, 3
  br i1 %27, label %.loopexit158.us, label %.lr.ph216.us

.loopexit158.us:                                  ; preds = %._crit_edge162.split.us167.us, %._crit_edge162.split.us.us.us.us, %.loopexit.us, %.preheader157.us, %44
  %48 = add nuw nsw i32 %.0145217.us, 4
  %49 = icmp slt i32 %48, %4
  br i1 %49, label %42, label %._crit_edge221.us, !llvm.loop !5

50:                                               ; preds = %.lr.ph216.us, %.loopexit.us
  %.0146214.us = phi i32 [ 0, %.lr.ph216.us ], [ %56, %.loopexit.us ]
  %51 = icmp slt i32 %.0146214.us, %24
  br i1 %51, label %52, label %.preheader155.us

52:                                               ; preds = %50
  %53 = or disjoint i32 %.0146214.us, 1
  %54 = or disjoint i32 %.0146214.us, 2
  %55 = or disjoint i32 %.0146214.us, 3
  br i1 %28, label %.lr.ph.us, label %.preheader154.us

.loopexit.us:                                     ; preds = %.preheader.us175.us.3, %._crit_edge.us.us.us179.us.3, %.preheader155.us, %.preheader154.us
  %56 = add nuw nsw i32 %.0146214.us, 4
  %57 = icmp slt i32 %56, %5
  br i1 %57, label %50, label %.loopexit158.us, !llvm.loop !7

.lr.ph.us:                                        ; preds = %52, %.lr.ph.us
  %.0147181.us = phi i32 [ %86, %.lr.ph.us ], [ 0, %52 ]
  %58 = phi <16 x float> [ %85, %.lr.ph.us ], [ zeroinitializer, %52 ]
  %59 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %.0145217.us, i32 noundef %.0147181.us)
  %60 = load float, ptr %59, align 4, !tbaa !8
  %61 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %45, i32 noundef %.0147181.us)
  %62 = load float, ptr %61, align 4, !tbaa !8
  %63 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %46, i32 noundef %.0147181.us)
  %64 = load float, ptr %63, align 4, !tbaa !8
  %65 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %47, i32 noundef %.0147181.us)
  %66 = load float, ptr %65, align 4, !tbaa !8
  %67 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0147181.us, i32 noundef %.0146214.us)
  %68 = load float, ptr %67, align 4, !tbaa !8
  %69 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0147181.us, i32 noundef %53)
  %70 = load float, ptr %69, align 4, !tbaa !8
  %71 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0147181.us, i32 noundef %54)
  %72 = load float, ptr %71, align 4, !tbaa !8
  %73 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0147181.us, i32 noundef %55)
  %74 = load float, ptr %73, align 4, !tbaa !8
  %75 = insertelement <16 x float> poison, float %62, i64 0
  %76 = insertelement <16 x float> %75, float %64, i64 1
  %77 = insertelement <16 x float> %76, float %66, i64 2
  %78 = insertelement <16 x float> %77, float %60, i64 3
  %79 = shufflevector <16 x float> %78, <16 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
  %80 = insertelement <16 x float> poison, float %68, i64 0
  %81 = insertelement <16 x float> %80, float %70, i64 1
  %82 = insertelement <16 x float> %81, float %72, i64 2
  %83 = insertelement <16 x float> %82, float %74, i64 3
  %84 = shufflevector <16 x float> %83, <16 x float> poison, <16 x i32> <i32 0, i32 0, i32 0, i32 3, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2, i32 1, i32 3, i32 3, i32 3, i32 0>
  %85 = call <16 x float> @llvm.fmuladd.v16f32(<16 x float> %79, <16 x float> %84, <16 x float> %58)
  %86 = add nuw nsw i32 %.0147181.us, 1
  %exitcond292.not = icmp eq i32 %86, %6
  br i1 %exitcond292.not, label %.preheader154.us, label %.lr.ph.us, !llvm.loop !12

.preheader154.us:                                 ; preds = %.lr.ph.us, %52
  %87 = phi <16 x float> [ zeroinitializer, %52 ], [ %85, %.lr.ph.us ]
  %88 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0145217.us, i32 noundef %.0146214.us)
  %89 = extractelement <16 x float> %87, i64 15
  store float %89, ptr %88, align 4, !tbaa !8
  %90 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0145217.us, i32 noundef %53)
  %91 = extractelement <16 x float> %87, i64 11
  store float %91, ptr %90, align 4, !tbaa !8
  %92 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0145217.us, i32 noundef %54)
  %93 = extractelement <16 x float> %87, i64 7
  store float %93, ptr %92, align 4, !tbaa !8
  %94 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0145217.us, i32 noundef %55)
  %95 = extractelement <16 x float> %87, i64 3
  store float %95, ptr %94, align 4, !tbaa !8
  %96 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %45, i32 noundef %.0146214.us)
  %97 = extractelement <16 x float> %87, i64 0
  store float %97, ptr %96, align 4, !tbaa !8
  %98 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %45, i32 noundef %53)
  %99 = extractelement <16 x float> %87, i64 4
  store float %99, ptr %98, align 4, !tbaa !8
  %100 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %45, i32 noundef %54)
  %101 = extractelement <16 x float> %87, i64 8
  store float %101, ptr %100, align 4, !tbaa !8
  %102 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %45, i32 noundef %55)
  %103 = extractelement <16 x float> %87, i64 12
  store float %103, ptr %102, align 4, !tbaa !8
  %104 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %46, i32 noundef %.0146214.us)
  %105 = extractelement <16 x float> %87, i64 1
  store float %105, ptr %104, align 4, !tbaa !8
  %106 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %46, i32 noundef %53)
  %107 = extractelement <16 x float> %87, i64 5
  store float %107, ptr %106, align 4, !tbaa !8
  %108 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %46, i32 noundef %54)
  %109 = extractelement <16 x float> %87, i64 9
  store float %109, ptr %108, align 4, !tbaa !8
  %110 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %46, i32 noundef %55)
  %111 = extractelement <16 x float> %87, i64 13
  store float %111, ptr %110, align 4, !tbaa !8
  %112 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %47, i32 noundef %.0146214.us)
  %113 = extractelement <16 x float> %87, i64 2
  store float %113, ptr %112, align 4, !tbaa !8
  %114 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %47, i32 noundef %53)
  %115 = extractelement <16 x float> %87, i64 6
  store float %115, ptr %114, align 4, !tbaa !8
  %116 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %47, i32 noundef %54)
  %117 = extractelement <16 x float> %87, i64 10
  store float %117, ptr %116, align 4, !tbaa !8
  %118 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %47, i32 noundef %55)
  %119 = extractelement <16 x float> %87, i64 14
  store float %119, ptr %118, align 4, !tbaa !8
  br label %.loopexit.us

.preheader155.us:                                 ; preds = %50
  br i1 %29, label %.preheader155.split.us.us, label %.loopexit.us

.preheader157.us:                                 ; preds = %42
  br i1 %brmerge, label %.loopexit158.us, label %.preheader156.lr.ph.split.us.us

.preheader156.lr.ph.split.us.us:                  ; preds = %.preheader157.us
  br i1 %28, label %.preheader156.us.us.us, label %.preheader156.us.us233

.preheader156.us.us233:                           ; preds = %.preheader156.lr.ph.split.us.us, %._crit_edge162.split.us167.us
  %.0137163.us.us234 = phi i32 [ %122, %._crit_edge162.split.us167.us ], [ %22, %.preheader156.lr.ph.split.us.us ]
  br label %.preheader153.us165.us

.preheader153.us165.us:                           ; preds = %.preheader153.us165.us, %.preheader156.us.us233
  %.0136161.us166.us = phi i32 [ 0, %.preheader156.us.us233 ], [ %121, %.preheader153.us165.us ]
  %120 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0137163.us.us234, i32 noundef %.0136161.us166.us)
  store float 0.000000e+00, ptr %120, align 4, !tbaa !8
  %121 = add nuw nsw i32 %.0136161.us166.us, 1
  %exitcond280.not = icmp eq i32 %121, %5
  br i1 %exitcond280.not, label %._crit_edge162.split.us167.us, label %.preheader153.us165.us, !llvm.loop !13

._crit_edge162.split.us167.us:                    ; preds = %.preheader153.us165.us
  %122 = add i32 %.0137163.us.us234, 1
  %exitcond281.not = icmp eq i32 %122, %4
  br i1 %exitcond281.not, label %.loopexit158.us, label %.preheader156.us.us233, !llvm.loop !14

.preheader156.us.us.us:                           ; preds = %.preheader156.lr.ph.split.us.us, %._crit_edge162.split.us.us.us.us
  %.0137163.us.us.us = phi i32 [ %132, %._crit_edge162.split.us.us.us.us ], [ %22, %.preheader156.lr.ph.split.us.us ]
  br label %.preheader153.us.us.us.us

.preheader153.us.us.us.us:                        ; preds = %._crit_edge.us.us.us.us, %.preheader156.us.us.us
  %.0136161.us.us.us.us = phi i32 [ 0, %.preheader156.us.us.us ], [ %131, %._crit_edge.us.us.us.us ]
  br label %123

123:                                              ; preds = %123, %.preheader153.us.us.us.us
  %.0160.us.us.us.us = phi i32 [ 0, %.preheader153.us.us.us.us ], [ %129, %123 ]
  %.0135159.us.us.us.us = phi float [ 0.000000e+00, %.preheader153.us.us.us.us ], [ %128, %123 ]
  %124 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %.0137163.us.us.us, i32 noundef %.0160.us.us.us.us)
  %125 = load float, ptr %124, align 4, !tbaa !8
  %126 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0160.us.us.us.us, i32 noundef %.0136161.us.us.us.us)
  %127 = load float, ptr %126, align 4, !tbaa !8
  %128 = call float @llvm.fmuladd.f32(float %125, float %127, float %.0135159.us.us.us.us)
  %129 = add nuw nsw i32 %.0160.us.us.us.us, 1
  %exitcond282.not = icmp eq i32 %129, %6
  br i1 %exitcond282.not, label %._crit_edge.us.us.us.us, label %123, !llvm.loop !15

._crit_edge.us.us.us.us:                          ; preds = %123
  %130 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0137163.us.us.us, i32 noundef %.0136161.us.us.us.us)
  store float %128, ptr %130, align 4, !tbaa !8
  %131 = add nuw nsw i32 %.0136161.us.us.us.us, 1
  %exitcond283.not = icmp eq i32 %131, %5
  br i1 %exitcond283.not, label %._crit_edge162.split.us.us.us.us, label %.preheader153.us.us.us.us, !llvm.loop !13

._crit_edge162.split.us.us.us.us:                 ; preds = %._crit_edge.us.us.us.us
  %132 = add i32 %.0137163.us.us.us, 1
  %exitcond284.not = icmp eq i32 %132, %4
  br i1 %exitcond284.not, label %.loopexit158.us, label %.preheader156.us.us.us, !llvm.loop !14

.preheader155.split.us.us:                        ; preds = %.preheader155.us
  br i1 %28, label %.preheader.us.us.us.us, label %.preheader.us175.us

.preheader.us175.us:                              ; preds = %.preheader155.split.us.us, %.preheader.us175.us
  %.0140171.us176.us = phi i32 [ %134, %.preheader.us175.us ], [ %24, %.preheader155.split.us.us ]
  %133 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0145217.us, i32 noundef %.0140171.us176.us)
  store float 0.000000e+00, ptr %133, align 4, !tbaa !8
  %134 = add i32 %.0140171.us176.us, 1
  %exitcond285.not = icmp eq i32 %134, %5
  br i1 %exitcond285.not, label %.preheader.us175.us.1, label %.preheader.us175.us, !llvm.loop !16

.preheader.us175.us.1:                            ; preds = %.preheader.us175.us, %.preheader.us175.us.1
  %.0140171.us176.us.1 = phi i32 [ %136, %.preheader.us175.us.1 ], [ %24, %.preheader.us175.us ]
  %135 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %177, i32 noundef %.0140171.us176.us.1)
  store float 0.000000e+00, ptr %135, align 4, !tbaa !8
  %136 = add i32 %.0140171.us176.us.1, 1
  %exitcond285.1.not = icmp eq i32 %136, %5
  br i1 %exitcond285.1.not, label %.preheader.us175.us.2, label %.preheader.us175.us.1, !llvm.loop !16

.preheader.us175.us.2:                            ; preds = %.preheader.us175.us.1, %.preheader.us175.us.2
  %.0140171.us176.us.2 = phi i32 [ %138, %.preheader.us175.us.2 ], [ %24, %.preheader.us175.us.1 ]
  %137 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %178, i32 noundef %.0140171.us176.us.2)
  store float 0.000000e+00, ptr %137, align 4, !tbaa !8
  %138 = add i32 %.0140171.us176.us.2, 1
  %exitcond285.2.not = icmp eq i32 %138, %5
  br i1 %exitcond285.2.not, label %.preheader.us175.us.3, label %.preheader.us175.us.2, !llvm.loop !16

.preheader.us175.us.3:                            ; preds = %.preheader.us175.us.2, %.preheader.us175.us.3
  %.0140171.us176.us.3 = phi i32 [ %140, %.preheader.us175.us.3 ], [ %24, %.preheader.us175.us.2 ]
  %139 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %179, i32 noundef %.0140171.us176.us.3)
  store float 0.000000e+00, ptr %139, align 4, !tbaa !8
  %140 = add i32 %.0140171.us176.us.3, 1
  %exitcond285.3.not = icmp eq i32 %140, %5
  br i1 %exitcond285.3.not, label %.loopexit.us, label %.preheader.us175.us.3, !llvm.loop !16

.preheader.us.us.us.us:                           ; preds = %.preheader155.split.us.us, %._crit_edge.us.us.us179.us
  %.0140171.us.us.us.us = phi i32 [ %149, %._crit_edge.us.us.us179.us ], [ %24, %.preheader155.split.us.us ]
  br label %141

141:                                              ; preds = %141, %.preheader.us.us.us.us
  %.0138170.us.us.us.us = phi i32 [ 0, %.preheader.us.us.us.us ], [ %147, %141 ]
  %.0139169.us.us.us.us = phi float [ 0.000000e+00, %.preheader.us.us.us.us ], [ %146, %141 ]
  %142 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %.0145217.us, i32 noundef %.0138170.us.us.us.us)
  %143 = load float, ptr %142, align 4, !tbaa !8
  %144 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0138170.us.us.us.us, i32 noundef %.0140171.us.us.us.us)
  %145 = load float, ptr %144, align 4, !tbaa !8
  %146 = call float @llvm.fmuladd.f32(float %143, float %145, float %.0139169.us.us.us.us)
  %147 = add nuw nsw i32 %.0138170.us.us.us.us, 1
  %exitcond289.not = icmp eq i32 %147, %6
  br i1 %exitcond289.not, label %._crit_edge.us.us.us179.us, label %141, !llvm.loop !17

._crit_edge.us.us.us179.us:                       ; preds = %141
  %148 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %.0145217.us, i32 noundef %.0140171.us.us.us.us)
  store float %146, ptr %148, align 4, !tbaa !8
  %149 = add i32 %.0140171.us.us.us.us, 1
  %exitcond290.not = icmp eq i32 %149, %5
  br i1 %exitcond290.not, label %.preheader.us.us.us.us.1, label %.preheader.us.us.us.us, !llvm.loop !16

.preheader.us.us.us.us.1:                         ; preds = %._crit_edge.us.us.us179.us, %._crit_edge.us.us.us179.us.1
  %.0140171.us.us.us.us.1 = phi i32 [ %158, %._crit_edge.us.us.us179.us.1 ], [ %24, %._crit_edge.us.us.us179.us ]
  br label %150

150:                                              ; preds = %150, %.preheader.us.us.us.us.1
  %.0138170.us.us.us.us.1 = phi i32 [ 0, %.preheader.us.us.us.us.1 ], [ %156, %150 ]
  %.0139169.us.us.us.us.1 = phi float [ 0.000000e+00, %.preheader.us.us.us.us.1 ], [ %155, %150 ]
  %151 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %180, i32 noundef %.0138170.us.us.us.us.1)
  %152 = load float, ptr %151, align 4, !tbaa !8
  %153 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0138170.us.us.us.us.1, i32 noundef %.0140171.us.us.us.us.1)
  %154 = load float, ptr %153, align 4, !tbaa !8
  %155 = call float @llvm.fmuladd.f32(float %152, float %154, float %.0139169.us.us.us.us.1)
  %156 = add nuw nsw i32 %.0138170.us.us.us.us.1, 1
  %exitcond289.1.not = icmp eq i32 %156, %6
  br i1 %exitcond289.1.not, label %._crit_edge.us.us.us179.us.1, label %150, !llvm.loop !17

._crit_edge.us.us.us179.us.1:                     ; preds = %150
  %157 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %180, i32 noundef %.0140171.us.us.us.us.1)
  store float %155, ptr %157, align 4, !tbaa !8
  %158 = add i32 %.0140171.us.us.us.us.1, 1
  %exitcond290.1.not = icmp eq i32 %158, %5
  br i1 %exitcond290.1.not, label %.preheader.us.us.us.us.2, label %.preheader.us.us.us.us.1, !llvm.loop !16

.preheader.us.us.us.us.2:                         ; preds = %._crit_edge.us.us.us179.us.1, %._crit_edge.us.us.us179.us.2
  %.0140171.us.us.us.us.2 = phi i32 [ %167, %._crit_edge.us.us.us179.us.2 ], [ %24, %._crit_edge.us.us.us179.us.1 ]
  br label %159

159:                                              ; preds = %159, %.preheader.us.us.us.us.2
  %.0138170.us.us.us.us.2 = phi i32 [ 0, %.preheader.us.us.us.us.2 ], [ %165, %159 ]
  %.0139169.us.us.us.us.2 = phi float [ 0.000000e+00, %.preheader.us.us.us.us.2 ], [ %164, %159 ]
  %160 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %181, i32 noundef %.0138170.us.us.us.us.2)
  %161 = load float, ptr %160, align 4, !tbaa !8
  %162 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0138170.us.us.us.us.2, i32 noundef %.0140171.us.us.us.us.2)
  %163 = load float, ptr %162, align 4, !tbaa !8
  %164 = call float @llvm.fmuladd.f32(float %161, float %163, float %.0139169.us.us.us.us.2)
  %165 = add nuw nsw i32 %.0138170.us.us.us.us.2, 1
  %exitcond289.2.not = icmp eq i32 %165, %6
  br i1 %exitcond289.2.not, label %._crit_edge.us.us.us179.us.2, label %159, !llvm.loop !17

._crit_edge.us.us.us179.us.2:                     ; preds = %159
  %166 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %181, i32 noundef %.0140171.us.us.us.us.2)
  store float %164, ptr %166, align 4, !tbaa !8
  %167 = add i32 %.0140171.us.us.us.us.2, 1
  %exitcond290.2.not = icmp eq i32 %167, %5
  br i1 %exitcond290.2.not, label %.preheader.us.us.us.us.3, label %.preheader.us.us.us.us.2, !llvm.loop !16

.preheader.us.us.us.us.3:                         ; preds = %._crit_edge.us.us.us179.us.2, %._crit_edge.us.us.us179.us.3
  %.0140171.us.us.us.us.3 = phi i32 [ %176, %._crit_edge.us.us.us179.us.3 ], [ %24, %._crit_edge.us.us.us179.us.2 ]
  br label %168

168:                                              ; preds = %168, %.preheader.us.us.us.us.3
  %.0138170.us.us.us.us.3 = phi i32 [ 0, %.preheader.us.us.us.us.3 ], [ %174, %168 ]
  %.0139169.us.us.us.us.3 = phi float [ 0.000000e+00, %.preheader.us.us.us.us.3 ], [ %173, %168 ]
  %169 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %14, i32 noundef %182, i32 noundef %.0138170.us.us.us.us.3)
  %170 = load float, ptr %169, align 4, !tbaa !8
  %171 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24) %15, i32 noundef %.0138170.us.us.us.us.3, i32 noundef %.0140171.us.us.us.us.3)
  %172 = load float, ptr %171, align 4, !tbaa !8
  %173 = call float @llvm.fmuladd.f32(float %170, float %172, float %.0139169.us.us.us.us.3)
  %174 = add nuw nsw i32 %.0138170.us.us.us.us.3, 1
  %exitcond289.3.not = icmp eq i32 %174, %6
  br i1 %exitcond289.3.not, label %._crit_edge.us.us.us179.us.3, label %168, !llvm.loop !17

._crit_edge.us.us.us179.us.3:                     ; preds = %168
  %175 = call noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24) %16, i32 noundef %182, i32 noundef %.0140171.us.us.us.us.3)
  store float %173, ptr %175, align 4, !tbaa !8
  %176 = add i32 %.0140171.us.us.us.us.3, 1
  %exitcond290.3.not = icmp eq i32 %176, %5
  br i1 %exitcond290.3.not, label %.loopexit.us, label %.preheader.us.us.us.us.3, !llvm.loop !16

.lr.ph216.us:                                     ; preds = %44
  %177 = or disjoint i32 %.0145217.us, 1
  %178 = or disjoint i32 %.0145217.us, 2
  %179 = or disjoint i32 %.0145217.us, 3
  %180 = or disjoint i32 %.0145217.us, 1
  %181 = or disjoint i32 %.0145217.us, 2
  %182 = or disjoint i32 %.0145217.us, 3
  br label %50

._crit_edge221.us:                                ; preds = %.loopexit158.us
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %16) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %15) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %14) #5
  %indvars.iv.next302 = add nuw nsw i64 %indvars.iv301, 1
  %exitcond305.not = icmp eq i64 %indvars.iv.next302, %wide.trip.count304
  br i1 %exitcond305.not, label %._crit_edge225, label %.lr.ph220.us, !llvm.loop !18

.lr.ph224.split:                                  ; preds = %.lr.ph224
  br i1 %10, label %.lr.ph224.split.split.us, label %.lr.ph224.split.split

.lr.ph224.split.split.us:                         ; preds = %.lr.ph224.split, %.lr.ph224.split.split.us
  %indvars.iv275 = phi i64 [ %indvars.iv.next276, %.lr.ph224.split.split.us ], [ 0, %.lr.ph224.split ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %14) #5
  %183 = trunc nuw nsw i64 %indvars.iv275 to i32
  %184 = mul i32 %18, %183
  %185 = sext i32 %184 to i64
  %186 = getelementptr inbounds float, ptr %1, i64 %185
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %14, ptr noundef %186, i32 noundef %7, i32 noundef %4, i32 noundef %6)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %15) #5
  %187 = select i1 %11, i32 %183, i32 0
  %188 = mul i32 %19, %187
  %189 = sext i32 %188 to i64
  %190 = getelementptr inbounds float, ptr %2, i64 %189
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %15, ptr noundef %190, i32 noundef %8, i32 noundef %6, i32 noundef %5)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %16) #5
  %191 = mul i32 %20, %183
  %192 = sext i32 %191 to i64
  %193 = getelementptr inbounds float, ptr %12, i64 %192
  call void @_ZN5micro3ops9MatrixMapIfEC2EPfNS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %16, ptr noundef %193, i32 noundef %9, i32 noundef %4, i32 noundef %5)
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %16) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %15) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %14) #5
  %indvars.iv.next276 = add nuw nsw i64 %indvars.iv275, 1
  %exitcond279.not = icmp eq i64 %indvars.iv.next276, %wide.trip.count304
  br i1 %exitcond279.not, label %._crit_edge225, label %.lr.ph224.split.split.us, !llvm.loop !18

.lr.ph224.split.split:                            ; preds = %.lr.ph224.split
  br i1 %11, label %.lr.ph224.split.split.split.us, label %.lr.ph224.split.split.split

.lr.ph224.split.split.split.us:                   ; preds = %.lr.ph224.split.split, %.lr.ph224.split.split.split.us
  %indvars.iv270 = phi i64 [ %indvars.iv.next271, %.lr.ph224.split.split.split.us ], [ 0, %.lr.ph224.split.split ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %14) #5
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %14, ptr noundef %1, i32 noundef %7, i32 noundef %4, i32 noundef %6)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %15) #5
  %194 = trunc nuw nsw i64 %indvars.iv270 to i32
  %195 = mul i32 %19, %194
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds float, ptr %2, i64 %196
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %15, ptr noundef %197, i32 noundef %8, i32 noundef %6, i32 noundef %5)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %16) #5
  %198 = mul i32 %20, %194
  %199 = sext i32 %198 to i64
  %200 = getelementptr inbounds float, ptr %12, i64 %199
  call void @_ZN5micro3ops9MatrixMapIfEC2EPfNS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %16, ptr noundef %200, i32 noundef %9, i32 noundef %4, i32 noundef %5)
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %16) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %15) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %14) #5
  %indvars.iv.next271 = add nuw nsw i64 %indvars.iv270, 1
  %exitcond274.not = icmp eq i64 %indvars.iv.next271, %wide.trip.count304
  br i1 %exitcond274.not, label %._crit_edge225, label %.lr.ph224.split.split.split.us, !llvm.loop !18

._crit_edge225:                                   ; preds = %.lr.ph224.split.split.split, %.lr.ph224.split.split.split.us, %.lr.ph224.split.split.us, %._crit_edge221.us, %13
  ret i32 0

.lr.ph224.split.split.split:                      ; preds = %.lr.ph224.split.split, %.lr.ph224.split.split.split
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph224.split.split.split ], [ 0, %.lr.ph224.split.split ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %14) #5
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %14, ptr noundef %1, i32 noundef %7, i32 noundef %4, i32 noundef %6)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %15) #5
  call void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %15, ptr noundef %2, i32 noundef %8, i32 noundef %6, i32 noundef %5)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %16) #5
  %201 = trunc nuw nsw i64 %indvars.iv to i32
  %202 = mul i32 %20, %201
  %203 = sext i32 %202 to i64
  %204 = getelementptr inbounds float, ptr %12, i64 %203
  call void @_ZN5micro3ops9MatrixMapIfEC2EPfNS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24) %16, ptr noundef %204, i32 noundef %9, i32 noundef %4, i32 noundef %5)
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %16) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %15) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %14) #5
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count304
  br i1 %exitcond.not, label %._crit_edge225, label %.lr.ph224.split.split.split, !llvm.loop !18
}

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5micro3ops9MatrixMapIKfEC2EPS2_NS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef, i32 noundef, i32 noundef, i32 noundef) unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5micro3ops9MatrixMapIfEC2EPfNS0_11MatrixMajorEii(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef, i32 noundef, i32 noundef, i32 noundef) unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNK5micro3ops9MatrixMapIKfEclEii(ptr noundef nonnull align 8 dereferenceable(24), i32 noundef, i32 noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #3

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZNK5micro3ops9MatrixMapIfE4dataEii(ptr noundef nonnull align 8 dereferenceable(24), i32 noundef, i32 noundef) local_unnamed_addr #0 align 2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <16 x float> @llvm.fmuladd.v16f32(<16 x float>, <16 x float>, <16 x float>) #4

attributes #0 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress 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 #3 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { 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 = distinct !{!5, !6}
!6 = !{!"llvm.loop.mustprogress"}
!7 = distinct !{!7, !6}
!8 = !{!9, !9, i64 0}
!9 = !{!"float", !10, i64 0}
!10 = !{!"omnipotent char", !11, i64 0}
!11 = !{!"Simple C++ TBAA"}
!12 = distinct !{!12, !6}
!13 = distinct !{!13, !6}
!14 = distinct !{!14, !6}
!15 = distinct !{!15, !6}
!16 = distinct !{!16, !6}
!17 = distinct !{!17, !6}
!18 = distinct !{!18, !6}


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