; 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.164" = type { i32 }
%"struct.std::pair.246" = type <{ %"struct.std::__detail::_Node_iterator.248", i8, [7 x i8] }>
%"struct.std::__detail::_Node_iterator.248" = type { %"struct.std::__detail::_Node_iterator_base.239" }
%"struct.std::__detail::_Node_iterator_base.239" = type { ptr }
%"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler" = type { %"struct.spirv_cross::Compiler::OpcodeHandler", ptr, ptr }
%"struct.spirv_cross::Compiler::OpcodeHandler" = type { ptr }
%"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::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] }
%"class.spirv_cross::TypedID.162" = 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::SPIRExtension" = type { %"struct.spirv_cross::IVariant.base", i32 }

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef) #1

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN11spirv_cross8Compiler30InterfaceVariableAccessHandler6handleEN3spv2OpEPKjj(ptr noundef nonnull align 8 dereferenceable(24) %0, i32 noundef %1, ptr noundef %2, i32 noundef %3) unnamed_addr #2 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 i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca %"class.spirv_cross::TypedID.164", align 4
  %16 = alloca %"struct.std::pair.246", align 8
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca %"class.spirv_cross::TypedID.164", align 4
  %21 = alloca %"struct.std::pair.246", align 8
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca ptr, align 8
  %25 = alloca %"class.spirv_cross::TypedID.164", align 4
  %26 = alloca %"struct.std::pair.246", align 8
  %27 = alloca ptr, align 8
  %28 = alloca %"class.spirv_cross::TypedID.164", align 4
  %29 = alloca %"struct.std::pair.246", align 8
  %30 = alloca %"class.spirv_cross::TypedID.164", align 4
  %31 = alloca %"struct.std::pair.246", align 8
  %32 = alloca ptr, align 8
  %33 = alloca i32, align 4
  %34 = alloca ptr, align 8
  %35 = alloca %"class.spirv_cross::TypedID.164", align 4
  %36 = alloca %"struct.std::pair.246", align 8
  %37 = alloca ptr, align 8
  %38 = alloca %"class.spirv_cross::TypedID.164", align 4
  %39 = alloca %"struct.std::pair.246", align 8
  %40 = alloca i32, align 4
  %41 = alloca ptr, align 8
  %42 = alloca %"class.spirv_cross::TypedID.164", align 4
  %43 = alloca %"struct.std::pair.246", align 8
  %44 = alloca ptr, align 8
  %45 = alloca %"class.spirv_cross::TypedID.164", align 4
  %46 = alloca %"struct.std::pair.246", 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
  %47 = load ptr, ptr %6, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  store i32 0, ptr %10, align 4, !tbaa !11
  %48 = load i32, ptr %7, align 4, !tbaa !9
  switch i32 %48, label %49 [
    i32 57, label %50
    i32 169, label %98
    i32 245, label %146
    i32 228, label %194
    i32 62, label %194
    i32 63, label %202
    i32 12, label %257
    i32 65, label %365
    i32 66, label %365
    i32 67, label %365
    i32 61, label %365
    i32 83, label %365
    i32 60, label %365
    i32 227, label %365
    i32 229, label %365
    i32 230, label %365
    i32 231, label %365
    i32 232, label %365
    i32 233, label %365
    i32 234, label %365
    i32 235, label %365
    i32 236, label %365
    i32 237, label %365
    i32 238, label %365
    i32 239, label %365
    i32 240, label %365
    i32 241, label %365
    i32 242, label %365
    i32 68, label %365
  ]

49:                                               ; preds = %4
  br label %373

50:                                               ; preds = %4
  %51 = load i32, ptr %9, align 4, !tbaa !11
  %52 = icmp ult i32 %51, 3
  br i1 %52, label %53, label %54

53:                                               ; preds = %50
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

54:                                               ; preds = %50
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  %55 = load i32, ptr %9, align 4, !tbaa !11
  %56 = sub i32 %55, 3
  store i32 %56, ptr %12, align 4, !tbaa !11
  %57 = load ptr, ptr %8, align 8, !tbaa !5
  %58 = getelementptr inbounds i32, ptr %57, i64 3
  store ptr %58, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  store i32 0, ptr %13, align 4, !tbaa !11
  br label %59

59:                                               ; preds = %94, %54
  %60 = load i32, ptr %13, align 4, !tbaa !11
  %61 = load i32, ptr %12, align 4, !tbaa !11
  %62 = icmp ult i32 %60, %61
  br i1 %62, label %64, label %63

63:                                               ; preds = %59
  store i32 3, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  br label %97

64:                                               ; preds = %59
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  %65 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %66 = load ptr, ptr %65, align 8, !tbaa !13
  %67 = load ptr, ptr %8, align 8, !tbaa !5
  %68 = load i32, ptr %13, align 4, !tbaa !11
  %69 = zext i32 %68 to i64
  %70 = getelementptr inbounds i32, ptr %67, i64 %69
  %71 = load i32, ptr %70, align 4, !tbaa !11
  %72 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %66, i32 noundef %71)
  store ptr %72, ptr %14, align 8, !tbaa !5
  %73 = load ptr, ptr %14, align 8, !tbaa !5
  %74 = icmp ne ptr %73, null
  br i1 %74, label %75, label %93

75:                                               ; preds = %64
  %76 = load ptr, ptr %14, align 8, !tbaa !5
  %77 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %76, i32 0, i32 2
  %78 = load i32, ptr %77, align 8, !tbaa !16
  %79 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %78)
  br i1 %79, label %80, label %93

80:                                               ; preds = %75
  %81 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %82 = load ptr, ptr %81, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  %83 = load ptr, ptr %8, align 8, !tbaa !5
  %84 = load i32, ptr %13, align 4, !tbaa !11
  %85 = zext i32 %84 to i64
  %86 = getelementptr inbounds i32, ptr %83, i64 %85
  %87 = load i32, ptr %86, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %15, i32 noundef %87)
  %88 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %82, ptr noundef nonnull align 4 dereferenceable(4) %15)
  %89 = getelementptr inbounds { ptr, i8 }, ptr %16, i32 0, i32 0
  %90 = extractvalue { ptr, i8 } %88, 0
  store ptr %90, ptr %89, align 8
  %91 = getelementptr inbounds { ptr, i8 }, ptr %16, i32 0, i32 1
  %92 = extractvalue { ptr, i8 } %88, 1
  store i8 %92, ptr %91, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  br label %93

93:                                               ; preds = %80, %75, %64
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  br label %94

94:                                               ; preds = %93
  %95 = load i32, ptr %13, align 4, !tbaa !11
  %96 = add i32 %95, 1
  store i32 %96, ptr %13, align 4, !tbaa !11
  br label %59, !llvm.loop !33

97:                                               ; preds = %63
  store i32 2, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  br label %373

98:                                               ; preds = %4
  %99 = load i32, ptr %9, align 4, !tbaa !11
  %100 = icmp ult i32 %99, 5
  br i1 %100, label %101, label %102

101:                                              ; preds = %98
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

102:                                              ; preds = %98
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #4
  %103 = load i32, ptr %9, align 4, !tbaa !11
  %104 = sub i32 %103, 3
  store i32 %104, ptr %17, align 4, !tbaa !11
  %105 = load ptr, ptr %8, align 8, !tbaa !5
  %106 = getelementptr inbounds i32, ptr %105, i64 3
  store ptr %106, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  store i32 0, ptr %18, align 4, !tbaa !11
  br label %107

107:                                              ; preds = %142, %102
  %108 = load i32, ptr %18, align 4, !tbaa !11
  %109 = load i32, ptr %17, align 4, !tbaa !11
  %110 = icmp ult i32 %108, %109
  br i1 %110, label %112, label %111

111:                                              ; preds = %107
  store i32 6, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  br label %145

112:                                              ; preds = %107
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %113 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %114 = load ptr, ptr %113, align 8, !tbaa !13
  %115 = load ptr, ptr %8, align 8, !tbaa !5
  %116 = load i32, ptr %18, align 4, !tbaa !11
  %117 = zext i32 %116 to i64
  %118 = getelementptr inbounds i32, ptr %115, i64 %117
  %119 = load i32, ptr %118, align 4, !tbaa !11
  %120 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %114, i32 noundef %119)
  store ptr %120, ptr %19, align 8, !tbaa !5
  %121 = load ptr, ptr %19, align 8, !tbaa !5
  %122 = icmp ne ptr %121, null
  br i1 %122, label %123, label %141

123:                                              ; preds = %112
  %124 = load ptr, ptr %19, align 8, !tbaa !5
  %125 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %124, i32 0, i32 2
  %126 = load i32, ptr %125, align 8, !tbaa !16
  %127 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %126)
  br i1 %127, label %128, label %141

128:                                              ; preds = %123
  %129 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %130 = load ptr, ptr %129, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  %131 = load ptr, ptr %8, align 8, !tbaa !5
  %132 = load i32, ptr %18, align 4, !tbaa !11
  %133 = zext i32 %132 to i64
  %134 = getelementptr inbounds i32, ptr %131, i64 %133
  %135 = load i32, ptr %134, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %20, i32 noundef %135)
  %136 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %130, ptr noundef nonnull align 4 dereferenceable(4) %20)
  %137 = getelementptr inbounds { ptr, i8 }, ptr %21, i32 0, i32 0
  %138 = extractvalue { ptr, i8 } %136, 0
  store ptr %138, ptr %137, align 8
  %139 = getelementptr inbounds { ptr, i8 }, ptr %21, i32 0, i32 1
  %140 = extractvalue { ptr, i8 } %136, 1
  store i8 %140, ptr %139, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  br label %141

141:                                              ; preds = %128, %123, %112
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  br label %142

142:                                              ; preds = %141
  %143 = load i32, ptr %18, align 4, !tbaa !11
  %144 = add i32 %143, 1
  store i32 %144, ptr %18, align 4, !tbaa !11
  br label %107, !llvm.loop !35

145:                                              ; preds = %111
  store i32 2, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  br label %373

146:                                              ; preds = %4
  %147 = load i32, ptr %9, align 4, !tbaa !11
  %148 = icmp ult i32 %147, 2
  br i1 %148, label %149, label %150

149:                                              ; preds = %146
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

150:                                              ; preds = %146
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  %151 = load i32, ptr %9, align 4, !tbaa !11
  %152 = sub i32 %151, 2
  store i32 %152, ptr %22, align 4, !tbaa !11
  %153 = load ptr, ptr %8, align 8, !tbaa !5
  %154 = getelementptr inbounds i32, ptr %153, i64 2
  store ptr %154, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  store i32 0, ptr %23, align 4, !tbaa !11
  br label %155

155:                                              ; preds = %190, %150
  %156 = load i32, ptr %23, align 4, !tbaa !11
  %157 = load i32, ptr %22, align 4, !tbaa !11
  %158 = icmp ult i32 %156, %157
  br i1 %158, label %160, label %159

159:                                              ; preds = %155
  store i32 9, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  br label %193

160:                                              ; preds = %155
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  %161 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %162 = load ptr, ptr %161, align 8, !tbaa !13
  %163 = load ptr, ptr %8, align 8, !tbaa !5
  %164 = load i32, ptr %23, align 4, !tbaa !11
  %165 = zext i32 %164 to i64
  %166 = getelementptr inbounds i32, ptr %163, i64 %165
  %167 = load i32, ptr %166, align 4, !tbaa !11
  %168 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %162, i32 noundef %167)
  store ptr %168, ptr %24, align 8, !tbaa !5
  %169 = load ptr, ptr %24, align 8, !tbaa !5
  %170 = icmp ne ptr %169, null
  br i1 %170, label %171, label %189

171:                                              ; preds = %160
  %172 = load ptr, ptr %24, align 8, !tbaa !5
  %173 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %172, i32 0, i32 2
  %174 = load i32, ptr %173, align 8, !tbaa !16
  %175 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %174)
  br i1 %175, label %176, label %189

176:                                              ; preds = %171
  %177 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %178 = load ptr, ptr %177, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  %179 = load ptr, ptr %8, align 8, !tbaa !5
  %180 = load i32, ptr %23, align 4, !tbaa !11
  %181 = zext i32 %180 to i64
  %182 = getelementptr inbounds i32, ptr %179, i64 %181
  %183 = load i32, ptr %182, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %25, i32 noundef %183)
  %184 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %178, ptr noundef nonnull align 4 dereferenceable(4) %25)
  %185 = getelementptr inbounds { ptr, i8 }, ptr %26, i32 0, i32 0
  %186 = extractvalue { ptr, i8 } %184, 0
  store ptr %186, ptr %185, align 8
  %187 = getelementptr inbounds { ptr, i8 }, ptr %26, i32 0, i32 1
  %188 = extractvalue { ptr, i8 } %184, 1
  store i8 %188, ptr %187, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  br label %189

189:                                              ; preds = %176, %171, %160
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  br label %190

190:                                              ; preds = %189
  %191 = load i32, ptr %23, align 4, !tbaa !11
  %192 = add i32 %191, 2
  store i32 %192, ptr %23, align 4, !tbaa !11
  br label %155, !llvm.loop !36

193:                                              ; preds = %159
  store i32 2, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  br label %373

194:                                              ; preds = %4, %4
  %195 = load i32, ptr %9, align 4, !tbaa !11
  %196 = icmp ult i32 %195, 1
  br i1 %196, label %197, label %198

197:                                              ; preds = %194
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

198:                                              ; preds = %194
  %199 = load ptr, ptr %8, align 8, !tbaa !5
  %200 = getelementptr inbounds i32, ptr %199, i64 0
  %201 = load i32, ptr %200, align 4, !tbaa !11
  store i32 %201, ptr %10, align 4, !tbaa !11
  br label %373

202:                                              ; preds = %4
  %203 = load i32, ptr %9, align 4, !tbaa !11
  %204 = icmp ult i32 %203, 2
  br i1 %204, label %205, label %206

205:                                              ; preds = %202
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

206:                                              ; preds = %202
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  %207 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %208 = load ptr, ptr %207, align 8, !tbaa !13
  %209 = load ptr, ptr %8, align 8, !tbaa !5
  %210 = getelementptr inbounds i32, ptr %209, i64 0
  %211 = load i32, ptr %210, align 4, !tbaa !11
  %212 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %208, i32 noundef %211)
  store ptr %212, ptr %27, align 8, !tbaa !5
  %213 = load ptr, ptr %27, align 8, !tbaa !5
  %214 = icmp ne ptr %213, null
  br i1 %214, label %215, label %231

215:                                              ; preds = %206
  %216 = load ptr, ptr %27, 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 !16
  %219 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %218)
  br i1 %219, label %220, label %231

220:                                              ; preds = %215
  %221 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %222 = load ptr, ptr %221, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %223 = load ptr, ptr %8, align 8, !tbaa !5
  %224 = getelementptr inbounds i32, ptr %223, i64 0
  %225 = load i32, ptr %224, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %28, i32 noundef %225)
  %226 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %222, ptr noundef nonnull align 4 dereferenceable(4) %28)
  %227 = getelementptr inbounds { ptr, i8 }, ptr %29, i32 0, i32 0
  %228 = extractvalue { ptr, i8 } %226, 0
  store ptr %228, ptr %227, align 8
  %229 = getelementptr inbounds { ptr, i8 }, ptr %29, i32 0, i32 1
  %230 = extractvalue { ptr, i8 } %226, 1
  store i8 %230, ptr %229, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  br label %231

231:                                              ; preds = %220, %215, %206
  %232 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %233 = load ptr, ptr %232, align 8, !tbaa !13
  %234 = load ptr, ptr %8, align 8, !tbaa !5
  %235 = getelementptr inbounds i32, ptr %234, i64 1
  %236 = load i32, ptr %235, align 4, !tbaa !11
  %237 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %233, i32 noundef %236)
  store ptr %237, ptr %27, align 8, !tbaa !5
  %238 = load ptr, ptr %27, align 8, !tbaa !5
  %239 = icmp ne ptr %238, null
  br i1 %239, label %240, label %256

240:                                              ; preds = %231
  %241 = load ptr, ptr %27, align 8, !tbaa !5
  %242 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %241, i32 0, i32 2
  %243 = load i32, ptr %242, align 8, !tbaa !16
  %244 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %243)
  br i1 %244, label %245, label %256

245:                                              ; preds = %240
  %246 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %247 = load ptr, ptr %246, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  %248 = load ptr, ptr %8, align 8, !tbaa !5
  %249 = getelementptr inbounds i32, ptr %248, i64 1
  %250 = load i32, ptr %249, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %30, i32 noundef %250)
  %251 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %247, ptr noundef nonnull align 4 dereferenceable(4) %30)
  %252 = getelementptr inbounds { ptr, i8 }, ptr %31, i32 0, i32 0
  %253 = extractvalue { ptr, i8 } %251, 0
  store ptr %253, ptr %252, align 8
  %254 = getelementptr inbounds { ptr, i8 }, ptr %31, i32 0, i32 1
  %255 = extractvalue { ptr, i8 } %251, 1
  store i8 %255, ptr %254, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  br label %256

256:                                              ; preds = %245, %240, %231
  store i32 2, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  br label %373

257:                                              ; preds = %4
  %258 = load i32, ptr %9, align 4, !tbaa !11
  %259 = icmp ult i32 %258, 3
  br i1 %259, label %260, label %261

260:                                              ; preds = %257
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

261:                                              ; preds = %257
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %262 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %263 = load ptr, ptr %262, align 8, !tbaa !13
  %264 = load ptr, ptr %8, align 8, !tbaa !5
  %265 = getelementptr inbounds i32, ptr %264, i64 2
  %266 = load i32, ptr %265, align 4, !tbaa !11
  %267 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNK11spirv_cross8Compiler3getINS_13SPIRExtensionEEERKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %263, i32 noundef %266)
  store ptr %267, ptr %32, align 8, !tbaa !5
  %268 = load ptr, ptr %32, align 8, !tbaa !5
  %269 = getelementptr inbounds %"struct.spirv_cross::SPIRExtension", ptr %268, i32 0, i32 1
  %270 = load i32, ptr %269, align 4, !tbaa !37
  switch i32 %270, label %363 [
    i32 1, label %271
    i32 4, label %330
  ]

271:                                              ; preds = %261
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  %272 = load ptr, ptr %8, align 8, !tbaa !5
  %273 = getelementptr inbounds i32, ptr %272, i64 3
  %274 = load i32, ptr %273, align 4, !tbaa !11
  store i32 %274, ptr %33, align 4, !tbaa !40
  %275 = load i32, ptr %33, align 4, !tbaa !40
  switch i32 %275, label %328 [
    i32 76, label %276
    i32 77, label %276
    i32 78, label %276
    i32 35, label %302
    i32 10, label %302
  ]

276:                                              ; preds = %271, %271, %271
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #4
  %277 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %278 = load ptr, ptr %277, align 8, !tbaa !13
  %279 = load ptr, ptr %8, align 8, !tbaa !5
  %280 = getelementptr inbounds i32, ptr %279, i64 4
  %281 = load i32, ptr %280, align 4, !tbaa !11
  %282 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %278, i32 noundef %281)
  store ptr %282, ptr %34, align 8, !tbaa !5
  %283 = load ptr, ptr %34, align 8, !tbaa !5
  %284 = icmp ne ptr %283, null
  br i1 %284, label %285, label %301

285:                                              ; preds = %276
  %286 = load ptr, ptr %34, align 8, !tbaa !5
  %287 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %286, i32 0, i32 2
  %288 = load i32, ptr %287, align 8, !tbaa !16
  %289 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %288)
  br i1 %289, label %290, label %301

290:                                              ; preds = %285
  %291 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %292 = load ptr, ptr %291, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  %293 = load ptr, ptr %8, align 8, !tbaa !5
  %294 = getelementptr inbounds i32, ptr %293, i64 4
  %295 = load i32, ptr %294, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %35, i32 noundef %295)
  %296 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %292, ptr noundef nonnull align 4 dereferenceable(4) %35)
  %297 = getelementptr inbounds { ptr, i8 }, ptr %36, i32 0, i32 0
  %298 = extractvalue { ptr, i8 } %296, 0
  store ptr %298, ptr %297, align 8
  %299 = getelementptr inbounds { ptr, i8 }, ptr %36, i32 0, i32 1
  %300 = extractvalue { ptr, i8 } %296, 1
  store i8 %300, ptr %299, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  br label %301

301:                                              ; preds = %290, %285, %276
  store i32 13, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #4
  br label %329

302:                                              ; preds = %271, %271
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  %303 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %304 = load ptr, ptr %303, align 8, !tbaa !13
  %305 = load ptr, ptr %8, align 8, !tbaa !5
  %306 = getelementptr inbounds i32, ptr %305, i64 5
  %307 = load i32, ptr %306, align 4, !tbaa !11
  %308 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %304, i32 noundef %307)
  store ptr %308, ptr %37, align 8, !tbaa !5
  %309 = load ptr, ptr %37, align 8, !tbaa !5
  %310 = icmp ne ptr %309, null
  br i1 %310, label %311, label %327

311:                                              ; preds = %302
  %312 = load ptr, ptr %37, align 8, !tbaa !5
  %313 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %312, i32 0, i32 2
  %314 = load i32, ptr %313, align 8, !tbaa !16
  %315 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %314)
  br i1 %315, label %316, label %327

316:                                              ; preds = %311
  %317 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %318 = load ptr, ptr %317, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #4
  %319 = load ptr, ptr %8, align 8, !tbaa !5
  %320 = getelementptr inbounds i32, ptr %319, i64 5
  %321 = load i32, ptr %320, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %38, i32 noundef %321)
  %322 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %318, ptr noundef nonnull align 4 dereferenceable(4) %38)
  %323 = getelementptr inbounds { ptr, i8 }, ptr %39, i32 0, i32 0
  %324 = extractvalue { ptr, i8 } %322, 0
  store ptr %324, ptr %323, align 8
  %325 = getelementptr inbounds { ptr, i8 }, ptr %39, i32 0, i32 1
  %326 = extractvalue { ptr, i8 } %322, 1
  store i8 %326, ptr %325, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #4
  br label %327

327:                                              ; preds = %316, %311, %302
  store i32 13, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  br label %329

328:                                              ; preds = %271
  br label %329

329:                                              ; preds = %328, %327, %301
  store i32 12, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #4
  br label %364

330:                                              ; preds = %261
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #4
  %331 = load ptr, ptr %8, align 8, !tbaa !5
  %332 = getelementptr inbounds i32, ptr %331, i64 3
  %333 = load i32, ptr %332, align 4, !tbaa !11
  store i32 %333, ptr %40, align 4, !tbaa !42
  %334 = load i32, ptr %40, align 4, !tbaa !42
  switch i32 %334, label %361 [
    i32 1, label %335
  ]

335:                                              ; preds = %330
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #4
  %336 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %337 = load ptr, ptr %336, align 8, !tbaa !13
  %338 = load ptr, ptr %8, align 8, !tbaa !5
  %339 = getelementptr inbounds i32, ptr %338, i64 4
  %340 = load i32, ptr %339, align 4, !tbaa !11
  %341 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %337, i32 noundef %340)
  store ptr %341, ptr %41, align 8, !tbaa !5
  %342 = load ptr, ptr %41, align 8, !tbaa !5
  %343 = icmp ne ptr %342, null
  br i1 %343, label %344, label %360

344:                                              ; preds = %335
  %345 = load ptr, ptr %41, align 8, !tbaa !5
  %346 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %345, i32 0, i32 2
  %347 = load i32, ptr %346, align 8, !tbaa !16
  %348 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %347)
  br i1 %348, label %349, label %360

349:                                              ; preds = %344
  %350 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %351 = load ptr, ptr %350, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #4
  %352 = load ptr, ptr %8, align 8, !tbaa !5
  %353 = getelementptr inbounds i32, ptr %352, i64 4
  %354 = load i32, ptr %353, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %42, i32 noundef %354)
  %355 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %351, ptr noundef nonnull align 4 dereferenceable(4) %42)
  %356 = getelementptr inbounds { ptr, i8 }, ptr %43, i32 0, i32 0
  %357 = extractvalue { ptr, i8 } %355, 0
  store ptr %357, ptr %356, align 8
  %358 = getelementptr inbounds { ptr, i8 }, ptr %43, i32 0, i32 1
  %359 = extractvalue { ptr, i8 } %355, 1
  store i8 %359, ptr %358, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #4
  br label %360

360:                                              ; preds = %349, %344, %335
  store i32 14, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #4
  br label %362

361:                                              ; preds = %330
  br label %362

362:                                              ; preds = %361, %360
  store i32 12, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #4
  br label %364

363:                                              ; preds = %261
  br label %364

364:                                              ; preds = %363, %362, %329
  store i32 2, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  br label %373

365:                                              ; preds = %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4
  %366 = load i32, ptr %9, align 4, !tbaa !11
  %367 = icmp ult i32 %366, 3
  br i1 %367, label %368, label %369

368:                                              ; preds = %365
  store i1 false, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

369:                                              ; preds = %365
  %370 = load ptr, ptr %8, align 8, !tbaa !5
  %371 = getelementptr inbounds i32, ptr %370, i64 2
  %372 = load i32, ptr %371, align 4, !tbaa !11
  store i32 %372, ptr %10, align 4, !tbaa !11
  br label %373

373:                                              ; preds = %369, %364, %256, %198, %193, %145, %97, %49
  %374 = load i32, ptr %10, align 4, !tbaa !11
  %375 = icmp ne i32 %374, 0
  br i1 %375, label %376, label %398

376:                                              ; preds = %373
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #4
  %377 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 1
  %378 = load ptr, ptr %377, align 8, !tbaa !13
  %379 = load i32, ptr %10, align 4, !tbaa !11
  %380 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %378, i32 noundef %379)
  store ptr %380, ptr %44, align 8, !tbaa !5
  %381 = load ptr, ptr %44, align 8, !tbaa !5
  %382 = icmp ne ptr %381, null
  br i1 %382, label %383, label %397

383:                                              ; preds = %376
  %384 = load ptr, ptr %44, align 8, !tbaa !5
  %385 = getelementptr inbounds %"struct.spirv_cross::SPIRVariable", ptr %384, i32 0, i32 2
  %386 = load i32, ptr %385, align 8, !tbaa !16
  %387 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %386)
  br i1 %387, label %388, label %397

388:                                              ; preds = %383
  %389 = getelementptr inbounds %"struct.spirv_cross::Compiler::InterfaceVariableAccessHandler", ptr %47, i32 0, i32 2
  %390 = load ptr, ptr %389, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #4
  %391 = load i32, ptr %10, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %45, i32 noundef %391)
  %392 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %390, ptr noundef nonnull align 4 dereferenceable(4) %45)
  %393 = getelementptr inbounds { ptr, i8 }, ptr %46, i32 0, i32 0
  %394 = extractvalue { ptr, i8 } %392, 0
  store ptr %394, ptr %393, align 8
  %395 = getelementptr inbounds { ptr, i8 }, ptr %46, i32 0, i32 1
  %396 = extractvalue { ptr, i8 } %392, 1
  store i8 %396, ptr %395, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #4
  br label %397

397:                                              ; preds = %388, %383, %376
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #4
  br label %398

398:                                              ; preds = %397, %373
  store i1 true, ptr %5, align 1
  store i32 1, ptr %11, align 4
  br label %399

399:                                              ; preds = %398, %368, %260, %205, %197, %149, %101, %53
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  %400 = load i1, ptr %5, align 1
  ret i1 %400
}

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

; Function Attrs: mustprogress uwtable
declare dso_local { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56), ptr noundef nonnull align 4 dereferenceable(4)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4), i32 noundef) unnamed_addr #3 align 2

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint 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 #2 = { 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 #3 = { 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 #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, !6, i64 8}
!14 = !{!"_ZTSN11spirv_cross8Compiler30InterfaceVariableAccessHandlerE", !15, i64 0, !6, i64 8, !6, i64 16}
!15 = !{!"_ZTSN11spirv_cross8Compiler13OpcodeHandlerE"}
!16 = !{!17, !21, i64 16}
!17 = !{!"_ZTSN11spirv_cross12SPIRVariableE", !18, i64 0, !20, i64 12, !21, i64 16, !12, i64 20, !19, i64 24, !22, i64 28, !23, i64 32, !27, i64 88, !27, i64 89, !19, i64 92, !28, i64 96, !27, i64 152, !27, i64 153, !27, i64 154, !27, i64 155, !12, i64 156, !31, i64 160, !27, i64 164, !27, i64 165, !27, i64 166, !6, i64 168}
!18 = !{!"_ZTSN11spirv_cross8IVariantE", !19, i64 8}
!19 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE0EEE", !12, i64 0}
!20 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE1EEE", !12, i64 0}
!21 = !{!"_ZTSN3spv12StorageClassE", !7, i64 0}
!22 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE2EEE", !12, i64 0}
!23 = !{!"_ZTSN11spirv_cross11SmallVectorIjLm8EEE", !24, i64 0, !25, i64 16, !26, i64 24}
!24 = !{!"_ZTSN11spirv_cross10VectorViewIjEE", !6, i64 0, !25, i64 8}
!25 = !{!"long", !7, i64 0}
!26 = !{!"_ZTSN11spirv_cross13AlignedBufferIjLm8EEE", !7, i64 0}
!27 = !{!"bool", !7, i64 0}
!28 = !{!"_ZTSN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EEE", !29, i64 0, !25, i64 16, !30, i64 24}
!29 = !{!"_ZTSN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE0EEEEE", !6, i64 0, !25, i64 8}
!30 = !{!"_ZTSN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE0EEELm8EEE", !7, i64 0}
!31 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE6EEE", !12, i64 0}
!32 = !{!14, !6, i64 16}
!33 = distinct !{!33, !34}
!34 = !{!"llvm.loop.mustprogress"}
!35 = distinct !{!35, !34}
!36 = distinct !{!36, !34}
!37 = !{!38, !39, i64 12}
!38 = !{!"_ZTSN11spirv_cross13SPIRExtensionE", !18, i64 0, !39, i64 12}
!39 = !{!"_ZTSN11spirv_cross13SPIRExtension9ExtensionE", !7, i64 0}
!40 = !{!41, !41, i64 0}
!41 = !{!"_ZTS10GLSLstd450", !7, i64 0}
!42 = !{!7, !7, i64 0}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.spirv_cross::TypedID.164" = type { i32 }

; 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: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef) local_unnamed_addr #1

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN11spirv_cross8Compiler30InterfaceVariableAccessHandler6handleEN3spv2OpEPKjj(ptr nocapture noundef nonnull readonly align 8 dereferenceable(24) %0, i32 noundef %1, ptr nocapture noundef readonly %2, i32 noundef %3) unnamed_addr #2 align 2 {
  %5 = alloca %"class.spirv_cross::TypedID.164", align 4
  %6 = alloca %"class.spirv_cross::TypedID.164", align 4
  %7 = alloca %"class.spirv_cross::TypedID.164", align 4
  %8 = alloca %"class.spirv_cross::TypedID.164", align 4
  %9 = alloca %"class.spirv_cross::TypedID.164", align 4
  %10 = alloca %"class.spirv_cross::TypedID.164", align 4
  %11 = alloca %"class.spirv_cross::TypedID.164", align 4
  %12 = alloca %"class.spirv_cross::TypedID.164", align 4
  %13 = alloca %"class.spirv_cross::TypedID.164", align 4
  switch i32 %1, label %.thread [
    i32 57, label %14
    i32 169, label %35
    i32 245, label %55
    i32 228, label %78
    i32 62, label %78
    i32 63, label %80
    i32 12, label %110
    i32 65, label %168
    i32 66, label %168
    i32 67, label %168
    i32 61, label %168
    i32 83, label %168
    i32 60, label %168
    i32 227, label %168
    i32 229, label %168
    i32 230, label %168
    i32 231, label %168
    i32 232, label %168
    i32 233, label %168
    i32 234, label %168
    i32 235, label %168
    i32 236, label %168
    i32 237, label %168
    i32 238, label %168
    i32 239, label %168
    i32 240, label %168
    i32 241, label %168
    i32 242, label %168
    i32 68, label %168
  ]

14:                                               ; preds = %4
  %15 = icmp ult i32 %3, 3
  br i1 %15, label %.thread, label %16

16:                                               ; preds = %14
  %17 = add i32 %3, -3
  %18 = getelementptr inbounds i8, ptr %2, i64 12
  %.not125 = icmp eq i32 %17, 0
  br i1 %.not125, label %.thread, label %.lr.ph122

.lr.ph122:                                        ; preds = %16
  %19 = getelementptr inbounds i8, ptr %0, i64 8
  %20 = getelementptr inbounds i8, ptr %0, i64 16
  %wide.trip.count135 = zext i32 %17 to i64
  br label %21

21:                                               ; preds = %.lr.ph122, %34
  %indvars.iv132 = phi i64 [ 0, %.lr.ph122 ], [ %indvars.iv.next133, %34 ]
  %22 = load ptr, ptr %19, align 8, !tbaa !5
  %23 = getelementptr inbounds i32, ptr %18, i64 %indvars.iv132
  %24 = load i32, ptr %23, align 4, !tbaa !11
  %25 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %22, i32 noundef %24)
  %.not111 = icmp eq ptr %25, null
  br i1 %.not111, label %34, label %26

26:                                               ; preds = %21
  %27 = getelementptr inbounds i8, ptr %25, i64 16
  %28 = load i32, ptr %27, align 8, !tbaa !13
  %29 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %28)
  br i1 %29, label %30, label %34

30:                                               ; preds = %26
  %31 = load ptr, ptr %20, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #4
  %32 = load i32, ptr %23, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %5, i32 noundef %32)
  %33 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %31, ptr noundef nonnull align 4 dereferenceable(4) %5)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #4
  br label %34

34:                                               ; preds = %30, %26, %21
  %indvars.iv.next133 = add nuw nsw i64 %indvars.iv132, 1
  %exitcond136.not = icmp eq i64 %indvars.iv.next133, %wide.trip.count135
  br i1 %exitcond136.not, label %.thread, label %21, !llvm.loop !30

35:                                               ; preds = %4
  %36 = icmp ult i32 %3, 5
  br i1 %36, label %.thread, label %.lr.ph120

.lr.ph120:                                        ; preds = %35
  %37 = add i32 %3, -3
  %38 = getelementptr inbounds i8, ptr %2, i64 12
  %39 = getelementptr inbounds i8, ptr %0, i64 8
  %40 = getelementptr inbounds i8, ptr %0, i64 16
  %wide.trip.count = zext i32 %37 to i64
  br label %41

41:                                               ; preds = %.lr.ph120, %54
  %indvars.iv129 = phi i64 [ 0, %.lr.ph120 ], [ %indvars.iv.next130, %54 ]
  %42 = load ptr, ptr %39, align 8, !tbaa !5
  %43 = getelementptr inbounds i32, ptr %38, i64 %indvars.iv129
  %44 = load i32, ptr %43, align 4, !tbaa !11
  %45 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %42, i32 noundef %44)
  %.not110 = icmp eq ptr %45, null
  br i1 %.not110, label %54, label %46

46:                                               ; preds = %41
  %47 = getelementptr inbounds i8, ptr %45, i64 16
  %48 = load i32, ptr %47, align 8, !tbaa !13
  %49 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %48)
  br i1 %49, label %50, label %54

50:                                               ; preds = %46
  %51 = load ptr, ptr %40, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #4
  %52 = load i32, ptr %43, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %6, i32 noundef %52)
  %53 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %51, ptr noundef nonnull align 4 dereferenceable(4) %6)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #4
  br label %54

54:                                               ; preds = %50, %46, %41
  %indvars.iv.next130 = add nuw nsw i64 %indvars.iv129, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next130, %wide.trip.count
  br i1 %exitcond.not, label %.thread, label %41, !llvm.loop !32

55:                                               ; preds = %4
  %56 = icmp ult i32 %3, 2
  br i1 %56, label %.thread, label %57

57:                                               ; preds = %55
  %58 = add i32 %3, -2
  %59 = getelementptr inbounds i8, ptr %2, i64 8
  %.not123 = icmp eq i32 %58, 0
  br i1 %.not123, label %.thread, label %.lr.ph

.lr.ph:                                           ; preds = %57
  %60 = getelementptr inbounds i8, ptr %0, i64 8
  %61 = getelementptr inbounds i8, ptr %0, i64 16
  %62 = zext i32 %58 to i64
  br label %63

63:                                               ; preds = %.lr.ph, %76
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %76 ]
  %64 = load ptr, ptr %60, align 8, !tbaa !5
  %65 = getelementptr inbounds i32, ptr %59, i64 %indvars.iv
  %66 = load i32, ptr %65, align 4, !tbaa !11
  %67 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %64, i32 noundef %66)
  %.not109 = icmp eq ptr %67, null
  br i1 %.not109, label %76, label %68

68:                                               ; preds = %63
  %69 = getelementptr inbounds i8, ptr %67, i64 16
  %70 = load i32, ptr %69, align 8, !tbaa !13
  %71 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %70)
  br i1 %71, label %72, label %76

72:                                               ; preds = %68
  %73 = load ptr, ptr %61, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %7) #4
  %74 = load i32, ptr %65, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %7, i32 noundef %74)
  %75 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %73, ptr noundef nonnull align 4 dereferenceable(4) %7)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %7) #4
  br label %76

76:                                               ; preds = %72, %68, %63
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
  %77 = icmp ult i64 %indvars.iv.next, %62
  br i1 %77, label %63, label %.thread, !llvm.loop !33

78:                                               ; preds = %4, %4
  %79 = icmp eq i32 %3, 0
  br i1 %79, label %.thread, label %172

80:                                               ; preds = %4
  %81 = icmp ult i32 %3, 2
  br i1 %81, label %.thread, label %82

82:                                               ; preds = %80
  %83 = getelementptr inbounds i8, ptr %0, i64 8
  %84 = load ptr, ptr %83, align 8, !tbaa !5
  %85 = load i32, ptr %2, align 4, !tbaa !11
  %86 = tail call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %84, i32 noundef %85)
  %.not107 = icmp eq ptr %86, null
  br i1 %.not107, label %96, label %87

87:                                               ; preds = %82
  %88 = getelementptr inbounds i8, ptr %86, i64 16
  %89 = load i32, ptr %88, align 8, !tbaa !13
  %90 = tail call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %89)
  br i1 %90, label %91, label %96

91:                                               ; preds = %87
  %92 = getelementptr inbounds i8, ptr %0, i64 16
  %93 = load ptr, ptr %92, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %8) #4
  %94 = load i32, ptr %2, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %8, i32 noundef %94)
  %95 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %93, ptr noundef nonnull align 4 dereferenceable(4) %8)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %8) #4
  br label %96

96:                                               ; preds = %91, %87, %82
  %97 = load ptr, ptr %83, align 8, !tbaa !5
  %98 = getelementptr inbounds i8, ptr %2, i64 4
  %99 = load i32, ptr %98, align 4, !tbaa !11
  %100 = call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %97, i32 noundef %99)
  %.not108 = icmp eq ptr %100, null
  br i1 %.not108, label %.thread, label %101

101:                                              ; preds = %96
  %102 = getelementptr inbounds i8, ptr %100, i64 16
  %103 = load i32, ptr %102, align 8, !tbaa !13
  %104 = call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %103)
  br i1 %104, label %105, label %.thread

105:                                              ; preds = %101
  %106 = getelementptr inbounds i8, ptr %0, i64 16
  %107 = load ptr, ptr %106, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #4
  %108 = load i32, ptr %98, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %9, i32 noundef %108)
  %109 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %107, ptr noundef nonnull align 4 dereferenceable(4) %9)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #4
  br label %.thread

110:                                              ; preds = %4
  %111 = icmp ult i32 %3, 3
  br i1 %111, label %.thread, label %112

112:                                              ; preds = %110
  %113 = getelementptr inbounds i8, ptr %0, i64 8
  %114 = load ptr, ptr %113, align 8, !tbaa !5
  %115 = getelementptr inbounds i8, ptr %2, i64 8
  %116 = load i32, ptr %115, align 4, !tbaa !11
  %117 = tail call noundef nonnull align 8 dereferenceable(16) ptr @_ZNK11spirv_cross8Compiler3getINS_13SPIRExtensionEEERKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %114, i32 noundef %116)
  %118 = getelementptr inbounds i8, ptr %117, i64 12
  %119 = load i32, ptr %118, align 4, !tbaa !34
  switch i32 %119, label %.thread [
    i32 1, label %120
    i32 4, label %151
  ]

120:                                              ; preds = %112
  %121 = getelementptr inbounds i8, ptr %2, i64 12
  %122 = load i32, ptr %121, align 4, !tbaa !11
  switch i32 %122, label %.thread [
    i32 76, label %123
    i32 77, label %123
    i32 78, label %123
    i32 35, label %137
    i32 10, label %137
  ]

123:                                              ; preds = %120, %120, %120
  %124 = load ptr, ptr %113, align 8, !tbaa !5
  %125 = getelementptr inbounds i8, ptr %2, i64 16
  %126 = load i32, ptr %125, align 4, !tbaa !11
  %127 = tail call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %124, i32 noundef %126)
  %.not106 = icmp eq ptr %127, null
  br i1 %.not106, label %.thread, label %128

128:                                              ; preds = %123
  %129 = getelementptr inbounds i8, ptr %127, i64 16
  %130 = load i32, ptr %129, align 8, !tbaa !13
  %131 = tail call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %130)
  br i1 %131, label %132, label %.thread

132:                                              ; preds = %128
  %133 = getelementptr inbounds i8, ptr %0, i64 16
  %134 = load ptr, ptr %133, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #4
  %135 = load i32, ptr %125, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %10, i32 noundef %135)
  %136 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %134, ptr noundef nonnull align 4 dereferenceable(4) %10)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #4
  br label %.thread

137:                                              ; preds = %120, %120
  %138 = load ptr, ptr %113, align 8, !tbaa !5
  %139 = getelementptr inbounds i8, ptr %2, i64 20
  %140 = load i32, ptr %139, align 4, !tbaa !11
  %141 = tail call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %138, i32 noundef %140)
  %.not105 = icmp eq ptr %141, null
  br i1 %.not105, label %.thread, label %142

142:                                              ; preds = %137
  %143 = getelementptr inbounds i8, ptr %141, i64 16
  %144 = load i32, ptr %143, align 8, !tbaa !13
  %145 = tail call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %144)
  br i1 %145, label %146, label %.thread

146:                                              ; preds = %142
  %147 = getelementptr inbounds i8, ptr %0, i64 16
  %148 = load ptr, ptr %147, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #4
  %149 = load i32, ptr %139, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %11, i32 noundef %149)
  %150 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %148, ptr noundef nonnull align 4 dereferenceable(4) %11)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #4
  br label %.thread

151:                                              ; preds = %112
  %152 = getelementptr inbounds i8, ptr %2, i64 12
  %153 = load i32, ptr %152, align 4, !tbaa !11
  %cond = icmp eq i32 %153, 1
  br i1 %cond, label %154, label %.thread

154:                                              ; preds = %151
  %155 = load ptr, ptr %113, align 8, !tbaa !5
  %156 = getelementptr inbounds i8, ptr %2, i64 16
  %157 = load i32, ptr %156, align 4, !tbaa !11
  %158 = tail call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %155, i32 noundef %157)
  %.not = icmp eq ptr %158, null
  br i1 %.not, label %.thread, label %159

159:                                              ; preds = %154
  %160 = getelementptr inbounds i8, ptr %158, i64 16
  %161 = load i32, ptr %160, align 8, !tbaa !13
  %162 = tail call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %161)
  br i1 %162, label %163, label %.thread

163:                                              ; preds = %159
  %164 = getelementptr inbounds i8, ptr %0, i64 16
  %165 = load ptr, ptr %164, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #4
  %166 = load i32, ptr %156, align 4, !tbaa !11
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %12, i32 noundef %166)
  %167 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %165, ptr noundef nonnull align 4 dereferenceable(4) %12)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #4
  br label %.thread

168:                                              ; preds = %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4, %4
  %169 = icmp ult i32 %3, 3
  br i1 %169, label %.thread, label %170

170:                                              ; preds = %168
  %171 = getelementptr inbounds i8, ptr %2, i64 8
  br label %172

172:                                              ; preds = %78, %170
  %.091.in = phi ptr [ %171, %170 ], [ %2, %78 ]
  %.091 = load i32, ptr %.091.in, align 4, !tbaa !11
  %.not112 = icmp eq i32 %.091, 0
  br i1 %.not112, label %.thread, label %173

173:                                              ; preds = %172
  %174 = getelementptr inbounds i8, ptr %0, i64 8
  %175 = load ptr, ptr %174, align 8, !tbaa !5
  %176 = tail call noundef ptr @_ZNK11spirv_cross8Compiler9maybe_getINS_12SPIRVariableEEEPKT_j(ptr noundef nonnull align 8 dereferenceable(3176) %175, i32 noundef %.091)
  %.not113 = icmp eq ptr %176, null
  br i1 %.not113, label %.thread, label %177

177:                                              ; preds = %173
  %178 = getelementptr inbounds i8, ptr %176, i64 16
  %179 = load i32, ptr %178, align 8, !tbaa !13
  %180 = tail call noundef zeroext i1 @_ZL26storage_class_is_interfaceN3spv12StorageClassE(i32 noundef %179)
  br i1 %180, label %181, label %.thread

181:                                              ; preds = %177
  %182 = getelementptr inbounds i8, ptr %0, i64 16
  %183 = load ptr, ptr %182, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #4
  call void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4) %13, i32 noundef %.091)
  %184 = call { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56) %183, ptr noundef nonnull align 4 dereferenceable(4) %13)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #4
  br label %.thread

.thread:                                          ; preds = %76, %54, %34, %57, %16, %112, %137, %142, %146, %123, %128, %132, %120, %154, %159, %163, %151, %96, %101, %105, %4, %172, %181, %177, %173, %168, %110, %80, %78, %55, %35, %14
  %.0 = phi i1 [ false, %14 ], [ false, %35 ], [ false, %55 ], [ false, %78 ], [ false, %80 ], [ false, %110 ], [ false, %168 ], [ true, %173 ], [ true, %177 ], [ true, %181 ], [ true, %172 ], [ true, %4 ], [ true, %105 ], [ true, %101 ], [ true, %96 ], [ true, %151 ], [ true, %163 ], [ true, %159 ], [ true, %154 ], [ true, %120 ], [ true, %132 ], [ true, %128 ], [ true, %123 ], [ true, %146 ], [ true, %142 ], [ true, %137 ], [ true, %112 ], [ true, %16 ], [ true, %57 ], [ true, %34 ], [ true, %54 ], [ true, %76 ]
  ret i1 %.0
}

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

; Function Attrs: mustprogress uwtable
declare dso_local { ptr, i8 } @_ZNSt13unordered_setIN11spirv_cross7TypedIDILNS0_5TypesE2EEESt4hashIS3_ESt8equal_toIS3_ESaIS3_EE6insertEOS3_(ptr noundef nonnull align 8 dereferenceable(56), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej(ptr noundef nonnull align 4 dereferenceable(4), i32 noundef) unnamed_addr #3 align 2

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint 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 #2 = { 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 #3 = { 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 #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, !8, i64 8}
!6 = !{!"_ZTSN11spirv_cross8Compiler30InterfaceVariableAccessHandlerE", !7, i64 0, !8, i64 8, !8, i64 16}
!7 = !{!"_ZTSN11spirv_cross8Compiler13OpcodeHandlerE"}
!8 = !{!"any pointer", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C++ TBAA"}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !9, i64 0}
!13 = !{!14, !18, i64 16}
!14 = !{!"_ZTSN11spirv_cross12SPIRVariableE", !15, i64 0, !17, i64 12, !18, i64 16, !12, i64 20, !16, i64 24, !19, i64 28, !20, i64 32, !24, i64 88, !24, i64 89, !16, i64 92, !25, i64 96, !24, i64 152, !24, i64 153, !24, i64 154, !24, i64 155, !12, i64 156, !28, i64 160, !24, i64 164, !24, i64 165, !24, i64 166, !8, i64 168}
!15 = !{!"_ZTSN11spirv_cross8IVariantE", !16, i64 8}
!16 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE0EEE", !12, i64 0}
!17 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE1EEE", !12, i64 0}
!18 = !{!"_ZTSN3spv12StorageClassE", !9, i64 0}
!19 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE2EEE", !12, i64 0}
!20 = !{!"_ZTSN11spirv_cross11SmallVectorIjLm8EEE", !21, i64 0, !22, i64 16, !23, i64 24}
!21 = !{!"_ZTSN11spirv_cross10VectorViewIjEE", !8, i64 0, !22, i64 8}
!22 = !{!"long", !9, i64 0}
!23 = !{!"_ZTSN11spirv_cross13AlignedBufferIjLm8EEE", !9, i64 0}
!24 = !{!"bool", !9, i64 0}
!25 = !{!"_ZTSN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EEE", !26, i64 0, !22, i64 16, !27, i64 24}
!26 = !{!"_ZTSN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE0EEEEE", !8, i64 0, !22, i64 8}
!27 = !{!"_ZTSN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE0EEELm8EEE", !9, i64 0}
!28 = !{!"_ZTSN11spirv_cross7TypedIDILNS_5TypesE6EEE", !12, i64 0}
!29 = !{!6, !8, i64 16}
!30 = distinct !{!30, !31}
!31 = !{!"llvm.loop.mustprogress"}
!32 = distinct !{!32, !31}
!33 = distinct !{!33, !31}
!34 = !{!35, !36, i64 12}
!35 = !{!"_ZTSN11spirv_cross13SPIRExtensionE", !15, i64 0, !36, i64 12}
!36 = !{!"_ZTSN11spirv_cross13SPIRExtension9ExtensionE", !9, i64 0}


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