; LLVM IR from Try/Tempest :: Engine/thirdparty/squish/alpha.ll (ZN6squish17CompressAlphaDxt3EPKhiPv)

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN6squish17CompressAlphaDxt3EPKhiPv(ptr noundef %0, i32 noundef %1, ptr noundef %2) #0 {
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca float, align 4
  %10 = alloca float, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i32 %1, ptr %5, align 4, !tbaa !9
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #3
  %15 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %15, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  store i32 0, ptr %8, align 4, !tbaa !9
  br label %16

16:                                               ; preds = %71, %3
  %17 = load i32, ptr %8, align 4, !tbaa !9
  %18 = icmp slt i32 %17, 8
  br i1 %18, label %20, label %19

19:                                               ; preds = %16
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  br label %74

20:                                               ; preds = %16
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  %21 = load ptr, ptr %4, align 8, !tbaa !5
  %22 = load i32, ptr %8, align 4, !tbaa !9
  %23 = mul nsw i32 8, %22
  %24 = add nsw i32 %23, 3
  %25 = sext i32 %24 to i64
  %26 = getelementptr inbounds i8, ptr %21, i64 %25
  %27 = load i8, ptr %26, align 1, !tbaa !11
  %28 = uitofp i8 %27 to float
  %29 = fmul float %28, 0x3FAE1E1E20000000
  store float %29, ptr %9, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  %30 = load ptr, ptr %4, align 8, !tbaa !5
  %31 = load i32, ptr %8, align 4, !tbaa !9
  %32 = mul nsw i32 8, %31
  %33 = add nsw i32 %32, 7
  %34 = sext i32 %33 to i64
  %35 = getelementptr inbounds i8, ptr %30, i64 %34
  %36 = load i8, ptr %35, align 1, !tbaa !11
  %37 = uitofp i8 %36 to float
  %38 = fmul float %37, 0x3FAE1E1E20000000
  store float %38, ptr %10, align 4, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  %39 = load float, ptr %9, align 4, !tbaa !12
  %40 = call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %39, i32 noundef 15)
  store i32 %40, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  %41 = load float, ptr %10, align 4, !tbaa !12
  %42 = call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %41, i32 noundef 15)
  store i32 %42, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  %43 = load i32, ptr %8, align 4, !tbaa !9
  %44 = mul nsw i32 2, %43
  %45 = shl i32 1, %44
  store i32 %45, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  %46 = load i32, ptr %8, align 4, !tbaa !9
  %47 = mul nsw i32 2, %46
  %48 = add nsw i32 %47, 1
  %49 = shl i32 1, %48
  store i32 %49, ptr %14, align 4, !tbaa !9
  %50 = load i32, ptr %5, align 4, !tbaa !9
  %51 = load i32, ptr %13, align 4, !tbaa !9
  %52 = and i32 %50, %51
  %53 = icmp eq i32 %52, 0
  br i1 %53, label %54, label %55

54:                                               ; preds = %20
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %55

55:                                               ; preds = %54, %20
  %56 = load i32, ptr %5, align 4, !tbaa !9
  %57 = load i32, ptr %14, align 4, !tbaa !9
  %58 = and i32 %56, %57
  %59 = icmp eq i32 %58, 0
  br i1 %59, label %60, label %61

60:                                               ; preds = %55
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %61

61:                                               ; preds = %60, %55
  %62 = load i32, ptr %11, align 4, !tbaa !9
  %63 = load i32, ptr %12, align 4, !tbaa !9
  %64 = shl i32 %63, 4
  %65 = or i32 %62, %64
  %66 = trunc i32 %65 to i8
  %67 = load ptr, ptr %7, align 8, !tbaa !5
  %68 = load i32, ptr %8, align 4, !tbaa !9
  %69 = sext i32 %68 to i64
  %70 = getelementptr inbounds i8, ptr %67, i64 %69
  store i8 %66, ptr %70, align 1, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  br label %71

71:                                               ; preds = %61
  %72 = load i32, ptr %8, align 4, !tbaa !9
  %73 = add nsw i32 %72, 1
  store i32 %73, ptr %8, align 4, !tbaa !9
  br label %16, !llvm.loop !14

74:                                               ; preds = %19
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  ret void
}

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

; Function Attrs: mustprogress nounwind uwtable
declare hidden noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef, i32 noundef) #2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"float", !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}


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

; Function Attrs: mustprogress nounwind uwtable
define dso_local void @_ZN6squish17CompressAlphaDxt3EPKhiPv(ptr nocapture noundef readonly %0, i32 noundef %1, ptr nocapture noundef writeonly %2) local_unnamed_addr #0 {
  %4 = getelementptr inbounds i8, ptr %0, i64 3
  %5 = load i8, ptr %4, align 1, !tbaa !5
  %6 = uitofp i8 %5 to float
  %7 = fmul float %6, 0x3FAE1E1E20000000
  %8 = getelementptr inbounds i8, ptr %0, i64 7
  %9 = load i8, ptr %8, align 1, !tbaa !5
  %10 = uitofp i8 %9 to float
  %11 = fmul float %10, 0x3FAE1E1E20000000
  %12 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %7, i32 noundef 15)
  %13 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %11, i32 noundef 15)
  %14 = insertelement <16 x i32> poison, i32 %1, i64 0
  %15 = shufflevector <16 x i32> %14, <16 x i32> poison, <16 x i32> zeroinitializer
  %16 = and <16 x i32> %15, <i32 32768, i32 16384, i32 8192, i32 4096, i32 2048, i32 1024, i32 512, i32 256, i32 128, i32 64, i32 32, i32 16, i32 8, i32 4, i32 2, i32 1>
  %17 = shl i32 %13, 4
  %18 = getelementptr inbounds i8, ptr %0, i64 11
  %19 = getelementptr inbounds i8, ptr %0, i64 15
  %20 = getelementptr inbounds i8, ptr %2, i64 1
  %21 = getelementptr inbounds i8, ptr %0, i64 19
  %22 = getelementptr inbounds i8, ptr %0, i64 23
  %23 = getelementptr inbounds i8, ptr %2, i64 2
  %24 = getelementptr inbounds i8, ptr %0, i64 27
  %25 = getelementptr inbounds i8, ptr %0, i64 31
  %26 = getelementptr inbounds i8, ptr %2, i64 3
  %27 = getelementptr inbounds i8, ptr %0, i64 35
  %28 = getelementptr inbounds i8, ptr %0, i64 39
  %29 = getelementptr inbounds i8, ptr %2, i64 4
  %30 = getelementptr inbounds i8, ptr %0, i64 43
  %31 = getelementptr inbounds i8, ptr %0, i64 47
  %32 = getelementptr inbounds i8, ptr %2, i64 5
  %33 = getelementptr inbounds i8, ptr %0, i64 51
  %34 = getelementptr inbounds i8, ptr %0, i64 55
  %35 = getelementptr inbounds i8, ptr %2, i64 6
  %36 = getelementptr inbounds i8, ptr %0, i64 59
  %37 = getelementptr inbounds i8, ptr %0, i64 63
  %38 = icmp eq <16 x i32> %16, zeroinitializer
  %39 = extractelement <16 x i1> %38, i64 15
  %spec.select = select i1 %39, i32 0, i32 %12
  %40 = extractelement <16 x i1> %38, i64 14
  %41 = select i1 %40, i32 0, i32 %17
  %42 = or i32 %41, %spec.select
  %43 = trunc i32 %42 to i8
  store i8 %43, ptr %2, align 1, !tbaa !5
  %44 = load i8, ptr %18, align 1, !tbaa !5
  %45 = uitofp i8 %44 to float
  %46 = fmul float %45, 0x3FAE1E1E20000000
  %47 = load i8, ptr %19, align 1, !tbaa !5
  %48 = uitofp i8 %47 to float
  %49 = fmul float %48, 0x3FAE1E1E20000000
  %50 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %46, i32 noundef 15)
  %51 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %49, i32 noundef 15)
  %52 = extractelement <16 x i1> %38, i64 13
  %spec.select.1 = select i1 %52, i32 0, i32 %50
  %53 = shl i32 %51, 4
  %54 = extractelement <16 x i1> %38, i64 12
  %55 = select i1 %54, i32 0, i32 %53
  %56 = or i32 %55, %spec.select.1
  %57 = trunc i32 %56 to i8
  store i8 %57, ptr %20, align 1, !tbaa !5
  %58 = load i8, ptr %21, align 1, !tbaa !5
  %59 = uitofp i8 %58 to float
  %60 = fmul float %59, 0x3FAE1E1E20000000
  %61 = load i8, ptr %22, align 1, !tbaa !5
  %62 = uitofp i8 %61 to float
  %63 = fmul float %62, 0x3FAE1E1E20000000
  %64 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %60, i32 noundef 15)
  %65 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %63, i32 noundef 15)
  %66 = extractelement <16 x i1> %38, i64 11
  %spec.select.2 = select i1 %66, i32 0, i32 %64
  %67 = shl i32 %65, 4
  %68 = extractelement <16 x i1> %38, i64 10
  %69 = select i1 %68, i32 0, i32 %67
  %70 = or i32 %69, %spec.select.2
  %71 = trunc i32 %70 to i8
  store i8 %71, ptr %23, align 1, !tbaa !5
  %72 = load i8, ptr %24, align 1, !tbaa !5
  %73 = uitofp i8 %72 to float
  %74 = fmul float %73, 0x3FAE1E1E20000000
  %75 = load i8, ptr %25, align 1, !tbaa !5
  %76 = uitofp i8 %75 to float
  %77 = fmul float %76, 0x3FAE1E1E20000000
  %78 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %74, i32 noundef 15)
  %79 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %77, i32 noundef 15)
  %80 = extractelement <16 x i1> %38, i64 9
  %spec.select.3 = select i1 %80, i32 0, i32 %78
  %81 = shl i32 %79, 4
  %82 = extractelement <16 x i1> %38, i64 8
  %83 = select i1 %82, i32 0, i32 %81
  %84 = or i32 %83, %spec.select.3
  %85 = trunc i32 %84 to i8
  store i8 %85, ptr %26, align 1, !tbaa !5
  %86 = load i8, ptr %27, align 1, !tbaa !5
  %87 = uitofp i8 %86 to float
  %88 = fmul float %87, 0x3FAE1E1E20000000
  %89 = load i8, ptr %28, align 1, !tbaa !5
  %90 = uitofp i8 %89 to float
  %91 = fmul float %90, 0x3FAE1E1E20000000
  %92 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %88, i32 noundef 15)
  %93 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %91, i32 noundef 15)
  %94 = extractelement <16 x i1> %38, i64 7
  %spec.select.4 = select i1 %94, i32 0, i32 %92
  %95 = shl i32 %93, 4
  %96 = extractelement <16 x i1> %38, i64 6
  %97 = select i1 %96, i32 0, i32 %95
  %98 = or i32 %97, %spec.select.4
  %99 = trunc i32 %98 to i8
  store i8 %99, ptr %29, align 1, !tbaa !5
  %100 = load i8, ptr %30, align 1, !tbaa !5
  %101 = uitofp i8 %100 to float
  %102 = fmul float %101, 0x3FAE1E1E20000000
  %103 = load i8, ptr %31, align 1, !tbaa !5
  %104 = uitofp i8 %103 to float
  %105 = fmul float %104, 0x3FAE1E1E20000000
  %106 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %102, i32 noundef 15)
  %107 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %105, i32 noundef 15)
  %108 = extractelement <16 x i1> %38, i64 5
  %spec.select.5 = select i1 %108, i32 0, i32 %106
  %109 = shl i32 %107, 4
  %110 = extractelement <16 x i1> %38, i64 4
  %111 = select i1 %110, i32 0, i32 %109
  %112 = or i32 %111, %spec.select.5
  %113 = trunc i32 %112 to i8
  store i8 %113, ptr %32, align 1, !tbaa !5
  %114 = load i8, ptr %33, align 1, !tbaa !5
  %115 = uitofp i8 %114 to float
  %116 = fmul float %115, 0x3FAE1E1E20000000
  %117 = load i8, ptr %34, align 1, !tbaa !5
  %118 = uitofp i8 %117 to float
  %119 = fmul float %118, 0x3FAE1E1E20000000
  %120 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %116, i32 noundef 15)
  %121 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %119, i32 noundef 15)
  %122 = extractelement <16 x i1> %38, i64 3
  %spec.select.6 = select i1 %122, i32 0, i32 %120
  %123 = shl i32 %121, 4
  %124 = extractelement <16 x i1> %38, i64 2
  %125 = select i1 %124, i32 0, i32 %123
  %126 = or i32 %125, %spec.select.6
  %127 = trunc i32 %126 to i8
  store i8 %127, ptr %35, align 1, !tbaa !5
  %128 = load i8, ptr %36, align 1, !tbaa !5
  %129 = uitofp i8 %128 to float
  %130 = fmul float %129, 0x3FAE1E1E20000000
  %131 = load i8, ptr %37, align 1, !tbaa !5
  %132 = uitofp i8 %131 to float
  %133 = fmul float %132, 0x3FAE1E1E20000000
  %134 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %130, i32 noundef 15)
  %135 = tail call noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef %133, i32 noundef 15)
  %136 = extractelement <16 x i1> %38, i64 1
  %spec.select.7 = select i1 %136, i32 0, i32 %134
  %137 = shl i32 %135, 4
  %138 = extractelement <16 x i1> %38, i64 0
  %139 = select i1 %138, i32 0, i32 %137
  %140 = or i32 %139, %spec.select.7
  %141 = trunc i32 %140 to i8
  %142 = getelementptr inbounds i8, ptr %2, i64 7
  store i8 %141, ptr %142, align 1, !tbaa !5
  ret void
}

; Function Attrs: mustprogress nounwind uwtable
declare hidden noundef i32 @_ZN6squishL10FloatToIntEfi(float noundef, i32 noundef) local_unnamed_addr #0

attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }

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

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


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,LoopRotatePass,PostOrderFunctionAttrsPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass