; LLVM IR from tsotchke/quantum_geometric_tensor :: src/quantum_geometric/core (quantum_geometric_metric)

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

%struct.ComplexFloat = type { float, float }
%struct.quantum_geometric_tensor_t = type { i32, ptr, i64, ptr, ptr, i8, i8, i8, i32, i64, i64 }
%struct.quantum_geometric_metric_t = type { i32, i64, ptr, i8, ptr, i32 }

; 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

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @llvm.prefetch.p0(ptr nocapture readonly, i32 immarg, i32 immarg, i32 immarg) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_conjugate(<2 x float>) #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_multiply(<2 x float>, <2 x float>) #3

; Function Attrs: nounwind uwtable
define dso_local i32 @geometric_transform_metric(ptr noundef %0, ptr noundef %1, ptr noundef %2) #4 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i32, align 4
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  %16 = alloca i64, align 8
  %17 = alloca %struct.ComplexFloat, align 4
  %18 = alloca %struct.ComplexFloat, align 4
  %19 = alloca i64, align 8
  %20 = alloca %struct.ComplexFloat, align 4
  %21 = alloca %struct.ComplexFloat, align 4
  %22 = alloca %struct.ComplexFloat, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  %23 = load ptr, ptr %5, align 8, !tbaa !5
  %24 = icmp eq ptr %23, null
  br i1 %24, label %25, label %26

25:                                               ; preds = %3
  store i32 -1, ptr %4, align 4
  br label %201

26:                                               ; preds = %3
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = icmp eq ptr %27, null
  br i1 %28, label %29, label %30

29:                                               ; preds = %26
  store i32 -1, ptr %4, align 4
  br label %201

30:                                               ; preds = %26
  %31 = load ptr, ptr %7, align 8, !tbaa !5
  %32 = icmp eq ptr %31, null
  br i1 %32, label %33, label %34

33:                                               ; preds = %30
  store i32 -1, ptr %4, align 4
  br label %201

34:                                               ; preds = %30
  %35 = load ptr, ptr %7, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %35, i32 0, i32 2
  %37 = load i64, ptr %36, align 8, !tbaa !9
  %38 = icmp ne i64 %37, 2
  br i1 %38, label %67, label %39

39:                                               ; preds = %34
  %40 = load ptr, ptr %7, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %40, i32 0, i32 1
  %42 = load ptr, ptr %41, align 8, !tbaa !14
  %43 = getelementptr inbounds i64, ptr %42, i64 0
  %44 = load i64, ptr %43, align 8, !tbaa !15
  %45 = load ptr, ptr %6, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %45, i32 0, i32 1
  %47 = load i64, ptr %46, align 8, !tbaa !16
  %48 = icmp ne i64 %44, %47
  br i1 %48, label %67, label %49

49:                                               ; preds = %39
  %50 = load ptr, ptr %7, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %50, i32 0, i32 1
  %52 = load ptr, ptr %51, align 8, !tbaa !14
  %53 = getelementptr inbounds i64, ptr %52, i64 1
  %54 = load i64, ptr %53, align 8, !tbaa !15
  %55 = load ptr, ptr %6, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %55, i32 0, i32 1
  %57 = load i64, ptr %56, align 8, !tbaa !16
  %58 = icmp ne i64 %54, %57
  br i1 %58, label %67, label %59

59:                                               ; preds = %49
  %60 = load ptr, ptr %5, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %60, i32 0, i32 1
  %62 = load i64, ptr %61, align 8, !tbaa !16
  %63 = load ptr, ptr %6, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %63, i32 0, i32 1
  %65 = load i64, ptr %64, align 8, !tbaa !16
  %66 = icmp ne i64 %62, %65
  br i1 %66, label %67, label %68

67:                                               ; preds = %59, %49, %39, %34
  store i32 -1, ptr %4, align 4
  br label %201

68:                                               ; preds = %59
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #6
  %69 = load ptr, ptr %6, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %69, i32 0, i32 1
  %71 = load i64, ptr %70, align 8, !tbaa !16
  store i64 %71, ptr %8, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #6
  store i64 32, ptr %9, align 8, !tbaa !15
  %72 = load ptr, ptr %5, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %72, i32 0, i32 2
  %74 = load ptr, ptr %73, align 8, !tbaa !18
  %75 = load i64, ptr %8, align 8, !tbaa !15
  %76 = load i64, ptr %8, align 8, !tbaa !15
  %77 = mul i64 %75, %76
  %78 = mul i64 %77, 8
  call void @llvm.memset.p0.i64(ptr align 4 %74, i8 0, i64 %78, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  store i64 0, ptr %10, align 8, !tbaa !15
  br label %79

79:                                               ; preds = %197, %68
  %80 = load i64, ptr %10, align 8, !tbaa !15
  %81 = load i64, ptr %8, align 8, !tbaa !15
  %82 = icmp ult i64 %80, %81
  br i1 %82, label %84, label %83

83:                                               ; preds = %79
  store i32 2, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  br label %200

84:                                               ; preds = %79
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #6
  store i64 0, ptr %12, align 8, !tbaa !15
  br label %85

85:                                               ; preds = %193, %84
  %86 = load i64, ptr %12, align 8, !tbaa !15
  %87 = load i64, ptr %8, align 8, !tbaa !15
  %88 = icmp ult i64 %86, %87
  br i1 %88, label %90, label %89

89:                                               ; preds = %85
  store i32 5, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #6
  br label %196

90:                                               ; preds = %85
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  %91 = load i64, ptr %10, align 8, !tbaa !15
  %92 = add i64 %91, 32
  %93 = load i64, ptr %8, align 8, !tbaa !15
  %94 = icmp ult i64 %92, %93
  br i1 %94, label %95, label %98

95:                                               ; preds = %90
  %96 = load i64, ptr %10, align 8, !tbaa !15
  %97 = add i64 %96, 32
  br label %100

98:                                               ; preds = %90
  %99 = load i64, ptr %8, align 8, !tbaa !15
  br label %100

100:                                              ; preds = %98, %95
  %101 = phi i64 [ %97, %95 ], [ %99, %98 ]
  store i64 %101, ptr %13, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  %102 = load i64, ptr %12, align 8, !tbaa !15
  %103 = add i64 %102, 32
  %104 = load i64, ptr %8, align 8, !tbaa !15
  %105 = icmp ult i64 %103, %104
  br i1 %105, label %106, label %109

106:                                              ; preds = %100
  %107 = load i64, ptr %12, align 8, !tbaa !15
  %108 = add i64 %107, 32
  br label %111

109:                                              ; preds = %100
  %110 = load i64, ptr %8, align 8, !tbaa !15
  br label %111

111:                                              ; preds = %109, %106
  %112 = phi i64 [ %108, %106 ], [ %110, %109 ]
  store i64 %112, ptr %14, align 8, !tbaa !15
  %113 = load i64, ptr %10, align 8, !tbaa !15
  %114 = add i64 %113, 32
  %115 = load i64, ptr %8, align 8, !tbaa !15
  %116 = icmp ult i64 %114, %115
  br i1 %116, label %117, label %134

117:                                              ; preds = %111
  %118 = load ptr, ptr %7, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %118, i32 0, i32 3
  %120 = load ptr, ptr %119, align 8, !tbaa !19
  %121 = load i64, ptr %10, align 8, !tbaa !15
  %122 = add i64 %121, 32
  %123 = load i64, ptr %8, align 8, !tbaa !15
  %124 = mul i64 %122, %123
  %125 = getelementptr inbounds %struct.ComplexFloat, ptr %120, i64 %124
  call void @llvm.prefetch.p0(ptr %125, i32 0, i32 3, i32 1)
  %126 = load ptr, ptr %6, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %126, i32 0, i32 2
  %128 = load ptr, ptr %127, align 8, !tbaa !18
  %129 = load i64, ptr %10, align 8, !tbaa !15
  %130 = add i64 %129, 32
  %131 = load i64, ptr %8, align 8, !tbaa !15
  %132 = mul i64 %130, %131
  %133 = getelementptr inbounds %struct.ComplexFloat, ptr %128, i64 %132
  call void @llvm.prefetch.p0(ptr %133, i32 0, i32 3, i32 1)
  br label %134

134:                                              ; preds = %117, %111
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  %135 = load i64, ptr %10, align 8, !tbaa !15
  store i64 %135, ptr %15, align 8, !tbaa !15
  br label %136

136:                                              ; preds = %189, %134
  %137 = load i64, ptr %15, align 8, !tbaa !15
  %138 = load i64, ptr %13, align 8, !tbaa !15
  %139 = icmp ult i64 %137, %138
  br i1 %139, label %141, label %140

140:                                              ; preds = %136
  store i32 8, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  br label %192

141:                                              ; preds = %136
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  %142 = load i64, ptr %12, align 8, !tbaa !15
  store i64 %142, ptr %16, align 8, !tbaa !15
  br label %143

143:                                              ; preds = %185, %141
  %144 = load i64, ptr %16, align 8, !tbaa !15
  %145 = load i64, ptr %14, align 8, !tbaa !15
  %146 = icmp ult i64 %144, %145
  br i1 %146, label %148, label %147

147:                                              ; preds = %143
  store i32 11, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  br label %188

148:                                              ; preds = %143
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  call void @llvm.memset.p0.i64(ptr align 4 %17, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  call void @llvm.memset.p0.i64(ptr align 4 %18, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #6
  store i64 0, ptr %19, align 8, !tbaa !15
  br label %149

149:                                              ; preds = %172, %148
  %150 = load i64, ptr %19, align 8, !tbaa !15
  %151 = load i64, ptr %8, align 8, !tbaa !15
  %152 = icmp ult i64 %150, %151
  br i1 %152, label %154, label %153

153:                                              ; preds = %149
  store i32 14, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #6
  br label %175

154:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #6
  %155 = load ptr, ptr %7, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %155, i32 0, i32 3
  %157 = load ptr, ptr %156, align 8, !tbaa !19
  %158 = load i64, ptr %19, align 8, !tbaa !15
  %159 = load i64, ptr %8, align 8, !tbaa !15
  %160 = mul i64 %158, %159
  %161 = load i64, ptr %15, align 8, !tbaa !15
  %162 = add i64 %160, %161
  %163 = getelementptr inbounds %struct.ComplexFloat, ptr %157, i64 %162
  %164 = load <2 x float>, ptr %163, align 4
  %165 = call <2 x float> @complex_float_conjugate(<2 x float> %164)
  store <2 x float> %165, ptr %21, align 4
  %166 = load <2 x float>, ptr %21, align 4
  %167 = load <2 x float>, ptr %18, align 4
  %168 = call <2 x float> @complex_float_multiply(<2 x float> %166, <2 x float> %167)
  store <2 x float> %168, ptr %20, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #6
  %169 = load <2 x float>, ptr %17, align 4
  %170 = load <2 x float>, ptr %20, align 4
  %171 = call <2 x float> @complex_float_add(<2 x float> %169, <2 x float> %170)
  store <2 x float> %171, ptr %22, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %17, ptr align 4 %22, i64 8, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #6
  br label %172

172:                                              ; preds = %154
  %173 = load i64, ptr %19, align 8, !tbaa !15
  %174 = add i64 %173, 1
  store i64 %174, ptr %19, align 8, !tbaa !15
  br label %149, !llvm.loop !23

175:                                              ; preds = %153
  %176 = load ptr, ptr %5, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.quantum_geometric_metric_t, ptr %176, i32 0, i32 2
  %178 = load ptr, ptr %177, align 8, !tbaa !18
  %179 = load i64, ptr %15, align 8, !tbaa !15
  %180 = load i64, ptr %8, align 8, !tbaa !15
  %181 = mul i64 %179, %180
  %182 = load i64, ptr %16, align 8, !tbaa !15
  %183 = add i64 %181, %182
  %184 = getelementptr inbounds %struct.ComplexFloat, ptr %178, i64 %183
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %184, ptr align 4 %17, i64 8, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  br label %185

185:                                              ; preds = %175
  %186 = load i64, ptr %16, align 8, !tbaa !15
  %187 = add i64 %186, 1
  store i64 %187, ptr %16, align 8, !tbaa !15
  br label %143, !llvm.loop !25

188:                                              ; preds = %147
  br label %189

189:                                              ; preds = %188
  %190 = load i64, ptr %15, align 8, !tbaa !15
  %191 = add i64 %190, 1
  store i64 %191, ptr %15, align 8, !tbaa !15
  br label %136, !llvm.loop !26

192:                                              ; preds = %140
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  br label %193

193:                                              ; preds = %192
  %194 = load i64, ptr %12, align 8, !tbaa !15
  %195 = add i64 %194, 32
  store i64 %195, ptr %12, align 8, !tbaa !15
  br label %85, !llvm.loop !27

196:                                              ; preds = %89
  br label %197

197:                                              ; preds = %196
  %198 = load i64, ptr %10, align 8, !tbaa !15
  %199 = add i64 %198, 32
  store i64 %199, ptr %10, align 8, !tbaa !15
  br label %79, !llvm.loop !28

200:                                              ; preds = %83
  store i32 0, ptr %4, align 4
  store i32 1, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #6
  br label %201

201:                                              ; preds = %200, %67, %33, %29, %25
  %202 = load i32, ptr %4, align 4
  ret i32 %202
}

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_add(<2 x float>, <2 x float>) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite) }
attributes #3 = { inlinehint nounwind uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind uwtable "min-legal-vector-width"="64" "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 nounwind willreturn memory(argmem: write) }
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/C++ TBAA"}
!9 = !{!10, !12, i64 16}
!10 = !{!"quantum_geometric_tensor_t", !11, i64 0, !6, i64 8, !12, i64 16, !6, i64 24, !6, i64 32, !13, i64 40, !13, i64 41, !13, i64 42, !11, i64 44, !12, i64 48, !12, i64 56}
!11 = !{!"int", !7, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{!10, !6, i64 8}
!15 = !{!12, !12, i64 0}
!16 = !{!17, !12, i64 8}
!17 = !{!"quantum_geometric_metric_t", !11, i64 0, !12, i64 8, !6, i64 16, !13, i64 24, !6, i64 32, !11, i64 40}
!18 = !{!17, !6, i64 16}
!19 = !{!10, !6, i64 24}
!20 = !{i64 0, i64 4, !21, i64 4, i64 4, !21}
!21 = !{!22, !22, i64 0}
!22 = !{!"float", !7, i64 0}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = distinct !{!25, !24}
!26 = distinct !{!26, !24}
!27 = distinct !{!27, !24}
!28 = distinct !{!28, !24}


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

%struct.ComplexFloat = type { float, float }

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @llvm.prefetch.p0(ptr nocapture readonly, i32 immarg, i32 immarg, i32 immarg) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_conjugate(<2 x float>) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_multiply(<2 x float>, <2 x float>) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local range(i32 -1, 1) i32 @geometric_transform_metric(ptr noundef readonly %0, ptr noundef readonly %1, ptr noundef readonly %2) local_unnamed_addr #2 {
  %4 = icmp eq ptr %0, null
  %5 = icmp eq ptr %1, null
  %or.cond = or i1 %4, %5
  %6 = icmp eq ptr %2, null
  %or.cond72 = or i1 %or.cond, %6
  br i1 %or.cond72, label %.loopexit75, label %7

7:                                                ; preds = %3
  %8 = getelementptr inbounds i8, ptr %2, i64 16
  %9 = load i64, ptr %8, align 8, !tbaa !5
  %.not = icmp eq i64 %9, 2
  br i1 %.not, label %10, label %.loopexit75

10:                                               ; preds = %7
  %11 = getelementptr inbounds i8, ptr %2, i64 8
  %12 = load ptr, ptr %11, align 8, !tbaa !13
  %13 = load i64, ptr %12, align 8, !tbaa !14
  %14 = getelementptr inbounds i8, ptr %1, i64 8
  %15 = load i64, ptr %14, align 8, !tbaa !15
  %.not69 = icmp eq i64 %13, %15
  br i1 %.not69, label %16, label %.loopexit75

16:                                               ; preds = %10
  %17 = getelementptr inbounds i8, ptr %12, i64 8
  %18 = load i64, ptr %17, align 8, !tbaa !14
  %.not70 = icmp eq i64 %18, %13
  br i1 %.not70, label %19, label %.loopexit75

19:                                               ; preds = %16
  %20 = getelementptr inbounds i8, ptr %0, i64 8
  %21 = load i64, ptr %20, align 8, !tbaa !15
  %.not71 = icmp eq i64 %21, %13
  br i1 %.not71, label %22, label %.loopexit75

22:                                               ; preds = %19
  %23 = getelementptr inbounds i8, ptr %0, i64 16
  %24 = load ptr, ptr %23, align 8, !tbaa !17
  %25 = shl i64 %13, 3
  %26 = mul i64 %25, %13
  tail call void @llvm.memset.p0.i64(ptr align 4 %24, i8 0, i64 %26, i1 false)
  %.not94 = icmp eq i64 %13, 0
  br i1 %.not94, label %.loopexit75, label %.preheader74.lr.ph

.preheader74.lr.ph:                               ; preds = %22
  %27 = getelementptr inbounds i8, ptr %2, i64 24
  %28 = getelementptr inbounds i8, ptr %1, i64 16
  br label %.preheader74

.preheader74:                                     ; preds = %.preheader74.lr.ph, %.split.us
  %.05993 = phi i64 [ 0, %.preheader74.lr.ph ], [ %29, %.split.us ]
  %29 = add i64 %.05993, 32
  %30 = icmp ult i64 %29, %13
  %31 = tail call i64 @llvm.umin.i64(i64 %29, i64 %13)
  %32 = icmp ult i64 %.05993, %31
  %33 = mul i64 %29, %13
  br i1 %32, label %.preheader74.split.us, label %.preheader74.split

.preheader74.split.us:                            ; preds = %.preheader74, %..loopexit_crit_edge.us
  %.06183.us = phi i64 [ %34, %..loopexit_crit_edge.us ], [ 0, %.preheader74 ]
  %34 = add i64 %.06183.us, 32
  %35 = tail call i64 @llvm.umin.i64(i64 %34, i64 %13)
  br i1 %30, label %36, label %.preheader73.lr.ph.us

36:                                               ; preds = %.preheader74.split.us
  %37 = load ptr, ptr %27, align 8, !tbaa !18
  %38 = getelementptr inbounds %struct.ComplexFloat, ptr %37, i64 %33
  tail call void @llvm.prefetch.p0(ptr %38, i32 0, i32 3, i32 1)
  %39 = load ptr, ptr %28, align 8, !tbaa !17
  %40 = getelementptr inbounds %struct.ComplexFloat, ptr %39, i64 %33
  tail call void @llvm.prefetch.p0(ptr %40, i32 0, i32 3, i32 1)
  br label %.preheader73.lr.ph.us

.preheader73.lr.ph.us:                            ; preds = %36, %.preheader74.split.us
  %41 = icmp ult i64 %.06183.us, %35
  br i1 %41, label %.preheader73.us.us, label %..loopexit_crit_edge.us

..loopexit_crit_edge.us:                          ; preds = %._crit_edge.us.us, %.preheader73.lr.ph.us
  %42 = icmp ult i64 %34, %13
  br i1 %42, label %.preheader74.split.us, label %.split.us, !llvm.loop !19

.preheader73.us.us:                               ; preds = %.preheader73.lr.ph.us, %._crit_edge.us.us
  %.06379.us.us = phi i64 [ %60, %._crit_edge.us.us ], [ %.05993, %.preheader73.lr.ph.us ]
  %43 = mul i64 %.06379.us.us, %13
  br label %.preheader.us.us

44:                                               ; preds = %50
  %45 = load ptr, ptr %23, align 8, !tbaa !17
  %46 = getelementptr %struct.ComplexFloat, ptr %45, i64 %43
  %47 = getelementptr %struct.ComplexFloat, ptr %46, i64 %.06278.us.us
  store <2 x float> %58, ptr %47, align 4
  %48 = add nuw i64 %.06278.us.us, 1
  %49 = icmp ult i64 %48, %35
  br i1 %49, label %.preheader.us.us, label %._crit_edge.us.us, !llvm.loop !21

50:                                               ; preds = %.preheader.us.us, %50
  %.06077.us.us = phi i64 [ 0, %.preheader.us.us ], [ %59, %50 ]
  %.sroa.06.476.us.us = phi <2 x float> [ zeroinitializer, %.preheader.us.us ], [ %58, %50 ]
  %51 = load ptr, ptr %27, align 8, !tbaa !18
  %52 = mul i64 %.06077.us.us, %13
  %53 = getelementptr %struct.ComplexFloat, ptr %51, i64 %52
  %54 = getelementptr %struct.ComplexFloat, ptr %53, i64 %.06379.us.us
  %55 = load <2 x float>, ptr %54, align 4
  %56 = tail call <2 x float> @complex_float_conjugate(<2 x float> %55)
  %57 = tail call <2 x float> @complex_float_multiply(<2 x float> %56, <2 x float> zeroinitializer)
  %58 = tail call <2 x float> @complex_float_add(<2 x float> %.sroa.06.476.us.us, <2 x float> %57)
  %59 = add nuw i64 %.06077.us.us, 1
  %exitcond.not = icmp eq i64 %59, %13
  br i1 %exitcond.not, label %44, label %50, !llvm.loop !22

.preheader.us.us:                                 ; preds = %44, %.preheader73.us.us
  %.06278.us.us = phi i64 [ %.06183.us, %.preheader73.us.us ], [ %48, %44 ]
  br label %50

._crit_edge.us.us:                                ; preds = %44
  %60 = add nuw i64 %.06379.us.us, 1
  %61 = icmp ult i64 %60, %31
  br i1 %61, label %.preheader73.us.us, label %..loopexit_crit_edge.us, !llvm.loop !23

.preheader74.split:                               ; preds = %.preheader74
  br i1 %30, label %.preheader74.split.split.us, label %.loopexit75

.preheader74.split.split.us:                      ; preds = %.preheader74.split
  %62 = load ptr, ptr %27, align 8, !tbaa !18
  %63 = getelementptr inbounds %struct.ComplexFloat, ptr %62, i64 %33
  %64 = load ptr, ptr %28, align 8, !tbaa !17
  %65 = getelementptr inbounds %struct.ComplexFloat, ptr %64, i64 %33
  br label %.loopexit.us90

.loopexit.us90:                                   ; preds = %.loopexit.us90, %.preheader74.split.split.us
  %.06183.us89 = phi i64 [ 0, %.preheader74.split.split.us ], [ %66, %.loopexit.us90 ]
  %66 = add i64 %.06183.us89, 32
  tail call void @llvm.prefetch.p0(ptr %63, i32 0, i32 3, i32 1)
  tail call void @llvm.prefetch.p0(ptr %65, i32 0, i32 3, i32 1)
  %67 = icmp ult i64 %66, %13
  br i1 %67, label %.loopexit.us90, label %.split.us, !llvm.loop !19

.split.us:                                        ; preds = %.loopexit.us90, %..loopexit_crit_edge.us
  br i1 %30, label %.preheader74, label %.loopexit75, !llvm.loop !24

.loopexit75:                                      ; preds = %.preheader74.split, %.split.us, %22, %7, %10, %16, %19, %3
  %.0 = phi i32 [ -1, %3 ], [ -1, %19 ], [ -1, %16 ], [ -1, %10 ], [ -1, %7 ], [ 0, %22 ], [ 0, %.split.us ], [ 0, %.preheader74.split ]
  ret i32 %.0
}

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @complex_float_add(<2 x float>, <2 x float>) local_unnamed_addr #1

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

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

!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, !11, i64 16}
!6 = !{!"quantum_geometric_tensor_t", !7, i64 0, !10, i64 8, !11, i64 16, !10, i64 24, !10, i64 32, !12, i64 40, !12, i64 41, !12, i64 42, !7, i64 44, !11, i64 48, !11, i64 56}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"long", !8, i64 0}
!12 = !{!"_Bool", !8, i64 0}
!13 = !{!6, !10, i64 8}
!14 = !{!11, !11, i64 0}
!15 = !{!16, !11, i64 8}
!16 = !{!"quantum_geometric_metric_t", !7, i64 0, !11, i64 8, !10, i64 16, !12, i64 24, !10, i64 32, !7, i64 40}
!17 = !{!16, !10, i64 16}
!18 = !{!6, !10, i64 24}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = distinct !{!21, !20}
!22 = distinct !{!22, !20}
!23 = distinct !{!23, !20}
!24 = distinct !{!24, !20}


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