; LLVM IR from HandmadeMath/HandmadeMath :: test/hmm_test.ll (Z31_hmt_test_MatrixOps_TransposeM4P21hmt_testresult_struct)

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

%union.HMM_Mat4 = type { [4 x %union.HMM_Vec4] }
%union.HMM_Vec4 = type { <4 x float> }
%struct.hmt_testresult_struct = type { i32, i32 }

@.str.15 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [34 x i8], align 1

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL6HMM_M4v(ptr dead_on_unwind noalias writable sret(%union.HMM_Mat4) align 16) #3

; Function Attrs: mustprogress uwtable
define dso_local void @_Z31_hmt_test_MatrixOps_TransposeM4P21hmt_testresult_struct(ptr noundef %0) #4 {
  %2 = alloca ptr, align 8
  %3 = alloca %union.HMM_Mat4, align 16
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca %union.HMM_Mat4, align 16
  %9 = alloca %union.HMM_Mat4, align 16
  %10 = alloca float, align 4
  %11 = alloca float, align 4
  %12 = alloca float, align 4
  %13 = alloca float, align 4
  %14 = alloca float, align 4
  %15 = alloca float, align 4
  %16 = alloca float, align 4
  %17 = alloca float, align 4
  %18 = alloca float, align 4
  %19 = alloca float, align 4
  %20 = alloca float, align 4
  %21 = alloca float, align 4
  %22 = alloca float, align 4
  %23 = alloca float, align 4
  %24 = alloca float, align 4
  %25 = alloca float, align 4
  %26 = alloca float, align 4
  %27 = alloca float, align 4
  %28 = alloca float, align 4
  %29 = alloca float, align 4
  %30 = alloca float, align 4
  %31 = alloca float, align 4
  %32 = alloca float, align 4
  %33 = alloca float, align 4
  %34 = alloca float, align 4
  %35 = alloca float, align 4
  %36 = alloca float, align 4
  %37 = alloca float, align 4
  %38 = alloca float, align 4
  %39 = alloca float, align 4
  %40 = alloca float, align 4
  %41 = alloca float, align 4
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 64, ptr %3) #6
  call void @_ZL6HMM_M4v(ptr dead_on_unwind writable sret(%union.HMM_Mat4) align 16 %3)
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #6
  store i32 1, ptr %4, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #6
  store i32 0, ptr %5, align 4, !tbaa !9
  br label %42

42:                                               ; preds = %66, %1
  %43 = load i32, ptr %5, align 4, !tbaa !9
  %44 = icmp slt i32 %43, 4
  br i1 %44, label %46, label %45

45:                                               ; preds = %42
  store i32 2, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #6
  br label %69

46:                                               ; preds = %42
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #6
  store i32 0, ptr %7, align 4, !tbaa !9
  br label %47

47:                                               ; preds = %62, %46
  %48 = load i32, ptr %7, align 4, !tbaa !9
  %49 = icmp slt i32 %48, 4
  br i1 %49, label %51, label %50

50:                                               ; preds = %47
  store i32 5, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #6
  br label %65

51:                                               ; preds = %47
  %52 = load i32, ptr %4, align 4, !tbaa !9
  %53 = sitofp i32 %52 to float
  %54 = load i32, ptr %5, align 4, !tbaa !9
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds [4 x [4 x float]], ptr %3, i64 0, i64 %55
  %57 = load i32, ptr %7, align 4, !tbaa !9
  %58 = sext i32 %57 to i64
  %59 = getelementptr inbounds [4 x float], ptr %56, i64 0, i64 %58
  store float %53, ptr %59, align 4, !tbaa !11
  %60 = load i32, ptr %4, align 4, !tbaa !9
  %61 = add nsw i32 %60, 1
  store i32 %61, ptr %4, align 4, !tbaa !9
  br label %62

62:                                               ; preds = %51
  %63 = load i32, ptr %7, align 4, !tbaa !9
  %64 = add nsw i32 %63, 1
  store i32 %64, ptr %7, align 4, !tbaa !9
  br label %47, !llvm.loop !12

65:                                               ; preds = %50
  br label %66

66:                                               ; preds = %65
  %67 = load i32, ptr %5, align 4, !tbaa !9
  %68 = add nsw i32 %67, 1
  store i32 %68, ptr %5, align 4, !tbaa !9
  br label %42, !llvm.loop !14

69:                                               ; preds = %45
  call void @llvm.lifetime.start.p0(i64 64, ptr %8) #6
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %9, ptr align 16 %3, i64 64, i1 false), !tbaa.struct !15
  call void @_ZL15HMM_TransposeM48HMM_Mat4(ptr dead_on_unwind writable sret(%union.HMM_Mat4) align 16 %8, ptr noundef byval(%union.HMM_Mat4) align 16 %9)
  %70 = load ptr, ptr %2, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %70, i32 0, i32 0
  %72 = load i32, ptr %71, align 4, !tbaa !16
  %73 = add nsw i32 %72, 1
  store i32 %73, ptr %71, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #6
  %74 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 0
  %75 = getelementptr inbounds [4 x float], ptr %74, i64 0, i64 0
  %76 = load float, ptr %75, align 16, !tbaa !11
  store float %76, ptr %10, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #6
  %77 = load float, ptr %10, align 4, !tbaa !18
  %78 = fsub float %77, 1.000000e+00
  store float %78, ptr %11, align 4, !tbaa !18
  %79 = load float, ptr %11, align 4, !tbaa !18
  %80 = fcmp olt float %79, 0xBE80000000000000
  br i1 %80, label %84, label %81

81:                                               ; preds = %69
  %82 = load float, ptr %11, align 4, !tbaa !18
  %83 = fcmp olt float 0x3E80000000000000, %82
  br i1 %83, label %84, label %95

84:                                               ; preds = %81, %69
  %85 = load ptr, ptr %2, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %85, i32 0, i32 1
  %87 = load i32, ptr %86, align 4, !tbaa !20
  %88 = add nsw i32 %87, 1
  store i32 %88, ptr %86, align 4, !tbaa !20
  %89 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 266)
  %90 = load float, ptr %10, align 4, !tbaa !18
  %91 = fpext float %90 to double
  %92 = load float, ptr %11, align 4, !tbaa !18
  %93 = fpext float %92 to double
  %94 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.000000e+00, double noundef %91, double noundef %93)
  br label %95

95:                                               ; preds = %84, %81
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #6
  %96 = load ptr, ptr %2, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %96, i32 0, i32 0
  %98 = load i32, ptr %97, align 4, !tbaa !16
  %99 = add nsw i32 %98, 1
  store i32 %99, ptr %97, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #6
  %100 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 0
  %101 = getelementptr inbounds [4 x float], ptr %100, i64 0, i64 1
  %102 = load float, ptr %101, align 4, !tbaa !11
  store float %102, ptr %12, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #6
  %103 = load float, ptr %12, align 4, !tbaa !18
  %104 = fsub float %103, 5.000000e+00
  store float %104, ptr %13, align 4, !tbaa !18
  %105 = load float, ptr %13, align 4, !tbaa !18
  %106 = fcmp olt float %105, 0xBE80000000000000
  br i1 %106, label %110, label %107

107:                                              ; preds = %95
  %108 = load float, ptr %13, align 4, !tbaa !18
  %109 = fcmp olt float 0x3E80000000000000, %108
  br i1 %109, label %110, label %121

110:                                              ; preds = %107, %95
  %111 = load ptr, ptr %2, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %111, i32 0, i32 1
  %113 = load i32, ptr %112, align 4, !tbaa !20
  %114 = add nsw i32 %113, 1
  store i32 %114, ptr %112, align 4, !tbaa !20
  %115 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 267)
  %116 = load float, ptr %12, align 4, !tbaa !18
  %117 = fpext float %116 to double
  %118 = load float, ptr %13, align 4, !tbaa !18
  %119 = fpext float %118 to double
  %120 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 5.000000e+00, double noundef %117, double noundef %119)
  br label %121

121:                                              ; preds = %110, %107
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #6
  %122 = load ptr, ptr %2, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %122, i32 0, i32 0
  %124 = load i32, ptr %123, align 4, !tbaa !16
  %125 = add nsw i32 %124, 1
  store i32 %125, ptr %123, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #6
  %126 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 0
  %127 = getelementptr inbounds [4 x float], ptr %126, i64 0, i64 2
  %128 = load float, ptr %127, align 8, !tbaa !11
  store float %128, ptr %14, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #6
  %129 = load float, ptr %14, align 4, !tbaa !18
  %130 = fsub float %129, 9.000000e+00
  store float %130, ptr %15, align 4, !tbaa !18
  %131 = load float, ptr %15, align 4, !tbaa !18
  %132 = fcmp olt float %131, 0xBE80000000000000
  br i1 %132, label %136, label %133

133:                                              ; preds = %121
  %134 = load float, ptr %15, align 4, !tbaa !18
  %135 = fcmp olt float 0x3E80000000000000, %134
  br i1 %135, label %136, label %147

136:                                              ; preds = %133, %121
  %137 = load ptr, ptr %2, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %137, i32 0, i32 1
  %139 = load i32, ptr %138, align 4, !tbaa !20
  %140 = add nsw i32 %139, 1
  store i32 %140, ptr %138, align 4, !tbaa !20
  %141 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 268)
  %142 = load float, ptr %14, align 4, !tbaa !18
  %143 = fpext float %142 to double
  %144 = load float, ptr %15, align 4, !tbaa !18
  %145 = fpext float %144 to double
  %146 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 9.000000e+00, double noundef %143, double noundef %145)
  br label %147

147:                                              ; preds = %136, %133
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #6
  %148 = load ptr, ptr %2, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %148, i32 0, i32 0
  %150 = load i32, ptr %149, align 4, !tbaa !16
  %151 = add nsw i32 %150, 1
  store i32 %151, ptr %149, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #6
  %152 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 0
  %153 = getelementptr inbounds [4 x float], ptr %152, i64 0, i64 3
  %154 = load float, ptr %153, align 4, !tbaa !11
  store float %154, ptr %16, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #6
  %155 = load float, ptr %16, align 4, !tbaa !18
  %156 = fsub float %155, 1.300000e+01
  store float %156, ptr %17, align 4, !tbaa !18
  %157 = load float, ptr %17, align 4, !tbaa !18
  %158 = fcmp olt float %157, 0xBE80000000000000
  br i1 %158, label %162, label %159

159:                                              ; preds = %147
  %160 = load float, ptr %17, align 4, !tbaa !18
  %161 = fcmp olt float 0x3E80000000000000, %160
  br i1 %161, label %162, label %173

162:                                              ; preds = %159, %147
  %163 = load ptr, ptr %2, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %163, i32 0, i32 1
  %165 = load i32, ptr %164, align 4, !tbaa !20
  %166 = add nsw i32 %165, 1
  store i32 %166, ptr %164, align 4, !tbaa !20
  %167 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 269)
  %168 = load float, ptr %16, align 4, !tbaa !18
  %169 = fpext float %168 to double
  %170 = load float, ptr %17, align 4, !tbaa !18
  %171 = fpext float %170 to double
  %172 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.300000e+01, double noundef %169, double noundef %171)
  br label %173

173:                                              ; preds = %162, %159
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #6
  %174 = load ptr, ptr %2, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %174, i32 0, i32 0
  %176 = load i32, ptr %175, align 4, !tbaa !16
  %177 = add nsw i32 %176, 1
  store i32 %177, ptr %175, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #6
  %178 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 1
  %179 = getelementptr inbounds [4 x float], ptr %178, i64 0, i64 0
  %180 = load float, ptr %179, align 16, !tbaa !11
  store float %180, ptr %18, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #6
  %181 = load float, ptr %18, align 4, !tbaa !18
  %182 = fsub float %181, 2.000000e+00
  store float %182, ptr %19, align 4, !tbaa !18
  %183 = load float, ptr %19, align 4, !tbaa !18
  %184 = fcmp olt float %183, 0xBE80000000000000
  br i1 %184, label %188, label %185

185:                                              ; preds = %173
  %186 = load float, ptr %19, align 4, !tbaa !18
  %187 = fcmp olt float 0x3E80000000000000, %186
  br i1 %187, label %188, label %199

188:                                              ; preds = %185, %173
  %189 = load ptr, ptr %2, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %189, i32 0, i32 1
  %191 = load i32, ptr %190, align 4, !tbaa !20
  %192 = add nsw i32 %191, 1
  store i32 %192, ptr %190, align 4, !tbaa !20
  %193 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 270)
  %194 = load float, ptr %18, align 4, !tbaa !18
  %195 = fpext float %194 to double
  %196 = load float, ptr %19, align 4, !tbaa !18
  %197 = fpext float %196 to double
  %198 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 2.000000e+00, double noundef %195, double noundef %197)
  br label %199

199:                                              ; preds = %188, %185
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #6
  %200 = load ptr, ptr %2, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %200, i32 0, i32 0
  %202 = load i32, ptr %201, align 4, !tbaa !16
  %203 = add nsw i32 %202, 1
  store i32 %203, ptr %201, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #6
  %204 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 1
  %205 = getelementptr inbounds [4 x float], ptr %204, i64 0, i64 1
  %206 = load float, ptr %205, align 4, !tbaa !11
  store float %206, ptr %20, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #6
  %207 = load float, ptr %20, align 4, !tbaa !18
  %208 = fsub float %207, 6.000000e+00
  store float %208, ptr %21, align 4, !tbaa !18
  %209 = load float, ptr %21, align 4, !tbaa !18
  %210 = fcmp olt float %209, 0xBE80000000000000
  br i1 %210, label %214, label %211

211:                                              ; preds = %199
  %212 = load float, ptr %21, align 4, !tbaa !18
  %213 = fcmp olt float 0x3E80000000000000, %212
  br i1 %213, label %214, label %225

214:                                              ; preds = %211, %199
  %215 = load ptr, ptr %2, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %215, i32 0, i32 1
  %217 = load i32, ptr %216, align 4, !tbaa !20
  %218 = add nsw i32 %217, 1
  store i32 %218, ptr %216, align 4, !tbaa !20
  %219 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 271)
  %220 = load float, ptr %20, align 4, !tbaa !18
  %221 = fpext float %220 to double
  %222 = load float, ptr %21, align 4, !tbaa !18
  %223 = fpext float %222 to double
  %224 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 6.000000e+00, double noundef %221, double noundef %223)
  br label %225

225:                                              ; preds = %214, %211
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #6
  %226 = load ptr, ptr %2, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %226, i32 0, i32 0
  %228 = load i32, ptr %227, align 4, !tbaa !16
  %229 = add nsw i32 %228, 1
  store i32 %229, ptr %227, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #6
  %230 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 1
  %231 = getelementptr inbounds [4 x float], ptr %230, i64 0, i64 2
  %232 = load float, ptr %231, align 8, !tbaa !11
  store float %232, ptr %22, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #6
  %233 = load float, ptr %22, align 4, !tbaa !18
  %234 = fsub float %233, 1.000000e+01
  store float %234, ptr %23, align 4, !tbaa !18
  %235 = load float, ptr %23, align 4, !tbaa !18
  %236 = fcmp olt float %235, 0xBE80000000000000
  br i1 %236, label %240, label %237

237:                                              ; preds = %225
  %238 = load float, ptr %23, align 4, !tbaa !18
  %239 = fcmp olt float 0x3E80000000000000, %238
  br i1 %239, label %240, label %251

240:                                              ; preds = %237, %225
  %241 = load ptr, ptr %2, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %241, i32 0, i32 1
  %243 = load i32, ptr %242, align 4, !tbaa !20
  %244 = add nsw i32 %243, 1
  store i32 %244, ptr %242, align 4, !tbaa !20
  %245 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 272)
  %246 = load float, ptr %22, align 4, !tbaa !18
  %247 = fpext float %246 to double
  %248 = load float, ptr %23, align 4, !tbaa !18
  %249 = fpext float %248 to double
  %250 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.000000e+01, double noundef %247, double noundef %249)
  br label %251

251:                                              ; preds = %240, %237
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #6
  %252 = load ptr, ptr %2, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %252, i32 0, i32 0
  %254 = load i32, ptr %253, align 4, !tbaa !16
  %255 = add nsw i32 %254, 1
  store i32 %255, ptr %253, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #6
  %256 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 1
  %257 = getelementptr inbounds [4 x float], ptr %256, i64 0, i64 3
  %258 = load float, ptr %257, align 4, !tbaa !11
  store float %258, ptr %24, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  %259 = load float, ptr %24, align 4, !tbaa !18
  %260 = fsub float %259, 1.400000e+01
  store float %260, ptr %25, align 4, !tbaa !18
  %261 = load float, ptr %25, align 4, !tbaa !18
  %262 = fcmp olt float %261, 0xBE80000000000000
  br i1 %262, label %266, label %263

263:                                              ; preds = %251
  %264 = load float, ptr %25, align 4, !tbaa !18
  %265 = fcmp olt float 0x3E80000000000000, %264
  br i1 %265, label %266, label %277

266:                                              ; preds = %263, %251
  %267 = load ptr, ptr %2, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %267, i32 0, i32 1
  %269 = load i32, ptr %268, align 4, !tbaa !20
  %270 = add nsw i32 %269, 1
  store i32 %270, ptr %268, align 4, !tbaa !20
  %271 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 273)
  %272 = load float, ptr %24, align 4, !tbaa !18
  %273 = fpext float %272 to double
  %274 = load float, ptr %25, align 4, !tbaa !18
  %275 = fpext float %274 to double
  %276 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.400000e+01, double noundef %273, double noundef %275)
  br label %277

277:                                              ; preds = %266, %263
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #6
  %278 = load ptr, ptr %2, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %278, i32 0, i32 0
  %280 = load i32, ptr %279, align 4, !tbaa !16
  %281 = add nsw i32 %280, 1
  store i32 %281, ptr %279, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #6
  %282 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 2
  %283 = getelementptr inbounds [4 x float], ptr %282, i64 0, i64 0
  %284 = load float, ptr %283, align 16, !tbaa !11
  store float %284, ptr %26, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #6
  %285 = load float, ptr %26, align 4, !tbaa !18
  %286 = fsub float %285, 3.000000e+00
  store float %286, ptr %27, align 4, !tbaa !18
  %287 = load float, ptr %27, align 4, !tbaa !18
  %288 = fcmp olt float %287, 0xBE80000000000000
  br i1 %288, label %292, label %289

289:                                              ; preds = %277
  %290 = load float, ptr %27, align 4, !tbaa !18
  %291 = fcmp olt float 0x3E80000000000000, %290
  br i1 %291, label %292, label %303

292:                                              ; preds = %289, %277
  %293 = load ptr, ptr %2, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %293, i32 0, i32 1
  %295 = load i32, ptr %294, align 4, !tbaa !20
  %296 = add nsw i32 %295, 1
  store i32 %296, ptr %294, align 4, !tbaa !20
  %297 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 274)
  %298 = load float, ptr %26, align 4, !tbaa !18
  %299 = fpext float %298 to double
  %300 = load float, ptr %27, align 4, !tbaa !18
  %301 = fpext float %300 to double
  %302 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 3.000000e+00, double noundef %299, double noundef %301)
  br label %303

303:                                              ; preds = %292, %289
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #6
  %304 = load ptr, ptr %2, align 8, !tbaa !5
  %305 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %304, i32 0, i32 0
  %306 = load i32, ptr %305, align 4, !tbaa !16
  %307 = add nsw i32 %306, 1
  store i32 %307, ptr %305, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #6
  %308 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 2
  %309 = getelementptr inbounds [4 x float], ptr %308, i64 0, i64 1
  %310 = load float, ptr %309, align 4, !tbaa !11
  store float %310, ptr %28, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #6
  %311 = load float, ptr %28, align 4, !tbaa !18
  %312 = fsub float %311, 7.000000e+00
  store float %312, ptr %29, align 4, !tbaa !18
  %313 = load float, ptr %29, align 4, !tbaa !18
  %314 = fcmp olt float %313, 0xBE80000000000000
  br i1 %314, label %318, label %315

315:                                              ; preds = %303
  %316 = load float, ptr %29, align 4, !tbaa !18
  %317 = fcmp olt float 0x3E80000000000000, %316
  br i1 %317, label %318, label %329

318:                                              ; preds = %315, %303
  %319 = load ptr, ptr %2, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %319, i32 0, i32 1
  %321 = load i32, ptr %320, align 4, !tbaa !20
  %322 = add nsw i32 %321, 1
  store i32 %322, ptr %320, align 4, !tbaa !20
  %323 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 275)
  %324 = load float, ptr %28, align 4, !tbaa !18
  %325 = fpext float %324 to double
  %326 = load float, ptr %29, align 4, !tbaa !18
  %327 = fpext float %326 to double
  %328 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 7.000000e+00, double noundef %325, double noundef %327)
  br label %329

329:                                              ; preds = %318, %315
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #6
  %330 = load ptr, ptr %2, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %330, i32 0, i32 0
  %332 = load i32, ptr %331, align 4, !tbaa !16
  %333 = add nsw i32 %332, 1
  store i32 %333, ptr %331, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  %334 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 2
  %335 = getelementptr inbounds [4 x float], ptr %334, i64 0, i64 2
  %336 = load float, ptr %335, align 8, !tbaa !11
  store float %336, ptr %30, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #6
  %337 = load float, ptr %30, align 4, !tbaa !18
  %338 = fsub float %337, 1.100000e+01
  store float %338, ptr %31, align 4, !tbaa !18
  %339 = load float, ptr %31, align 4, !tbaa !18
  %340 = fcmp olt float %339, 0xBE80000000000000
  br i1 %340, label %344, label %341

341:                                              ; preds = %329
  %342 = load float, ptr %31, align 4, !tbaa !18
  %343 = fcmp olt float 0x3E80000000000000, %342
  br i1 %343, label %344, label %355

344:                                              ; preds = %341, %329
  %345 = load ptr, ptr %2, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %345, i32 0, i32 1
  %347 = load i32, ptr %346, align 4, !tbaa !20
  %348 = add nsw i32 %347, 1
  store i32 %348, ptr %346, align 4, !tbaa !20
  %349 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 276)
  %350 = load float, ptr %30, align 4, !tbaa !18
  %351 = fpext float %350 to double
  %352 = load float, ptr %31, align 4, !tbaa !18
  %353 = fpext float %352 to double
  %354 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.100000e+01, double noundef %351, double noundef %353)
  br label %355

355:                                              ; preds = %344, %341
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  %356 = load ptr, ptr %2, align 8, !tbaa !5
  %357 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %356, i32 0, i32 0
  %358 = load i32, ptr %357, align 4, !tbaa !16
  %359 = add nsw i32 %358, 1
  store i32 %359, ptr %357, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #6
  %360 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 2
  %361 = getelementptr inbounds [4 x float], ptr %360, i64 0, i64 3
  %362 = load float, ptr %361, align 4, !tbaa !11
  store float %362, ptr %32, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #6
  %363 = load float, ptr %32, align 4, !tbaa !18
  %364 = fsub float %363, 1.500000e+01
  store float %364, ptr %33, align 4, !tbaa !18
  %365 = load float, ptr %33, align 4, !tbaa !18
  %366 = fcmp olt float %365, 0xBE80000000000000
  br i1 %366, label %370, label %367

367:                                              ; preds = %355
  %368 = load float, ptr %33, align 4, !tbaa !18
  %369 = fcmp olt float 0x3E80000000000000, %368
  br i1 %369, label %370, label %381

370:                                              ; preds = %367, %355
  %371 = load ptr, ptr %2, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %371, i32 0, i32 1
  %373 = load i32, ptr %372, align 4, !tbaa !20
  %374 = add nsw i32 %373, 1
  store i32 %374, ptr %372, align 4, !tbaa !20
  %375 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 277)
  %376 = load float, ptr %32, align 4, !tbaa !18
  %377 = fpext float %376 to double
  %378 = load float, ptr %33, align 4, !tbaa !18
  %379 = fpext float %378 to double
  %380 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.500000e+01, double noundef %377, double noundef %379)
  br label %381

381:                                              ; preds = %370, %367
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #6
  %382 = load ptr, ptr %2, align 8, !tbaa !5
  %383 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %382, i32 0, i32 0
  %384 = load i32, ptr %383, align 4, !tbaa !16
  %385 = add nsw i32 %384, 1
  store i32 %385, ptr %383, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #6
  %386 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 3
  %387 = getelementptr inbounds [4 x float], ptr %386, i64 0, i64 0
  %388 = load float, ptr %387, align 16, !tbaa !11
  store float %388, ptr %34, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #6
  %389 = load float, ptr %34, align 4, !tbaa !18
  %390 = fsub float %389, 4.000000e+00
  store float %390, ptr %35, align 4, !tbaa !18
  %391 = load float, ptr %35, align 4, !tbaa !18
  %392 = fcmp olt float %391, 0xBE80000000000000
  br i1 %392, label %396, label %393

393:                                              ; preds = %381
  %394 = load float, ptr %35, align 4, !tbaa !18
  %395 = fcmp olt float 0x3E80000000000000, %394
  br i1 %395, label %396, label %407

396:                                              ; preds = %393, %381
  %397 = load ptr, ptr %2, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %397, i32 0, i32 1
  %399 = load i32, ptr %398, align 4, !tbaa !20
  %400 = add nsw i32 %399, 1
  store i32 %400, ptr %398, align 4, !tbaa !20
  %401 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 278)
  %402 = load float, ptr %34, align 4, !tbaa !18
  %403 = fpext float %402 to double
  %404 = load float, ptr %35, align 4, !tbaa !18
  %405 = fpext float %404 to double
  %406 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 4.000000e+00, double noundef %403, double noundef %405)
  br label %407

407:                                              ; preds = %396, %393
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #6
  %408 = load ptr, ptr %2, align 8, !tbaa !5
  %409 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %408, i32 0, i32 0
  %410 = load i32, ptr %409, align 4, !tbaa !16
  %411 = add nsw i32 %410, 1
  store i32 %411, ptr %409, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #6
  %412 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 3
  %413 = getelementptr inbounds [4 x float], ptr %412, i64 0, i64 1
  %414 = load float, ptr %413, align 4, !tbaa !11
  store float %414, ptr %36, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #6
  %415 = load float, ptr %36, align 4, !tbaa !18
  %416 = fsub float %415, 8.000000e+00
  store float %416, ptr %37, align 4, !tbaa !18
  %417 = load float, ptr %37, align 4, !tbaa !18
  %418 = fcmp olt float %417, 0xBE80000000000000
  br i1 %418, label %422, label %419

419:                                              ; preds = %407
  %420 = load float, ptr %37, align 4, !tbaa !18
  %421 = fcmp olt float 0x3E80000000000000, %420
  br i1 %421, label %422, label %433

422:                                              ; preds = %419, %407
  %423 = load ptr, ptr %2, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %423, i32 0, i32 1
  %425 = load i32, ptr %424, align 4, !tbaa !20
  %426 = add nsw i32 %425, 1
  store i32 %426, ptr %424, align 4, !tbaa !20
  %427 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 279)
  %428 = load float, ptr %36, align 4, !tbaa !18
  %429 = fpext float %428 to double
  %430 = load float, ptr %37, align 4, !tbaa !18
  %431 = fpext float %430 to double
  %432 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 8.000000e+00, double noundef %429, double noundef %431)
  br label %433

433:                                              ; preds = %422, %419
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #6
  %434 = load ptr, ptr %2, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %434, i32 0, i32 0
  %436 = load i32, ptr %435, align 4, !tbaa !16
  %437 = add nsw i32 %436, 1
  store i32 %437, ptr %435, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #6
  %438 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 3
  %439 = getelementptr inbounds [4 x float], ptr %438, i64 0, i64 2
  %440 = load float, ptr %439, align 8, !tbaa !11
  store float %440, ptr %38, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #6
  %441 = load float, ptr %38, align 4, !tbaa !18
  %442 = fsub float %441, 1.200000e+01
  store float %442, ptr %39, align 4, !tbaa !18
  %443 = load float, ptr %39, align 4, !tbaa !18
  %444 = fcmp olt float %443, 0xBE80000000000000
  br i1 %444, label %448, label %445

445:                                              ; preds = %433
  %446 = load float, ptr %39, align 4, !tbaa !18
  %447 = fcmp olt float 0x3E80000000000000, %446
  br i1 %447, label %448, label %459

448:                                              ; preds = %445, %433
  %449 = load ptr, ptr %2, align 8, !tbaa !5
  %450 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %449, i32 0, i32 1
  %451 = load i32, ptr %450, align 4, !tbaa !20
  %452 = add nsw i32 %451, 1
  store i32 %452, ptr %450, align 4, !tbaa !20
  %453 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 280)
  %454 = load float, ptr %38, align 4, !tbaa !18
  %455 = fpext float %454 to double
  %456 = load float, ptr %39, align 4, !tbaa !18
  %457 = fpext float %456 to double
  %458 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.200000e+01, double noundef %455, double noundef %457)
  br label %459

459:                                              ; preds = %448, %445
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #6
  %460 = load ptr, ptr %2, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %460, i32 0, i32 0
  %462 = load i32, ptr %461, align 4, !tbaa !16
  %463 = add nsw i32 %462, 1
  store i32 %463, ptr %461, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #6
  %464 = getelementptr inbounds [4 x [4 x float]], ptr %8, i64 0, i64 3
  %465 = getelementptr inbounds [4 x float], ptr %464, i64 0, i64 3
  %466 = load float, ptr %465, align 4, !tbaa !11
  store float %466, ptr %40, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #6
  %467 = load float, ptr %40, align 4, !tbaa !18
  %468 = fsub float %467, 1.600000e+01
  store float %468, ptr %41, align 4, !tbaa !18
  %469 = load float, ptr %41, align 4, !tbaa !18
  %470 = fcmp olt float %469, 0xBE80000000000000
  br i1 %470, label %474, label %471

471:                                              ; preds = %459
  %472 = load float, ptr %41, align 4, !tbaa !18
  %473 = fcmp olt float 0x3E80000000000000, %472
  br i1 %473, label %474, label %485

474:                                              ; preds = %471, %459
  %475 = load ptr, ptr %2, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.hmt_testresult_struct, ptr %475, i32 0, i32 1
  %477 = load i32, ptr %476, align 4, !tbaa !20
  %478 = add nsw i32 %477, 1
  store i32 %478, ptr %476, align 4, !tbaa !20
  %479 = call i32 (ptr, ...) @printf(ptr noundef @.str.15, i32 noundef 281)
  %480 = load float, ptr %40, align 4, !tbaa !18
  %481 = fpext float %480 to double
  %482 = load float, ptr %41, align 4, !tbaa !18
  %483 = fpext float %482 to double
  %484 = call i32 (ptr, ...) @printf(ptr noundef @.str.18, double noundef 1.600000e+01, double noundef %481, double noundef %483)
  br label %485

485:                                              ; preds = %474, %471
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #6
  call void @llvm.lifetime.end.p0(i64 64, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #6
  call void @llvm.lifetime.end.p0(i64 64, ptr %3) #6
  ret void
}

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL15HMM_TransposeM48HMM_Mat4(ptr dead_on_unwind noalias writable sret(%union.HMM_Mat4) align 16, ptr noundef byval(%union.HMM_Mat4) align 16) #5

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

!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 = !{!7, !7, i64 0}
!12 = distinct !{!12, !13}
!13 = !{!"llvm.loop.mustprogress"}
!14 = distinct !{!14, !13}
!15 = !{i64 0, i64 64, !11}
!16 = !{!17, !10, i64 0}
!17 = !{!"_ZTS21hmt_testresult_struct", !10, i64 0, !10, i64 4}
!18 = !{!19, !19, i64 0}
!19 = !{!"float", !7, i64 0}
!20 = !{!17, !10, i64 4}


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

%union.HMM_Mat4 = type { [4 x %union.HMM_Vec4] }
%union.HMM_Vec4 = type { <4 x float> }

@.str.15 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [34 x i8], align 1

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL6HMM_M4v(ptr dead_on_unwind noalias writable sret(%union.HMM_Mat4) align 16) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
define dso_local void @_Z31_hmt_test_MatrixOps_TransposeM4P21hmt_testresult_struct(ptr nocapture noundef %0) local_unnamed_addr #3 {
.preheader:
  %1 = alloca %union.HMM_Mat4, align 16
  %2 = alloca %union.HMM_Mat4, align 16
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %1) #6
  call void @_ZL6HMM_M4v(ptr dead_on_unwind nonnull writable sret(%union.HMM_Mat4) align 16 %1)
  store <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>, ptr %1, align 16, !tbaa !5
  %3 = getelementptr inbounds i8, ptr %1, i64 16
  store <4 x float> <float 5.000000e+00, float 6.000000e+00, float 7.000000e+00, float 8.000000e+00>, ptr %3, align 16, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %1, i64 32
  store <4 x float> <float 9.000000e+00, float 1.000000e+01, float 1.100000e+01, float 1.200000e+01>, ptr %4, align 16, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %1, i64 48
  store <4 x float> <float 1.300000e+01, float 1.400000e+01, float 1.500000e+01, float 1.600000e+01>, ptr %5, align 16, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %2) #6
  call void @_ZL15HMM_TransposeM48HMM_Mat4(ptr dead_on_unwind nonnull writable sret(%union.HMM_Mat4) align 16 %2, ptr noundef nonnull byval(%union.HMM_Mat4) align 16 %1)
  %6 = load i32, ptr %0, align 4, !tbaa !8
  %7 = add nsw i32 %6, 1
  store i32 %7, ptr %0, align 4, !tbaa !8
  %8 = load float, ptr %2, align 16, !tbaa !5
  %9 = fadd float %8, -1.000000e+00
  %10 = call float @llvm.fabs.f32(float %9)
  %or.cond = fcmp ogt float %10, 0x3E80000000000000
  br i1 %or.cond, label %11, label %19

11:                                               ; preds = %.preheader
  %12 = getelementptr inbounds i8, ptr %0, i64 4
  %13 = load i32, ptr %12, align 4, !tbaa !11
  %14 = add nsw i32 %13, 1
  store i32 %14, ptr %12, align 4, !tbaa !11
  %15 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 266)
  %16 = fpext float %8 to double
  %17 = fpext float %9 to double
  %18 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.000000e+00, double noundef %16, double noundef %17)
  %.pre = load i32, ptr %0, align 4, !tbaa !8
  br label %19

19:                                               ; preds = %.preheader, %11
  %20 = phi i32 [ %7, %.preheader ], [ %.pre, %11 ]
  %21 = add nsw i32 %20, 1
  store i32 %21, ptr %0, align 4, !tbaa !8
  %22 = getelementptr inbounds i8, ptr %2, i64 4
  %23 = load float, ptr %22, align 4, !tbaa !5
  %24 = fadd float %23, -5.000000e+00
  %25 = call float @llvm.fabs.f32(float %24)
  %or.cond3 = fcmp ogt float %25, 0x3E80000000000000
  br i1 %or.cond3, label %26, label %34

26:                                               ; preds = %19
  %27 = getelementptr inbounds i8, ptr %0, i64 4
  %28 = load i32, ptr %27, align 4, !tbaa !11
  %29 = add nsw i32 %28, 1
  store i32 %29, ptr %27, align 4, !tbaa !11
  %30 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 267)
  %31 = fpext float %23 to double
  %32 = fpext float %24 to double
  %33 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 5.000000e+00, double noundef %31, double noundef %32)
  %.pre158 = load i32, ptr %0, align 4, !tbaa !8
  br label %34

34:                                               ; preds = %19, %26
  %35 = phi i32 [ %21, %19 ], [ %.pre158, %26 ]
  %36 = add nsw i32 %35, 1
  store i32 %36, ptr %0, align 4, !tbaa !8
  %37 = getelementptr inbounds i8, ptr %2, i64 8
  %38 = load float, ptr %37, align 8, !tbaa !5
  %39 = fadd float %38, -9.000000e+00
  %40 = call float @llvm.fabs.f32(float %39)
  %or.cond5 = fcmp ogt float %40, 0x3E80000000000000
  br i1 %or.cond5, label %41, label %49

41:                                               ; preds = %34
  %42 = getelementptr inbounds i8, ptr %0, i64 4
  %43 = load i32, ptr %42, align 4, !tbaa !11
  %44 = add nsw i32 %43, 1
  store i32 %44, ptr %42, align 4, !tbaa !11
  %45 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 268)
  %46 = fpext float %38 to double
  %47 = fpext float %39 to double
  %48 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 9.000000e+00, double noundef %46, double noundef %47)
  %.pre159 = load i32, ptr %0, align 4, !tbaa !8
  br label %49

49:                                               ; preds = %34, %41
  %50 = phi i32 [ %36, %34 ], [ %.pre159, %41 ]
  %51 = add nsw i32 %50, 1
  store i32 %51, ptr %0, align 4, !tbaa !8
  %52 = getelementptr inbounds i8, ptr %2, i64 12
  %53 = load float, ptr %52, align 4, !tbaa !5
  %54 = fadd float %53, -1.300000e+01
  %55 = call float @llvm.fabs.f32(float %54)
  %or.cond7 = fcmp ogt float %55, 0x3E80000000000000
  br i1 %or.cond7, label %56, label %64

56:                                               ; preds = %49
  %57 = getelementptr inbounds i8, ptr %0, i64 4
  %58 = load i32, ptr %57, align 4, !tbaa !11
  %59 = add nsw i32 %58, 1
  store i32 %59, ptr %57, align 4, !tbaa !11
  %60 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 269)
  %61 = fpext float %53 to double
  %62 = fpext float %54 to double
  %63 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.300000e+01, double noundef %61, double noundef %62)
  %.pre160 = load i32, ptr %0, align 4, !tbaa !8
  br label %64

64:                                               ; preds = %49, %56
  %65 = phi i32 [ %51, %49 ], [ %.pre160, %56 ]
  %66 = add nsw i32 %65, 1
  store i32 %66, ptr %0, align 4, !tbaa !8
  %67 = getelementptr inbounds i8, ptr %2, i64 16
  %68 = load float, ptr %67, align 16, !tbaa !5
  %69 = fadd float %68, -2.000000e+00
  %70 = call float @llvm.fabs.f32(float %69)
  %or.cond9 = fcmp ogt float %70, 0x3E80000000000000
  br i1 %or.cond9, label %71, label %79

71:                                               ; preds = %64
  %72 = getelementptr inbounds i8, ptr %0, i64 4
  %73 = load i32, ptr %72, align 4, !tbaa !11
  %74 = add nsw i32 %73, 1
  store i32 %74, ptr %72, align 4, !tbaa !11
  %75 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 270)
  %76 = fpext float %68 to double
  %77 = fpext float %69 to double
  %78 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 2.000000e+00, double noundef %76, double noundef %77)
  %.pre161 = load i32, ptr %0, align 4, !tbaa !8
  br label %79

79:                                               ; preds = %64, %71
  %80 = phi i32 [ %66, %64 ], [ %.pre161, %71 ]
  %81 = add nsw i32 %80, 1
  store i32 %81, ptr %0, align 4, !tbaa !8
  %82 = getelementptr inbounds i8, ptr %2, i64 20
  %83 = load float, ptr %82, align 4, !tbaa !5
  %84 = fadd float %83, -6.000000e+00
  %85 = call float @llvm.fabs.f32(float %84)
  %or.cond11 = fcmp ogt float %85, 0x3E80000000000000
  br i1 %or.cond11, label %86, label %94

86:                                               ; preds = %79
  %87 = getelementptr inbounds i8, ptr %0, i64 4
  %88 = load i32, ptr %87, align 4, !tbaa !11
  %89 = add nsw i32 %88, 1
  store i32 %89, ptr %87, align 4, !tbaa !11
  %90 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 271)
  %91 = fpext float %83 to double
  %92 = fpext float %84 to double
  %93 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 6.000000e+00, double noundef %91, double noundef %92)
  %.pre162 = load i32, ptr %0, align 4, !tbaa !8
  br label %94

94:                                               ; preds = %79, %86
  %95 = phi i32 [ %81, %79 ], [ %.pre162, %86 ]
  %96 = add nsw i32 %95, 1
  store i32 %96, ptr %0, align 4, !tbaa !8
  %97 = getelementptr inbounds i8, ptr %2, i64 24
  %98 = load float, ptr %97, align 8, !tbaa !5
  %99 = fadd float %98, -1.000000e+01
  %100 = call float @llvm.fabs.f32(float %99)
  %or.cond13 = fcmp ogt float %100, 0x3E80000000000000
  br i1 %or.cond13, label %101, label %109

101:                                              ; preds = %94
  %102 = getelementptr inbounds i8, ptr %0, i64 4
  %103 = load i32, ptr %102, align 4, !tbaa !11
  %104 = add nsw i32 %103, 1
  store i32 %104, ptr %102, align 4, !tbaa !11
  %105 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 272)
  %106 = fpext float %98 to double
  %107 = fpext float %99 to double
  %108 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.000000e+01, double noundef %106, double noundef %107)
  %.pre163 = load i32, ptr %0, align 4, !tbaa !8
  br label %109

109:                                              ; preds = %94, %101
  %110 = phi i32 [ %96, %94 ], [ %.pre163, %101 ]
  %111 = add nsw i32 %110, 1
  store i32 %111, ptr %0, align 4, !tbaa !8
  %112 = getelementptr inbounds i8, ptr %2, i64 28
  %113 = load float, ptr %112, align 4, !tbaa !5
  %114 = fadd float %113, -1.400000e+01
  %115 = call float @llvm.fabs.f32(float %114)
  %or.cond15 = fcmp ogt float %115, 0x3E80000000000000
  br i1 %or.cond15, label %116, label %124

116:                                              ; preds = %109
  %117 = getelementptr inbounds i8, ptr %0, i64 4
  %118 = load i32, ptr %117, align 4, !tbaa !11
  %119 = add nsw i32 %118, 1
  store i32 %119, ptr %117, align 4, !tbaa !11
  %120 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 273)
  %121 = fpext float %113 to double
  %122 = fpext float %114 to double
  %123 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.400000e+01, double noundef %121, double noundef %122)
  %.pre164 = load i32, ptr %0, align 4, !tbaa !8
  br label %124

124:                                              ; preds = %109, %116
  %125 = phi i32 [ %111, %109 ], [ %.pre164, %116 ]
  %126 = add nsw i32 %125, 1
  store i32 %126, ptr %0, align 4, !tbaa !8
  %127 = getelementptr inbounds i8, ptr %2, i64 32
  %128 = load float, ptr %127, align 16, !tbaa !5
  %129 = fadd float %128, -3.000000e+00
  %130 = call float @llvm.fabs.f32(float %129)
  %or.cond17 = fcmp ogt float %130, 0x3E80000000000000
  br i1 %or.cond17, label %131, label %139

131:                                              ; preds = %124
  %132 = getelementptr inbounds i8, ptr %0, i64 4
  %133 = load i32, ptr %132, align 4, !tbaa !11
  %134 = add nsw i32 %133, 1
  store i32 %134, ptr %132, align 4, !tbaa !11
  %135 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 274)
  %136 = fpext float %128 to double
  %137 = fpext float %129 to double
  %138 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 3.000000e+00, double noundef %136, double noundef %137)
  %.pre165 = load i32, ptr %0, align 4, !tbaa !8
  br label %139

139:                                              ; preds = %124, %131
  %140 = phi i32 [ %126, %124 ], [ %.pre165, %131 ]
  %141 = add nsw i32 %140, 1
  store i32 %141, ptr %0, align 4, !tbaa !8
  %142 = getelementptr inbounds i8, ptr %2, i64 36
  %143 = load float, ptr %142, align 4, !tbaa !5
  %144 = fadd float %143, -7.000000e+00
  %145 = call float @llvm.fabs.f32(float %144)
  %or.cond19 = fcmp ogt float %145, 0x3E80000000000000
  br i1 %or.cond19, label %146, label %154

146:                                              ; preds = %139
  %147 = getelementptr inbounds i8, ptr %0, i64 4
  %148 = load i32, ptr %147, align 4, !tbaa !11
  %149 = add nsw i32 %148, 1
  store i32 %149, ptr %147, align 4, !tbaa !11
  %150 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 275)
  %151 = fpext float %143 to double
  %152 = fpext float %144 to double
  %153 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 7.000000e+00, double noundef %151, double noundef %152)
  %.pre166 = load i32, ptr %0, align 4, !tbaa !8
  br label %154

154:                                              ; preds = %139, %146
  %155 = phi i32 [ %141, %139 ], [ %.pre166, %146 ]
  %156 = add nsw i32 %155, 1
  store i32 %156, ptr %0, align 4, !tbaa !8
  %157 = getelementptr inbounds i8, ptr %2, i64 40
  %158 = load float, ptr %157, align 8, !tbaa !5
  %159 = fadd float %158, -1.100000e+01
  %160 = call float @llvm.fabs.f32(float %159)
  %or.cond21 = fcmp ogt float %160, 0x3E80000000000000
  br i1 %or.cond21, label %161, label %169

161:                                              ; preds = %154
  %162 = getelementptr inbounds i8, ptr %0, i64 4
  %163 = load i32, ptr %162, align 4, !tbaa !11
  %164 = add nsw i32 %163, 1
  store i32 %164, ptr %162, align 4, !tbaa !11
  %165 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 276)
  %166 = fpext float %158 to double
  %167 = fpext float %159 to double
  %168 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.100000e+01, double noundef %166, double noundef %167)
  %.pre167 = load i32, ptr %0, align 4, !tbaa !8
  br label %169

169:                                              ; preds = %154, %161
  %170 = phi i32 [ %156, %154 ], [ %.pre167, %161 ]
  %171 = add nsw i32 %170, 1
  store i32 %171, ptr %0, align 4, !tbaa !8
  %172 = getelementptr inbounds i8, ptr %2, i64 44
  %173 = load float, ptr %172, align 4, !tbaa !5
  %174 = fadd float %173, -1.500000e+01
  %175 = call float @llvm.fabs.f32(float %174)
  %or.cond23 = fcmp ogt float %175, 0x3E80000000000000
  br i1 %or.cond23, label %176, label %184

176:                                              ; preds = %169
  %177 = getelementptr inbounds i8, ptr %0, i64 4
  %178 = load i32, ptr %177, align 4, !tbaa !11
  %179 = add nsw i32 %178, 1
  store i32 %179, ptr %177, align 4, !tbaa !11
  %180 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 277)
  %181 = fpext float %173 to double
  %182 = fpext float %174 to double
  %183 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.500000e+01, double noundef %181, double noundef %182)
  %.pre168 = load i32, ptr %0, align 4, !tbaa !8
  br label %184

184:                                              ; preds = %169, %176
  %185 = phi i32 [ %171, %169 ], [ %.pre168, %176 ]
  %186 = add nsw i32 %185, 1
  store i32 %186, ptr %0, align 4, !tbaa !8
  %187 = getelementptr inbounds i8, ptr %2, i64 48
  %188 = load float, ptr %187, align 16, !tbaa !5
  %189 = fadd float %188, -4.000000e+00
  %190 = call float @llvm.fabs.f32(float %189)
  %or.cond25 = fcmp ogt float %190, 0x3E80000000000000
  br i1 %or.cond25, label %191, label %199

191:                                              ; preds = %184
  %192 = getelementptr inbounds i8, ptr %0, i64 4
  %193 = load i32, ptr %192, align 4, !tbaa !11
  %194 = add nsw i32 %193, 1
  store i32 %194, ptr %192, align 4, !tbaa !11
  %195 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 278)
  %196 = fpext float %188 to double
  %197 = fpext float %189 to double
  %198 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 4.000000e+00, double noundef %196, double noundef %197)
  %.pre169 = load i32, ptr %0, align 4, !tbaa !8
  br label %199

199:                                              ; preds = %184, %191
  %200 = phi i32 [ %186, %184 ], [ %.pre169, %191 ]
  %201 = add nsw i32 %200, 1
  store i32 %201, ptr %0, align 4, !tbaa !8
  %202 = getelementptr inbounds i8, ptr %2, i64 52
  %203 = load float, ptr %202, align 4, !tbaa !5
  %204 = fadd float %203, -8.000000e+00
  %205 = call float @llvm.fabs.f32(float %204)
  %or.cond27 = fcmp ogt float %205, 0x3E80000000000000
  br i1 %or.cond27, label %206, label %214

206:                                              ; preds = %199
  %207 = getelementptr inbounds i8, ptr %0, i64 4
  %208 = load i32, ptr %207, align 4, !tbaa !11
  %209 = add nsw i32 %208, 1
  store i32 %209, ptr %207, align 4, !tbaa !11
  %210 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 279)
  %211 = fpext float %203 to double
  %212 = fpext float %204 to double
  %213 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 8.000000e+00, double noundef %211, double noundef %212)
  %.pre170 = load i32, ptr %0, align 4, !tbaa !8
  br label %214

214:                                              ; preds = %199, %206
  %215 = phi i32 [ %201, %199 ], [ %.pre170, %206 ]
  %216 = add nsw i32 %215, 1
  store i32 %216, ptr %0, align 4, !tbaa !8
  %217 = getelementptr inbounds i8, ptr %2, i64 56
  %218 = load float, ptr %217, align 8, !tbaa !5
  %219 = fadd float %218, -1.200000e+01
  %220 = call float @llvm.fabs.f32(float %219)
  %or.cond29 = fcmp ogt float %220, 0x3E80000000000000
  br i1 %or.cond29, label %221, label %229

221:                                              ; preds = %214
  %222 = getelementptr inbounds i8, ptr %0, i64 4
  %223 = load i32, ptr %222, align 4, !tbaa !11
  %224 = add nsw i32 %223, 1
  store i32 %224, ptr %222, align 4, !tbaa !11
  %225 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 280)
  %226 = fpext float %218 to double
  %227 = fpext float %219 to double
  %228 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.200000e+01, double noundef %226, double noundef %227)
  %.pre171 = load i32, ptr %0, align 4, !tbaa !8
  br label %229

229:                                              ; preds = %214, %221
  %230 = phi i32 [ %216, %214 ], [ %.pre171, %221 ]
  %231 = add nsw i32 %230, 1
  store i32 %231, ptr %0, align 4, !tbaa !8
  %232 = getelementptr inbounds i8, ptr %2, i64 60
  %233 = load float, ptr %232, align 4, !tbaa !5
  %234 = fadd float %233, -1.600000e+01
  %235 = call float @llvm.fabs.f32(float %234)
  %or.cond31 = fcmp ogt float %235, 0x3E80000000000000
  br i1 %or.cond31, label %236, label %244

236:                                              ; preds = %229
  %237 = getelementptr inbounds i8, ptr %0, i64 4
  %238 = load i32, ptr %237, align 4, !tbaa !11
  %239 = add nsw i32 %238, 1
  store i32 %239, ptr %237, align 4, !tbaa !11
  %240 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15, i32 noundef 281)
  %241 = fpext float %233 to double
  %242 = fpext float %234 to double
  %243 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18, double noundef 1.600000e+01, double noundef %241, double noundef %242)
  br label %244

244:                                              ; preds = %229, %236
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %2) #6
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %1) #6
  ret void
}

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL15HMM_TransposeM48HMM_Mat4(ptr dead_on_unwind noalias writable sret(%union.HMM_Mat4) align 16, ptr noundef byval(%union.HMM_Mat4) align 16) local_unnamed_addr #4

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

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


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,MemCpyOptPass,PostOrderFunctionAttrsPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass