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

; 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.quantum_geometric_tensor_t = type { i32, ptr, i64, ptr, ptr, i8, i8, i8, i32, i64, i64 }
%struct.ComplexFloat = type { float, float }

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

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

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

21:                                               ; preds = %1
  store i32 -1, ptr %2, align 4
  br label %238

22:                                               ; preds = %1
  %23 = load ptr, ptr %3, align 8, !tbaa !5
  %24 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %23, i32 0, i32 3
  %25 = load ptr, ptr %24, align 8, !tbaa !9
  %26 = icmp eq ptr %25, null
  br i1 %26, label %27, label %28

27:                                               ; preds = %22
  store i32 -1, ptr %2, align 4
  br label %238

28:                                               ; preds = %22
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #5
  store ptr null, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #5
  %29 = call i32 @qrng_init(ptr noundef %4, ptr noundef null, i64 noundef 0)
  store i32 %29, ptr %5, align 4, !tbaa !14
  %30 = load i32, ptr %5, align 4, !tbaa !14
  %31 = icmp eq i32 %30, 1
  br i1 %31, label %32, label %33

32:                                               ; preds = %28
  store i32 -18, ptr %2, align 4
  store i32 1, ptr %6, align 4
  br label %237

33:                                               ; preds = %28
  %34 = load i32, ptr %5, align 4, !tbaa !14
  %35 = icmp eq i32 %34, 2
  br i1 %35, label %36, label %37

36:                                               ; preds = %33
  store i32 -1, ptr %2, align 4
  store i32 1, ptr %6, align 4
  br label %237

37:                                               ; preds = %33
  %38 = load i32, ptr %5, align 4, !tbaa !14
  %39 = icmp eq i32 %38, 4
  br i1 %39, label %40, label %41

40:                                               ; preds = %37
  store i32 -27, ptr %2, align 4
  store i32 1, ptr %6, align 4
  br label %237

41:                                               ; preds = %37
  %42 = load i32, ptr %5, align 4, !tbaa !14
  %43 = icmp eq i32 %42, 3
  br i1 %43, label %44, label %45

44:                                               ; preds = %41
  store i32 -22, ptr %2, align 4
  store i32 1, ptr %6, align 4
  br label %237

45:                                               ; preds = %41
  %46 = load i32, ptr %5, align 4, !tbaa !14
  %47 = icmp eq i32 %46, 5
  br i1 %47, label %48, label %49

48:                                               ; preds = %45
  store i32 -1, ptr %2, align 4
  store i32 1, ptr %6, align 4
  br label %237

49:                                               ; preds = %45
  %50 = load i32, ptr %5, align 4, !tbaa !14
  %51 = icmp ne i32 %50, 0
  br i1 %51, label %52, label %53

52:                                               ; preds = %49
  store i32 -26, ptr %2, align 4
  store i32 1, ptr %6, align 4
  br label %237

53:                                               ; preds = %49
  br label %54

54:                                               ; preds = %53
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55
  br label %57

57:                                               ; preds = %56
  br label %58

58:                                               ; preds = %57
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #5
  %59 = load ptr, ptr %3, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %59, i32 0, i32 3
  %61 = load ptr, ptr %60, align 8, !tbaa !9
  store ptr %61, ptr %7, align 8, !tbaa !5
  %62 = load ptr, ptr %3, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %62, i32 0, i32 0
  %64 = load i32, ptr %63, align 8, !tbaa !15
  %65 = icmp eq i32 %64, 6
  br i1 %65, label %66, label %187

66:                                               ; preds = %58
  %67 = load ptr, ptr %3, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %67, i32 0, i32 2
  %69 = load i64, ptr %68, align 8, !tbaa !16
  %70 = icmp eq i64 %69, 2
  br i1 %70, label %71, label %187

71:                                               ; preds = %66
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  %72 = load ptr, ptr %3, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %72, i32 0, i32 1
  %74 = load ptr, ptr %73, align 8, !tbaa !17
  %75 = getelementptr inbounds i64, ptr %74, i64 0
  %76 = load i64, ptr %75, align 8, !tbaa !18
  store i64 %76, ptr %8, align 8, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  store i64 0, ptr %9, align 8, !tbaa !18
  br label %77

77:                                               ; preds = %183, %71
  %78 = load i64, ptr %9, align 8, !tbaa !18
  %79 = load i64, ptr %8, align 8, !tbaa !18
  %80 = icmp ult i64 %78, %79
  br i1 %80, label %82, label %81

81:                                               ; preds = %77
  store i32 2, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  br label %186

82:                                               ; preds = %77
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  %83 = load i64, ptr %9, align 8, !tbaa !18
  store i64 %83, ptr %10, align 8, !tbaa !18
  br label %84

84:                                               ; preds = %179, %82
  %85 = load i64, ptr %10, align 8, !tbaa !18
  %86 = load i64, ptr %8, align 8, !tbaa !18
  %87 = icmp ult i64 %85, %86
  br i1 %87, label %89, label %88

88:                                               ; preds = %84
  store i32 5, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  br label %182

89:                                               ; preds = %84
  %90 = load i64, ptr %9, align 8, !tbaa !18
  %91 = load i64, ptr %10, align 8, !tbaa !18
  %92 = icmp eq i64 %90, %91
  br i1 %92, label %93, label %115

93:                                               ; preds = %89
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  %94 = load ptr, ptr %4, align 8, !tbaa !5
  %95 = call double @qrng_double(ptr noundef %94)
  %96 = fptrunc double %95 to float
  %97 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %96, float -1.000000e+00)
  store float %97, ptr %11, align 4, !tbaa !19
  %98 = load float, ptr %11, align 4, !tbaa !19
  %99 = load ptr, ptr %7, align 8, !tbaa !5
  %100 = load i64, ptr %9, align 8, !tbaa !18
  %101 = load i64, ptr %8, align 8, !tbaa !18
  %102 = mul i64 %100, %101
  %103 = load i64, ptr %9, align 8, !tbaa !18
  %104 = add i64 %102, %103
  %105 = getelementptr inbounds %struct.ComplexFloat, ptr %99, i64 %104
  %106 = getelementptr inbounds %struct.ComplexFloat, ptr %105, i32 0, i32 0
  store float %98, ptr %106, align 4, !tbaa !21
  %107 = load ptr, ptr %7, align 8, !tbaa !5
  %108 = load i64, ptr %9, align 8, !tbaa !18
  %109 = load i64, ptr %8, align 8, !tbaa !18
  %110 = mul i64 %108, %109
  %111 = load i64, ptr %9, align 8, !tbaa !18
  %112 = add i64 %110, %111
  %113 = getelementptr inbounds %struct.ComplexFloat, ptr %107, i64 %112
  %114 = getelementptr inbounds %struct.ComplexFloat, ptr %113, i32 0, i32 1
  store float 0.000000e+00, ptr %114, align 4, !tbaa !23
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  br label %178

115:                                              ; preds = %89
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  %116 = load ptr, ptr %4, align 8, !tbaa !5
  %117 = call double @qrng_double(ptr noundef %116)
  %118 = fptrunc double %117 to float
  %119 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %118, float -1.000000e+00)
  store float %119, ptr %12, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  %120 = load ptr, ptr %4, align 8, !tbaa !5
  %121 = call double @qrng_double(ptr noundef %120)
  %122 = fptrunc double %121 to float
  %123 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %122, float -1.000000e+00)
  store float %123, ptr %13, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  %124 = load float, ptr %12, align 4, !tbaa !19
  %125 = load float, ptr %12, align 4, !tbaa !19
  %126 = load float, ptr %13, align 4, !tbaa !19
  %127 = load float, ptr %13, align 4, !tbaa !19
  %128 = fmul float %126, %127
  %129 = call float @llvm.fmuladd.f32(float %124, float %125, float %128)
  %130 = call float @sqrtf(float noundef %129) #5
  store float %130, ptr %14, align 4, !tbaa !19
  %131 = load float, ptr %14, align 4, !tbaa !19
  %132 = fcmp ogt float %131, 0.000000e+00
  br i1 %132, label %133, label %140

133:                                              ; preds = %115
  %134 = load float, ptr %14, align 4, !tbaa !19
  %135 = load float, ptr %12, align 4, !tbaa !19
  %136 = fdiv float %135, %134
  store float %136, ptr %12, align 4, !tbaa !19
  %137 = load float, ptr %14, align 4, !tbaa !19
  %138 = load float, ptr %13, align 4, !tbaa !19
  %139 = fdiv float %138, %137
  store float %139, ptr %13, align 4, !tbaa !19
  br label %140

140:                                              ; preds = %133, %115
  %141 = load float, ptr %12, align 4, !tbaa !19
  %142 = load ptr, ptr %7, align 8, !tbaa !5
  %143 = load i64, ptr %9, align 8, !tbaa !18
  %144 = load i64, ptr %8, align 8, !tbaa !18
  %145 = mul i64 %143, %144
  %146 = load i64, ptr %10, align 8, !tbaa !18
  %147 = add i64 %145, %146
  %148 = getelementptr inbounds %struct.ComplexFloat, ptr %142, i64 %147
  %149 = getelementptr inbounds %struct.ComplexFloat, ptr %148, i32 0, i32 0
  store float %141, ptr %149, align 4, !tbaa !21
  %150 = load float, ptr %13, align 4, !tbaa !19
  %151 = load ptr, ptr %7, align 8, !tbaa !5
  %152 = load i64, ptr %9, align 8, !tbaa !18
  %153 = load i64, ptr %8, align 8, !tbaa !18
  %154 = mul i64 %152, %153
  %155 = load i64, ptr %10, align 8, !tbaa !18
  %156 = add i64 %154, %155
  %157 = getelementptr inbounds %struct.ComplexFloat, ptr %151, i64 %156
  %158 = getelementptr inbounds %struct.ComplexFloat, ptr %157, i32 0, i32 1
  store float %150, ptr %158, align 4, !tbaa !23
  %159 = load float, ptr %12, align 4, !tbaa !19
  %160 = load ptr, ptr %7, align 8, !tbaa !5
  %161 = load i64, ptr %10, align 8, !tbaa !18
  %162 = load i64, ptr %8, align 8, !tbaa !18
  %163 = mul i64 %161, %162
  %164 = load i64, ptr %9, align 8, !tbaa !18
  %165 = add i64 %163, %164
  %166 = getelementptr inbounds %struct.ComplexFloat, ptr %160, i64 %165
  %167 = getelementptr inbounds %struct.ComplexFloat, ptr %166, i32 0, i32 0
  store float %159, ptr %167, align 4, !tbaa !21
  %168 = load float, ptr %13, align 4, !tbaa !19
  %169 = fneg float %168
  %170 = load ptr, ptr %7, align 8, !tbaa !5
  %171 = load i64, ptr %10, align 8, !tbaa !18
  %172 = load i64, ptr %8, align 8, !tbaa !18
  %173 = mul i64 %171, %172
  %174 = load i64, ptr %9, align 8, !tbaa !18
  %175 = add i64 %173, %174
  %176 = getelementptr inbounds %struct.ComplexFloat, ptr %170, i64 %175
  %177 = getelementptr inbounds %struct.ComplexFloat, ptr %176, i32 0, i32 1
  store float %169, ptr %177, align 4, !tbaa !23
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  br label %178

178:                                              ; preds = %140, %93
  br label %179

179:                                              ; preds = %178
  %180 = load i64, ptr %10, align 8, !tbaa !18
  %181 = add i64 %180, 1
  store i64 %181, ptr %10, align 8, !tbaa !18
  br label %84, !llvm.loop !24

182:                                              ; preds = %88
  br label %183

183:                                              ; preds = %182
  %184 = load i64, ptr %9, align 8, !tbaa !18
  %185 = add i64 %184, 1
  store i64 %185, ptr %9, align 8, !tbaa !18
  br label %77, !llvm.loop !26

186:                                              ; preds = %81
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  br label %235

187:                                              ; preds = %66, %58
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  store i64 0, ptr %15, align 8, !tbaa !18
  br label %188

188:                                              ; preds = %231, %187
  %189 = load i64, ptr %15, align 8, !tbaa !18
  %190 = load ptr, ptr %3, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.quantum_geometric_tensor_t, ptr %190, i32 0, i32 9
  %192 = load i64, ptr %191, align 8, !tbaa !27
  %193 = icmp ult i64 %189, %192
  br i1 %193, label %195, label %194

194:                                              ; preds = %188
  store i32 8, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  br label %234

195:                                              ; preds = %188
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  %196 = load ptr, ptr %4, align 8, !tbaa !5
  %197 = call double @qrng_double(ptr noundef %196)
  %198 = fptrunc double %197 to float
  %199 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %198, float -1.000000e+00)
  store float %199, ptr %16, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #5
  %200 = load ptr, ptr %4, align 8, !tbaa !5
  %201 = call double @qrng_double(ptr noundef %200)
  %202 = fptrunc double %201 to float
  %203 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %202, float -1.000000e+00)
  store float %203, ptr %17, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  %204 = load float, ptr %16, align 4, !tbaa !19
  %205 = load float, ptr %16, align 4, !tbaa !19
  %206 = load float, ptr %17, align 4, !tbaa !19
  %207 = load float, ptr %17, align 4, !tbaa !19
  %208 = fmul float %206, %207
  %209 = call float @llvm.fmuladd.f32(float %204, float %205, float %208)
  %210 = call float @sqrtf(float noundef %209) #5
  store float %210, ptr %18, align 4, !tbaa !19
  %211 = load float, ptr %18, align 4, !tbaa !19
  %212 = fcmp ogt float %211, 0.000000e+00
  br i1 %212, label %213, label %220

213:                                              ; preds = %195
  %214 = load float, ptr %18, align 4, !tbaa !19
  %215 = load float, ptr %16, align 4, !tbaa !19
  %216 = fdiv float %215, %214
  store float %216, ptr %16, align 4, !tbaa !19
  %217 = load float, ptr %18, align 4, !tbaa !19
  %218 = load float, ptr %17, align 4, !tbaa !19
  %219 = fdiv float %218, %217
  store float %219, ptr %17, align 4, !tbaa !19
  br label %220

220:                                              ; preds = %213, %195
  %221 = load float, ptr %16, align 4, !tbaa !19
  %222 = load ptr, ptr %7, align 8, !tbaa !5
  %223 = load i64, ptr %15, align 8, !tbaa !18
  %224 = getelementptr inbounds %struct.ComplexFloat, ptr %222, i64 %223
  %225 = getelementptr inbounds %struct.ComplexFloat, ptr %224, i32 0, i32 0
  store float %221, ptr %225, align 4, !tbaa !21
  %226 = load float, ptr %17, align 4, !tbaa !19
  %227 = load ptr, ptr %7, align 8, !tbaa !5
  %228 = load i64, ptr %15, align 8, !tbaa !18
  %229 = getelementptr inbounds %struct.ComplexFloat, ptr %227, i64 %228
  %230 = getelementptr inbounds %struct.ComplexFloat, ptr %229, i32 0, i32 1
  store float %226, ptr %230, align 4, !tbaa !23
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  br label %231

231:                                              ; preds = %220
  %232 = load i64, ptr %15, align 8, !tbaa !18
  %233 = add i64 %232, 1
  store i64 %233, ptr %15, align 8, !tbaa !18
  br label %188, !llvm.loop !28

234:                                              ; preds = %194
  br label %235

235:                                              ; preds = %234, %186
  %236 = load ptr, ptr %4, align 8, !tbaa !5
  call void @qrng_free(ptr noundef %236)
  store i32 0, ptr %2, align 4
  store i32 1, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #5
  br label %237

237:                                              ; preds = %235, %52, %48, %44, %40, %36, %32
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #5
  br label %238

238:                                              ; preds = %237, %27, %21
  %239 = load i32, ptr %2, align 4
  ret i32 %239
}

declare i32 @qrng_init(ptr noundef, ptr noundef, i64 noundef) #2

declare double @qrng_double(ptr noundef) #2

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

; Function Attrs: nounwind
declare float @sqrtf(float noundef) #4

declare void @qrng_free(ptr noundef) #2

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


; 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)
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: nounwind uwtable
define dso_local range(i32 -27, 1) i32 @geometric_tensor_initialize_random(ptr noundef readonly %0) local_unnamed_addr #1 {
  %2 = alloca ptr, align 8
  %3 = icmp eq ptr %0, null
  br i1 %3, label %94, label %4

4:                                                ; preds = %1
  %5 = getelementptr inbounds i8, ptr %0, i64 24
  %6 = load ptr, ptr %5, align 8, !tbaa !5
  %7 = icmp eq ptr %6, null
  br i1 %7, label %94, label %8

8:                                                ; preds = %4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2) #5
  store ptr null, ptr %2, align 8, !tbaa !13
  %9 = call i32 @qrng_init(ptr noundef nonnull %2, ptr noundef null, i64 noundef 0) #5
  switch i32 %9, label %14 [
    i32 1, label %93
    i32 2, label %10
    i32 4, label %11
    i32 3, label %12
    i32 5, label %13
    i32 0, label %15
  ]

10:                                               ; preds = %8
  br label %93

11:                                               ; preds = %8
  br label %93

12:                                               ; preds = %8
  br label %93

13:                                               ; preds = %8
  br label %93

14:                                               ; preds = %8
  br label %93

15:                                               ; preds = %8
  %16 = load ptr, ptr %5, align 8, !tbaa !5
  %17 = load i32, ptr %0, align 8, !tbaa !14
  %18 = icmp eq i32 %17, 6
  br i1 %18, label %19, label %66

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

23:                                               ; preds = %19
  %24 = getelementptr inbounds i8, ptr %0, i64 8
  %25 = load ptr, ptr %24, align 8, !tbaa !16
  %26 = load i64, ptr %25, align 8, !tbaa !17
  %.not95 = icmp eq i64 %26, 0
  br i1 %.not95, label %.loopexit, label %.preheader.lr.ph

.preheader.lr.ph:                                 ; preds = %23
  %.08289 = add i64 %26, 1
  br label %.preheader

.preheader:                                       ; preds = %.preheader.lr.ph, %32
  %.08294 = phi i64 [ 0, %.preheader.lr.ph ], [ %33, %32 ]
  %invariant.gep = getelementptr %struct.ComplexFloat, ptr %16, i64 %.08294
  %27 = mul i64 %.08294, %26
  %28 = getelementptr %struct.ComplexFloat, ptr %16, i64 %27
  %29 = mul i64 %.08294, %.08289
  %30 = getelementptr inbounds %struct.ComplexFloat, ptr %16, i64 %29
  %31 = getelementptr inbounds i8, ptr %30, i64 4
  br label %34

32:                                               ; preds = %63
  %33 = add nuw i64 %.08294, 1
  %exitcond.not = icmp eq i64 %33, %26
  br i1 %exitcond.not, label %.loopexit, label %.preheader, !llvm.loop !18

34:                                               ; preds = %.preheader, %63
  %.08393 = phi i64 [ %.08294, %.preheader ], [ %64, %63 ]
  %35 = icmp eq i64 %.08294, %.08393
  %36 = load ptr, ptr %2, align 8, !tbaa !13
  %37 = call double @qrng_double(ptr noundef %36) #5
  %38 = fptrunc double %37 to float
  %39 = call float @llvm.fmuladd.f32(float %38, float 2.000000e+00, float -1.000000e+00)
  br i1 %35, label %40, label %41

40:                                               ; preds = %34
  store float %39, ptr %30, align 4, !tbaa !20
  store float 0.000000e+00, ptr %31, align 4, !tbaa !23
  br label %63

41:                                               ; preds = %34
  %42 = load ptr, ptr %2, align 8, !tbaa !13
  %43 = call double @qrng_double(ptr noundef %42) #5
  %44 = fptrunc double %43 to float
  %45 = call float @llvm.fmuladd.f32(float %44, float 2.000000e+00, float -1.000000e+00)
  %46 = fmul float %45, %45
  %47 = call float @llvm.fmuladd.f32(float %39, float %39, float %46)
  %sqrt = call float @llvm.sqrt.f32(float %47)
  %48 = fcmp ogt float %sqrt, 0.000000e+00
  %49 = getelementptr %struct.ComplexFloat, ptr %28, i64 %.08393
  %50 = insertelement <2 x float> poison, float %39, i64 0
  %51 = insertelement <2 x float> %50, float %45, i64 1
  %52 = insertelement <2 x float> poison, float %sqrt, i64 0
  %53 = shufflevector <2 x float> %52, <2 x float> poison, <2 x i32> zeroinitializer
  %54 = fdiv <2 x float> %51, %53
  %55 = insertelement <2 x i1> poison, i1 %48, i64 0
  %56 = shufflevector <2 x i1> %55, <2 x i1> poison, <2 x i32> zeroinitializer
  %57 = select <2 x i1> %56, <2 x float> %54, <2 x float> %51
  store <2 x float> %57, ptr %49, align 4, !tbaa !24
  %58 = mul i64 %.08393, %26
  %gep = getelementptr %struct.ComplexFloat, ptr %invariant.gep, i64 %58
  %59 = extractelement <2 x float> %57, i64 0
  store float %59, ptr %gep, align 4, !tbaa !20
  %60 = extractelement <2 x float> %57, i64 1
  %61 = fneg float %60
  %62 = getelementptr inbounds i8, ptr %gep, i64 4
  store float %61, ptr %62, align 4, !tbaa !23
  br label %63

63:                                               ; preds = %40, %41
  %64 = add nuw i64 %.08393, 1
  %65 = icmp ult i64 %64, %26
  br i1 %65, label %34, label %32, !llvm.loop !25

66:                                               ; preds = %19, %15
  %67 = getelementptr inbounds i8, ptr %0, i64 48
  %68 = load i64, ptr %67, align 8, !tbaa !26
  %.not = icmp eq i64 %68, 0
  br i1 %.not, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %66, %.lr.ph
  %.07992 = phi i64 [ %89, %.lr.ph ], [ 0, %66 ]
  %69 = load ptr, ptr %2, align 8, !tbaa !13
  %70 = call double @qrng_double(ptr noundef %69) #5
  %71 = load ptr, ptr %2, align 8, !tbaa !13
  %72 = call double @qrng_double(ptr noundef %71) #5
  %73 = getelementptr inbounds %struct.ComplexFloat, ptr %16, i64 %.07992
  %74 = insertelement <2 x double> poison, double %70, i64 0
  %75 = insertelement <2 x double> %74, double %72, i64 1
  %76 = fptrunc <2 x double> %75 to <2 x float>
  %77 = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> %76, <2 x float> <float 2.000000e+00, float 2.000000e+00>, <2 x float> <float -1.000000e+00, float -1.000000e+00>)
  %78 = fmul <2 x float> %77, %77
  %79 = extractelement <2 x float> %78, i64 1
  %80 = extractelement <2 x float> %77, i64 0
  %81 = call float @llvm.fmuladd.f32(float %80, float %80, float %79)
  %sqrt90 = call float @llvm.sqrt.f32(float %81)
  %82 = fcmp ogt float %sqrt90, 0.000000e+00
  %83 = insertelement <2 x float> poison, float %sqrt90, i64 0
  %84 = shufflevector <2 x float> %83, <2 x float> poison, <2 x i32> zeroinitializer
  %85 = fdiv <2 x float> %77, %84
  %86 = insertelement <2 x i1> poison, i1 %82, i64 0
  %87 = shufflevector <2 x i1> %86, <2 x i1> poison, <2 x i32> zeroinitializer
  %88 = select <2 x i1> %87, <2 x float> %85, <2 x float> %77
  store <2 x float> %88, ptr %73, align 4, !tbaa !24
  %89 = add nuw i64 %.07992, 1
  %90 = load i64, ptr %67, align 8, !tbaa !26
  %91 = icmp ult i64 %89, %90
  br i1 %91, label %.lr.ph, label %.loopexit, !llvm.loop !27

.loopexit:                                        ; preds = %.lr.ph, %32, %66, %23
  %92 = load ptr, ptr %2, align 8, !tbaa !13
  call void @qrng_free(ptr noundef %92) #5
  br label %93

93:                                               ; preds = %8, %.loopexit, %14, %13, %12, %11, %10
  %.0 = phi i32 [ -1, %10 ], [ -27, %11 ], [ -22, %12 ], [ -1, %13 ], [ -26, %14 ], [ 0, %.loopexit ], [ -18, %8 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #5
  br label %94

94:                                               ; preds = %4, %1, %93
  %.1 = phi i32 [ %.0, %93 ], [ -1, %1 ], [ -1, %4 ]
  ret i32 %.1
}

declare i32 @qrng_init(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #2

declare double @qrng_double(ptr noundef) local_unnamed_addr #2

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

declare void @qrng_free(ptr noundef) local_unnamed_addr #2

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "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 = !{!6, !10, i64 24}
!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 = !{!10, !10, i64 0}
!14 = !{!6, !7, i64 0}
!15 = !{!6, !11, i64 16}
!16 = !{!6, !10, i64 8}
!17 = !{!11, !11, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!21, !22, i64 0}
!21 = !{!"", !22, i64 0, !22, i64 4}
!22 = !{!"float", !8, i64 0}
!23 = !{!21, !22, i64 4}
!24 = !{!22, !22, i64 0}
!25 = distinct !{!25, !19}
!26 = !{!6, !11, i64 48}
!27 = distinct !{!27, !19}


; Effective O3 passes: AggressiveInstCombinePass,CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,VectorCombinePass