; LLVM IR from InsightSoftwareConsortium/ITK :: Modules/ThirdParty/MINC/src/libminc/nifti (nifti1_io)

; 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.mat44 = type { [4 x [4 x float]] }
%struct.mat33 = type { [3 x [3 x 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: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

; Function Attrs: nounwind
declare double @sqrt(double noundef) #2

; Function Attrs: nounwind uwtable
define dso_local void @nifti_mat44_to_quatern(ptr noundef byval(%struct.mat44) align 8 %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7, ptr noundef %8, ptr noundef %9, ptr noundef %10) #3 {
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca double, align 8
  %23 = alloca double, align 8
  %24 = alloca double, align 8
  %25 = alloca double, align 8
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca double, align 8
  %29 = alloca double, align 8
  %30 = alloca double, align 8
  %31 = alloca double, align 8
  %32 = alloca double, align 8
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca double, align 8
  %38 = alloca %struct.mat33, align 4
  %39 = alloca %struct.mat33, align 8
  %40 = alloca %struct.mat33, align 4
  store ptr %1, ptr %12, align 8, !tbaa !5
  store ptr %2, ptr %13, align 8, !tbaa !5
  store ptr %3, ptr %14, align 8, !tbaa !5
  store ptr %4, ptr %15, align 8, !tbaa !5
  store ptr %5, ptr %16, align 8, !tbaa !5
  store ptr %6, ptr %17, align 8, !tbaa !5
  store ptr %7, ptr %18, align 8, !tbaa !5
  store ptr %8, ptr %19, align 8, !tbaa !5
  store ptr %9, ptr %20, align 8, !tbaa !5
  store ptr %10, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #5
  call void @llvm.lifetime.start.p0(i64 36, ptr %38) #5
  call void @llvm.lifetime.start.p0(i64 36, ptr %39) #5
  %41 = load ptr, ptr %15, align 8, !tbaa !5
  %42 = icmp ne ptr %41, null
  br i1 %42, label %43, label %49

43:                                               ; preds = %11
  %44 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %45 = getelementptr inbounds [4 x [4 x float]], ptr %44, i64 0, i64 0
  %46 = getelementptr inbounds [4 x float], ptr %45, i64 0, i64 3
  %47 = load float, ptr %46, align 4, !tbaa !9
  %48 = load ptr, ptr %15, align 8, !tbaa !5
  store float %47, ptr %48, align 4, !tbaa !9
  br label %49

49:                                               ; preds = %43, %11
  %50 = load ptr, ptr %16, align 8, !tbaa !5
  %51 = icmp ne ptr %50, null
  br i1 %51, label %52, label %58

52:                                               ; preds = %49
  %53 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %54 = getelementptr inbounds [4 x [4 x float]], ptr %53, i64 0, i64 1
  %55 = getelementptr inbounds [4 x float], ptr %54, i64 0, i64 3
  %56 = load float, ptr %55, align 4, !tbaa !9
  %57 = load ptr, ptr %16, align 8, !tbaa !5
  store float %56, ptr %57, align 4, !tbaa !9
  br label %58

58:                                               ; preds = %52, %49
  %59 = load ptr, ptr %17, align 8, !tbaa !5
  %60 = icmp ne ptr %59, null
  br i1 %60, label %61, label %67

61:                                               ; preds = %58
  %62 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %63 = getelementptr inbounds [4 x [4 x float]], ptr %62, i64 0, i64 2
  %64 = getelementptr inbounds [4 x float], ptr %63, i64 0, i64 3
  %65 = load float, ptr %64, align 4, !tbaa !9
  %66 = load ptr, ptr %17, align 8, !tbaa !5
  store float %65, ptr %66, align 4, !tbaa !9
  br label %67

67:                                               ; preds = %61, %58
  %68 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %69 = getelementptr inbounds [4 x [4 x float]], ptr %68, i64 0, i64 0
  %70 = getelementptr inbounds [4 x float], ptr %69, i64 0, i64 0
  %71 = load float, ptr %70, align 8, !tbaa !9
  %72 = fpext float %71 to double
  store double %72, ptr %22, align 8, !tbaa !11
  %73 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %74 = getelementptr inbounds [4 x [4 x float]], ptr %73, i64 0, i64 0
  %75 = getelementptr inbounds [4 x float], ptr %74, i64 0, i64 1
  %76 = load float, ptr %75, align 4, !tbaa !9
  %77 = fpext float %76 to double
  store double %77, ptr %23, align 8, !tbaa !11
  %78 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %79 = getelementptr inbounds [4 x [4 x float]], ptr %78, i64 0, i64 0
  %80 = getelementptr inbounds [4 x float], ptr %79, i64 0, i64 2
  %81 = load float, ptr %80, align 8, !tbaa !9
  %82 = fpext float %81 to double
  store double %82, ptr %24, align 8, !tbaa !11
  %83 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %84 = getelementptr inbounds [4 x [4 x float]], ptr %83, i64 0, i64 1
  %85 = getelementptr inbounds [4 x float], ptr %84, i64 0, i64 0
  %86 = load float, ptr %85, align 8, !tbaa !9
  %87 = fpext float %86 to double
  store double %87, ptr %25, align 8, !tbaa !11
  %88 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %89 = getelementptr inbounds [4 x [4 x float]], ptr %88, i64 0, i64 1
  %90 = getelementptr inbounds [4 x float], ptr %89, i64 0, i64 1
  %91 = load float, ptr %90, align 4, !tbaa !9
  %92 = fpext float %91 to double
  store double %92, ptr %26, align 8, !tbaa !11
  %93 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %94 = getelementptr inbounds [4 x [4 x float]], ptr %93, i64 0, i64 1
  %95 = getelementptr inbounds [4 x float], ptr %94, i64 0, i64 2
  %96 = load float, ptr %95, align 8, !tbaa !9
  %97 = fpext float %96 to double
  store double %97, ptr %27, align 8, !tbaa !11
  %98 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %99 = getelementptr inbounds [4 x [4 x float]], ptr %98, i64 0, i64 2
  %100 = getelementptr inbounds [4 x float], ptr %99, i64 0, i64 0
  %101 = load float, ptr %100, align 8, !tbaa !9
  %102 = fpext float %101 to double
  store double %102, ptr %28, align 8, !tbaa !11
  %103 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %104 = getelementptr inbounds [4 x [4 x float]], ptr %103, i64 0, i64 2
  %105 = getelementptr inbounds [4 x float], ptr %104, i64 0, i64 1
  %106 = load float, ptr %105, align 4, !tbaa !9
  %107 = fpext float %106 to double
  store double %107, ptr %29, align 8, !tbaa !11
  %108 = getelementptr inbounds %struct.mat44, ptr %0, i32 0, i32 0
  %109 = getelementptr inbounds [4 x [4 x float]], ptr %108, i64 0, i64 2
  %110 = getelementptr inbounds [4 x float], ptr %109, i64 0, i64 2
  %111 = load float, ptr %110, align 8, !tbaa !9
  %112 = fpext float %111 to double
  store double %112, ptr %30, align 8, !tbaa !11
  %113 = load double, ptr %22, align 8, !tbaa !11
  %114 = load double, ptr %22, align 8, !tbaa !11
  %115 = load double, ptr %25, align 8, !tbaa !11
  %116 = load double, ptr %25, align 8, !tbaa !11
  %117 = fmul double %115, %116
  %118 = call double @llvm.fmuladd.f64(double %113, double %114, double %117)
  %119 = load double, ptr %28, align 8, !tbaa !11
  %120 = load double, ptr %28, align 8, !tbaa !11
  %121 = call double @llvm.fmuladd.f64(double %119, double %120, double %118)
  %122 = call double @sqrt(double noundef %121) #5
  store double %122, ptr %31, align 8, !tbaa !11
  %123 = load double, ptr %23, align 8, !tbaa !11
  %124 = load double, ptr %23, align 8, !tbaa !11
  %125 = load double, ptr %26, align 8, !tbaa !11
  %126 = load double, ptr %26, align 8, !tbaa !11
  %127 = fmul double %125, %126
  %128 = call double @llvm.fmuladd.f64(double %123, double %124, double %127)
  %129 = load double, ptr %29, align 8, !tbaa !11
  %130 = load double, ptr %29, align 8, !tbaa !11
  %131 = call double @llvm.fmuladd.f64(double %129, double %130, double %128)
  %132 = call double @sqrt(double noundef %131) #5
  store double %132, ptr %32, align 8, !tbaa !11
  %133 = load double, ptr %24, align 8, !tbaa !11
  %134 = load double, ptr %24, align 8, !tbaa !11
  %135 = load double, ptr %27, align 8, !tbaa !11
  %136 = load double, ptr %27, align 8, !tbaa !11
  %137 = fmul double %135, %136
  %138 = call double @llvm.fmuladd.f64(double %133, double %134, double %137)
  %139 = load double, ptr %30, align 8, !tbaa !11
  %140 = load double, ptr %30, align 8, !tbaa !11
  %141 = call double @llvm.fmuladd.f64(double %139, double %140, double %138)
  %142 = call double @sqrt(double noundef %141) #5
  store double %142, ptr %33, align 8, !tbaa !11
  %143 = load double, ptr %31, align 8, !tbaa !11
  %144 = fpext double %143 to x86_fp80
  %145 = fcmp oeq x86_fp80 %144, 0xK00000000000000000000
  br i1 %145, label %146, label %147

146:                                              ; preds = %67
  store double 1.000000e+00, ptr %22, align 8, !tbaa !11
  store double 0.000000e+00, ptr %28, align 8, !tbaa !11
  store double 0.000000e+00, ptr %25, align 8, !tbaa !11
  store double 1.000000e+00, ptr %31, align 8, !tbaa !11
  br label %147

147:                                              ; preds = %146, %67
  %148 = load double, ptr %32, align 8, !tbaa !11
  %149 = fpext double %148 to x86_fp80
  %150 = fcmp oeq x86_fp80 %149, 0xK00000000000000000000
  br i1 %150, label %151, label %152

151:                                              ; preds = %147
  store double 1.000000e+00, ptr %26, align 8, !tbaa !11
  store double 0.000000e+00, ptr %29, align 8, !tbaa !11
  store double 0.000000e+00, ptr %23, align 8, !tbaa !11
  store double 1.000000e+00, ptr %32, align 8, !tbaa !11
  br label %152

152:                                              ; preds = %151, %147
  %153 = load double, ptr %33, align 8, !tbaa !11
  %154 = fpext double %153 to x86_fp80
  %155 = fcmp oeq x86_fp80 %154, 0xK00000000000000000000
  br i1 %155, label %156, label %157

156:                                              ; preds = %152
  store double 1.000000e+00, ptr %30, align 8, !tbaa !11
  store double 0.000000e+00, ptr %27, align 8, !tbaa !11
  store double 0.000000e+00, ptr %24, align 8, !tbaa !11
  store double 1.000000e+00, ptr %33, align 8, !tbaa !11
  br label %157

157:                                              ; preds = %156, %152
  %158 = load ptr, ptr %18, align 8, !tbaa !5
  %159 = icmp ne ptr %158, null
  br i1 %159, label %160, label %164

160:                                              ; preds = %157
  %161 = load double, ptr %31, align 8, !tbaa !11
  %162 = fptrunc double %161 to float
  %163 = load ptr, ptr %18, align 8, !tbaa !5
  store float %162, ptr %163, align 4, !tbaa !9
  br label %164

164:                                              ; preds = %160, %157
  %165 = load ptr, ptr %19, align 8, !tbaa !5
  %166 = icmp ne ptr %165, null
  br i1 %166, label %167, label %171

167:                                              ; preds = %164
  %168 = load double, ptr %32, align 8, !tbaa !11
  %169 = fptrunc double %168 to float
  %170 = load ptr, ptr %19, align 8, !tbaa !5
  store float %169, ptr %170, align 4, !tbaa !9
  br label %171

171:                                              ; preds = %167, %164
  %172 = load ptr, ptr %20, align 8, !tbaa !5
  %173 = icmp ne ptr %172, null
  br i1 %173, label %174, label %178

174:                                              ; preds = %171
  %175 = load double, ptr %33, align 8, !tbaa !11
  %176 = fptrunc double %175 to float
  %177 = load ptr, ptr %20, align 8, !tbaa !5
  store float %176, ptr %177, align 4, !tbaa !9
  br label %178

178:                                              ; preds = %174, %171
  %179 = load double, ptr %31, align 8, !tbaa !11
  %180 = load double, ptr %22, align 8, !tbaa !11
  %181 = fdiv double %180, %179
  store double %181, ptr %22, align 8, !tbaa !11
  %182 = load double, ptr %31, align 8, !tbaa !11
  %183 = load double, ptr %25, align 8, !tbaa !11
  %184 = fdiv double %183, %182
  store double %184, ptr %25, align 8, !tbaa !11
  %185 = load double, ptr %31, align 8, !tbaa !11
  %186 = load double, ptr %28, align 8, !tbaa !11
  %187 = fdiv double %186, %185
  store double %187, ptr %28, align 8, !tbaa !11
  %188 = load double, ptr %32, align 8, !tbaa !11
  %189 = load double, ptr %23, align 8, !tbaa !11
  %190 = fdiv double %189, %188
  store double %190, ptr %23, align 8, !tbaa !11
  %191 = load double, ptr %32, align 8, !tbaa !11
  %192 = load double, ptr %26, align 8, !tbaa !11
  %193 = fdiv double %192, %191
  store double %193, ptr %26, align 8, !tbaa !11
  %194 = load double, ptr %32, align 8, !tbaa !11
  %195 = load double, ptr %29, align 8, !tbaa !11
  %196 = fdiv double %195, %194
  store double %196, ptr %29, align 8, !tbaa !11
  %197 = load double, ptr %33, align 8, !tbaa !11
  %198 = load double, ptr %24, align 8, !tbaa !11
  %199 = fdiv double %198, %197
  store double %199, ptr %24, align 8, !tbaa !11
  %200 = load double, ptr %33, align 8, !tbaa !11
  %201 = load double, ptr %27, align 8, !tbaa !11
  %202 = fdiv double %201, %200
  store double %202, ptr %27, align 8, !tbaa !11
  %203 = load double, ptr %33, align 8, !tbaa !11
  %204 = load double, ptr %30, align 8, !tbaa !11
  %205 = fdiv double %204, %203
  store double %205, ptr %30, align 8, !tbaa !11
  %206 = load double, ptr %22, align 8, !tbaa !11
  %207 = fptrunc double %206 to float
  %208 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %209 = getelementptr inbounds [3 x [3 x float]], ptr %208, i64 0, i64 0
  %210 = getelementptr inbounds [3 x float], ptr %209, i64 0, i64 0
  store float %207, ptr %210, align 4, !tbaa !9
  %211 = load double, ptr %23, align 8, !tbaa !11
  %212 = fptrunc double %211 to float
  %213 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %214 = getelementptr inbounds [3 x [3 x float]], ptr %213, i64 0, i64 0
  %215 = getelementptr inbounds [3 x float], ptr %214, i64 0, i64 1
  store float %212, ptr %215, align 4, !tbaa !9
  %216 = load double, ptr %24, align 8, !tbaa !11
  %217 = fptrunc double %216 to float
  %218 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %219 = getelementptr inbounds [3 x [3 x float]], ptr %218, i64 0, i64 0
  %220 = getelementptr inbounds [3 x float], ptr %219, i64 0, i64 2
  store float %217, ptr %220, align 4, !tbaa !9
  %221 = load double, ptr %25, align 8, !tbaa !11
  %222 = fptrunc double %221 to float
  %223 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %224 = getelementptr inbounds [3 x [3 x float]], ptr %223, i64 0, i64 1
  %225 = getelementptr inbounds [3 x float], ptr %224, i64 0, i64 0
  store float %222, ptr %225, align 4, !tbaa !9
  %226 = load double, ptr %26, align 8, !tbaa !11
  %227 = fptrunc double %226 to float
  %228 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %229 = getelementptr inbounds [3 x [3 x float]], ptr %228, i64 0, i64 1
  %230 = getelementptr inbounds [3 x float], ptr %229, i64 0, i64 1
  store float %227, ptr %230, align 4, !tbaa !9
  %231 = load double, ptr %27, align 8, !tbaa !11
  %232 = fptrunc double %231 to float
  %233 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %234 = getelementptr inbounds [3 x [3 x float]], ptr %233, i64 0, i64 1
  %235 = getelementptr inbounds [3 x float], ptr %234, i64 0, i64 2
  store float %232, ptr %235, align 4, !tbaa !9
  %236 = load double, ptr %28, align 8, !tbaa !11
  %237 = fptrunc double %236 to float
  %238 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %239 = getelementptr inbounds [3 x [3 x float]], ptr %238, i64 0, i64 2
  %240 = getelementptr inbounds [3 x float], ptr %239, i64 0, i64 0
  store float %237, ptr %240, align 4, !tbaa !9
  %241 = load double, ptr %29, align 8, !tbaa !11
  %242 = fptrunc double %241 to float
  %243 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %244 = getelementptr inbounds [3 x [3 x float]], ptr %243, i64 0, i64 2
  %245 = getelementptr inbounds [3 x float], ptr %244, i64 0, i64 1
  store float %242, ptr %245, align 4, !tbaa !9
  %246 = load double, ptr %30, align 8, !tbaa !11
  %247 = fptrunc double %246 to float
  %248 = getelementptr inbounds %struct.mat33, ptr %39, i32 0, i32 0
  %249 = getelementptr inbounds [3 x [3 x float]], ptr %248, i64 0, i64 2
  %250 = getelementptr inbounds [3 x float], ptr %249, i64 0, i64 2
  store float %247, ptr %250, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 36, ptr %40) #5
  call void @nifti_mat33_polar(ptr dead_on_unwind writable sret(%struct.mat33) align 4 %40, ptr noundef byval(%struct.mat33) align 8 %39)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %38, ptr align 4 %40, i64 36, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.end.p0(i64 36, ptr %40) #5
  %251 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %252 = getelementptr inbounds [3 x [3 x float]], ptr %251, i64 0, i64 0
  %253 = getelementptr inbounds [3 x float], ptr %252, i64 0, i64 0
  %254 = load float, ptr %253, align 4, !tbaa !9
  %255 = fpext float %254 to double
  store double %255, ptr %22, align 8, !tbaa !11
  %256 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %257 = getelementptr inbounds [3 x [3 x float]], ptr %256, i64 0, i64 0
  %258 = getelementptr inbounds [3 x float], ptr %257, i64 0, i64 1
  %259 = load float, ptr %258, align 4, !tbaa !9
  %260 = fpext float %259 to double
  store double %260, ptr %23, align 8, !tbaa !11
  %261 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %262 = getelementptr inbounds [3 x [3 x float]], ptr %261, i64 0, i64 0
  %263 = getelementptr inbounds [3 x float], ptr %262, i64 0, i64 2
  %264 = load float, ptr %263, align 4, !tbaa !9
  %265 = fpext float %264 to double
  store double %265, ptr %24, align 8, !tbaa !11
  %266 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %267 = getelementptr inbounds [3 x [3 x float]], ptr %266, i64 0, i64 1
  %268 = getelementptr inbounds [3 x float], ptr %267, i64 0, i64 0
  %269 = load float, ptr %268, align 4, !tbaa !9
  %270 = fpext float %269 to double
  store double %270, ptr %25, align 8, !tbaa !11
  %271 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %272 = getelementptr inbounds [3 x [3 x float]], ptr %271, i64 0, i64 1
  %273 = getelementptr inbounds [3 x float], ptr %272, i64 0, i64 1
  %274 = load float, ptr %273, align 4, !tbaa !9
  %275 = fpext float %274 to double
  store double %275, ptr %26, align 8, !tbaa !11
  %276 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %277 = getelementptr inbounds [3 x [3 x float]], ptr %276, i64 0, i64 1
  %278 = getelementptr inbounds [3 x float], ptr %277, i64 0, i64 2
  %279 = load float, ptr %278, align 4, !tbaa !9
  %280 = fpext float %279 to double
  store double %280, ptr %27, align 8, !tbaa !11
  %281 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %282 = getelementptr inbounds [3 x [3 x float]], ptr %281, i64 0, i64 2
  %283 = getelementptr inbounds [3 x float], ptr %282, i64 0, i64 0
  %284 = load float, ptr %283, align 4, !tbaa !9
  %285 = fpext float %284 to double
  store double %285, ptr %28, align 8, !tbaa !11
  %286 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %287 = getelementptr inbounds [3 x [3 x float]], ptr %286, i64 0, i64 2
  %288 = getelementptr inbounds [3 x float], ptr %287, i64 0, i64 1
  %289 = load float, ptr %288, align 4, !tbaa !9
  %290 = fpext float %289 to double
  store double %290, ptr %29, align 8, !tbaa !11
  %291 = getelementptr inbounds %struct.mat33, ptr %38, i32 0, i32 0
  %292 = getelementptr inbounds [3 x [3 x float]], ptr %291, i64 0, i64 2
  %293 = getelementptr inbounds [3 x float], ptr %292, i64 0, i64 2
  %294 = load float, ptr %293, align 4, !tbaa !9
  %295 = fpext float %294 to double
  store double %295, ptr %30, align 8, !tbaa !11
  %296 = load double, ptr %22, align 8, !tbaa !11
  %297 = load double, ptr %26, align 8, !tbaa !11
  %298 = fmul double %296, %297
  %299 = load double, ptr %30, align 8, !tbaa !11
  %300 = load double, ptr %22, align 8, !tbaa !11
  %301 = load double, ptr %29, align 8, !tbaa !11
  %302 = fmul double %300, %301
  %303 = load double, ptr %27, align 8, !tbaa !11
  %304 = fmul double %302, %303
  %305 = fneg double %304
  %306 = call double @llvm.fmuladd.f64(double %298, double %299, double %305)
  %307 = load double, ptr %25, align 8, !tbaa !11
  %308 = load double, ptr %23, align 8, !tbaa !11
  %309 = fmul double %307, %308
  %310 = load double, ptr %30, align 8, !tbaa !11
  %311 = fneg double %309
  %312 = call double @llvm.fmuladd.f64(double %311, double %310, double %306)
  %313 = load double, ptr %25, align 8, !tbaa !11
  %314 = load double, ptr %29, align 8, !tbaa !11
  %315 = fmul double %313, %314
  %316 = load double, ptr %24, align 8, !tbaa !11
  %317 = call double @llvm.fmuladd.f64(double %315, double %316, double %312)
  %318 = load double, ptr %28, align 8, !tbaa !11
  %319 = load double, ptr %23, align 8, !tbaa !11
  %320 = fmul double %318, %319
  %321 = load double, ptr %27, align 8, !tbaa !11
  %322 = call double @llvm.fmuladd.f64(double %320, double %321, double %317)
  %323 = load double, ptr %28, align 8, !tbaa !11
  %324 = load double, ptr %26, align 8, !tbaa !11
  %325 = fmul double %323, %324
  %326 = load double, ptr %24, align 8, !tbaa !11
  %327 = fneg double %325
  %328 = call double @llvm.fmuladd.f64(double %327, double %326, double %322)
  store double %328, ptr %33, align 8, !tbaa !11
  %329 = load double, ptr %33, align 8, !tbaa !11
  %330 = fcmp ogt double %329, 0.000000e+00
  br i1 %330, label %331, label %337

331:                                              ; preds = %178
  %332 = load ptr, ptr %21, align 8, !tbaa !5
  %333 = icmp ne ptr %332, null
  br i1 %333, label %334, label %336

334:                                              ; preds = %331
  %335 = load ptr, ptr %21, align 8, !tbaa !5
  store float 1.000000e+00, ptr %335, align 4, !tbaa !9
  br label %336

336:                                              ; preds = %334, %331
  br label %349

337:                                              ; preds = %178
  %338 = load ptr, ptr %21, align 8, !tbaa !5
  %339 = icmp ne ptr %338, null
  br i1 %339, label %340, label %342

340:                                              ; preds = %337
  %341 = load ptr, ptr %21, align 8, !tbaa !5
  store float -1.000000e+00, ptr %341, align 4, !tbaa !9
  br label %342

342:                                              ; preds = %340, %337
  %343 = load double, ptr %24, align 8, !tbaa !11
  %344 = fneg double %343
  store double %344, ptr %24, align 8, !tbaa !11
  %345 = load double, ptr %27, align 8, !tbaa !11
  %346 = fneg double %345
  store double %346, ptr %27, align 8, !tbaa !11
  %347 = load double, ptr %30, align 8, !tbaa !11
  %348 = fneg double %347
  store double %348, ptr %30, align 8, !tbaa !11
  br label %349

349:                                              ; preds = %342, %336
  %350 = load double, ptr %22, align 8, !tbaa !11
  %351 = load double, ptr %26, align 8, !tbaa !11
  %352 = fadd double %350, %351
  %353 = load double, ptr %30, align 8, !tbaa !11
  %354 = fadd double %352, %353
  %355 = fpext double %354 to x86_fp80
  %356 = fadd x86_fp80 %355, 0xK3FFF8000000000000000
  %357 = fptrunc x86_fp80 %356 to double
  store double %357, ptr %34, align 8, !tbaa !11
  %358 = load double, ptr %34, align 8, !tbaa !11
  %359 = fpext double %358 to x86_fp80
  %360 = fcmp ogt x86_fp80 %359, 0xK3FFE8000000000000000
  br i1 %360, label %361, label %394

361:                                              ; preds = %349
  %362 = load double, ptr %34, align 8, !tbaa !11
  %363 = call double @sqrt(double noundef %362) #5
  %364 = fpext double %363 to x86_fp80
  %365 = fmul x86_fp80 0xK3FFE8000000000000000, %364
  %366 = fptrunc x86_fp80 %365 to double
  store double %366, ptr %34, align 8, !tbaa !11
  %367 = load double, ptr %29, align 8, !tbaa !11
  %368 = load double, ptr %27, align 8, !tbaa !11
  %369 = fsub double %367, %368
  %370 = fpext double %369 to x86_fp80
  %371 = fmul x86_fp80 0xK3FFD8000000000000000, %370
  %372 = load double, ptr %34, align 8, !tbaa !11
  %373 = fpext double %372 to x86_fp80
  %374 = fdiv x86_fp80 %371, %373
  %375 = fptrunc x86_fp80 %374 to double
  store double %375, ptr %35, align 8, !tbaa !11
  %376 = load double, ptr %24, align 8, !tbaa !11
  %377 = load double, ptr %28, align 8, !tbaa !11
  %378 = fsub double %376, %377
  %379 = fpext double %378 to x86_fp80
  %380 = fmul x86_fp80 0xK3FFD8000000000000000, %379
  %381 = load double, ptr %34, align 8, !tbaa !11
  %382 = fpext double %381 to x86_fp80
  %383 = fdiv x86_fp80 %380, %382
  %384 = fptrunc x86_fp80 %383 to double
  store double %384, ptr %36, align 8, !tbaa !11
  %385 = load double, ptr %25, align 8, !tbaa !11
  %386 = load double, ptr %23, align 8, !tbaa !11
  %387 = fsub double %385, %386
  %388 = fpext double %387 to x86_fp80
  %389 = fmul x86_fp80 0xK3FFD8000000000000000, %388
  %390 = load double, ptr %34, align 8, !tbaa !11
  %391 = fpext double %390 to x86_fp80
  %392 = fdiv x86_fp80 %389, %391
  %393 = fptrunc x86_fp80 %392 to double
  store double %393, ptr %37, align 8, !tbaa !11
  br label %532

394:                                              ; preds = %349
  %395 = load double, ptr %22, align 8, !tbaa !11
  %396 = fadd double 1.000000e+00, %395
  %397 = load double, ptr %26, align 8, !tbaa !11
  %398 = load double, ptr %30, align 8, !tbaa !11
  %399 = fadd double %397, %398
  %400 = fsub double %396, %399
  store double %400, ptr %31, align 8, !tbaa !11
  %401 = load double, ptr %26, align 8, !tbaa !11
  %402 = fadd double 1.000000e+00, %401
  %403 = load double, ptr %22, align 8, !tbaa !11
  %404 = load double, ptr %30, align 8, !tbaa !11
  %405 = fadd double %403, %404
  %406 = fsub double %402, %405
  store double %406, ptr %32, align 8, !tbaa !11
  %407 = load double, ptr %30, align 8, !tbaa !11
  %408 = fadd double 1.000000e+00, %407
  %409 = load double, ptr %22, align 8, !tbaa !11
  %410 = load double, ptr %26, align 8, !tbaa !11
  %411 = fadd double %409, %410
  %412 = fsub double %408, %411
  store double %412, ptr %33, align 8, !tbaa !11
  %413 = load double, ptr %31, align 8, !tbaa !11
  %414 = fcmp ogt double %413, 1.000000e+00
  br i1 %414, label %415, label %448

415:                                              ; preds = %394
  %416 = load double, ptr %31, align 8, !tbaa !11
  %417 = call double @sqrt(double noundef %416) #5
  %418 = fpext double %417 to x86_fp80
  %419 = fmul x86_fp80 0xK3FFE8000000000000000, %418
  %420 = fptrunc x86_fp80 %419 to double
  store double %420, ptr %35, align 8, !tbaa !11
  %421 = load double, ptr %23, align 8, !tbaa !11
  %422 = load double, ptr %25, align 8, !tbaa !11
  %423 = fadd double %421, %422
  %424 = fpext double %423 to x86_fp80
  %425 = fmul x86_fp80 0xK3FFD8000000000000000, %424
  %426 = load double, ptr %35, align 8, !tbaa !11
  %427 = fpext double %426 to x86_fp80
  %428 = fdiv x86_fp80 %425, %427
  %429 = fptrunc x86_fp80 %428 to double
  store double %429, ptr %36, align 8, !tbaa !11
  %430 = load double, ptr %24, align 8, !tbaa !11
  %431 = load double, ptr %28, align 8, !tbaa !11
  %432 = fadd double %430, %431
  %433 = fpext double %432 to x86_fp80
  %434 = fmul x86_fp80 0xK3FFD8000000000000000, %433
  %435 = load double, ptr %35, align 8, !tbaa !11
  %436 = fpext double %435 to x86_fp80
  %437 = fdiv x86_fp80 %434, %436
  %438 = fptrunc x86_fp80 %437 to double
  store double %438, ptr %37, align 8, !tbaa !11
  %439 = load double, ptr %29, align 8, !tbaa !11
  %440 = load double, ptr %27, align 8, !tbaa !11
  %441 = fsub double %439, %440
  %442 = fpext double %441 to x86_fp80
  %443 = fmul x86_fp80 0xK3FFD8000000000000000, %442
  %444 = load double, ptr %35, align 8, !tbaa !11
  %445 = fpext double %444 to x86_fp80
  %446 = fdiv x86_fp80 %443, %445
  %447 = fptrunc x86_fp80 %446 to double
  store double %447, ptr %34, align 8, !tbaa !11
  br label %518

448:                                              ; preds = %394
  %449 = load double, ptr %32, align 8, !tbaa !11
  %450 = fcmp ogt double %449, 1.000000e+00
  br i1 %450, label %451, label %484

451:                                              ; preds = %448
  %452 = load double, ptr %32, align 8, !tbaa !11
  %453 = call double @sqrt(double noundef %452) #5
  %454 = fpext double %453 to x86_fp80
  %455 = fmul x86_fp80 0xK3FFE8000000000000000, %454
  %456 = fptrunc x86_fp80 %455 to double
  store double %456, ptr %36, align 8, !tbaa !11
  %457 = load double, ptr %23, align 8, !tbaa !11
  %458 = load double, ptr %25, align 8, !tbaa !11
  %459 = fadd double %457, %458
  %460 = fpext double %459 to x86_fp80
  %461 = fmul x86_fp80 0xK3FFD8000000000000000, %460
  %462 = load double, ptr %36, align 8, !tbaa !11
  %463 = fpext double %462 to x86_fp80
  %464 = fdiv x86_fp80 %461, %463
  %465 = fptrunc x86_fp80 %464 to double
  store double %465, ptr %35, align 8, !tbaa !11
  %466 = load double, ptr %27, align 8, !tbaa !11
  %467 = load double, ptr %29, align 8, !tbaa !11
  %468 = fadd double %466, %467
  %469 = fpext double %468 to x86_fp80
  %470 = fmul x86_fp80 0xK3FFD8000000000000000, %469
  %471 = load double, ptr %36, align 8, !tbaa !11
  %472 = fpext double %471 to x86_fp80
  %473 = fdiv x86_fp80 %470, %472
  %474 = fptrunc x86_fp80 %473 to double
  store double %474, ptr %37, align 8, !tbaa !11
  %475 = load double, ptr %24, align 8, !tbaa !11
  %476 = load double, ptr %28, align 8, !tbaa !11
  %477 = fsub double %475, %476
  %478 = fpext double %477 to x86_fp80
  %479 = fmul x86_fp80 0xK3FFD8000000000000000, %478
  %480 = load double, ptr %36, align 8, !tbaa !11
  %481 = fpext double %480 to x86_fp80
  %482 = fdiv x86_fp80 %479, %481
  %483 = fptrunc x86_fp80 %482 to double
  store double %483, ptr %34, align 8, !tbaa !11
  br label %517

484:                                              ; preds = %448
  %485 = load double, ptr %33, align 8, !tbaa !11
  %486 = call double @sqrt(double noundef %485) #5
  %487 = fpext double %486 to x86_fp80
  %488 = fmul x86_fp80 0xK3FFE8000000000000000, %487
  %489 = fptrunc x86_fp80 %488 to double
  store double %489, ptr %37, align 8, !tbaa !11
  %490 = load double, ptr %24, align 8, !tbaa !11
  %491 = load double, ptr %28, align 8, !tbaa !11
  %492 = fadd double %490, %491
  %493 = fpext double %492 to x86_fp80
  %494 = fmul x86_fp80 0xK3FFD8000000000000000, %493
  %495 = load double, ptr %37, align 8, !tbaa !11
  %496 = fpext double %495 to x86_fp80
  %497 = fdiv x86_fp80 %494, %496
  %498 = fptrunc x86_fp80 %497 to double
  store double %498, ptr %35, align 8, !tbaa !11
  %499 = load double, ptr %27, align 8, !tbaa !11
  %500 = load double, ptr %29, align 8, !tbaa !11
  %501 = fadd double %499, %500
  %502 = fpext double %501 to x86_fp80
  %503 = fmul x86_fp80 0xK3FFD8000000000000000, %502
  %504 = load double, ptr %37, align 8, !tbaa !11
  %505 = fpext double %504 to x86_fp80
  %506 = fdiv x86_fp80 %503, %505
  %507 = fptrunc x86_fp80 %506 to double
  store double %507, ptr %36, align 8, !tbaa !11
  %508 = load double, ptr %25, align 8, !tbaa !11
  %509 = load double, ptr %23, align 8, !tbaa !11
  %510 = fsub double %508, %509
  %511 = fpext double %510 to x86_fp80
  %512 = fmul x86_fp80 0xK3FFD8000000000000000, %511
  %513 = load double, ptr %37, align 8, !tbaa !11
  %514 = fpext double %513 to x86_fp80
  %515 = fdiv x86_fp80 %512, %514
  %516 = fptrunc x86_fp80 %515 to double
  store double %516, ptr %34, align 8, !tbaa !11
  br label %517

517:                                              ; preds = %484, %451
  br label %518

518:                                              ; preds = %517, %415
  %519 = load double, ptr %34, align 8, !tbaa !11
  %520 = fpext double %519 to x86_fp80
  %521 = fcmp olt x86_fp80 %520, 0xK00000000000000000000
  br i1 %521, label %522, label %531

522:                                              ; preds = %518
  %523 = load double, ptr %35, align 8, !tbaa !11
  %524 = fneg double %523
  store double %524, ptr %35, align 8, !tbaa !11
  %525 = load double, ptr %36, align 8, !tbaa !11
  %526 = fneg double %525
  store double %526, ptr %36, align 8, !tbaa !11
  %527 = load double, ptr %37, align 8, !tbaa !11
  %528 = fneg double %527
  store double %528, ptr %37, align 8, !tbaa !11
  %529 = load double, ptr %34, align 8, !tbaa !11
  %530 = fneg double %529
  store double %530, ptr %34, align 8, !tbaa !11
  br label %531

531:                                              ; preds = %522, %518
  br label %532

532:                                              ; preds = %531, %361
  %533 = load ptr, ptr %12, align 8, !tbaa !5
  %534 = icmp ne ptr %533, null
  br i1 %534, label %535, label %539

535:                                              ; preds = %532
  %536 = load double, ptr %35, align 8, !tbaa !11
  %537 = fptrunc double %536 to float
  %538 = load ptr, ptr %12, align 8, !tbaa !5
  store float %537, ptr %538, align 4, !tbaa !9
  br label %539

539:                                              ; preds = %535, %532
  %540 = load ptr, ptr %13, align 8, !tbaa !5
  %541 = icmp ne ptr %540, null
  br i1 %541, label %542, label %546

542:                                              ; preds = %539
  %543 = load double, ptr %36, align 8, !tbaa !11
  %544 = fptrunc double %543 to float
  %545 = load ptr, ptr %13, align 8, !tbaa !5
  store float %544, ptr %545, align 4, !tbaa !9
  br label %546

546:                                              ; preds = %542, %539
  %547 = load ptr, ptr %14, align 8, !tbaa !5
  %548 = icmp ne ptr %547, null
  br i1 %548, label %549, label %553

549:                                              ; preds = %546
  %550 = load double, ptr %37, align 8, !tbaa !11
  %551 = fptrunc double %550 to float
  %552 = load ptr, ptr %14, align 8, !tbaa !5
  store float %551, ptr %552, align 4, !tbaa !9
  br label %553

553:                                              ; preds = %549, %546
  call void @llvm.lifetime.end.p0(i64 36, ptr %39) #5
  call void @llvm.lifetime.end.p0(i64 36, ptr %38) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  ret void
}

; Function Attrs: nounwind uwtable
declare dso_local void @nifti_mat33_polar(ptr dead_on_unwind noalias writable sret(%struct.mat33) align 4, ptr noundef byval(%struct.mat33) align 8) #3

; 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) #4

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { 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 #3 = { 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 #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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, !10, i64 0}
!10 = !{!"float", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{i64 0, i64 36, !14}
!14 = !{!7, !7, i64 0}


; 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.mat44 = type { [4 x [4 x float]] }
%struct.mat33 = type { [3 x [3 x 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: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @sqrt(double noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local void @nifti_mat44_to_quatern(ptr nocapture noundef readonly byval(%struct.mat44) align 8 %0, ptr noundef writeonly %1, ptr noundef writeonly %2, ptr noundef writeonly %3, ptr noundef writeonly %4, ptr noundef writeonly %5, ptr noundef writeonly %6, ptr noundef writeonly %7, ptr noundef writeonly %8, ptr noundef writeonly %9, ptr noundef writeonly %10) local_unnamed_addr #3 {
  %12 = alloca %struct.mat33, align 16
  %13 = alloca %struct.mat33, align 4
  call void @llvm.lifetime.start.p0(i64 36, ptr nonnull %12) #5
  %.not = icmp eq ptr %4, null
  br i1 %.not, label %17, label %14

14:                                               ; preds = %11
  %15 = getelementptr inbounds i8, ptr %0, i64 12
  %16 = load float, ptr %15, align 4, !tbaa !5
  store float %16, ptr %4, align 4, !tbaa !5
  br label %17

17:                                               ; preds = %14, %11
  %.not191 = icmp eq ptr %5, null
  br i1 %.not191, label %21, label %18

18:                                               ; preds = %17
  %19 = getelementptr inbounds i8, ptr %0, i64 28
  %20 = load float, ptr %19, align 4, !tbaa !5
  store float %20, ptr %5, align 4, !tbaa !5
  br label %21

21:                                               ; preds = %18, %17
  %.not192 = icmp eq ptr %6, null
  br i1 %.not192, label %25, label %22

22:                                               ; preds = %21
  %23 = getelementptr inbounds i8, ptr %0, i64 44
  %24 = load float, ptr %23, align 4, !tbaa !5
  store float %24, ptr %6, align 4, !tbaa !5
  br label %25

25:                                               ; preds = %22, %21
  %26 = load float, ptr %0, align 8, !tbaa !5
  %27 = fpext float %26 to double
  %28 = getelementptr inbounds i8, ptr %0, i64 4
  %29 = load float, ptr %28, align 4, !tbaa !5
  %30 = fpext float %29 to double
  %31 = getelementptr inbounds i8, ptr %0, i64 8
  %32 = load float, ptr %31, align 8, !tbaa !5
  %33 = fpext float %32 to double
  %34 = getelementptr inbounds i8, ptr %0, i64 16
  %35 = load float, ptr %34, align 8, !tbaa !5
  %36 = fpext float %35 to double
  %37 = getelementptr inbounds i8, ptr %0, i64 20
  %38 = load float, ptr %37, align 4, !tbaa !5
  %39 = fpext float %38 to double
  %40 = getelementptr inbounds i8, ptr %0, i64 24
  %41 = load float, ptr %40, align 8, !tbaa !5
  %42 = fpext float %41 to double
  %43 = getelementptr inbounds i8, ptr %0, i64 32
  %44 = load float, ptr %43, align 8, !tbaa !5
  %45 = fpext float %44 to double
  %46 = getelementptr inbounds i8, ptr %0, i64 36
  %47 = load float, ptr %46, align 4, !tbaa !5
  %48 = fpext float %47 to double
  %49 = getelementptr inbounds i8, ptr %0, i64 40
  %50 = load float, ptr %49, align 8, !tbaa !5
  %51 = fpext float %50 to double
  %52 = fmul double %36, %36
  %53 = tail call double @llvm.fmuladd.f64(double %27, double %27, double %52)
  %54 = tail call double @llvm.fmuladd.f64(double %45, double %45, double %53)
  %sqrt202 = tail call double @llvm.sqrt.f64(double %54)
  %55 = fmul double %39, %39
  %56 = tail call double @llvm.fmuladd.f64(double %30, double %30, double %55)
  %57 = tail call double @llvm.fmuladd.f64(double %48, double %48, double %56)
  %sqrt201 = tail call double @llvm.sqrt.f64(double %57)
  %58 = fmul double %42, %42
  %59 = tail call double @llvm.fmuladd.f64(double %33, double %33, double %58)
  %60 = tail call double @llvm.fmuladd.f64(double %51, double %51, double %59)
  %sqrt = tail call double @llvm.sqrt.f64(double %60)
  %61 = fcmp oeq double %sqrt202, 0.000000e+00
  br i1 %61, label %62, label %63

62:                                               ; preds = %25
  br label %63

63:                                               ; preds = %62, %25
  %.0177 = phi double [ 1.000000e+00, %62 ], [ %sqrt202, %25 ]
  %.0164 = phi double [ 0.000000e+00, %62 ], [ %45, %25 ]
  %.0160 = phi double [ 0.000000e+00, %62 ], [ %36, %25 ]
  %.0 = phi double [ 1.000000e+00, %62 ], [ %27, %25 ]
  %64 = fcmp oeq double %sqrt201, 0.000000e+00
  br i1 %64, label %65, label %66

65:                                               ; preds = %63
  br label %66

66:                                               ; preds = %65, %63
  %.0176 = phi double [ 1.000000e+00, %65 ], [ %sqrt201, %63 ]
  %.0165 = phi double [ 0.000000e+00, %65 ], [ %48, %63 ]
  %.0161 = phi double [ 1.000000e+00, %65 ], [ %39, %63 ]
  %.0158 = phi double [ 0.000000e+00, %65 ], [ %30, %63 ]
  %67 = fcmp oeq double %sqrt, 0.000000e+00
  br i1 %67, label %68, label %69

68:                                               ; preds = %66
  br label %69

69:                                               ; preds = %68, %66
  %.0175 = phi double [ 1.000000e+00, %68 ], [ %sqrt, %66 ]
  %.0166 = phi double [ 1.000000e+00, %68 ], [ %51, %66 ]
  %.0162 = phi double [ 0.000000e+00, %68 ], [ %42, %66 ]
  %.0159 = phi double [ 0.000000e+00, %68 ], [ %33, %66 ]
  %.not193 = icmp eq ptr %7, null
  br i1 %.not193, label %72, label %70

70:                                               ; preds = %69
  %71 = fptrunc double %.0177 to float
  store float %71, ptr %7, align 4, !tbaa !5
  br label %72

72:                                               ; preds = %70, %69
  %.not194 = icmp eq ptr %8, null
  br i1 %.not194, label %75, label %73

73:                                               ; preds = %72
  %74 = fptrunc double %.0176 to float
  store float %74, ptr %8, align 4, !tbaa !5
  br label %75

75:                                               ; preds = %73, %72
  %.not195 = icmp eq ptr %9, null
  br i1 %.not195, label %78, label %76

76:                                               ; preds = %75
  %77 = fptrunc double %.0175 to float
  store float %77, ptr %9, align 4, !tbaa !5
  br label %78

78:                                               ; preds = %76, %75
  %79 = insertelement <4 x double> poison, double %.0, i64 0
  %80 = insertelement <4 x double> %79, double %.0158, i64 1
  %81 = insertelement <4 x double> %80, double %.0159, i64 2
  %82 = insertelement <4 x double> %81, double %.0160, i64 3
  %83 = insertelement <4 x double> poison, double %.0177, i64 0
  %84 = insertelement <4 x double> %83, double %.0176, i64 1
  %85 = insertelement <4 x double> %84, double %.0175, i64 2
  %86 = shufflevector <4 x double> %85, <4 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 0>
  %87 = fdiv <4 x double> %82, %86
  %88 = insertelement <4 x double> poison, double %.0161, i64 0
  %89 = insertelement <4 x double> %88, double %.0162, i64 1
  %90 = insertelement <4 x double> %89, double %.0164, i64 2
  %91 = insertelement <4 x double> %90, double %.0165, i64 3
  %92 = insertelement <4 x double> poison, double %.0176, i64 0
  %93 = insertelement <4 x double> %92, double %.0175, i64 1
  %94 = insertelement <4 x double> %93, double %.0177, i64 2
  %95 = shufflevector <4 x double> %94, <4 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 0>
  %96 = fdiv <4 x double> %91, %95
  %97 = fdiv double %.0166, %.0175
  %98 = fptrunc <4 x double> %87 to <4 x float>
  store <4 x float> %98, ptr %12, align 16, !tbaa !5
  %99 = getelementptr inbounds i8, ptr %12, i64 16
  %100 = fptrunc <4 x double> %96 to <4 x float>
  store <4 x float> %100, ptr %99, align 16, !tbaa !5
  %101 = fptrunc double %97 to float
  %102 = getelementptr inbounds i8, ptr %12, i64 32
  store float %101, ptr %102, align 16, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 36, ptr nonnull %13) #5
  call void @nifti_mat33_polar(ptr dead_on_unwind nonnull writable sret(%struct.mat33) align 4 %13, ptr noundef nonnull byval(%struct.mat33) align 8 %12)
  %.sroa.0.0.copyload = load float, ptr %13, align 4
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 4
  %.sroa.4.0.copyload = load float, ptr %.sroa.4.0..sroa_idx, align 4
  %.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 8
  %.sroa.5.0.copyload = load float, ptr %.sroa.5.0..sroa_idx, align 4
  %.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 12
  %.sroa.6.0.copyload = load float, ptr %.sroa.6.0..sroa_idx, align 4
  %.sroa.7.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 16
  %.sroa.7.0.copyload = load float, ptr %.sroa.7.0..sroa_idx, align 4
  %.sroa.8.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 20
  %.sroa.8.0.copyload = load float, ptr %.sroa.8.0..sroa_idx, align 4
  %.sroa.9.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 24
  %.sroa.9.0.copyload = load float, ptr %.sroa.9.0..sroa_idx, align 4
  %.sroa.10.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 28
  %.sroa.10.0.copyload = load float, ptr %.sroa.10.0..sroa_idx, align 4
  %.sroa.11.0..sroa_idx = getelementptr inbounds i8, ptr %13, i64 32
  %.sroa.11.0.copyload = load float, ptr %.sroa.11.0..sroa_idx, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 36, ptr nonnull %13) #5
  %103 = fpext float %.sroa.0.0.copyload to double
  %104 = fpext float %.sroa.4.0.copyload to double
  %105 = fpext float %.sroa.5.0.copyload to double
  %106 = fpext float %.sroa.6.0.copyload to double
  %107 = fpext float %.sroa.7.0.copyload to double
  %108 = fpext float %.sroa.8.0.copyload to double
  %109 = fpext float %.sroa.9.0.copyload to double
  %110 = fpext float %.sroa.10.0.copyload to double
  %111 = fpext float %.sroa.11.0.copyload to double
  %112 = fmul double %103, %107
  %113 = fneg double %103
  %114 = fmul double %113, %110
  %115 = fmul double %114, %108
  %116 = call double @llvm.fmuladd.f64(double %112, double %111, double %115)
  %117 = fneg double %106
  %118 = fmul double %104, %117
  %119 = call double @llvm.fmuladd.f64(double %118, double %111, double %116)
  %120 = fmul double %106, %110
  %121 = call double @llvm.fmuladd.f64(double %120, double %105, double %119)
  %122 = fmul double %104, %109
  %123 = call double @llvm.fmuladd.f64(double %122, double %108, double %121)
  %124 = fneg double %109
  %125 = fmul double %107, %124
  %126 = call double @llvm.fmuladd.f64(double %125, double %105, double %123)
  %127 = fcmp ogt double %126, 0.000000e+00
  %.not197 = icmp eq ptr %10, null
  br i1 %127, label %128, label %130

128:                                              ; preds = %78
  br i1 %.not197, label %136, label %129

129:                                              ; preds = %128
  store float 1.000000e+00, ptr %10, align 4, !tbaa !5
  br label %136

130:                                              ; preds = %78
  br i1 %.not197, label %132, label %131

131:                                              ; preds = %130
  store float -1.000000e+00, ptr %10, align 4, !tbaa !5
  br label %132

132:                                              ; preds = %131, %130
  %133 = fneg double %105
  %134 = fneg double %108
  %135 = fneg double %111
  br label %136

136:                                              ; preds = %128, %129, %132
  %.1167 = phi double [ %111, %129 ], [ %111, %128 ], [ %135, %132 ]
  %.1163 = phi double [ %108, %129 ], [ %108, %128 ], [ %134, %132 ]
  %.1 = phi double [ %105, %129 ], [ %105, %128 ], [ %133, %132 ]
  %137 = fadd double %103, %107
  %138 = fadd double %137, %.1167
  %139 = fpext double %138 to x86_fp80
  %140 = fadd x86_fp80 %139, 0xK3FFF8000000000000000
  %141 = fptrunc x86_fp80 %140 to double
  %142 = fcmp ogt double %141, 5.000000e-01
  br i1 %142, label %143, label %162

143:                                              ; preds = %136
  %144 = call double @sqrt(double noundef %141) #5
  %145 = fmul double %144, 5.000000e-01
  %146 = fsub double %110, %.1163
  %147 = fpext double %146 to x86_fp80
  %148 = fmul x86_fp80 %147, 0xK3FFD8000000000000000
  %149 = fpext double %145 to x86_fp80
  %150 = fdiv x86_fp80 %148, %149
  %151 = fptrunc x86_fp80 %150 to double
  %152 = fsub double %.1, %109
  %153 = fpext double %152 to x86_fp80
  %154 = fmul x86_fp80 %153, 0xK3FFD8000000000000000
  %155 = fdiv x86_fp80 %154, %149
  %156 = fptrunc x86_fp80 %155 to double
  %157 = fsub double %106, %104
  %158 = fpext double %157 to x86_fp80
  %159 = fmul x86_fp80 %158, 0xK3FFD8000000000000000
  %160 = fdiv x86_fp80 %159, %149
  %161 = fptrunc x86_fp80 %160 to double
  br label %225

162:                                              ; preds = %136
  %163 = fadd double %103, 1.000000e+00
  %164 = fadd double %.1167, %107
  %165 = fsub double %163, %164
  %166 = fadd double %107, 1.000000e+00
  %167 = fadd double %.1167, %103
  %168 = fsub double %166, %167
  %169 = fadd double %.1167, 1.000000e+00
  %170 = fsub double %169, %137
  %171 = fcmp ogt double %165, 1.000000e+00
  br i1 %171, label %172, label %187

172:                                              ; preds = %162
  %173 = call double @sqrt(double noundef %165) #5
  %174 = fmul double %173, 5.000000e-01
  %175 = fadd double %104, %106
  %176 = fpext double %175 to x86_fp80
  %177 = fmul x86_fp80 %176, 0xK3FFD8000000000000000
  %178 = fpext double %174 to x86_fp80
  %179 = fdiv x86_fp80 %177, %178
  %180 = fptrunc x86_fp80 %179 to double
  %181 = fadd double %.1, %109
  %182 = fpext double %181 to x86_fp80
  %183 = fmul x86_fp80 %182, 0xK3FFD8000000000000000
  %184 = fdiv x86_fp80 %183, %178
  %185 = fptrunc x86_fp80 %184 to double
  %186 = fsub double %110, %.1163
  br label %216

187:                                              ; preds = %162
  %188 = fcmp ogt double %168, 1.000000e+00
  %189 = fadd double %.1163, %110
  %190 = fpext double %189 to x86_fp80
  %191 = fmul x86_fp80 %190, 0xK3FFD8000000000000000
  br i1 %188, label %192, label %204

192:                                              ; preds = %187
  %193 = call double @sqrt(double noundef %168) #5
  %194 = fmul double %193, 5.000000e-01
  %195 = fadd double %104, %106
  %196 = fpext double %195 to x86_fp80
  %197 = fmul x86_fp80 %196, 0xK3FFD8000000000000000
  %198 = fpext double %194 to x86_fp80
  %199 = fdiv x86_fp80 %197, %198
  %200 = fptrunc x86_fp80 %199 to double
  %201 = fdiv x86_fp80 %191, %198
  %202 = fptrunc x86_fp80 %201 to double
  %203 = fsub double %.1, %109
  br label %216

204:                                              ; preds = %187
  %205 = call double @sqrt(double noundef %170) #5
  %206 = fmul double %205, 5.000000e-01
  %207 = fadd double %.1, %109
  %208 = fpext double %207 to x86_fp80
  %209 = fmul x86_fp80 %208, 0xK3FFD8000000000000000
  %210 = fpext double %206 to x86_fp80
  %211 = fdiv x86_fp80 %209, %210
  %212 = fptrunc x86_fp80 %211 to double
  %213 = fdiv x86_fp80 %191, %210
  %214 = fptrunc x86_fp80 %213 to double
  %215 = fsub double %106, %104
  br label %216

216:                                              ; preds = %192, %204, %172
  %.sink = phi double [ %203, %192 ], [ %215, %204 ], [ %186, %172 ]
  %.sink203 = phi x86_fp80 [ %198, %192 ], [ %210, %204 ], [ %178, %172 ]
  %.0172 = phi double [ %200, %192 ], [ %212, %204 ], [ %174, %172 ]
  %.0170 = phi double [ %194, %192 ], [ %214, %204 ], [ %180, %172 ]
  %.0168 = phi double [ %202, %192 ], [ %206, %204 ], [ %185, %172 ]
  %217 = fpext double %.sink to x86_fp80
  %218 = fmul x86_fp80 %217, 0xK3FFD8000000000000000
  %219 = fdiv x86_fp80 %218, %.sink203
  %.0174 = fptrunc x86_fp80 %219 to double
  %220 = fcmp olt double %.0174, 0.000000e+00
  br i1 %220, label %221, label %225

221:                                              ; preds = %216
  %222 = fneg double %.0172
  %223 = fneg double %.0170
  %224 = fneg double %.0168
  br label %225

225:                                              ; preds = %216, %221, %143
  %.1173 = phi double [ %151, %143 ], [ %222, %221 ], [ %.0172, %216 ]
  %.1171 = phi double [ %156, %143 ], [ %223, %221 ], [ %.0170, %216 ]
  %.1169 = phi double [ %161, %143 ], [ %224, %221 ], [ %.0168, %216 ]
  %.not198 = icmp eq ptr %1, null
  br i1 %.not198, label %228, label %226

226:                                              ; preds = %225
  %227 = fptrunc double %.1173 to float
  store float %227, ptr %1, align 4, !tbaa !5
  br label %228

228:                                              ; preds = %226, %225
  %.not199 = icmp eq ptr %2, null
  br i1 %.not199, label %231, label %229

229:                                              ; preds = %228
  %230 = fptrunc double %.1171 to float
  store float %230, ptr %2, align 4, !tbaa !5
  br label %231

231:                                              ; preds = %229, %228
  %.not200 = icmp eq ptr %3, null
  br i1 %.not200, label %234, label %232

232:                                              ; preds = %231
  %233 = fptrunc double %.1169 to float
  store float %233, ptr %3, align 4, !tbaa !5
  br label %234

234:                                              ; preds = %232, %231
  call void @llvm.lifetime.end.p0(i64 36, ptr nonnull %12) #5
  ret void
}

; Function Attrs: nounwind uwtable
declare dso_local void @nifti_mat33_polar(ptr dead_on_unwind noalias writable sret(%struct.mat33) align 4, ptr noundef byval(%struct.mat33) align 8) local_unnamed_addr #3

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { mustprogress nofree nounwind willreturn memory(write) "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 = { 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 #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"float", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}


; Effective O3 passes: AggressiveInstCombinePass,EarlyCSEPass,GlobalOptPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,PostOrderFunctionAttrsPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass