; LLVM IR from Try/Tempest :: Engine/thirdparty/spirv_cross (spirv_cross)

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

%"class.spirv_cross::TypedID.162" = type { i32 }
%"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler" = type { %"struct.spirv_cross::Compiler::OpcodeHandler", ptr, i8, i32, i8, i8, i8, i8, %"class.spirv_cross::SmallVector.92" }
%"struct.spirv_cross::Compiler::OpcodeHandler" = type { ptr }
%"class.spirv_cross::SmallVector.92" = type { %"class.spirv_cross::VectorView.93", i64, %"class.spirv_cross::AlignedBuffer.94" }
%"class.spirv_cross::VectorView.93" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.94" = type { [32 x i8] }
%"struct.spirv_cross::SPIRVariable" = type { %"struct.spirv_cross::IVariant.base", %"class.spirv_cross::TypedID.163", i32, i32, %"class.spirv_cross::TypedID.162", %"class.spirv_cross::TypedID.164", %"class.spirv_cross::SmallVector.92", i8, i8, %"class.spirv_cross::TypedID.162", %"class.spirv_cross::SmallVector.7", i8, i8, i8, i8, i32, %"class.spirv_cross::TypedID.165", i8, i8, i8, ptr }
%"struct.spirv_cross::IVariant.base" = type <{ ptr, %"class.spirv_cross::TypedID.162" }>
%"class.spirv_cross::TypedID.163" = type { i32 }
%"class.spirv_cross::TypedID.164" = type { i32 }
%"class.spirv_cross::SmallVector.7" = type { %"class.spirv_cross::VectorView.8", i64, %"class.spirv_cross::AlignedBuffer.9" }
%"class.spirv_cross::VectorView.8" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.9" = type { [32 x i8] }
%"class.spirv_cross::TypedID.165" = type { i32 }
%"struct.spirv_cross::IVariant" = type <{ ptr, %"class.spirv_cross::TypedID.162", [4 x i8] }>
%"struct.spirv_cross::SPIRType" = type { %"struct.spirv_cross::IVariant.base", i32, i32, i32, i32, i32, %"class.spirv_cross::SmallVector.92", %"class.spirv_cross::SmallVector.166", i32, i8, i8, i32, %"class.spirv_cross::SmallVector.169", %"class.spirv_cross::SmallVector.92", %"struct.spirv_cross::SPIRType::ImageType", %"class.spirv_cross::TypedID.163", %"class.spirv_cross::TypedID.163", %"class.std::unordered_set.172" }
%"class.spirv_cross::SmallVector.166" = type { %"class.spirv_cross::VectorView.167", i64, %"class.spirv_cross::AlignedBuffer.168" }
%"class.spirv_cross::VectorView.167" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.168" = type { [8 x i8] }
%"class.spirv_cross::SmallVector.169" = type { %"class.spirv_cross::VectorView.170", i64, %"class.spirv_cross::AlignedBuffer.171" }
%"class.spirv_cross::VectorView.170" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.171" = type { [32 x i8] }
%"struct.spirv_cross::SPIRType::ImageType" = type { %"class.spirv_cross::TypedID.163", i32, i8, i8, i8, i32, i32, i32 }
%"class.std::unordered_set.172" = type { %"class.std::_Hashtable.173" }
%"class.std::_Hashtable.173" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"struct.std::__detail::_Hash_node_base" = type { ptr }
%"struct.std::__detail::_Prime_rehash_policy" = type { float, i64 }
%"class.spirv_cross::Compiler" = type { ptr, %"class.spirv_cross::ParsedIR", %"class.spirv_cross::SmallVector.92", %"class.spirv_cross::SmallVector.92", ptr, ptr, i32, %"class.std::unordered_set.95", i8, %"class.std::unordered_set", i8, i8, %"class.spirv_cross::SmallVector.114", %"class.spirv_cross::SmallVector.92", %"class.std::function", %"class.std::unordered_set", %"class.std::unordered_set", %"class.std::unordered_set", %"class.std::unordered_set", %"class.std::unordered_set", %"class.spirv_cross::Bitset", %"class.spirv_cross::Bitset", i32, i32, i8, %"class.std::unordered_set", i8, i8, i32, %"class.std::unordered_map.117", %"class.spirv_cross::SmallVector.92", %"class.std::unordered_map.131", %"class.std::unordered_set", i8, %"class.std::unordered_map.145" }
%"class.spirv_cross::ParsedIR" = type { %"class.std::unique_ptr", %"class.std::vector", %"class.spirv_cross::SmallVector", %"class.std::unordered_map", [14 x %"class.spirv_cross::SmallVector.7"], %"class.spirv_cross::SmallVector.7", %"class.spirv_cross::SmallVector.7", %"class.std::unordered_map.10", %"class.spirv_cross::SmallVector.24", %"class.spirv_cross::SmallVector.27", %"class.spirv_cross::SmallVector.30", %"class.std::unordered_map.33", %"class.std::unordered_map.52", %"class.spirv_cross::TypedID", %"struct.spirv_cross::ParsedIR::Source", i32, i32, i32, i32, %"class.std::__cxx11::basic_string", %"class.spirv_cross::Bitset", %"class.std::unordered_set" }
%"class.std::unique_ptr" = type { %"struct.std::__uniq_ptr_data" }
%"struct.std::__uniq_ptr_data" = type { %"class.std::__uniq_ptr_impl" }
%"class.std::__uniq_ptr_impl" = type { %"class.std::tuple" }
%"class.std::tuple" = type { %"struct.std::_Tuple_impl" }
%"struct.std::_Tuple_impl" = type { %"struct.std::_Head_base.1" }
%"struct.std::_Head_base.1" = type { ptr }
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl" }
%"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl" = type { %"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl_data" }
%"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%"class.spirv_cross::SmallVector" = type { %"class.spirv_cross::VectorView", i64, %"class.spirv_cross::AlignedBuffer" }
%"class.spirv_cross::VectorView" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer" = type { [192 x i8] }
%"class.std::unordered_map" = type { %"class.std::_Hashtable" }
%"class.std::_Hashtable" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.std::unordered_map.10" = type { %"class.std::_Hashtable.11" }
%"class.std::_Hashtable.11" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.spirv_cross::SmallVector.24" = type { %"class.spirv_cross::VectorView.25", i64, %"class.spirv_cross::AlignedBuffer.26" }
%"class.spirv_cross::VectorView.25" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.26" = type { [32 x i8] }
%"class.spirv_cross::SmallVector.27" = type { %"class.spirv_cross::VectorView.28", i64, %"class.spirv_cross::AlignedBuffer.29" }
%"class.spirv_cross::VectorView.28" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.29" = type { [256 x i8] }
%"class.spirv_cross::SmallVector.30" = type { %"class.spirv_cross::VectorView.31", i64, %"class.spirv_cross::AlignedBuffer.32" }
%"class.spirv_cross::VectorView.31" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.32" = type { [8 x i8] }
%"class.std::unordered_map.33" = type { %"class.std::_Hashtable.34" }
%"class.std::_Hashtable.34" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.std::unordered_map.52" = type { %"class.std::_Hashtable.53" }
%"class.std::_Hashtable.53" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.spirv_cross::TypedID" = type { i32 }
%"struct.spirv_cross::ParsedIR::Source" = type <{ i32, i8, i8, i8, i8 }>
%"class.std::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%"class.std::unordered_set.95" = type { %"class.std::_Hashtable.96" }
%"class.std::_Hashtable.96" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.spirv_cross::SmallVector.114" = type { %"class.spirv_cross::VectorView.115", i64, %"class.spirv_cross::AlignedBuffer.116" }
%"class.spirv_cross::VectorView.115" = type { ptr, i64 }
%"class.spirv_cross::AlignedBuffer.116" = type { [96 x i8] }
%"class.std::function" = type { %"class.std::_Function_base", ptr }
%"class.std::_Function_base" = type { %"union.std::_Any_data", ptr }
%"union.std::_Any_data" = type { %"union.std::_Nocopy_types" }
%"union.std::_Nocopy_types" = type { { i64, i64 } }
%"class.spirv_cross::Bitset" = type { i64, %"class.std::unordered_set" }
%"class.std::unordered_map.117" = type { %"class.std::_Hashtable.118" }
%"class.std::_Hashtable.118" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.std::unordered_map.131" = type { %"class.std::_Hashtable.132" }
%"class.std::_Hashtable.132" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.std::unordered_set" = type { %"class.std::_Hashtable.74" }
%"class.std::_Hashtable.74" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.std::unordered_map.145" = type { %"class.std::_Hashtable.146" }
%"class.std::_Hashtable.146" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"struct.spirv_cross::SPIRExpression" = type <{ %"struct.spirv_cross::IVariant.base", %"class.spirv_cross::TypedID.162", %"class.std::__cxx11::basic_string", %"class.spirv_cross::TypedID.163", %"class.spirv_cross::TypedID.162", i8, i8, i8, i8, [4 x i8], %"class.spirv_cross::SmallVector.7", %"class.spirv_cross::SmallVector.7", %"class.spirv_cross::SmallVector.7", i32, [4 x i8] }>

@.str = external hidden unnamed_addr constant [1 x i8], align 1

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

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef) #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4)) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176), i32, i32 noundef) #1 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef) #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4)) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11spirv_cross8Compiler13register_readEjjb(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef, i32 noundef, i1 noundef zeroext) #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(21) ptr @_ZN11spirv_cross10VectorViewINS_7VariantEEixEm(ptr noundef nonnull align 8 dereferenceable(16), i64 noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef, ptr noundef nonnull align 1 dereferenceable(1), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 1 dereferenceable(1)) #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN11spirv_cross7Variant22set_allow_type_rewriteEv(ptr noundef nonnull align 8 dereferenceable(21)) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88), i32 noundef) #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler6handleEN3spv2OpEPKjj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %1, ptr noundef %2, i32 noundef %3) unnamed_addr #1 align 2 {
  %5 = alloca i1, align 1
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i8, align 1
  %16 = alloca %"class.spirv_cross::TypedID.162", align 4
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i8, align 1
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca ptr, align 8
  %26 = alloca i8, align 1
  %27 = alloca ptr, align 8
  %28 = alloca i32, align 4
  %29 = alloca ptr, align 8
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca %"class.spirv_cross::TypedID.162", align 4
  %35 = alloca i32, align 4
  %36 = alloca ptr, align 8
  %37 = alloca %"class.spirv_cross::TypedID.162", align 4
  %38 = alloca i32, align 4
  %39 = alloca ptr, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store i32 %1, ptr %7, align 4, !tbaa !9
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !11
  %40 = load ptr, ptr %6, align 8
  %41 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 6
  %42 = load i8, ptr %41, align 2, !tbaa !13, !range !21, !noundef !22
  %43 = trunc i8 %42 to i1
  br i1 %43, label %44, label %54

44:                                               ; preds = %4
  %45 = load i32, ptr %7, align 4, !tbaa !9
  %46 = icmp eq i32 %45, 5364
  br i1 %46, label %47, label %49

47:                                               ; preds = %44
  %48 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 2
  store i8 1, ptr %48, align 8, !tbaa !23
  store i1 true, ptr %5, align 1
  br label %376

49:                                               ; preds = %44
  %50 = load i32, ptr %7, align 4, !tbaa !9
  %51 = icmp eq i32 %50, 5365
  br i1 %51, label %52, label %53

52:                                               ; preds = %49
  store i1 false, ptr %5, align 1
  br label %376

53:                                               ; preds = %49
  br label %54

54:                                               ; preds = %53, %4
  %55 = load i32, ptr %7, align 4, !tbaa !9
  switch i32 %55, label %374 [
    i32 61, label %56
    i32 66, label %112
    i32 65, label %112
    i32 67, label %112
    i32 60, label %161
    i32 62, label %191
    i32 99, label %191
    i32 228, label %191
    i32 63, label %225
    i32 98, label %299
    i32 227, label %299
    i32 229, label %340
    i32 230, label %340
    i32 232, label %340
    i32 233, label %340
    i32 234, label %340
    i32 235, label %340
    i32 236, label %340
    i32 237, label %340
    i32 238, label %340
    i32 239, label %340
    i32 240, label %340
    i32 241, label %340
    i32 242, label %340
  ]

56:                                               ; preds = %54
  %57 = load i32, ptr %9, align 4, !tbaa !11
  %58 = icmp ult i32 %57, 3
  br i1 %58, label %59, label %60

59:                                               ; preds = %56
  store i1 false, ptr %5, align 1
  br label %376

60:                                               ; preds = %56
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  %61 = load ptr, ptr %8, align 8, !tbaa !5
  %62 = getelementptr inbounds i32, ptr %61, i64 2
  %63 = load i32, ptr %62, align 4, !tbaa !11
  store i32 %63, ptr %10, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  %64 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %65 = load ptr, ptr %64, align 8, !tbaa !24
  %66 = load i32, ptr %10, align 4, !tbaa !11
  %67 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %65, i32 noundef %66)
  store ptr %67, ptr %11, align 8, !tbaa !5
  %68 = load ptr, ptr %11, align 8, !tbaa !5
  %69 = icmp ne ptr %68, null
  br i1 %69, label %71, label %70

70:                                               ; preds = %60
  store i32 2, ptr %12, align 4
  br label %111

71:                                               ; preds = %60
  %72 = load ptr, ptr %11, align 8, !tbaa !5
  %73 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %72, i32 0, i32 2
  %74 = load i32, ptr %73, align 8, !tbaa !25
  switch i32 %74, label %75 [
    i32 0, label %76
    i32 2, label %91
    i32 12, label %106
  ]

75:                                               ; preds = %71
  br label %110

76:                                               ; preds = %71
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  %77 = load ptr, ptr %8, align 8, !tbaa !5
  %78 = getelementptr inbounds i32, ptr %77, i64 0
  %79 = load i32, ptr %78, align 4, !tbaa !11
  store i32 %79, ptr %13, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  %80 = load ptr, ptr %8, align 8, !tbaa !5
  %81 = getelementptr inbounds i32, ptr %80, i64 1
  %82 = load i32, ptr %81, align 4, !tbaa !11
  store i32 %82, ptr %14, align 4, !tbaa !11
  %83 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %84 = load ptr, ptr %83, align 8, !tbaa !24
  %85 = load i32, ptr %14, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %15) #4
  store i8 1, ptr %15, align 1, !tbaa !36
  %86 = call noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176) %84, i32 noundef %85, ptr noundef nonnull align 1 dereferenceable(1) @.str, ptr noundef nonnull align 4 dereferenceable(4) %13, ptr noundef nonnull align 1 dereferenceable(1) %15)
  call void @llvm.lifetime.end.p0(i64 1, ptr %15) #4
  %87 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %88 = load ptr, ptr %87, align 8, !tbaa !24
  %89 = load i32, ptr %14, align 4, !tbaa !11
  %90 = load i32, ptr %10, align 4, !tbaa !11
  call void @_ZN11spirv_cross8Compiler13register_readEjjb(ptr noundef nonnull align 8 dereferenceable(3176) %88, i32 noundef %89, i32 noundef %90, i1 noundef zeroext true)
  store i32 3, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  br label %110

91:                                               ; preds = %71
  %92 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %93 = load ptr, ptr %92, align 8, !tbaa !24
  %94 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %95 = load ptr, ptr %94, align 8, !tbaa !24
  %96 = load ptr, ptr %11, align 8, !tbaa !5
  %97 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %96, i32 0, i32 1
  %98 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %97)
  %99 = call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %95, i32 noundef %98)
  %100 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %99, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %16, ptr align 8 %100, i64 4, i1 false), !tbaa.struct !37
  %101 = getelementptr inbounds %"class.spirv_cross::TypedID.162", ptr %16, i32 0, i32 0
  %102 = load i32, ptr %101, align 4
  %103 = call noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176) %93, i32 %102, i32 noundef 3)
  br i1 %103, label %105, label %104

104:                                              ; preds = %91
  br label %110

105:                                              ; preds = %91
  br label %106

106:                                              ; preds = %105, %71
  %107 = load ptr, ptr %11, align 8, !tbaa !5
  %108 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %107, i32 0, i32 1
  %109 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %108)
  call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %40, i32 noundef %109)
  br label %110

110:                                              ; preds = %106, %104, %76, %75
  store i32 2, ptr %12, align 4
  br label %111

111:                                              ; preds = %110, %70
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  br label %375

112:                                              ; preds = %54, %54, %54
  %113 = load i32, ptr %9, align 4, !tbaa !11
  %114 = icmp ult i32 %113, 3
  br i1 %114, label %115, label %116

115:                                              ; preds = %112
  store i1 false, ptr %5, align 1
  br label %376

116:                                              ; preds = %112
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #4
  %117 = load ptr, ptr %8, align 8, !tbaa !5
  %118 = getelementptr inbounds i32, ptr %117, i64 0
  %119 = load i32, ptr %118, align 4, !tbaa !11
  store i32 %119, ptr %17, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %120 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %121 = load ptr, ptr %120, align 8, !tbaa !24
  %122 = load i32, ptr %17, align 4, !tbaa !11
  %123 = call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %121, i32 noundef %122)
  store ptr %123, ptr %18, align 8, !tbaa !5
  %124 = load ptr, ptr %18, align 8, !tbaa !5
  %125 = getelementptr inbounds %"struct.spirv_cross::SPIRType", ptr %124, i32 0, i32 11
  %126 = load i32, ptr %125, align 8, !tbaa !38
  %127 = icmp eq i32 %126, 2
  br i1 %127, label %138, label %128

128:                                              ; preds = %116
  %129 = load ptr, ptr %18, align 8, !tbaa !5
  %130 = getelementptr inbounds %"struct.spirv_cross::SPIRType", ptr %129, i32 0, i32 11
  %131 = load i32, ptr %130, align 8, !tbaa !38
  %132 = icmp eq i32 %131, 0
  br i1 %132, label %138, label %133

133:                                              ; preds = %128
  %134 = load ptr, ptr %18, align 8, !tbaa !5
  %135 = getelementptr inbounds %"struct.spirv_cross::SPIRType", ptr %134, i32 0, i32 11
  %136 = load i32, ptr %135, align 8, !tbaa !38
  %137 = icmp eq i32 %136, 12
  br i1 %137, label %138, label %160

138:                                              ; preds = %133, %128, %116
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  %139 = load ptr, ptr %8, align 8, !tbaa !5
  %140 = getelementptr inbounds i32, ptr %139, i64 1
  %141 = load i32, ptr %140, align 4, !tbaa !11
  store i32 %141, ptr %19, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  %142 = load ptr, ptr %8, align 8, !tbaa !5
  %143 = getelementptr inbounds i32, ptr %142, i64 2
  %144 = load i32, ptr %143, align 4, !tbaa !11
  store i32 %144, ptr %20, align 4, !tbaa !11
  %145 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %146 = load ptr, ptr %145, align 8, !tbaa !24
  %147 = load i32, ptr %19, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %21) #4
  store i8 1, ptr %21, align 1, !tbaa !36
  %148 = call noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176) %146, i32 noundef %147, ptr noundef nonnull align 1 dereferenceable(1) @.str, ptr noundef nonnull align 4 dereferenceable(4) %17, ptr noundef nonnull align 1 dereferenceable(1) %21)
  call void @llvm.lifetime.end.p0(i64 1, ptr %21) #4
  %149 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %150 = load ptr, ptr %149, align 8, !tbaa !24
  %151 = load i32, ptr %19, align 4, !tbaa !11
  %152 = load i32, ptr %20, align 4, !tbaa !11
  call void @_ZN11spirv_cross8Compiler13register_readEjjb(ptr noundef nonnull align 8 dereferenceable(3176) %150, i32 noundef %151, i32 noundef %152, i1 noundef zeroext true)
  %153 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %154 = load ptr, ptr %153, align 8, !tbaa !24
  %155 = getelementptr inbounds %"class.spirv_cross::Compiler", ptr %154, i32 0, i32 1
  %156 = getelementptr inbounds %"class.spirv_cross::ParsedIR", ptr %155, i32 0, i32 2
  %157 = load i32, ptr %19, align 4, !tbaa !11
  %158 = zext i32 %157 to i64
  %159 = call noundef nonnull align 8 dereferenceable(21) ptr @_ZN11spirv_cross10VectorViewINS_7VariantEEixEm(ptr noundef nonnull align 8 dereferenceable(16) %156, i64 noundef %158) #4
  call void @_ZN11spirv_cross7Variant22set_allow_type_rewriteEv(ptr noundef nonnull align 8 dereferenceable(21) %159)
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  br label %160

160:                                              ; preds = %138, %133
  store i32 2, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  br label %375

161:                                              ; preds = %54
  %162 = load i32, ptr %9, align 4, !tbaa !11
  %163 = icmp ult i32 %162, 3
  br i1 %163, label %164, label %165

164:                                              ; preds = %161
  store i1 false, ptr %5, align 1
  br label %376

165:                                              ; preds = %161
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  %166 = load ptr, ptr %8, align 8, !tbaa !5
  %167 = getelementptr inbounds i32, ptr %166, i64 0
  %168 = load i32, ptr %167, align 4, !tbaa !11
  store i32 %168, ptr %22, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  %169 = load ptr, ptr %8, align 8, !tbaa !5
  %170 = getelementptr inbounds i32, ptr %169, i64 1
  %171 = load i32, ptr %170, align 4, !tbaa !11
  store i32 %171, ptr %23, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  %172 = load ptr, ptr %8, align 8, !tbaa !5
  %173 = getelementptr inbounds i32, ptr %172, i64 2
  %174 = load i32, ptr %173, align 4, !tbaa !11
  store i32 %174, ptr %24, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %175 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %176 = load ptr, ptr %175, align 8, !tbaa !24
  %177 = load i32, ptr %23, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %26) #4
  store i8 1, ptr %26, align 1, !tbaa !36
  %178 = call noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176) %176, i32 noundef %177, ptr noundef nonnull align 1 dereferenceable(1) @.str, ptr noundef nonnull align 4 dereferenceable(4) %22, ptr noundef nonnull align 1 dereferenceable(1) %26)
  call void @llvm.lifetime.end.p0(i64 1, ptr %26) #4
  store ptr %178, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  %179 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %180 = load ptr, ptr %179, align 8, !tbaa !24
  %181 = load i32, ptr %24, align 4, !tbaa !11
  %182 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %180, i32 noundef %181)
  store ptr %182, ptr %27, align 8, !tbaa !5
  %183 = load ptr, ptr %27, align 8, !tbaa !5
  %184 = icmp ne ptr %183, null
  br i1 %184, label %185, label %190

185:                                              ; preds = %165
  %186 = load ptr, ptr %27, align 8, !tbaa !5
  %187 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %186, i32 0, i32 1
  %188 = load ptr, ptr %25, align 8, !tbaa !5
  %189 = getelementptr inbounds %"struct.spirv_cross::SPIRExpression", ptr %188, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %189, ptr align 8 %187, i64 4, i1 false), !tbaa.struct !37
  br label %190

190:                                              ; preds = %185, %165
  store i32 2, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  br label %375

191:                                              ; preds = %54, %54, %54
  %192 = load i32, ptr %9, align 4, !tbaa !11
  %193 = icmp ult i32 %192, 1
  br i1 %193, label %194, label %195

194:                                              ; preds = %191
  store i1 false, ptr %5, align 1
  br label %376

195:                                              ; preds = %191
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %196 = load ptr, ptr %8, align 8, !tbaa !5
  %197 = getelementptr inbounds i32, ptr %196, i64 0
  %198 = load i32, ptr %197, align 4, !tbaa !11
  store i32 %198, ptr %28, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  %199 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %200 = load ptr, ptr %199, align 8, !tbaa !24
  %201 = load i32, ptr %28, align 4, !tbaa !11
  %202 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %200, i32 noundef %201)
  store ptr %202, ptr %29, align 8, !tbaa !5
  %203 = load ptr, ptr %29, align 8, !tbaa !5
  %204 = icmp ne ptr %203, null
  br i1 %204, label %205, label %224

205:                                              ; preds = %195
  %206 = load ptr, ptr %29, align 8, !tbaa !5
  %207 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %206, i32 0, i32 2
  %208 = load i32, ptr %207, align 8, !tbaa !25
  %209 = icmp eq i32 %208, 2
  br i1 %209, label %220, label %210

210:                                              ; preds = %205
  %211 = load ptr, ptr %29, align 8, !tbaa !5
  %212 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %211, i32 0, i32 2
  %213 = load i32, ptr %212, align 8, !tbaa !25
  %214 = icmp eq i32 %213, 0
  br i1 %214, label %220, label %215

215:                                              ; preds = %210
  %216 = load ptr, ptr %29, align 8, !tbaa !5
  %217 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %216, i32 0, i32 2
  %218 = load i32, ptr %217, align 8, !tbaa !25
  %219 = icmp eq i32 %218, 12
  br i1 %219, label %220, label %224

220:                                              ; preds = %215, %210, %205
  %221 = load ptr, ptr %29, align 8, !tbaa !5
  %222 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %221, i32 0, i32 1
  %223 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %222)
  call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %40, i32 noundef %223)
  br label %224

224:                                              ; preds = %220, %215, %195
  store i32 2, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  br label %375

225:                                              ; preds = %54
  %226 = load i32, ptr %9, align 4, !tbaa !11
  %227 = icmp ult i32 %226, 2
  br i1 %227, label %228, label %229

228:                                              ; preds = %225
  store i1 false, ptr %5, align 1
  br label %376

229:                                              ; preds = %225
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  %230 = load ptr, ptr %8, align 8, !tbaa !5
  %231 = getelementptr inbounds i32, ptr %230, i64 0
  %232 = load i32, ptr %231, align 4, !tbaa !11
  store i32 %232, ptr %30, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #4
  %233 = load ptr, ptr %8, align 8, !tbaa !5
  %234 = getelementptr inbounds i32, ptr %233, i64 1
  %235 = load i32, ptr %234, align 4, !tbaa !11
  store i32 %235, ptr %31, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %236 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %237 = load ptr, ptr %236, align 8, !tbaa !24
  %238 = load i32, ptr %30, align 4, !tbaa !11
  %239 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %237, i32 noundef %238)
  store ptr %239, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #4
  %240 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %241 = load ptr, ptr %240, align 8, !tbaa !24
  %242 = load i32, ptr %31, align 4, !tbaa !11
  %243 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %241, i32 noundef %242)
  store ptr %243, ptr %33, align 8, !tbaa !5
  %244 = load ptr, ptr %32, align 8, !tbaa !5
  %245 = icmp ne ptr %244, null
  br i1 %245, label %246, label %260

246:                                              ; preds = %229
  %247 = load ptr, ptr %32, align 8, !tbaa !5
  %248 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %247, i32 0, i32 2
  %249 = load i32, ptr %248, align 8, !tbaa !25
  %250 = icmp eq i32 %249, 2
  br i1 %250, label %256, label %251

251:                                              ; preds = %246
  %252 = load ptr, ptr %32, align 8, !tbaa !5
  %253 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %252, i32 0, i32 2
  %254 = load i32, ptr %253, align 8, !tbaa !25
  %255 = icmp eq i32 %254, 12
  br i1 %255, label %256, label %260

256:                                              ; preds = %251, %246
  %257 = load ptr, ptr %32, align 8, !tbaa !5
  %258 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %257, i32 0, i32 1
  %259 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %258)
  call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %40, i32 noundef %259)
  br label %260

260:                                              ; preds = %256, %251, %229
  %261 = load ptr, ptr %33, align 8, !tbaa !5
  %262 = icmp ne ptr %261, null
  br i1 %262, label %263, label %297

263:                                              ; preds = %260
  %264 = load ptr, ptr %33, align 8, !tbaa !5
  %265 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %264, i32 0, i32 2
  %266 = load i32, ptr %265, align 8, !tbaa !25
  %267 = icmp ne i32 %266, 2
  br i1 %267, label %268, label %274

268:                                              ; preds = %263
  %269 = load ptr, ptr %33, align 8, !tbaa !5
  %270 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %269, i32 0, i32 2
  %271 = load i32, ptr %270, align 8, !tbaa !25
  %272 = icmp ne i32 %271, 12
  br i1 %272, label %273, label %274

273:                                              ; preds = %268
  store i32 2, ptr %12, align 4
  br label %298

274:                                              ; preds = %268, %263
  %275 = load ptr, ptr %33, align 8, !tbaa !5
  %276 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %275, i32 0, i32 2
  %277 = load i32, ptr %276, align 8, !tbaa !25
  %278 = icmp eq i32 %277, 2
  br i1 %278, label %279, label %293

279:                                              ; preds = %274
  %280 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %281 = load ptr, ptr %280, align 8, !tbaa !24
  %282 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %283 = load ptr, ptr %282, align 8, !tbaa !24
  %284 = load ptr, ptr %33, align 8, !tbaa !5
  %285 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %284, i32 0, i32 1
  %286 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %285)
  %287 = call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %283, i32 noundef %286)
  %288 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %287, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %34, ptr align 8 %288, i64 4, i1 false), !tbaa.struct !37
  %289 = getelementptr inbounds %"class.spirv_cross::TypedID.162", ptr %34, i32 0, i32 0
  %290 = load i32, ptr %289, align 4
  %291 = call noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176) %281, i32 %290, i32 noundef 3)
  br i1 %291, label %293, label %292

292:                                              ; preds = %279
  store i32 2, ptr %12, align 4
  br label %298

293:                                              ; preds = %279, %274
  %294 = load ptr, ptr %33, align 8, !tbaa !5
  %295 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %294, i32 0, i32 1
  %296 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %295)
  call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %40, i32 noundef %296)
  br label %297

297:                                              ; preds = %293, %260
  store i32 2, ptr %12, align 4
  br label %298

298:                                              ; preds = %297, %292, %273
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  br label %375

299:                                              ; preds = %54, %54
  %300 = load i32, ptr %9, align 4, !tbaa !11
  %301 = icmp ult i32 %300, 3
  br i1 %301, label %302, label %303

302:                                              ; preds = %299
  store i1 false, ptr %5, align 1
  br label %376

303:                                              ; preds = %299
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  %304 = load ptr, ptr %8, align 8, !tbaa !5
  %305 = getelementptr inbounds i32, ptr %304, i64 2
  %306 = load i32, ptr %305, align 4, !tbaa !11
  store i32 %306, ptr %35, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  %307 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %308 = load ptr, ptr %307, align 8, !tbaa !24
  %309 = load i32, ptr %35, align 4, !tbaa !11
  %310 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %308, i32 noundef %309)
  store ptr %310, ptr %36, align 8, !tbaa !5
  %311 = load ptr, ptr %36, align 8, !tbaa !5
  %312 = icmp ne ptr %311, null
  br i1 %312, label %314, label %313

313:                                              ; preds = %303
  store i32 2, ptr %12, align 4
  br label %339

314:                                              ; preds = %303
  %315 = load ptr, ptr %36, align 8, !tbaa !5
  %316 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %315, i32 0, i32 2
  %317 = load i32, ptr %316, align 8, !tbaa !25
  switch i32 %317, label %318 [
    i32 2, label %319
    i32 0, label %334
    i32 12, label %334
  ]

318:                                              ; preds = %314
  br label %338

319:                                              ; preds = %314
  %320 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %321 = load ptr, ptr %320, align 8, !tbaa !24
  %322 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %323 = load ptr, ptr %322, align 8, !tbaa !24
  %324 = load ptr, ptr %36, align 8, !tbaa !5
  %325 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %324, i32 0, i32 1
  %326 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %325)
  %327 = call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %323, i32 noundef %326)
  %328 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %327, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %37, ptr align 8 %328, i64 4, i1 false), !tbaa.struct !37
  %329 = getelementptr inbounds %"class.spirv_cross::TypedID.162", ptr %37, i32 0, i32 0
  %330 = load i32, ptr %329, align 4
  %331 = call noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176) %321, i32 %330, i32 noundef 3)
  br i1 %331, label %333, label %332

332:                                              ; preds = %319
  br label %338

333:                                              ; preds = %319
  br label %334

334:                                              ; preds = %333, %314, %314
  %335 = load ptr, ptr %36, align 8, !tbaa !5
  %336 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %335, i32 0, i32 1
  %337 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %336)
  call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %40, i32 noundef %337)
  br label %338

338:                                              ; preds = %334, %332, %318
  store i32 2, ptr %12, align 4
  br label %339

339:                                              ; preds = %338, %313
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  br label %375

340:                                              ; preds = %54, %54, %54, %54, %54, %54, %54, %54, %54, %54, %54, %54, %54
  %341 = load i32, ptr %9, align 4, !tbaa !11
  %342 = icmp ult i32 %341, 3
  br i1 %342, label %343, label %344

343:                                              ; preds = %340
  store i1 false, ptr %5, align 1
  br label %376

344:                                              ; preds = %340
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #4
  %345 = load ptr, ptr %8, align 8, !tbaa !5
  %346 = getelementptr inbounds i32, ptr %345, i64 2
  %347 = load i32, ptr %346, align 4, !tbaa !11
  store i32 %347, ptr %38, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  %348 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterlockedResourceAccessHandler", ptr %40, i32 0, i32 1
  %349 = load ptr, ptr %348, align 8, !tbaa !24
  %350 = load i32, ptr %38, align 4, !tbaa !11
  %351 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %349, i32 noundef %350)
  store ptr %351, ptr %39, align 8, !tbaa !5
  %352 = load ptr, ptr %39, align 8, !tbaa !5
  %353 = icmp ne ptr %352, null
  br i1 %353, label %354, label %373

354:                                              ; preds = %344
  %355 = load ptr, ptr %39, align 8, !tbaa !5
  %356 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %355, i32 0, i32 2
  %357 = load i32, ptr %356, align 8, !tbaa !25
  %358 = icmp eq i32 %357, 2
  br i1 %358, label %369, label %359

359:                                              ; preds = %354
  %360 = load ptr, ptr %39, align 8, !tbaa !5
  %361 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %360, i32 0, i32 2
  %362 = load i32, ptr %361, align 8, !tbaa !25
  %363 = icmp eq i32 %362, 0
  br i1 %363, label %369, label %364

364:                                              ; preds = %359
  %365 = load ptr, ptr %39, align 8, !tbaa !5
  %366 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %365, i32 0, i32 2
  %367 = load i32, ptr %366, align 8, !tbaa !25
  %368 = icmp eq i32 %367, 12
  br i1 %368, label %369, label %373

369:                                              ; preds = %364, %359, %354
  %370 = load ptr, ptr %39, align 8, !tbaa !5
  %371 = getelementptr inbounds %"struct.spirv_cross::IVariant", ptr %370, i32 0, i32 1
  %372 = call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %371)
  call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %40, i32 noundef %372)
  br label %373

373:                                              ; preds = %369, %364, %344
  store i32 2, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #4
  br label %375

374:                                              ; preds = %54
  br label %375

375:                                              ; preds = %374, %373, %339, %298, %224, %190, %160, %111
  store i1 true, ptr %5, align 1
  br label %376

376:                                              ; preds = %375, %343, %302, %228, %194, %164, %115, %59, %52, %47
  %377 = load i1, ptr %5, align 1
  ret i1 %377
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 = !{!"_ZTSN3spv2OpE", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !16, i64 26}
!14 = !{!"_ZTSN11spirv_cross8Compiler32InterlockedResourceAccessHandlerE", !15, i64 0, !6, i64 8, !16, i64 16, !12, i64 20, !16, i64 24, !16, i64 25, !16, i64 26, !16, i64 27, !17, i64 32}
!15 = !{!"_ZTSN11spirv_cross8Compiler13OpcodeHandlerE"}
!16 = !{!"bool", !7, i64 0}
!17 = !{!"_ZTSN11spirv_cross11SmallVectorIjLm8EEE", !18, i64 0, !19, i64 16, !20, i64 24}
!18 = !{!"_ZTSN11spirv_cross10VectorViewIjEE", !6, i64 0, !19, i64 8}
!19 = !{!"long", !7, i64 0}
!20 = !{!"_ZTSN11spirv_cross13AlignedBufferIjLm8EEE", !7, i64 0}
!21 = !{i8 0, i8 2}
!22 = !{}
!23 = !{!14, !16, i64 16}
!24 = !{!14, !6, i64 8}
!25 = !{!26, !30, i64 16}
!26 = !{!"_ZTSN11spirv_cross12SPIRVariableE", !27, i64 0, !29, i64 12, !30, i64 16, !12, i64 20, !28, i64 24, !31, i64 28, !17, i64 32, !16, i64 88, !16, i64 89, !28, i64 92, !32, i64 96, !16, i64 152, !16, i64 153, !16, i64 154, !16, i64 155, !12, i64 156, !35, i64 160, !16, i64 164, !16, i64 165, !16, i64 166, !6, i64 168}
!27 = !{!"_ZTSN11spirv_cross8IVariantE", !28, i64 8}
!28 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE0EEE", !12, i64 0}
!29 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE1EEE", !12, i64 0}
!30 = !{!"_ZTSN3spv12StorageClassE", !7, i64 0}
!31 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE2EEE", !12, i64 0}
!32 = !{!"_ZTSN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EEE", !33, i64 0, !19, i64 16, !34, i64 24}
!33 = !{!"_ZTSN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE0EEEEE", !6, i64 0, !19, i64 8}
!34 = !{!"_ZTSN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE0EEELm8EEE", !7, i64 0}
!35 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE6EEE", !12, i64 0}
!36 = !{!16, !16, i64 0}
!37 = !{i64 0, i64 4, !11}
!38 = !{!39, !30, i64 128}
!39 = !{!"_ZTSN11spirv_cross8SPIRTypeE", !27, i64 0, !10, i64 12, !40, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !17, i64 32, !41, i64 88, !12, i64 120, !16, i64 124, !16, i64 125, !30, i64 128, !44, i64 136, !17, i64 192, !47, i64 248, !29, i64 272, !29, i64 276, !51, i64 280}
!40 = !{!"_ZTSN11spirv_cross8SPIRType8BaseTypeE", !7, i64 0}
!41 = !{!"_ZTSN11spirv_cross11SmallVectorIbLm8EEE", !42, i64 0, !19, i64 16, !43, i64 24}
!42 = !{!"_ZTSN11spirv_cross10VectorViewIbEE", !6, i64 0, !19, i64 8}
!43 = !{!"_ZTSN11spirv_cross13AlignedBufferIbLm8EEE", !7, i64 0}
!44 = !{!"_ZTSN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EEE", !45, i64 0, !19, i64 16, !46, i64 24}
!45 = !{!"_ZTSN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE1EEEEE", !6, i64 0, !19, i64 8}
!46 = !{!"_ZTSN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE1EEELm8EEE", !7, i64 0}
!47 = !{!"_ZTSN11spirv_cross8SPIRType9ImageTypeE", !29, i64 0, !48, i64 4, !16, i64 8, !16, i64 9, !16, i64 10, !12, i64 12, !49, i64 16, !50, i64 20}
!48 = !{!"_ZTSN3spv3DimE", !7, i64 0}
!49 = !{!"_ZTSN3spv11ImageFormatE", !7, i64 0}
!50 = !{!"_ZTSN3spv15AccessQualifierE", !7, i64 0}
!51 = !{!"_ZTSSt13unordered_setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4hashIS5_ESt8equal_toIS5_ESaIS5_EE", !52, i64 0}
!52 = !{!"_ZTSSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_SaIS5_ENSt8__detail9_IdentityESt8equal_toIS5_ESt4hashIS5_ENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb1ELb1ELb1EEEE", !6, i64 0, !19, i64 8, !53, i64 16, !19, i64 24, !54, i64 32, !6, i64 48}
!53 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !6, i64 0}
!54 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !55, i64 0, !19, i64 8}
!55 = !{!"float", !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"

@.str = external hidden unnamed_addr constant [1 x i8], align 1

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

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176), i32, i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11spirv_cross8Compiler13register_readEjjb(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef, i32 noundef, i1 noundef zeroext) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(21) ptr @_ZN11spirv_cross10VectorViewINS_7VariantEEixEm(ptr noundef nonnull align 8 dereferenceable(16), i64 noundef) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176), i32 noundef, ptr noundef nonnull align 1 dereferenceable(1), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 1 dereferenceable(1)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN11spirv_cross7Variant22set_allow_type_rewriteEv(ptr noundef nonnull align 8 dereferenceable(21)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88), i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler6handleEN3spv2OpEPKjj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %1, ptr nocapture noundef readonly %2, i32 noundef %3) unnamed_addr #1 align 2 {
  %5 = alloca i32, align 4
  %6 = alloca i8, align 1
  %7 = alloca i32, align 4
  %8 = alloca i8, align 1
  %9 = alloca i32, align 4
  %10 = alloca i8, align 1
  %11 = getelementptr inbounds i8, ptr %0, i64 26
  %12 = load i8, ptr %11, align 2, !tbaa !5, !range !17, !noundef !18
  %13 = trunc nuw i8 %12 to i1
  br i1 %13, label %14, label %17

14:                                               ; preds = %4
  switch i32 %1, label %165 [
    i32 5364, label %15
    i32 5365, label %166
    i32 61, label %18
    i32 66, label %46
    i32 65, label %46
    i32 67, label %46
    i32 60, label %68
    i32 62, label %86
    i32 99, label %86
    i32 228, label %86
    i32 63, label %99
    i32 98, label %130
    i32 227, label %130
    i32 229, label %151
    i32 230, label %151
    i32 232, label %151
    i32 233, label %151
    i32 234, label %151
    i32 235, label %151
    i32 236, label %151
    i32 237, label %151
    i32 238, label %151
    i32 239, label %151
    i32 240, label %151
    i32 241, label %151
    i32 242, label %151
  ]

15:                                               ; preds = %14
  %16 = getelementptr inbounds i8, ptr %0, i64 16
  store i8 1, ptr %16, align 8, !tbaa !19
  br label %166

17:                                               ; preds = %4
  switch i32 %1, label %165 [
    i32 61, label %18
    i32 66, label %46
    i32 65, label %46
    i32 67, label %46
    i32 60, label %68
    i32 62, label %86
    i32 99, label %86
    i32 228, label %86
    i32 63, label %99
    i32 98, label %130
    i32 227, label %130
    i32 229, label %151
    i32 230, label %151
    i32 232, label %151
    i32 233, label %151
    i32 234, label %151
    i32 235, label %151
    i32 236, label %151
    i32 237, label %151
    i32 238, label %151
    i32 239, label %151
    i32 240, label %151
    i32 241, label %151
    i32 242, label %151
  ]

18:                                               ; preds = %14, %17
  %19 = icmp ult i32 %3, 3
  br i1 %19, label %166, label %20

20:                                               ; preds = %18
  %21 = getelementptr inbounds i8, ptr %2, i64 8
  %22 = load i32, ptr %21, align 4, !tbaa !20
  %23 = getelementptr inbounds i8, ptr %0, i64 8
  %24 = load ptr, ptr %23, align 8, !tbaa !21
  %25 = tail call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %24, i32 noundef %22)
  %.not96 = icmp eq ptr %25, null
  br i1 %.not96, label %165, label %26

26:                                               ; preds = %20
  %27 = getelementptr inbounds i8, ptr %25, i64 16
  %28 = load i32, ptr %27, align 8, !tbaa !22
  switch i32 %28, label %165 [
    i32 0, label %29
    i32 2, label %36
    i32 12, label %43
  ]

29:                                               ; preds = %26
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #3
  %30 = load i32, ptr %2, align 4, !tbaa !20
  store i32 %30, ptr %5, align 4, !tbaa !20
  %31 = getelementptr inbounds i8, ptr %2, i64 4
  %32 = load i32, ptr %31, align 4, !tbaa !20
  %33 = load ptr, ptr %23, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %6) #3
  store i8 1, ptr %6, align 1, !tbaa !33
  %34 = call noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176) %33, i32 noundef %32, ptr noundef nonnull align 1 dereferenceable(1) @.str, ptr noundef nonnull align 4 dereferenceable(4) %5, ptr noundef nonnull align 1 dereferenceable(1) %6)
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %6) #3
  %35 = load ptr, ptr %23, align 8, !tbaa !21
  call void @_ZN11spirv_cross8Compiler13register_readEjjb(ptr noundef nonnull align 8 dereferenceable(3176) %35, i32 noundef %32, i32 noundef %22, i1 noundef zeroext true)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #3
  br label %165

36:                                               ; preds = %26
  %37 = load ptr, ptr %23, align 8, !tbaa !21
  %38 = getelementptr inbounds i8, ptr %25, i64 12
  %39 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %38)
  %40 = tail call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %37, i32 noundef %39)
  %41 = getelementptr inbounds i8, ptr %40, i64 8
  %.sroa.041.0.copyload = load i32, ptr %41, align 8, !tbaa !20
  %42 = tail call noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176) %37, i32 %.sroa.041.0.copyload, i32 noundef 3)
  br i1 %42, label %43, label %165

43:                                               ; preds = %36, %26
  %44 = getelementptr inbounds i8, ptr %25, i64 8
  %45 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %44)
  tail call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %45)
  br label %165

46:                                               ; preds = %14, %14, %14, %17, %17, %17
  %47 = icmp ult i32 %3, 3
  br i1 %47, label %166, label %48

48:                                               ; preds = %46
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %7) #3
  %49 = load i32, ptr %2, align 4, !tbaa !20
  store i32 %49, ptr %7, align 4, !tbaa !20
  %50 = getelementptr inbounds i8, ptr %0, i64 8
  %51 = load ptr, ptr %50, align 8, !tbaa !21
  %52 = tail call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %51, i32 noundef %49)
  %53 = getelementptr inbounds i8, ptr %52, i64 128
  %54 = load i32, ptr %53, align 8, !tbaa !34
  switch i32 %54, label %67 [
    i32 2, label %55
    i32 0, label %55
    i32 12, label %55
  ]

55:                                               ; preds = %48, %48, %48
  %56 = getelementptr inbounds i8, ptr %2, i64 4
  %57 = load i32, ptr %56, align 4, !tbaa !20
  %58 = getelementptr inbounds i8, ptr %2, i64 8
  %59 = load i32, ptr %58, align 4, !tbaa !20
  %60 = load ptr, ptr %50, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %8) #3
  store i8 1, ptr %8, align 1, !tbaa !33
  %61 = call noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176) %60, i32 noundef %57, ptr noundef nonnull align 1 dereferenceable(1) @.str, ptr noundef nonnull align 4 dereferenceable(4) %7, ptr noundef nonnull align 1 dereferenceable(1) %8)
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %8) #3
  %62 = load ptr, ptr %50, align 8, !tbaa !21
  call void @_ZN11spirv_cross8Compiler13register_readEjjb(ptr noundef nonnull align 8 dereferenceable(3176) %62, i32 noundef %57, i32 noundef %59, i1 noundef zeroext true)
  %63 = load ptr, ptr %50, align 8, !tbaa !21
  %64 = getelementptr inbounds i8, ptr %63, i64 40
  %65 = zext i32 %57 to i64
  %66 = call noundef nonnull align 8 dereferenceable(21) ptr @_ZN11spirv_cross10VectorViewINS_7VariantEEixEm(ptr noundef nonnull align 8 dereferenceable(16) %64, i64 noundef %65) #3
  call void @_ZN11spirv_cross7Variant22set_allow_type_rewriteEv(ptr noundef nonnull align 8 dereferenceable(21) %66)
  br label %67

67:                                               ; preds = %48, %55
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %7) #3
  br label %165

68:                                               ; preds = %14, %17
  %69 = icmp ult i32 %3, 3
  br i1 %69, label %166, label %70

70:                                               ; preds = %68
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #3
  %71 = load i32, ptr %2, align 4, !tbaa !20
  store i32 %71, ptr %9, align 4, !tbaa !20
  %72 = getelementptr inbounds i8, ptr %2, i64 4
  %73 = load i32, ptr %72, align 4, !tbaa !20
  %74 = getelementptr inbounds i8, ptr %2, i64 8
  %75 = load i32, ptr %74, align 4, !tbaa !20
  %76 = getelementptr inbounds i8, ptr %0, i64 8
  %77 = load ptr, ptr %76, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %10) #3
  store i8 1, ptr %10, align 1, !tbaa !33
  %78 = call noundef nonnull align 8 dereferenceable(236) ptr @_ZN11spirv_cross8Compiler3setINS_14SPIRExpressionEJRA1_KcRjbEEERT_jDpOT0_(ptr noundef nonnull align 8 dereferenceable(3176) %77, i32 noundef %73, ptr noundef nonnull align 1 dereferenceable(1) @.str, ptr noundef nonnull align 4 dereferenceable(4) %9, ptr noundef nonnull align 1 dereferenceable(1) %10)
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %10) #3
  %79 = load ptr, ptr %76, align 8, !tbaa !21
  %80 = call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %79, i32 noundef %75)
  %.not95 = icmp eq ptr %80, null
  br i1 %.not95, label %85, label %81

81:                                               ; preds = %70
  %82 = getelementptr inbounds i8, ptr %80, i64 8
  %83 = getelementptr inbounds i8, ptr %78, i64 52
  %84 = load i32, ptr %82, align 8, !tbaa !20
  store i32 %84, ptr %83, align 4, !tbaa !20
  br label %85

85:                                               ; preds = %81, %70
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #3
  br label %165

86:                                               ; preds = %14, %14, %14, %17, %17, %17
  %87 = icmp eq i32 %3, 0
  br i1 %87, label %166, label %88

88:                                               ; preds = %86
  %89 = load i32, ptr %2, align 4, !tbaa !20
  %90 = getelementptr inbounds i8, ptr %0, i64 8
  %91 = load ptr, ptr %90, align 8, !tbaa !21
  %92 = tail call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %91, i32 noundef %89)
  %.not94 = icmp eq ptr %92, null
  br i1 %.not94, label %165, label %93

93:                                               ; preds = %88
  %94 = getelementptr inbounds i8, ptr %92, i64 16
  %95 = load i32, ptr %94, align 8, !tbaa !22
  switch i32 %95, label %165 [
    i32 2, label %96
    i32 0, label %96
    i32 12, label %96
  ]

96:                                               ; preds = %93, %93, %93
  %97 = getelementptr inbounds i8, ptr %92, i64 8
  %98 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %97)
  tail call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %98)
  br label %165

99:                                               ; preds = %14, %17
  %100 = icmp ult i32 %3, 2
  br i1 %100, label %166, label %101

101:                                              ; preds = %99
  %102 = load i32, ptr %2, align 4, !tbaa !20
  %103 = getelementptr inbounds i8, ptr %2, i64 4
  %104 = load i32, ptr %103, align 4, !tbaa !20
  %105 = getelementptr inbounds i8, ptr %0, i64 8
  %106 = load ptr, ptr %105, align 8, !tbaa !21
  %107 = tail call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %106, i32 noundef %102)
  %108 = load ptr, ptr %105, align 8, !tbaa !21
  %109 = tail call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %108, i32 noundef %104)
  %.not90 = icmp eq ptr %107, null
  br i1 %.not90, label %116, label %110

110:                                              ; preds = %101
  %111 = getelementptr inbounds i8, ptr %107, i64 16
  %112 = load i32, ptr %111, align 8, !tbaa !22
  switch i32 %112, label %116 [
    i32 2, label %113
    i32 12, label %113
  ]

113:                                              ; preds = %110, %110
  %114 = getelementptr inbounds i8, ptr %107, i64 8
  %115 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %114)
  tail call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %115)
  br label %116

116:                                              ; preds = %110, %113, %101
  %.not91 = icmp eq ptr %109, null
  br i1 %.not91, label %165, label %117

117:                                              ; preds = %116
  %118 = getelementptr inbounds i8, ptr %109, i64 16
  %119 = load i32, ptr %118, align 8, !tbaa !22
  switch i32 %119, label %165 [
    i32 2, label %120
    i32 12, label %127
  ]

120:                                              ; preds = %117
  %121 = load ptr, ptr %105, align 8, !tbaa !21
  %122 = getelementptr inbounds i8, ptr %109, i64 12
  %123 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %122)
  %124 = tail call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %121, i32 noundef %123)
  %125 = getelementptr inbounds i8, ptr %124, i64 8
  %.sroa.010.0.copyload = load i32, ptr %125, align 8, !tbaa !20
  %126 = tail call noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176) %121, i32 %.sroa.010.0.copyload, i32 noundef 3)
  br i1 %126, label %127, label %165

127:                                              ; preds = %117, %120
  %128 = getelementptr inbounds i8, ptr %109, i64 8
  %129 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %128)
  tail call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %129)
  br label %165

130:                                              ; preds = %14, %14, %17, %17
  %131 = icmp ult i32 %3, 3
  br i1 %131, label %166, label %132

132:                                              ; preds = %130
  %133 = getelementptr inbounds i8, ptr %2, i64 8
  %134 = load i32, ptr %133, align 4, !tbaa !20
  %135 = getelementptr inbounds i8, ptr %0, i64 8
  %136 = load ptr, ptr %135, align 8, !tbaa !21
  %137 = tail call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %136, i32 noundef %134)
  %.not89 = icmp eq ptr %137, null
  br i1 %.not89, label %165, label %138

138:                                              ; preds = %132
  %139 = getelementptr inbounds i8, ptr %137, i64 16
  %140 = load i32, ptr %139, align 8, !tbaa !22
  switch i32 %140, label %165 [
    i32 2, label %141
    i32 0, label %148
    i32 12, label %148
  ]

141:                                              ; preds = %138
  %142 = load ptr, ptr %135, align 8, !tbaa !21
  %143 = getelementptr inbounds i8, ptr %137, i64 12
  %144 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %143)
  %145 = tail call noundef nonnull align 8 dereferenceable(336) ptr @_ZN11spirv_cross8Compiler3getINS_8SPIRTypeEEERT_j(ptr noundef nonnull align 8 dereferenceable(3176) %142, i32 noundef %144)
  %146 = getelementptr inbounds i8, ptr %145, i64 8
  %.sroa.0.0.copyload = load i32, ptr %146, align 8, !tbaa !20
  %147 = tail call noundef zeroext i1 @_ZNK11spirv_cross8Compiler14has_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE(ptr noundef nonnull align 8 dereferenceable(3176) %142, i32 %.sroa.0.0.copyload, i32 noundef 3)
  br i1 %147, label %148, label %165

148:                                              ; preds = %141, %138, %138
  %149 = getelementptr inbounds i8, ptr %137, i64 8
  %150 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %149)
  tail call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %150)
  br label %165

151:                                              ; preds = %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %17, %17, %17, %17, %17, %17, %17, %17, %17, %17, %17, %17, %17
  %152 = icmp ult i32 %3, 3
  br i1 %152, label %166, label %153

153:                                              ; preds = %151
  %154 = getelementptr inbounds i8, ptr %2, i64 8
  %155 = load i32, ptr %154, align 4, !tbaa !20
  %156 = getelementptr inbounds i8, ptr %0, i64 8
  %157 = load ptr, ptr %156, align 8, !tbaa !21
  %158 = tail call noundef ptr @_ZN11spirv_cross8Compiler26maybe_get_backing_variableEj(ptr noundef nonnull align 8 dereferenceable(3176) %157, i32 noundef %155)
  %.not = icmp eq ptr %158, null
  br i1 %.not, label %165, label %159

159:                                              ; preds = %153
  %160 = getelementptr inbounds i8, ptr %158, i64 16
  %161 = load i32, ptr %160, align 8, !tbaa !22
  switch i32 %161, label %165 [
    i32 2, label %162
    i32 0, label %162
    i32 12, label %162
  ]

162:                                              ; preds = %159, %159, %159
  %163 = getelementptr inbounds i8, ptr %158, i64 8
  %164 = tail call noundef i32 @_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %163)
  tail call void @_ZN11spirv_cross8Compiler32InterlockedResourceAccessHandler25access_potential_resourceEj(ptr noundef nonnull align 8 dereferenceable(88) %0, i32 noundef %164)
  br label %165

165:                                              ; preds = %117, %153, %162, %159, %132, %141, %138, %148, %120, %127, %116, %88, %96, %93, %20, %36, %26, %43, %29, %14, %17, %85, %67
  br label %166

166:                                              ; preds = %151, %130, %99, %86, %68, %46, %18, %14, %165, %15
  %.0 = phi i1 [ true, %15 ], [ true, %165 ], [ false, %14 ], [ false, %18 ], [ false, %46 ], [ false, %68 ], [ false, %86 ], [ false, %99 ], [ false, %130 ], [ false, %151 ]
  ret i1 %.0
}

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #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, !11, i64 26}
!6 = !{!"_ZTSN11spirv_cross8Compiler32InterlockedResourceAccessHandlerE", !7, i64 0, !8, i64 8, !11, i64 16, !12, i64 20, !11, i64 24, !11, i64 25, !11, i64 26, !11, i64 27, !13, i64 32}
!7 = !{!"_ZTSN11spirv_cross8Compiler13OpcodeHandlerE"}
!8 = !{!"any pointer", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C++ TBAA"}
!11 = !{!"bool", !9, i64 0}
!12 = !{!"int", !9, i64 0}
!13 = !{!"_ZTSN11spirv_cross11SmallVectorIjLm8EEE", !14, i64 0, !15, i64 16, !16, i64 24}
!14 = !{!"_ZTSN11spirv_cross10VectorViewIjEE", !8, i64 0, !15, i64 8}
!15 = !{!"long", !9, i64 0}
!16 = !{!"_ZTSN11spirv_cross13AlignedBufferIjLm8EEE", !9, i64 0}
!17 = !{i8 0, i8 2}
!18 = !{}
!19 = !{!6, !11, i64 16}
!20 = !{!12, !12, i64 0}
!21 = !{!6, !8, i64 8}
!22 = !{!23, !27, i64 16}
!23 = !{!"_ZTSN11spirv_cross12SPIRVariableE", !24, i64 0, !26, i64 12, !27, i64 16, !12, i64 20, !25, i64 24, !28, i64 28, !13, i64 32, !11, i64 88, !11, i64 89, !25, i64 92, !29, i64 96, !11, i64 152, !11, i64 153, !11, i64 154, !11, i64 155, !12, i64 156, !32, i64 160, !11, i64 164, !11, i64 165, !11, i64 166, !8, i64 168}
!24 = !{!"_ZTSN11spirv_cross8IVariantE", !25, i64 8}
!25 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE0EEE", !12, i64 0}
!26 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE1EEE", !12, i64 0}
!27 = !{!"_ZTSN3spv12StorageClassE", !9, i64 0}
!28 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE2EEE", !12, i64 0}
!29 = !{!"_ZTSN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EEE", !30, i64 0, !15, i64 16, !31, i64 24}
!30 = !{!"_ZTSN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE0EEEEE", !8, i64 0, !15, i64 8}
!31 = !{!"_ZTSN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE0EEELm8EEE", !9, i64 0}
!32 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE6EEE", !12, i64 0}
!33 = !{!11, !11, i64 0}
!34 = !{!35, !27, i64 128}
!35 = !{!"_ZTSN11spirv_cross8SPIRTypeE", !24, i64 0, !36, i64 12, !37, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !13, i64 32, !38, i64 88, !12, i64 120, !11, i64 124, !11, i64 125, !27, i64 128, !41, i64 136, !13, i64 192, !44, i64 248, !26, i64 272, !26, i64 276, !48, i64 280}
!36 = !{!"_ZTSN3spv2OpE", !9, i64 0}
!37 = !{!"_ZTSN11spirv_cross8SPIRType8BaseTypeE", !9, i64 0}
!38 = !{!"_ZTSN11spirv_cross11SmallVectorIbLm8EEE", !39, i64 0, !15, i64 16, !40, i64 24}
!39 = !{!"_ZTSN11spirv_cross10VectorViewIbEE", !8, i64 0, !15, i64 8}
!40 = !{!"_ZTSN11spirv_cross13AlignedBufferIbLm8EEE", !9, i64 0}
!41 = !{!"_ZTSN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EEE", !42, i64 0, !15, i64 16, !43, i64 24}
!42 = !{!"_ZTSN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE1EEEEE", !8, i64 0, !15, i64 8}
!43 = !{!"_ZTSN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE1EEELm8EEE", !9, i64 0}
!44 = !{!"_ZTSN11spirv_cross8SPIRType9ImageTypeE", !26, i64 0, !45, i64 4, !11, i64 8, !11, i64 9, !11, i64 10, !12, i64 12, !46, i64 16, !47, i64 20}
!45 = !{!"_ZTSN3spv3DimE", !9, i64 0}
!46 = !{!"_ZTSN3spv11ImageFormatE", !9, i64 0}
!47 = !{!"_ZTSN3spv15AccessQualifierE", !9, i64 0}
!48 = !{!"_ZTSSt13unordered_setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4hashIS5_ESt8equal_toIS5_ESaIS5_EE", !49, i64 0}
!49 = !{!"_ZTSSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_SaIS5_ENSt8__detail9_IdentityESt8equal_toIS5_ESt4hashIS5_ENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb1ELb1ELb1EEEE", !8, i64 0, !15, i64 8, !50, i64 16, !15, i64 24, !51, i64 32, !8, i64 48}
!50 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !8, i64 0}
!51 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !52, i64 0, !15, i64 8}
!52 = !{!"float", !9, i64 0}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass