LLVMFuzzerTestOneInput:
   20|    610|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   21|       |  // Skip this iteration if data is not enough
   22|    610|  if (size < (sizeof(uint32_t) * 5) || (size % 4 != 0)) {
  ------------------
  |  Branch (22:7): [True: 0, False: 610]
  |  Branch (22:40): [True: 10, False: 600]
  ------------------
   23|     10|    return 0;
   24|     10|  }
   25|       |
   26|       |  // Initialise objects and random data
   27|    600|  std::vector<uint32_t> spirv_data((uint32_t *)data, (uint32_t *)(data + size));
   28|       |
   29|       |  // Set magic number, since this is needed to get past initial checks.
   30|    600|  spirv_data[0] = 0x07230203;
   31|    600|  spirv_data[1] = 0x10600;
   32|       |
   33|    600|  Parser parser(spirv_data);
   34|    600|  ParsedIR &ir = parser.get_parsed_ir();
   35|    600|  SPIRFunction *current_function = nullptr;
   36|    600|  SPIRBlock *current_block = nullptr;
   37|       |
   38|    600|  try {
   39|    600|    parser.parse();
   40|    600|  } catch (...) {
   41|    438|  }
   42|       |
   43|    600|  return 0;
   44|    600|}

_ZN11spirv_cross7VariantD2Ev:
 1464|  37.8M|	{
 1465|  37.8M|		if (holder)
  ------------------
  |  Branch (1465:7): [True: 22.4k, False: 37.8M]
  ------------------
 1466|  22.4k|			group->pools[type]->deallocate_opaque(holder);
 1467|  37.8M|	}
_ZNK11spirv_cross6Bitset3getEj:
   80|  22.1k|	{
   81|  22.1k|		if (bit < 64)
  ------------------
  |  Branch (81:7): [True: 6.03k, False: 16.1k]
  ------------------
   82|  6.03k|			return (lower & (1ull << bit)) != 0;
   83|  16.1k|		else
   84|  16.1k|			return higher.count(bit) != 0;
   85|  22.1k|	}
_ZN11spirv_cross6Bitset3setEj:
   88|  38.5k|	{
   89|  38.5k|		if (bit < 64)
  ------------------
  |  Branch (89:7): [True: 18.4k, False: 20.1k]
  ------------------
   90|  18.4k|			lower |= 1ull << bit;
   91|  20.1k|		else
   92|  20.1k|			higher.insert(bit);
   93|  38.5k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE0EEC2Ej:
  383|   351k|	    : id(id_)
  384|   351k|	{
  385|   351k|	}
_ZNK11spirv_cross7TypedIDILNS_5TypesE0EEcvjEv:
  403|   627k|	{
  404|   627k|		return id;
  405|   627k|	}
_ZN11spirv_cross9SPIRUndefC2ENS_7TypedIDILNS_5TypesE1EEE:
  475|  1.81k|	    : basetype(basetype_)
  476|  1.81k|	{
  477|  1.81k|	}
_ZN11spirv_cross10SPIRStringC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  491|    886|	    : str(std::move(str_))
  492|    886|	{
  493|    886|	}
_ZN11spirv_cross14SPIRConstantOpC2ENS_7TypedIDILNS_5TypesE1EEEN3spv2OpEPKjj:
  529|    791|	    : opcode(op)
  530|    791|	    , basetype(result_type)
  531|    791|	{
  532|    791|		arguments.reserve(length);
  533|  1.60k|		for (uint32_t i = 0; i < length; i++)
  ------------------
  |  Branch (533:24): [True: 810, False: 791]
  ------------------
  534|    810|			arguments.push_back(args[i]);
  535|    791|	}
_ZN11spirv_cross8SPIRTypeC2EN3spv2OpE:
  552|  18.8k|	explicit SPIRType(spv::Op op_) : op(op_) {}
_ZN11spirv_cross13SPIRExtensionC2ENS0_9ExtensionE:
  674|    508|	    : ext(ext_)
  675|    508|	{
  676|    508|	}
_ZN11spirv_cross14SPIREntryPointC2ENS_7TypedIDILNS_5TypesE4EEEN3spv14ExecutionModelERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
  687|  2.74k|	    : self(self_)
  688|  2.74k|	    , name(entry_name)
  689|  2.74k|	    , orig_name(entry_name)
  690|  2.74k|	    , model(execution_model)
  691|  2.74k|	{
  692|  2.74k|	}
_ZN11spirv_cross21SPIRFunctionPrototypeC2ENS_7TypedIDILNS_5TypesE1EEE:
  782|  5.83k|	    : return_type(return_type_)
  783|  5.83k|	{
  784|  5.83k|	}
_ZN11spirv_cross12SPIRFunctionC2ENS_7TypedIDILNS_5TypesE1EEES3_:
  952|    450|	    : return_type(return_type_)
  953|    450|	    , function_type(function_type_)
  954|    450|	{
  955|    450|	}
_ZN11spirv_cross12SPIRFunction18add_local_variableENS_7TypedIDILNS_5TypesE2EEE:
 1011|  4.18k|	{
 1012|  4.18k|		local_variables.push_back(id);
 1013|  4.18k|	}
_ZN11spirv_cross12SPIRFunction13add_parameterENS_7TypedIDILNS_5TypesE1EEENS1_ILS2_0EEEb:
 1016|    166|	{
 1017|       |		// Arguments are read-only until proven otherwise.
 1018|    166|		arguments.push_back({ parameter_type, id, 0u, 0u, alias_global_variable });
 1019|    166|	}
_ZN11spirv_cross12SPIRVariableC2ENS_7TypedIDILNS_5TypesE1EEEN3spv12StorageClassENS1_ILS2_0EEENS1_ILS2_2EEE:
 1098|  9.50k|	    : basetype(basetype_)
 1099|  9.50k|	    , storage(storage_)
 1100|  9.50k|	    , initializer(initializer_)
 1101|  9.50k|	    , basevariable(basevariable_)
 1102|  9.50k|	{
 1103|  9.50k|	}
_ZN11spirv_cross12SPIRConstant14ConstantVectorC2Ev:
 1176|  82.1k|		{
 1177|  82.1k|			memset(r, 0, sizeof(r));
 1178|  82.1k|		}
_ZNK11spirv_cross12SPIRConstant6scalarEjj:
 1252|    278|	{
 1253|    278|		return m.c[col].r[row].u32;
 1254|    278|	}
_ZN11spirv_cross12SPIRConstant9make_nullERKNS_8SPIRTypeE:
 1330|  5.16k|	{
 1331|  5.16k|		m = {};
 1332|  5.16k|		m.columns = constant_type_.columns;
 1333|  5.16k|		for (auto &c : m.c)
  ------------------
  |  Branch (1333:16): [True: 20.6k, False: 5.16k]
  ------------------
 1334|  20.6k|			c.vecsize = constant_type_.vecsize;
 1335|  5.16k|	}
_ZN11spirv_cross12SPIRConstantC2Ej:
 1353|  5.19k|	    : constant_type(constant_type_)
 1354|  5.19k|	{
 1355|  5.19k|	}
_ZN11spirv_cross12SPIRConstantC2ENS_7TypedIDILNS_5TypesE1EEEPKjjb:
 1360|  2.28k|	    : constant_type(constant_type_)
 1361|  2.28k|	    , specialization(specialized)
 1362|  2.28k|	{
 1363|  2.28k|		subconstants.reserve(num_elements);
 1364|  8.38k|		for (uint32_t i = 0; i < num_elements; i++)
  ------------------
  |  Branch (1364:24): [True: 6.10k, False: 2.28k]
  ------------------
 1365|  6.10k|			subconstants.push_back(elements[i]);
 1366|  2.28k|		specialization = specialized;
 1367|  2.28k|	}
_ZN11spirv_cross12SPIRConstantC2ENS_7TypedIDILNS_5TypesE1EEEjb:
 1371|  4.51k|	    : constant_type(constant_type_)
 1372|  4.51k|	    , specialization(specialized)
 1373|  4.51k|	{
 1374|  4.51k|		m.c[0].r[0].u32 = v0;
 1375|  4.51k|		m.c[0].vecsize = 1;
 1376|  4.51k|		m.columns = 1;
 1377|  4.51k|	}
_ZN11spirv_cross12SPIRConstantC2ENS_7TypedIDILNS_5TypesE1EEEmb:
 1381|     18|	    : constant_type(constant_type_)
 1382|     18|	    , specialization(specialized)
 1383|     18|	{
 1384|     18|		m.c[0].r[0].u64 = v0;
 1385|     18|		m.c[0].vecsize = 1;
 1386|     18|		m.columns = 1;
 1387|     18|	}
_ZN11spirv_cross12SPIRConstantC2ENS_7TypedIDILNS_5TypesE1EEEPKPKS0_jb:
 1392|    669|	    : constant_type(constant_type_)
 1393|    669|	    , specialization(specialized)
 1394|    669|	{
 1395|    669|		bool matrix = vector_elements[0]->m.c[0].vecsize > 1;
 1396|       |
 1397|    669|		if (matrix)
  ------------------
  |  Branch (1397:7): [True: 268, False: 401]
  ------------------
 1398|    268|		{
 1399|    268|			m.columns = num_elements;
 1400|       |
 1401|    860|			for (uint32_t i = 0; i < num_elements; i++)
  ------------------
  |  Branch (1401:25): [True: 592, False: 268]
  ------------------
 1402|    592|			{
 1403|    592|				m.c[i] = vector_elements[i]->m.c[0];
 1404|    592|				if (vector_elements[i]->specialization)
  ------------------
  |  Branch (1404:9): [True: 474, False: 118]
  ------------------
 1405|    474|					m.id[i] = vector_elements[i]->self;
 1406|    592|			}
 1407|    268|		}
 1408|    401|		else
 1409|    401|		{
 1410|    401|			m.c[0].vecsize = num_elements;
 1411|    401|			m.columns = 1;
 1412|       |
 1413|  1.77k|			for (uint32_t i = 0; i < num_elements; i++)
  ------------------
  |  Branch (1413:25): [True: 1.37k, False: 401]
  ------------------
 1414|  1.37k|			{
 1415|  1.37k|				m.c[0].r[i] = vector_elements[i]->m.c[0].r[0];
 1416|  1.37k|				if (vector_elements[i]->specialization)
  ------------------
  |  Branch (1416:9): [True: 26, False: 1.35k]
  ------------------
 1417|     26|					m.c[0].id[i] = vector_elements[i]->self;
 1418|  1.37k|			}
 1419|    401|		}
 1420|    669|	}
_ZN11spirv_cross7VariantC2EPNS_15ObjectPoolGroupE:
 1459|  37.8M|	    : group(group_)
 1460|  37.8M|	{
 1461|  37.8M|	}
_ZN11spirv_cross7VariantC2EOS0_:
 1471|    127|	{
 1472|    127|		*this = std::move(other);
 1473|    127|	}
_ZN11spirv_cross7VariantaSEOS0_:
 1481|    127|	{
 1482|    127|		if (this != &other)
  ------------------
  |  Branch (1482:7): [True: 127, False: 0]
  ------------------
 1483|    127|		{
 1484|    127|			if (holder)
  ------------------
  |  Branch (1484:8): [True: 0, False: 127]
  ------------------
 1485|      0|				group->pools[type]->deallocate_opaque(holder);
 1486|    127|			holder = other.holder;
 1487|    127|			group = other.group;
 1488|    127|			type = other.type;
 1489|    127|			allow_type_rewrite = other.allow_type_rewrite;
 1490|       |
 1491|    127|			other.holder = nullptr;
 1492|    127|			other.type = TypeNone;
 1493|    127|		}
 1494|    127|		return *this;
 1495|    127|	}
_ZN11spirv_cross7Variant3setEPNS_8IVariantENS_5TypesE:
 1523|  64.5k|	{
 1524|  64.5k|		if (holder)
  ------------------
  |  Branch (1524:7): [True: 42.0k, False: 22.4k]
  ------------------
 1525|  42.0k|			group->pools[type]->deallocate_opaque(holder);
 1526|  64.5k|		holder = nullptr;
 1527|       |
 1528|  64.5k|		if (!allow_type_rewrite && type != TypeNone && type != new_type)
  ------------------
  |  Branch (1528:7): [True: 64.5k, False: 0]
  |  Branch (1528:30): [True: 42.0k, False: 22.4k]
  |  Branch (1528:50): [True: 18, False: 42.0k]
  ------------------
 1529|     18|		{
 1530|     18|			if (val)
  ------------------
  |  Branch (1530:8): [True: 18, False: 0]
  ------------------
 1531|     18|				group->pools[new_type]->deallocate_opaque(val);
 1532|     18|			SPIRV_CROSS_THROW("Overwriting a variant with new type.");
  ------------------
  |  |   76|     18|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1533|     18|		}
 1534|       |
 1535|  64.5k|		holder = val;
 1536|  64.5k|		type = new_type;
 1537|  64.5k|		allow_type_rewrite = false;
 1538|  64.5k|	}
_ZNK11spirv_cross7Variant8get_typeEv:
 1569|   121k|	{
 1570|   121k|		return type;
 1571|   121k|	}
_ZNK11spirv_cross7Variant5emptyEv:
 1579|   129k|	{
 1580|   129k|		return !holder;
 1581|   129k|	}
_ZN11spirv_cross4Meta10Decoration8ExtendedC2Ev:
 1741|  5.94M|			{
 1742|       |				// MSVC 2013 workaround to init like this.
 1743|  5.94M|				for (auto &v : values)
  ------------------
  |  Branch (1743:18): [True: 106M, False: 5.94M]
  ------------------
 1744|   106M|					v = 0;
 1745|  5.94M|			}
_ZN11spirv_cross6BitsetC2Ev:
   73|  11.8M|	Bitset() = default;
spirv_parser.cpp:_ZN11spirv_crossL18to_signed_basetypeEj:
 1801|    463|{
 1802|    463|	switch (width)
 1803|    463|	{
 1804|      0|	case 8:
  ------------------
  |  Branch (1804:2): [True: 0, False: 463]
  ------------------
 1805|      0|		return SPIRType::SByte;
 1806|      0|	case 16:
  ------------------
  |  Branch (1806:2): [True: 0, False: 463]
  ------------------
 1807|      0|		return SPIRType::Short;
 1808|    452|	case 32:
  ------------------
  |  Branch (1808:2): [True: 452, False: 11]
  ------------------
 1809|    452|		return SPIRType::Int;
 1810|     11|	case 64:
  ------------------
  |  Branch (1810:2): [True: 11, False: 452]
  ------------------
 1811|     11|		return SPIRType::Int64;
 1812|      0|	default:
  ------------------
  |  Branch (1812:2): [True: 0, False: 463]
  ------------------
 1813|      0|		SPIRV_CROSS_THROW("Invalid bit width.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1814|    463|	}
 1815|    463|}
spirv_parser.cpp:_ZN11spirv_crossL20to_unsigned_basetypeEj:
 1818|    394|{
 1819|    394|	switch (width)
 1820|    394|	{
 1821|      0|	case 8:
  ------------------
  |  Branch (1821:2): [True: 0, False: 394]
  ------------------
 1822|      0|		return SPIRType::UByte;
 1823|      0|	case 16:
  ------------------
  |  Branch (1823:2): [True: 0, False: 394]
  ------------------
 1824|      0|		return SPIRType::UShort;
 1825|    393|	case 32:
  ------------------
  |  Branch (1825:2): [True: 393, False: 1]
  ------------------
 1826|    393|		return SPIRType::UInt;
 1827|      0|	case 64:
  ------------------
  |  Branch (1827:2): [True: 0, False: 394]
  ------------------
 1828|      0|		return SPIRType::UInt64;
 1829|      1|	default:
  ------------------
  |  Branch (1829:2): [True: 1, False: 393]
  ------------------
 1830|      1|		SPIRV_CROSS_THROW("Invalid bit width.");
  ------------------
  |  |   76|      1|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1831|    394|	}
 1832|    394|}
_ZN11spirv_cross8IVariantaSERKS0_:
  458|  9.02k|	IVariant &operator=(const IVariant&) = default;
_ZN11spirv_cross12SPIRConstantC2Ev:
 1357|  2.70k|	SPIRConstant() = default;
_ZN11spirv_cross8IVariantC2Ev:
  456|  63.7k|	IVariant() = default;
_ZN11spirv_cross7TypedIDILNS_5TypesE0EEC2Ev:
  381|   450k|	TypedID() = default;
_ZN11spirv_cross8IVariantD2Ev:
  451|  67.2k|	virtual ~IVariant() = default;
_ZN11spirv_cross8IVariantC2ERKS0_:
  457|  3.45k|	IVariant(const IVariant&) = default;
_ZN11spirv_cross7TypedIDILNS_5TypesE1EEC2Ej:
  423|   103k|	    : id(id_)
  424|   103k|	{
  425|   103k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE6EEC2Ej:
  423|   128k|	    : id(id_)
  424|   128k|	{
  425|   128k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE2EEC2Ej:
  423|  29.9k|	    : id(id_)
  424|  29.9k|	{
  425|  29.9k|	}
_ZN11spirv_cross11variant_getINS_8SPIRTypeEEERT_RNS_7VariantE:
 1605|  46.0k|{
 1606|  46.0k|	return var.get<T>();
 1607|  46.0k|}
_ZN11spirv_cross7Variant3getINS_8SPIRTypeEEERT_v:
 1550|  46.0k|	{
 1551|  46.0k|		if (!holder)
  ------------------
  |  Branch (1551:7): [True: 8, False: 46.0k]
  ------------------
 1552|      8|			SPIRV_CROSS_THROW("nullptr");
  ------------------
  |  |   76|      8|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1553|  46.0k|		if (static_cast<Types>(T::type) != type)
  ------------------
  |  Branch (1553:7): [True: 2, False: 46.0k]
  ------------------
 1554|      2|			SPIRV_CROSS_THROW("Bad cast");
  ------------------
  |  |   76|      2|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1555|  46.0k|		return *static_cast<T *>(holder);
 1556|  46.0k|	}
_ZNK11spirv_cross7TypedIDILNS_5TypesE4EEcvjEv:
  433|  31.5k|	{
  434|  31.5k|		return id;
  435|  31.5k|	}
_ZN11spirv_cross11variant_setINS_10SPIRStringEJNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEEERT_RNS_7VariantEDpOT0_:
 1617|    886|{
 1618|    886|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|    886|	return *ptr;
 1620|    886|}
_ZN11spirv_cross7Variant16allocate_and_setINS_10SPIRStringEJNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEEPT_NS_5TypesEDpOT0_:
 1542|    886|	{
 1543|    886|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|    886|		set(val, new_type);
 1545|    886|		return val;
 1546|    886|	}
_ZN11spirv_cross11variant_setINS_9SPIRUndefEJRjEEERT_RNS_7VariantEDpOT0_:
 1617|  1.81k|{
 1618|  1.81k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  1.81k|	return *ptr;
 1620|  1.81k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_9SPIRUndefEJRjEEEPT_NS_5TypesEDpOT0_:
 1542|  1.81k|	{
 1543|  1.81k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  1.81k|		set(val, new_type);
 1545|  1.81k|		return val;
 1546|  1.81k|	}
_ZN11spirv_cross11variant_setINS_13SPIRExtensionEJRNS1_9ExtensionEEEERT_RNS_7VariantEDpOT0_:
 1617|    508|{
 1618|    508|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|    508|	return *ptr;
 1620|    508|}
_ZN11spirv_cross7Variant16allocate_and_setINS_13SPIRExtensionEJRNS2_9ExtensionEEEEPT_NS_5TypesEDpOT0_:
 1542|    508|	{
 1543|    508|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|    508|		set(val, new_type);
 1545|    508|		return val;
 1546|    508|	}
_ZNKSt3__14hashIN11spirv_cross7TypedIDILNS1_5TypesE0EEEEclERKS4_:
 1969|   126k|	{
 1970|   126k|		return std::hash<uint32_t>()(value);
 1971|   126k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE4EEC2Ej:
  423|  12.9k|	    : id(id_)
  424|  12.9k|	{
  425|  12.9k|	}
_ZNKSt3__14hashIN11spirv_cross7TypedIDILNS1_5TypesE4EEEEclERKS4_:
 1969|  11.8k|	{
 1970|  11.8k|		return std::hash<uint32_t>()(value);
 1971|  11.8k|	}
_ZN11spirv_cross14SPIREntryPointC2Ev:
  693|    166|	SPIREntryPoint() = default;
spirv_parser.cpp:_ZNK11spirv_cross6Bitset12for_each_bitIZNS_6Parser5parseERKNS_11InstructionEE3$_0EEvRKT_:
  153|  2.84k|	{
  154|       |		// TODO: Add ctz-based iteration.
  155|   184k|		for (uint32_t i = 0; i < 64; i++)
  ------------------
  |  Branch (155:24): [True: 182k, False: 2.84k]
  ------------------
  156|   182k|		{
  157|   182k|			if (lower & (1ull << i))
  ------------------
  |  Branch (157:8): [True: 1.00k, False: 181k]
  ------------------
  158|  1.00k|				op(i);
  159|   182k|		}
  160|       |
  161|  2.84k|		if (higher.empty())
  ------------------
  |  Branch (161:7): [True: 430, False: 2.41k]
  ------------------
  162|    430|			return;
  163|       |
  164|       |		// Need to enforce an order here for reproducible results,
  165|       |		// but hitting this path should happen extremely rarely, so having this slow path is fine.
  166|  2.41k|		SmallVector<uint32_t> bits;
  167|  2.41k|		bits.reserve(higher.size());
  168|  2.41k|		for (auto &v : higher)
  ------------------
  |  Branch (168:16): [True: 12.2k, False: 2.41k]
  ------------------
  169|  12.2k|			bits.push_back(v);
  170|  2.41k|		std::sort(std::begin(bits), std::end(bits));
  171|       |
  172|  2.41k|		for (auto &v : bits)
  ------------------
  |  Branch (172:16): [True: 12.2k, False: 2.41k]
  ------------------
  173|  12.2k|			op(v);
  174|  2.41k|	}
spirv_parser.cpp:_ZNK11spirv_cross6Bitset12for_each_bitIZNS_6Parser5parseERKNS_11InstructionEE3$_1EEvRKT_:
  153|  2.39k|	{
  154|       |		// TODO: Add ctz-based iteration.
  155|   155k|		for (uint32_t i = 0; i < 64; i++)
  ------------------
  |  Branch (155:24): [True: 153k, False: 2.39k]
  ------------------
  156|   153k|		{
  157|   153k|			if (lower & (1ull << i))
  ------------------
  |  Branch (157:8): [True: 5.02k, False: 147k]
  ------------------
  158|  5.02k|				op(i);
  159|   153k|		}
  160|       |
  161|  2.39k|		if (higher.empty())
  ------------------
  |  Branch (161:7): [True: 752, False: 1.63k]
  ------------------
  162|    752|			return;
  163|       |
  164|       |		// Need to enforce an order here for reproducible results,
  165|       |		// but hitting this path should happen extremely rarely, so having this slow path is fine.
  166|  1.63k|		SmallVector<uint32_t> bits;
  167|  1.63k|		bits.reserve(higher.size());
  168|  1.63k|		for (auto &v : higher)
  ------------------
  |  Branch (168:16): [True: 3.83k, False: 1.63k]
  ------------------
  169|  3.83k|			bits.push_back(v);
  170|  1.63k|		std::sort(std::begin(bits), std::end(bits));
  171|       |
  172|  1.63k|		for (auto &v : bits)
  ------------------
  |  Branch (172:16): [True: 3.83k, False: 1.63k]
  ------------------
  173|  3.83k|			op(v);
  174|  1.63k|	}
_ZN11spirv_cross11variant_setINS_8SPIRTypeEJRN3spv2OpEEEERT_RNS_7VariantEDpOT0_:
 1617|  18.7k|{
 1618|  18.7k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  18.7k|	return *ptr;
 1620|  18.7k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_8SPIRTypeEJRN3spv2OpEEEEPT_NS_5TypesEDpOT0_:
 1542|  18.7k|	{
 1543|  18.7k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  18.7k|		set(val, new_type);
 1545|  18.7k|		return val;
 1546|  18.7k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE1EEC2Ev:
  421|  18.8k|	TypedID() = default;
_ZN11spirv_cross11variant_setINS_8SPIRTypeEJRS1_EEERT_RNS_7VariantEDpOT0_:
 1617|  3.45k|{
 1618|  3.45k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  3.45k|	return *ptr;
 1620|  3.45k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_8SPIRTypeEJRS2_EEEPT_NS_5TypesEDpOT0_:
 1542|  3.45k|	{
 1543|  3.45k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  3.45k|		set(val, new_type);
 1545|  3.45k|		return val;
 1546|  3.45k|	}
_ZNK11spirv_cross7TypedIDILNS_5TypesE1EEcvjEv:
  433|  24.6k|	{
  434|  24.6k|		return id;
  435|  24.6k|	}
_ZN11spirv_cross11variant_setINS_21SPIRFunctionPrototypeEJRjEEERT_RNS_7VariantEDpOT0_:
 1617|  5.83k|{
 1618|  5.83k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  5.83k|	return *ptr;
 1620|  5.83k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_21SPIRFunctionPrototypeEJRjEEEPT_NS_5TypesEDpOT0_:
 1542|  5.83k|	{
 1543|  5.83k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  5.83k|		set(val, new_type);
 1545|  5.83k|		return val;
 1546|  5.83k|	}
_ZN11spirv_cross11variant_setINS_12SPIRVariableEJRjRN3spv12StorageClassES2_EEERT_RNS_7VariantEDpOT0_:
 1617|  6.43k|{
 1618|  6.43k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  6.43k|	return *ptr;
 1620|  6.43k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRVariableEJRjRN3spv12StorageClassES3_EEEPT_NS_5TypesEDpOT0_:
 1542|  6.43k|	{
 1543|  6.43k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  6.43k|		set(val, new_type);
 1545|  6.43k|		return val;
 1546|  6.43k|	}
_ZN11spirv_cross11variant_setINS_12SPIRVariableEJRjN3spv12StorageClassEEEERT_RNS_7VariantEDpOT0_:
 1617|  3.07k|{
 1618|  3.07k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  3.07k|	return *ptr;
 1620|  3.07k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRVariableEJRjN3spv12StorageClassEEEEPT_NS_5TypesEDpOT0_:
 1542|  3.07k|	{
 1543|  3.07k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  3.07k|		set(val, new_type);
 1545|  3.07k|		return val;
 1546|  3.07k|	}
_ZN11spirv_cross11variant_setINS_12SPIRConstantEJRKjmbEEERT_RNS_7VariantEDpOT0_:
 1617|     18|{
 1618|     18|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|     18|	return *ptr;
 1620|     18|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRConstantEJRKjmbEEEPT_NS_5TypesEDpOT0_:
 1542|     18|	{
 1543|     18|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|     18|		set(val, new_type);
 1545|     18|		return val;
 1546|     18|	}
_ZN11spirv_cross11variant_setINS_12SPIRConstantEJRKjS3_bEEERT_RNS_7VariantEDpOT0_:
 1617|  3.90k|{
 1618|  3.90k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  3.90k|	return *ptr;
 1620|  3.90k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRConstantEJRKjS4_bEEEPT_NS_5TypesEDpOT0_:
 1542|  3.90k|	{
 1543|  3.90k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  3.90k|		set(val, new_type);
 1545|  3.90k|		return val;
 1546|  3.90k|	}
_ZN11spirv_cross11variant_setINS_12SPIRConstantEJRKjjbEEERT_RNS_7VariantEDpOT0_:
 1617|    613|{
 1618|    613|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|    613|	return *ptr;
 1620|    613|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRConstantEJRKjjbEEEPT_NS_5TypesEDpOT0_:
 1542|    613|	{
 1543|    613|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|    613|		set(val, new_type);
 1545|    613|		return val;
 1546|    613|	}
_ZN11spirv_cross11variant_setINS_12SPIRConstantEJRjPKjjbEEERT_RNS_7VariantEDpOT0_:
 1617|    409|{
 1618|    409|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|    409|	return *ptr;
 1620|    409|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRConstantEJRjPKjjbEEEPT_NS_5TypesEDpOT0_:
 1542|    409|	{
 1543|    409|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|    409|		set(val, new_type);
 1545|    409|		return val;
 1546|    409|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE3EEC2Ej:
  423|  6.10k|	    : id(id_)
  424|  6.10k|	{
  425|  6.10k|	}
_ZN11spirv_cross11variant_getINS_12SPIRConstantEEERT_RNS_7VariantE:
 1605|  2.74k|{
 1606|  2.74k|	return var.get<T>();
 1607|  2.74k|}
_ZN11spirv_cross7Variant3getINS_12SPIRConstantEEERT_v:
 1550|  2.74k|	{
 1551|  2.74k|		if (!holder)
  ------------------
  |  Branch (1551:7): [True: 6, False: 2.73k]
  ------------------
 1552|      6|			SPIRV_CROSS_THROW("nullptr");
  ------------------
  |  |   76|      6|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1553|  2.73k|		if (static_cast<Types>(T::type) != type)
  ------------------
  |  Branch (1553:7): [True: 1, False: 2.73k]
  ------------------
 1554|      1|			SPIRV_CROSS_THROW("Bad cast");
  ------------------
  |  |   76|      1|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1555|  2.73k|		return *static_cast<T *>(holder);
 1556|  2.73k|	}
_ZN11spirv_cross11variant_setINS_12SPIRConstantEJRjRA4_PKS1_S2_bEEERT_RNS_7VariantEDpOT0_:
 1617|    669|{
 1618|    669|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|    669|	return *ptr;
 1620|    669|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRConstantEJRjRA4_PKS2_S3_bEEEPT_NS_5TypesEDpOT0_:
 1542|    669|	{
 1543|    669|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|    669|		set(val, new_type);
 1545|    669|		return val;
 1546|    669|	}
_ZN11spirv_cross11variant_setINS_12SPIRFunctionEJRjS2_EEERT_RNS_7VariantEDpOT0_:
 1617|    450|{
 1618|    450|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|    450|	return *ptr;
 1620|    450|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRFunctionEJRjS3_EEEPT_NS_5TypesEDpOT0_:
 1542|    450|	{
 1543|    450|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|    450|		set(val, new_type);
 1545|    450|		return val;
 1546|    450|	}
_ZNK11spirv_cross7TypedIDILNS_5TypesE6EEcvjEv:
  433|  46.2k|	{
  434|  46.2k|		return id;
  435|  46.2k|	}
_ZN11spirv_cross11variant_setINS_9SPIRBlockEJEEERT_RNS_7VariantEDpOT0_:
 1617|  9.80k|{
 1618|  9.80k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  9.80k|	return *ptr;
 1620|  9.80k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_9SPIRBlockEJEEEPT_NS_5TypesEDpOT0_:
 1542|  9.80k|	{
 1543|  9.80k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  9.80k|		set(val, new_type);
 1545|  9.80k|		return val;
 1546|  9.80k|	}
_ZN11spirv_cross11variant_setINS_8SPIRTypeEJN3spv2OpEEEERT_RNS_7VariantEDpOT0_:
 1617|     28|{
 1618|     28|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|     28|	return *ptr;
 1620|     28|}
_ZN11spirv_cross7Variant16allocate_and_setINS_8SPIRTypeEJN3spv2OpEEEEPT_NS_5TypesEDpOT0_:
 1542|     28|	{
 1543|     28|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|     28|		set(val, new_type);
 1545|     28|		return val;
 1546|     28|	}
_ZN11spirv_cross11variant_setINS_12SPIRConstantEJRjEEERT_RNS_7VariantEDpOT0_:
 1617|  5.19k|{
 1618|  5.19k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  5.19k|	return *ptr;
 1620|  5.19k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRConstantEJRjEEEPT_NS_5TypesEDpOT0_:
 1542|  5.19k|	{
 1543|  5.19k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  5.19k|		set(val, new_type);
 1545|  5.19k|		return val;
 1546|  5.19k|	}
_ZNKSt3__14hashIN11spirv_cross7TypedIDILNS1_5TypesE6EEEEclERKS4_:
 1969|  4.40k|	{
 1970|  4.40k|		return std::hash<uint32_t>()(value);
 1971|  4.40k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE6EEC2Ev:
  421|    695|	TypedID() = default;
_ZN11spirv_cross7TypedIDILNS_5TypesE6EEC2ERKNS0_ILS1_0EEE:
  428|  8.80k|	    : id(uint32_t(other))
  429|  8.80k|	{
  430|  8.80k|	}
_ZN11spirv_cross11variant_setINS_14SPIRConstantOpEJRjRN3spv2OpEPKjjEEERT_RNS_7VariantEDpOT0_:
 1617|    791|{
 1618|    791|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|    791|	return *ptr;
 1620|    791|}
_ZN11spirv_cross7Variant16allocate_and_setINS_14SPIRConstantOpEJRjRN3spv2OpEPKjjEEEPT_NS_5TypesEDpOT0_:
 1542|    791|	{
 1543|    791|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|    791|		set(val, new_type);
 1545|    791|		return val;
 1546|    791|	}
_ZN11spirv_cross11variant_getINS_8SPIRTypeEEERKT_RKNS_7VariantE:
 1611|  3.51k|{
 1612|  3.51k|	return var.get<T>();
 1613|  3.51k|}
_ZNK11spirv_cross7Variant3getINS_8SPIRTypeEEERKT_v:
 1560|  3.51k|	{
 1561|  3.51k|		if (!holder)
  ------------------
  |  Branch (1561:7): [True: 0, False: 3.51k]
  ------------------
 1562|      0|			SPIRV_CROSS_THROW("nullptr");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1563|  3.51k|		if (static_cast<Types>(T::type) != type)
  ------------------
  |  Branch (1563:7): [True: 0, False: 3.51k]
  ------------------
 1564|      0|			SPIRV_CROSS_THROW("Bad cast");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1565|  3.51k|		return *static_cast<const T *>(holder);
 1566|  3.51k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE0EEC2ILS1_1EEERKNS0_IXT_EEE:
  389|  12.4k|	{
  390|  12.4k|		*this = other;
  391|  12.4k|	}
_ZN11spirv_cross7TypedIDILNS_5TypesE0EEaSILS1_1EEERS2_RKNS0_IXT_EEE:
  395|  12.4k|	{
  396|  12.4k|		id = uint32_t(other);
  397|  12.4k|		return *this;
  398|  12.4k|	}
_ZN11spirv_cross11variant_setINS_12SPIRConstantEJRjPjjbEEERT_RNS_7VariantEDpOT0_:
 1617|  1.87k|{
 1618|  1.87k|	auto *ptr = var.allocate_and_set<T>(static_cast<Types>(T::type), std::forward<P>(args)...);
 1619|  1.87k|	return *ptr;
 1620|  1.87k|}
_ZN11spirv_cross7Variant16allocate_and_setINS_12SPIRConstantEJRjPjjbEEEPT_NS_5TypesEDpOT0_:
 1542|  1.87k|	{
 1543|  1.87k|		T *val = static_cast<ObjectPool<T> &>(*group->pools[new_type]).allocate(std::forward<Ts>(ts)...);
 1544|  1.87k|		set(val, new_type);
 1545|  1.87k|		return val;
 1546|  1.87k|	}

_ZN11spirv_cross11SmallVectorINSt3__14pairIjjEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 16, False: 584]
  ------------------
  296|     16|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__14pairIjjEELm8EE5clearEv:
  300|    999|	{
  301|  3.82k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 2.82k, False: 999]
  ------------------
  302|  2.82k|			this->ptr[i].~T();
  303|    999|		this->buffer_size = 0;
  304|    999|	}
_ZN11spirv_cross13AlignedBufferINSt3__14pairIjjEELm8EE4dataEv:
   60|  1.26k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.26k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.26k|#endif
   69|  1.26k|	}
_ZN11spirv_cross11SmallVectorIjLm8EED2Ev:
  293|  67.1k|	{
  294|  67.1k|		clear();
  295|  67.1k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 5.39k, False: 61.7k]
  ------------------
  296|  5.39k|			free(this->ptr);
  297|  67.1k|	}
_ZN11spirv_cross11SmallVectorIjLm8EE5clearEv:
  300|  90.0k|	{
  301|   215k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 125k, False: 90.0k]
  ------------------
  302|   125k|			this->ptr[i].~T();
  303|  90.0k|		this->buffer_size = 0;
  304|  90.0k|	}
_ZN11spirv_cross13AlignedBufferIjLm8EE4dataEv:
   60|   139k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|   139k|		return reinterpret_cast<T *>(aligned_char);
   68|   139k|#endif
   69|   139k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EED2Ev:
  293|  28.4k|	{
  294|  28.4k|		clear();
  295|  28.4k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 223, False: 28.2k]
  ------------------
  296|    223|			free(this->ptr);
  297|  28.4k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EE5clearEv:
  300|  33.9k|	{
  301|  48.0k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 14.1k, False: 33.9k]
  ------------------
  302|  14.1k|			this->ptr[i].~T();
  303|  33.9k|		this->buffer_size = 0;
  304|  33.9k|	}
_ZN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE2EEELm8EE4dataEv:
   60|  62.9k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  62.9k|		return reinterpret_cast<T *>(aligned_char);
   68|  62.9k|#endif
   69|  62.9k|	}
_ZN11spirv_cross11SmallVectorIhLm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 558, False: 42]
  ------------------
  296|    558|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIhLm8EE5clearEv:
  300|    600|	{
  301|  37.8M|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 37.8M, False: 600]
  ------------------
  302|  37.8M|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross13AlignedBufferIhLm8EE4dataEv:
   60|  1.75k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.75k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.75k|#endif
   69|  1.75k|	}
_ZN11spirv_cross11SmallVectorINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 34, False: 566]
  ------------------
  296|     34|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEELm8EE5clearEv:
  300|    600|	{
  301|   314k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 313k, False: 600]
  ------------------
  302|   313k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross13AlignedBufferINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEELm8EE4dataEv:
   60|  1.50k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.50k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.50k|#endif
   69|  1.50k|	}
_ZN11spirv_cross11SmallVectorIN3spv10CapabilityELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 12, False: 588]
  ------------------
  296|     12|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIN3spv10CapabilityELm8EE5clearEv:
  300|    600|	{
  301|  4.20k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 3.60k, False: 600]
  ------------------
  302|  3.60k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross13AlignedBufferIN3spv10CapabilityELm8EE4dataEv:
   60|  1.25k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.25k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.25k|#endif
   69|  1.25k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EED2Ev:
  293|  29.3k|	{
  294|  29.3k|		clear();
  295|  29.3k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 1.01k, False: 28.3k]
  ------------------
  296|  1.01k|			free(this->ptr);
  297|  29.3k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EE5clearEv:
  300|  29.3k|	{
  301|  76.3k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 46.9k, False: 29.3k]
  ------------------
  302|  46.9k|			this->ptr[i].~T();
  303|  29.3k|		this->buffer_size = 0;
  304|  29.3k|	}
_ZN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE0EEELm8EE4dataEv:
   60|  61.0k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  61.0k|		return reinterpret_cast<T *>(aligned_char);
   68|  61.0k|#endif
   69|  61.0k|	}
_ZN11spirv_cross11SmallVectorINS_4Meta10DecorationELm0EED2Ev:
  293|  8.15k|	{
  294|  8.15k|		clear();
  295|  8.15k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 381, False: 7.77k]
  ------------------
  296|    381|			free(this->ptr);
  297|  8.15k|	}
_ZN11spirv_cross11SmallVectorINS_4Meta10DecorationELm0EE5clearEv:
  300|  8.15k|	{
  301|  5.94M|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 5.93M, False: 8.15k]
  ------------------
  302|  5.93M|			this->ptr[i].~T();
  303|  8.15k|		this->buffer_size = 0;
  304|  8.15k|	}
_ZN11spirv_cross13AlignedBufferINS_4Meta10DecorationELm0EE4dataEv:
   89|  16.7k|	{
   90|  16.7k|		return nullptr;
   91|  16.7k|	}
_ZN11spirv_cross11SmallVectorINS_7VariantELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 558, False: 42]
  ------------------
  296|    558|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINS_7VariantELm8EE5clearEv:
  300|    600|	{
  301|  37.8M|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 37.8M, False: 600]
  ------------------
  302|  37.8M|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross13AlignedBufferINS_7VariantELm8EE4dataEv:
   60|  1.75k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.75k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.75k|#endif
   69|  1.75k|	}
_ZN11spirv_cross10VectorViewIjE5beginEv:
  130|  9.65k|	{
  131|  9.65k|		return ptr;
  132|  9.65k|	}
_ZN11spirv_cross10VectorViewIjE3endEv:
  135|  9.65k|	{
  136|  9.65k|		return ptr + buffer_size;
  137|  9.65k|	}
_ZNK11spirv_cross10VectorViewIPNS_9SPIRUndefEE5emptyEv:
  110|  3.62k|	{
  111|  3.62k|		return buffer_size == 0;
  112|  3.62k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|     71|	{
  116|     71|		return buffer_size;
  117|     71|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EE7reserveEm:
  337|  3.01k|	{
  338|  3.01k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 3.01k]
  ------------------
  339|  3.01k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 3.01k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  3.01k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 71, False: 2.94k]
  ------------------
  346|     71|		{
  347|     71|			size_t target_capacity = buffer_capacity;
  348|     71|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 71, False: 0]
  ------------------
  349|     71|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|     71|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    355|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 284, False: 71]
  ------------------
  357|    284|				target_capacity <<= 1u;
  358|       |
  359|     71|			T *new_buffer =
  360|     71|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 71, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|     71|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 71]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|     71|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 71, False: 0]
  ------------------
  368|     71|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|     71|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 71]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|     71|			}
  376|       |
  377|     71|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 71]
  ------------------
  378|      0|				free(this->ptr);
  379|     71|			this->ptr = new_buffer;
  380|     71|			buffer_capacity = target_capacity;
  381|     71|		}
  382|  3.01k|	}
_ZN11spirv_cross13AlignedBufferIPNS_9SPIRUndefELm0EE4dataEv:
   89|  1.27k|	{
   90|  1.27k|		return nullptr;
   91|  1.27k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EE9push_backEOS2_:
  314|  1.13k|	{
  315|  1.13k|		reserve(this->buffer_size + 1);
  316|  1.13k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  1.13k|		this->buffer_size++;
  318|  1.13k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|     71|	{
  331|     71|		reserve(this->buffer_size + 1);
  332|     71|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|     71|		this->buffer_size++;
  334|     71|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|     71|	{
  338|     71|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 71]
  ------------------
  339|     71|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 71]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|     71|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 71]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|     71|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRUndefEE13MallocDeleterclEPS1_:
  615|     71|		{
  616|     71|			::free(ptr);
  617|     71|		}
_ZN11spirv_cross10VectorViewIPNS_9SPIRUndefEE4backEv:
  160|  1.81k|	{
  161|  1.81k|		return ptr[buffer_size - 1];
  162|  1.81k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EE8pop_backEv:
  321|  1.81k|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|  1.81k|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 1.81k, False: 0]
  ------------------
  325|  1.81k|			resize(this->buffer_size - 1);
  326|  1.81k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EE6resizeEm:
  512|  1.81k|	{
  513|  1.81k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 1.81k, False: 0]
  ------------------
  514|  1.81k|		{
  515|  3.62k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 1.81k, False: 1.81k]
  ------------------
  516|  1.81k|				this->ptr[i].~T();
  517|  1.81k|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|  1.81k|		this->buffer_size = new_size;
  526|  1.81k|	}
_ZNK11spirv_cross10VectorViewIPNS_10SPIRStringEE5emptyEv:
  110|  1.77k|	{
  111|  1.77k|		return buffer_size == 0;
  112|  1.77k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|      4|	{
  116|      4|		return buffer_size;
  117|      4|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EE7reserveEm:
  337|    954|	{
  338|    954|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 954]
  ------------------
  339|    954|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 954]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    954|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 4, False: 950]
  ------------------
  346|      4|		{
  347|      4|			size_t target_capacity = buffer_capacity;
  348|      4|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 4, False: 0]
  ------------------
  349|      4|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      4|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|     20|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 16, False: 4]
  ------------------
  357|     16|				target_capacity <<= 1u;
  358|       |
  359|      4|			T *new_buffer =
  360|      4|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 4, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      4|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 4]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      4|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 4, False: 0]
  ------------------
  368|      4|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      4|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 4]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      4|			}
  376|       |
  377|      4|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 4]
  ------------------
  378|      0|				free(this->ptr);
  379|      4|			this->ptr = new_buffer;
  380|      4|			buffer_capacity = target_capacity;
  381|      4|		}
  382|    954|	}
_ZN11spirv_cross13AlignedBufferIPNS_10SPIRStringELm0EE4dataEv:
   89|  1.20k|	{
   90|  1.20k|		return nullptr;
   91|  1.20k|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EE9push_backEOS2_:
  314|     64|	{
  315|     64|		reserve(this->buffer_size + 1);
  316|     64|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|     64|		this->buffer_size++;
  318|     64|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|      4|	{
  331|      4|		reserve(this->buffer_size + 1);
  332|      4|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|      4|		this->buffer_size++;
  334|      4|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|      4|	{
  338|      4|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 4]
  ------------------
  339|      4|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 4]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|      4|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 4]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|      4|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_10SPIRStringEE13MallocDeleterclEPS1_:
  615|      4|		{
  616|      4|			::free(ptr);
  617|      4|		}
_ZN11spirv_cross10VectorViewIPNS_10SPIRStringEE4backEv:
  160|    886|	{
  161|    886|		return ptr[buffer_size - 1];
  162|    886|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EE8pop_backEv:
  321|    886|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|    886|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 886, False: 0]
  ------------------
  325|    886|			resize(this->buffer_size - 1);
  326|    886|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EE6resizeEm:
  512|    886|	{
  513|    886|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 886, False: 0]
  ------------------
  514|    886|		{
  515|  1.77k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 886, False: 886]
  ------------------
  516|    886|				this->ptr[i].~T();
  517|    886|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|    886|		this->buffer_size = new_size;
  526|    886|	}
_ZN11spirv_cross13AlignedBufferIPNS_24SPIRCombinedImageSamplerELm0EE4dataEv:
   89|  1.20k|	{
   90|  1.20k|		return nullptr;
   91|  1.20k|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_24SPIRCombinedImageSamplerENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross11SmallVectorIjLm8EE7reserveEm:
  337|   118k|	{
  338|   118k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 118k]
  ------------------
  339|   118k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 118k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|   118k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 5.41k, False: 112k]
  ------------------
  346|  5.41k|		{
  347|  5.41k|			size_t target_capacity = buffer_capacity;
  348|  5.41k|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 5.41k]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|  5.41k|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  11.8k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 6.47k, False: 5.41k]
  ------------------
  357|  6.47k|				target_capacity <<= 1u;
  358|       |
  359|  5.41k|			T *new_buffer =
  360|  5.41k|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 5.41k, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|  5.41k|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 5.41k]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|  5.41k|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 5.41k, False: 0]
  ------------------
  368|  5.41k|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  41.0k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 35.6k, False: 5.41k]
  ------------------
  371|  35.6k|				{
  372|  35.6k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  35.6k|					this->ptr[i].~T();
  374|  35.6k|				}
  375|  5.41k|			}
  376|       |
  377|  5.41k|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 18, False: 5.39k]
  ------------------
  378|     18|				free(this->ptr);
  379|  5.41k|			this->ptr = new_buffer;
  380|  5.41k|			buffer_capacity = target_capacity;
  381|  5.41k|		}
  382|   118k|	}
_ZN11spirv_cross11SmallVectorIjLm8EE9push_backERKj:
  307|  87.6k|	{
  308|  87.6k|		reserve(this->buffer_size + 1);
  309|  87.6k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  87.6k|		this->buffer_size++;
  311|  87.6k|	}
_ZNK11spirv_cross10VectorViewIPNS_14SPIRConstantOpEE5emptyEv:
  110|  1.58k|	{
  111|  1.58k|		return buffer_size == 0;
  112|  1.58k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|     13|	{
  116|     13|		return buffer_size;
  117|     13|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EE7reserveEm:
  337|  1.01k|	{
  338|  1.01k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 1.01k]
  ------------------
  339|  1.01k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 1.01k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  1.01k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 13, False: 999]
  ------------------
  346|     13|		{
  347|     13|			size_t target_capacity = buffer_capacity;
  348|     13|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 13, False: 0]
  ------------------
  349|     13|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|     13|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|     65|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 52, False: 13]
  ------------------
  357|     52|				target_capacity <<= 1u;
  358|       |
  359|     13|			T *new_buffer =
  360|     13|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 13, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|     13|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 13]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|     13|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 13, False: 0]
  ------------------
  368|     13|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|     13|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 13]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|     13|			}
  376|       |
  377|     13|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 13]
  ------------------
  378|      0|				free(this->ptr);
  379|     13|			this->ptr = new_buffer;
  380|     13|			buffer_capacity = target_capacity;
  381|     13|		}
  382|  1.01k|	}
_ZN11spirv_cross13AlignedBufferIPNS_14SPIRConstantOpELm0EE4dataEv:
   89|  1.21k|	{
   90|  1.21k|		return nullptr;
   91|  1.21k|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EE9push_backEOS2_:
  314|    208|	{
  315|    208|		reserve(this->buffer_size + 1);
  316|    208|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|    208|		this->buffer_size++;
  318|    208|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|     13|	{
  331|     13|		reserve(this->buffer_size + 1);
  332|     13|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|     13|		this->buffer_size++;
  334|     13|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|     13|	{
  338|     13|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 13]
  ------------------
  339|     13|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 13]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|     13|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 13]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|     13|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_14SPIRConstantOpEE13MallocDeleterclEPS1_:
  615|     13|		{
  616|     13|			::free(ptr);
  617|     13|		}
_ZN11spirv_cross10VectorViewIPNS_14SPIRConstantOpEE4backEv:
  160|    791|	{
  161|    791|		return ptr[buffer_size - 1];
  162|    791|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EE8pop_backEv:
  321|    791|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|    791|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 791, False: 0]
  ------------------
  325|    791|			resize(this->buffer_size - 1);
  326|    791|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EE6resizeEm:
  512|    791|	{
  513|    791|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 791, False: 0]
  ------------------
  514|    791|		{
  515|  1.58k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 791, False: 791]
  ------------------
  516|    791|				this->ptr[i].~T();
  517|    791|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|    791|		this->buffer_size = new_size;
  526|    791|	}
_ZN11spirv_cross11SmallVectorIjLm8EEaSERKS1_:
  275|  24.9k|	{
  276|  24.9k|		if (this == &other)
  ------------------
  |  Branch (276:7): [True: 2.11k, False: 22.8k]
  ------------------
  277|  2.11k|			return *this;
  278|       |
  279|  22.8k|		clear();
  280|  22.8k|		reserve(other.buffer_size);
  281|  54.8k|		for (size_t i = 0; i < other.buffer_size; i++)
  ------------------
  |  Branch (281:22): [True: 31.9k, False: 22.8k]
  ------------------
  282|  31.9k|			new (&this->ptr[i]) T(other.ptr[i]);
  283|  22.8k|		this->buffer_size = other.buffer_size;
  284|  22.8k|		return *this;
  285|  24.9k|	}
_ZN11spirv_cross13AlignedBufferIbLm8EE4dataEv:
   60|  45.0k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  45.0k|		return reinterpret_cast<T *>(aligned_char);
   68|  45.0k|#endif
   69|  45.0k|	}
_ZN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE1EEELm8EE4dataEv:
   60|  44.5k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  44.5k|		return reinterpret_cast<T *>(aligned_char);
   68|  44.5k|#endif
   69|  44.5k|	}
_ZN11spirv_cross11SmallVectorIbLm8EE5clearEv:
  300|  33.6k|	{
  301|  66.8k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 33.1k, False: 33.6k]
  ------------------
  302|  33.1k|			this->ptr[i].~T();
  303|  33.6k|		this->buffer_size = 0;
  304|  33.6k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EE5clearEv:
  300|  34.0k|	{
  301|  43.3k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 9.31k, False: 34.0k]
  ------------------
  302|  9.31k|			this->ptr[i].~T();
  303|  34.0k|		this->buffer_size = 0;
  304|  34.0k|	}
_ZN11spirv_cross10ObjectPoolINS_8SPIRTypeEE8allocateIJRS1_EEEPS1_DpOT_:
  571|  3.45k|	{
  572|  3.45k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 30, False: 3.42k]
  ------------------
  573|     30|		{
  574|     30|			unsigned num_objects = start_object_count << memory.size();
  575|     30|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     30|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 30]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     30|			vacants.reserve(num_objects);
  580|    990|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 960, False: 30]
  ------------------
  581|    960|				vacants.push_back(&ptr[i]);
  582|       |
  583|     30|			memory.emplace_back(ptr);
  584|     30|		}
  585|       |
  586|  3.45k|		T *ptr = vacants.back();
  587|  3.45k|		vacants.pop_back();
  588|  3.45k|		new (ptr) T(std::forward<P>(p)...);
  589|  3.45k|		return ptr;
  590|  3.45k|	}
_ZNK11spirv_cross10VectorViewIPNS_8SPIRTypeEE5emptyEv:
  110|  44.5k|	{
  111|  44.5k|		return buffer_size == 0;
  112|  44.5k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|    442|	{
  116|    442|		return buffer_size;
  117|    442|	}
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EE7reserveEm:
  337|  31.1k|	{
  338|  31.1k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 31.1k]
  ------------------
  339|  31.1k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 31.1k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  31.1k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 530, False: 30.6k]
  ------------------
  346|    530|		{
  347|    530|			size_t target_capacity = buffer_capacity;
  348|    530|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 354, False: 176]
  ------------------
  349|    354|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    530|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  2.12k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 1.59k, False: 530]
  ------------------
  357|  1.59k|				target_capacity <<= 1u;
  358|       |
  359|    530|			T *new_buffer =
  360|    530|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 530, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    530|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 530]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    530|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 530, False: 0]
  ------------------
  368|    530|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  3.34k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 2.81k, False: 530]
  ------------------
  371|  2.81k|				{
  372|  2.81k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  2.81k|					this->ptr[i].~T();
  374|  2.81k|				}
  375|    530|			}
  376|       |
  377|    530|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 176, False: 354]
  ------------------
  378|    176|				free(this->ptr);
  379|    530|			this->ptr = new_buffer;
  380|    530|			buffer_capacity = target_capacity;
  381|    530|		}
  382|  31.1k|	}
_ZN11spirv_cross13AlignedBufferIPNS_8SPIRTypeELm0EE4dataEv:
   89|  1.73k|	{
   90|  1.73k|		return nullptr;
   91|  1.73k|	}
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EE9push_backEOS2_:
  314|  8.48k|	{
  315|  8.48k|		reserve(this->buffer_size + 1);
  316|  8.48k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  8.48k|		this->buffer_size++;
  318|  8.48k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|    442|	{
  331|    442|		reserve(this->buffer_size + 1);
  332|    442|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|    442|		this->buffer_size++;
  334|    442|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|    442|	{
  338|    442|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 442]
  ------------------
  339|    442|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 442]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    442|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 442]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    442|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_8SPIRTypeEE13MallocDeleterclEPS1_:
  615|    442|		{
  616|    442|			::free(ptr);
  617|    442|		}
_ZN11spirv_cross10VectorViewIPNS_8SPIRTypeEE4backEv:
  160|  22.2k|	{
  161|  22.2k|		return ptr[buffer_size - 1];
  162|  22.2k|	}
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EE8pop_backEv:
  321|  22.2k|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|  22.2k|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 22.2k, False: 0]
  ------------------
  325|  22.2k|			resize(this->buffer_size - 1);
  326|  22.2k|	}
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EE6resizeEm:
  512|  22.2k|	{
  513|  22.2k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 22.2k, False: 0]
  ------------------
  514|  22.2k|		{
  515|  44.5k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 22.2k, False: 22.2k]
  ------------------
  516|  22.2k|				this->ptr[i].~T();
  517|  22.2k|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|  22.2k|		this->buffer_size = new_size;
  526|  22.2k|	}
_ZN11spirv_cross11SmallVectorIbLm8EEaSERKS1_:
  275|  12.4k|	{
  276|  12.4k|		if (this == &other)
  ------------------
  |  Branch (276:7): [True: 1.05k, False: 11.4k]
  ------------------
  277|  1.05k|			return *this;
  278|       |
  279|  11.4k|		clear();
  280|  11.4k|		reserve(other.buffer_size);
  281|  43.4k|		for (size_t i = 0; i < other.buffer_size; i++)
  ------------------
  |  Branch (281:22): [True: 31.9k, False: 11.4k]
  ------------------
  282|  31.9k|			new (&this->ptr[i]) T(other.ptr[i]);
  283|  11.4k|		this->buffer_size = other.buffer_size;
  284|  11.4k|		return *this;
  285|  12.4k|	}
_ZN11spirv_cross11SmallVectorIbLm8EE7reserveEm:
  337|  12.6k|	{
  338|  12.6k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 12.6k]
  ------------------
  339|  12.6k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 12.6k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  12.6k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 546, False: 12.0k]
  ------------------
  346|    546|		{
  347|    546|			size_t target_capacity = buffer_capacity;
  348|    546|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 546]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    546|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  2.15k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 1.61k, False: 546]
  ------------------
  357|  1.61k|				target_capacity <<= 1u;
  358|       |
  359|    546|			T *new_buffer =
  360|    546|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 546, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    546|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 546]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    546|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 546, False: 0]
  ------------------
  368|    546|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  1.34k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 800, False: 546]
  ------------------
  371|    800|				{
  372|    800|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|    800|					this->ptr[i].~T();
  374|    800|				}
  375|    546|			}
  376|       |
  377|    546|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 18, False: 528]
  ------------------
  378|     18|				free(this->ptr);
  379|    546|			this->ptr = new_buffer;
  380|    546|			buffer_capacity = target_capacity;
  381|    546|		}
  382|  12.6k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EEaSERKS4_:
  275|  13.1k|	{
  276|  13.1k|		if (this == &other)
  ------------------
  |  Branch (276:7): [True: 1.40k, False: 11.7k]
  ------------------
  277|  1.40k|			return *this;
  278|       |
  279|  11.7k|		clear();
  280|  11.7k|		reserve(other.buffer_size);
  281|  16.6k|		for (size_t i = 0; i < other.buffer_size; i++)
  ------------------
  |  Branch (281:22): [True: 4.91k, False: 11.7k]
  ------------------
  282|  4.91k|			new (&this->ptr[i]) T(other.ptr[i]);
  283|  11.7k|		this->buffer_size = other.buffer_size;
  284|  11.7k|		return *this;
  285|  13.1k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EE7reserveEm:
  337|  16.1k|	{
  338|  16.1k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 16.1k]
  ------------------
  339|  16.1k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 16.1k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  16.1k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 50, False: 16.0k]
  ------------------
  346|     50|		{
  347|     50|			size_t target_capacity = buffer_capacity;
  348|     50|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 50]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|     50|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    194|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 144, False: 50]
  ------------------
  357|    144|				target_capacity <<= 1u;
  358|       |
  359|     50|			T *new_buffer =
  360|     50|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 50, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|     50|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 50]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|     50|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 50, False: 0]
  ------------------
  368|     50|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|    106|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 56, False: 50]
  ------------------
  371|     56|				{
  372|     56|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|     56|					this->ptr[i].~T();
  374|     56|				}
  375|     50|			}
  376|       |
  377|     50|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 2, False: 48]
  ------------------
  378|      2|				free(this->ptr);
  379|     50|			this->ptr = new_buffer;
  380|     50|			buffer_capacity = target_capacity;
  381|     50|		}
  382|  16.1k|	}
_ZNK11spirv_cross10VectorViewIPNS_13SPIRExtensionEE5emptyEv:
  110|  1.01k|	{
  111|  1.01k|		return buffer_size == 0;
  112|  1.01k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|    284|	{
  116|    284|		return buffer_size;
  117|    284|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EE7reserveEm:
  337|  5.33k|	{
  338|  5.33k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 5.33k]
  ------------------
  339|  5.33k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 5.33k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  5.33k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 284, False: 5.05k]
  ------------------
  346|    284|		{
  347|    284|			size_t target_capacity = buffer_capacity;
  348|    284|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 284, False: 0]
  ------------------
  349|    284|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    284|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  1.42k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 1.13k, False: 284]
  ------------------
  357|  1.13k|				target_capacity <<= 1u;
  358|       |
  359|    284|			T *new_buffer =
  360|    284|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 284, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    284|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 284]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    284|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 284, False: 0]
  ------------------
  368|    284|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|    284|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 284]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|    284|			}
  376|       |
  377|    284|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 284]
  ------------------
  378|      0|				free(this->ptr);
  379|    284|			this->ptr = new_buffer;
  380|    284|			buffer_capacity = target_capacity;
  381|    284|		}
  382|  5.33k|	}
_ZN11spirv_cross13AlignedBufferIPNS_13SPIRExtensionELm0EE4dataEv:
   89|  1.48k|	{
   90|  1.48k|		return nullptr;
   91|  1.48k|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EE9push_backEOS2_:
  314|  4.54k|	{
  315|  4.54k|		reserve(this->buffer_size + 1);
  316|  4.54k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  4.54k|		this->buffer_size++;
  318|  4.54k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|    284|	{
  331|    284|		reserve(this->buffer_size + 1);
  332|    284|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|    284|		this->buffer_size++;
  334|    284|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|    284|	{
  338|    284|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 284]
  ------------------
  339|    284|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 284]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    284|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 284]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    284|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_13SPIRExtensionEE13MallocDeleterclEPS1_:
  615|    284|		{
  616|    284|			::free(ptr);
  617|    284|		}
_ZN11spirv_cross10VectorViewIPNS_13SPIRExtensionEE4backEv:
  160|    508|	{
  161|    508|		return ptr[buffer_size - 1];
  162|    508|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EE8pop_backEv:
  321|    508|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|    508|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 508, False: 0]
  ------------------
  325|    508|			resize(this->buffer_size - 1);
  326|    508|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EE6resizeEm:
  512|    508|	{
  513|    508|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 508, False: 0]
  ------------------
  514|    508|		{
  515|  1.01k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 508, False: 508]
  ------------------
  516|    508|				this->ptr[i].~T();
  517|    508|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|    508|		this->buffer_size = new_size;
  526|    508|	}
_ZN11spirv_cross13AlignedBufferIPNS_14SPIRExpressionELm0EE4dataEv:
   89|  1.20k|	{
   90|  1.20k|		return nullptr;
   91|  1.20k|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_14SPIRExpressionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EE7reserveEm:
  337|  46.9k|	{
  338|  46.9k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 46.9k]
  ------------------
  339|  46.9k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 46.9k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  46.9k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 2.30k, False: 44.6k]
  ------------------
  346|  2.30k|		{
  347|  2.30k|			size_t target_capacity = buffer_capacity;
  348|  2.30k|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 2.30k]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|  2.30k|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  4.60k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 2.30k, False: 2.30k]
  ------------------
  357|  2.30k|				target_capacity <<= 1u;
  358|       |
  359|  2.30k|			T *new_buffer =
  360|  2.30k|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 2.30k, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|  2.30k|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 2.30k]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|  2.30k|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 2.30k, False: 0]
  ------------------
  368|  2.30k|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  56.8k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 54.5k, False: 2.30k]
  ------------------
  371|  54.5k|				{
  372|  54.5k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  54.5k|					this->ptr[i].~T();
  374|  54.5k|				}
  375|  2.30k|			}
  376|       |
  377|  2.30k|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 1.28k, False: 1.01k]
  ------------------
  378|  1.28k|				free(this->ptr);
  379|  2.30k|			this->ptr = new_buffer;
  380|  2.30k|			buffer_capacity = target_capacity;
  381|  2.30k|		}
  382|  46.9k|	}
_ZNK11spirv_cross10VectorViewIPNS_21SPIRFunctionPrototypeEE5emptyEv:
  110|  11.6k|	{
  111|  11.6k|		return buffer_size == 0;
  112|  11.6k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|    268|	{
  116|    268|		return buffer_size;
  117|    268|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EE7reserveEm:
  337|  10.3k|	{
  338|  10.3k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 10.3k]
  ------------------
  339|  10.3k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 10.3k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  10.3k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 268, False: 10.1k]
  ------------------
  346|    268|		{
  347|    268|			size_t target_capacity = buffer_capacity;
  348|    268|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 268, False: 0]
  ------------------
  349|    268|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    268|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  1.34k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 1.07k, False: 268]
  ------------------
  357|  1.07k|				target_capacity <<= 1u;
  358|       |
  359|    268|			T *new_buffer =
  360|    268|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 268, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    268|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 268]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    268|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 268, False: 0]
  ------------------
  368|    268|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|    268|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 268]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|    268|			}
  376|       |
  377|    268|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 268]
  ------------------
  378|      0|				free(this->ptr);
  379|    268|			this->ptr = new_buffer;
  380|    268|			buffer_capacity = target_capacity;
  381|    268|		}
  382|  10.3k|	}
_ZN11spirv_cross13AlignedBufferIPNS_21SPIRFunctionPrototypeELm0EE4dataEv:
   89|  1.46k|	{
   90|  1.46k|		return nullptr;
   91|  1.46k|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EE9push_backEOS2_:
  314|  4.28k|	{
  315|  4.28k|		reserve(this->buffer_size + 1);
  316|  4.28k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  4.28k|		this->buffer_size++;
  318|  4.28k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|    268|	{
  331|    268|		reserve(this->buffer_size + 1);
  332|    268|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|    268|		this->buffer_size++;
  334|    268|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|    268|	{
  338|    268|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 268]
  ------------------
  339|    268|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 268]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    268|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 268]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    268|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_21SPIRFunctionPrototypeEE13MallocDeleterclEPS1_:
  615|    268|		{
  616|    268|			::free(ptr);
  617|    268|		}
_ZN11spirv_cross10VectorViewIPNS_21SPIRFunctionPrototypeEE4backEv:
  160|  5.83k|	{
  161|  5.83k|		return ptr[buffer_size - 1];
  162|  5.83k|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EE8pop_backEv:
  321|  5.83k|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|  5.83k|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 5.83k, False: 0]
  ------------------
  325|  5.83k|			resize(this->buffer_size - 1);
  326|  5.83k|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EE6resizeEm:
  512|  5.83k|	{
  513|  5.83k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 5.83k, False: 0]
  ------------------
  514|  5.83k|		{
  515|  11.6k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 5.83k, False: 5.83k]
  ------------------
  516|  5.83k|				this->ptr[i].~T();
  517|  5.83k|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|  5.83k|		this->buffer_size = new_size;
  526|  5.83k|	}
_ZNK11spirv_cross10VectorViewIPNS_9SPIRBlockEE5emptyEv:
  110|  19.6k|	{
  111|  19.6k|		return buffer_size == 0;
  112|  19.6k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|    350|	{
  116|    350|		return buffer_size;
  117|    350|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EE7reserveEm:
  337|  20.7k|	{
  338|  20.7k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 20.7k]
  ------------------
  339|  20.7k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 20.7k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  20.7k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 423, False: 20.3k]
  ------------------
  346|    423|		{
  347|    423|			size_t target_capacity = buffer_capacity;
  348|    423|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 227, False: 196]
  ------------------
  349|    227|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    423|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  1.52k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 1.10k, False: 423]
  ------------------
  357|  1.10k|				target_capacity <<= 1u;
  358|       |
  359|    423|			T *new_buffer =
  360|    423|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 423, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    423|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 423]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    423|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 423, False: 0]
  ------------------
  368|    423|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  5.06k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 4.64k, False: 423]
  ------------------
  371|  4.64k|				{
  372|  4.64k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  4.64k|					this->ptr[i].~T();
  374|  4.64k|				}
  375|    423|			}
  376|       |
  377|    423|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 196, False: 227]
  ------------------
  378|    196|				free(this->ptr);
  379|    423|			this->ptr = new_buffer;
  380|    423|			buffer_capacity = target_capacity;
  381|    423|		}
  382|  20.7k|	}
_ZN11spirv_cross13AlignedBufferIPNS_9SPIRBlockELm0EE4dataEv:
   89|  1.62k|	{
   90|  1.62k|		return nullptr;
   91|  1.62k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EE9push_backEOS2_:
  314|  10.5k|	{
  315|  10.5k|		reserve(this->buffer_size + 1);
  316|  10.5k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  10.5k|		this->buffer_size++;
  318|  10.5k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|    350|	{
  331|    350|		reserve(this->buffer_size + 1);
  332|    350|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|    350|		this->buffer_size++;
  334|    350|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|    350|	{
  338|    350|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 350]
  ------------------
  339|    350|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 350]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    350|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 350]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    350|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRBlockEE13MallocDeleterclEPS1_:
  615|    350|		{
  616|    350|			::free(ptr);
  617|    350|		}
_ZN11spirv_cross10VectorViewIPNS_9SPIRBlockEE4backEv:
  160|  9.80k|	{
  161|  9.80k|		return ptr[buffer_size - 1];
  162|  9.80k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EE8pop_backEv:
  321|  9.80k|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|  9.80k|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 9.80k, False: 0]
  ------------------
  325|  9.80k|			resize(this->buffer_size - 1);
  326|  9.80k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EE6resizeEm:
  512|  9.80k|	{
  513|  9.80k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 9.80k, False: 0]
  ------------------
  514|  9.80k|		{
  515|  19.6k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 9.80k, False: 9.80k]
  ------------------
  516|  9.80k|				this->ptr[i].~T();
  517|  9.80k|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|  9.80k|		this->buffer_size = new_size;
  526|  9.80k|	}
_ZN11spirv_cross13AlignedBufferINS_11InstructionELm8EE4dataEv:
   60|  24.6k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  24.6k|		return reinterpret_cast<T *>(aligned_char);
   68|  24.6k|#endif
   69|  24.6k|	}
_ZN11spirv_cross11SmallVectorINS_11InstructionELm8EE5clearEv:
  300|  10.3k|	{
  301|   631k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 621k, False: 10.3k]
  ------------------
  302|   621k|			this->ptr[i].~T();
  303|  10.3k|		this->buffer_size = 0;
  304|  10.3k|	}
_ZN11spirv_cross11SmallVectorINS_11InstructionELm8EE7reserveEm:
  337|   621k|	{
  338|   621k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 621k]
  ------------------
  339|   621k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 621k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|   621k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 3.87k, False: 617k]
  ------------------
  346|  3.87k|		{
  347|  3.87k|			size_t target_capacity = buffer_capacity;
  348|  3.87k|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 3.87k]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|  3.87k|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  7.74k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 3.87k, False: 3.87k]
  ------------------
  357|  3.87k|				target_capacity <<= 1u;
  358|       |
  359|  3.87k|			T *new_buffer =
  360|  3.87k|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 3.87k, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|  3.87k|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 3.87k]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|  3.87k|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 3.87k, False: 0]
  ------------------
  368|  3.87k|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|   803k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 799k, False: 3.87k]
  ------------------
  371|   799k|				{
  372|   799k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|   799k|					this->ptr[i].~T();
  374|   799k|				}
  375|  3.87k|			}
  376|       |
  377|  3.87k|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 2.71k, False: 1.15k]
  ------------------
  378|  2.71k|				free(this->ptr);
  379|  3.87k|			this->ptr = new_buffer;
  380|  3.87k|			buffer_capacity = target_capacity;
  381|  3.87k|		}
  382|   621k|	}
_ZN11spirv_cross13AlignedBufferINS_9SPIRBlock3PhiELm8EE4dataEv:
   60|  19.7k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  19.7k|		return reinterpret_cast<T *>(aligned_char);
   68|  19.7k|#endif
   69|  19.7k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock3PhiELm8EE5clearEv:
  300|  9.80k|	{
  301|  16.0k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 6.29k, False: 9.80k]
  ------------------
  302|  6.29k|			this->ptr[i].~T();
  303|  9.80k|		this->buffer_size = 0;
  304|  9.80k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock3PhiELm8EE7reserveEm:
  337|  6.29k|	{
  338|  6.29k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 6.29k]
  ------------------
  339|  6.29k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 6.29k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  6.29k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 102, False: 6.18k]
  ------------------
  346|    102|		{
  347|    102|			size_t target_capacity = buffer_capacity;
  348|    102|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 102]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    102|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    204|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 102, False: 102]
  ------------------
  357|    102|				target_capacity <<= 1u;
  358|       |
  359|    102|			T *new_buffer =
  360|    102|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 102, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    102|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 102]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    102|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 102, False: 0]
  ------------------
  368|    102|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  1.42k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 1.32k, False: 102]
  ------------------
  371|  1.32k|				{
  372|  1.32k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  1.32k|					this->ptr[i].~T();
  374|  1.32k|				}
  375|    102|			}
  376|       |
  377|    102|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 47, False: 55]
  ------------------
  378|     47|				free(this->ptr);
  379|    102|			this->ptr = new_buffer;
  380|    102|			buffer_capacity = target_capacity;
  381|    102|		}
  382|  6.29k|	}
_ZN11spirv_cross13AlignedBufferINSt3__14pairINS_7TypedIDILNS_5TypesE1EEENS3_ILS4_0EEEEELm8EE4dataEv:
   60|  39.2k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  39.2k|		return reinterpret_cast<T *>(aligned_char);
   68|  39.2k|#endif
   69|  39.2k|	}
_ZN11spirv_cross11SmallVectorINSt3__14pairINS_7TypedIDILNS_5TypesE1EEENS3_ILS4_0EEEEELm8EE5clearEv:
  300|  19.6k|	{
  301|  19.6k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 19.6k]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|  19.6k|		this->buffer_size = 0;
  304|  19.6k|	}
_ZN11spirv_cross13AlignedBufferINS_9SPIRBlock4CaseELm8EE4dataEv:
   60|  39.2k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  39.2k|		return reinterpret_cast<T *>(aligned_char);
   68|  39.2k|#endif
   69|  39.2k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock4CaseELm8EE5clearEv:
  300|  19.6k|	{
  301|  20.8k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 1.20k, False: 19.6k]
  ------------------
  302|  1.20k|			this->ptr[i].~T();
  303|  19.6k|		this->buffer_size = 0;
  304|  19.6k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock4CaseELm8EE7reserveEm:
  337|  1.20k|	{
  338|  1.20k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 1.20k]
  ------------------
  339|  1.20k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 1.20k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  1.20k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 87, False: 1.11k]
  ------------------
  346|     87|		{
  347|     87|			size_t target_capacity = buffer_capacity;
  348|     87|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 87]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|     87|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    174|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 87, False: 87]
  ------------------
  357|     87|				target_capacity <<= 1u;
  358|       |
  359|     87|			T *new_buffer =
  360|     87|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 87, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|     87|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 87]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|     87|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 87, False: 0]
  ------------------
  368|     87|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|    871|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 784, False: 87]
  ------------------
  371|    784|				{
  372|    784|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|    784|					this->ptr[i].~T();
  374|    784|				}
  375|     87|			}
  376|       |
  377|     87|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 3, False: 84]
  ------------------
  378|      3|				free(this->ptr);
  379|     87|			this->ptr = new_buffer;
  380|     87|			buffer_capacity = target_capacity;
  381|     87|		}
  382|  1.20k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EE7reserveEm:
  337|  19.6k|	{
  338|  19.6k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 19.6k]
  ------------------
  339|  19.6k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 19.6k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  19.6k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 510, False: 19.0k]
  ------------------
  346|    510|		{
  347|    510|			size_t target_capacity = buffer_capacity;
  348|    510|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 510]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    510|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  1.02k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 510, False: 510]
  ------------------
  357|    510|				target_capacity <<= 1u;
  358|       |
  359|    510|			T *new_buffer =
  360|    510|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 510, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    510|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 510]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    510|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 510, False: 0]
  ------------------
  368|    510|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  17.4k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 16.9k, False: 510]
  ------------------
  371|  16.9k|				{
  372|  16.9k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  16.9k|					this->ptr[i].~T();
  374|  16.9k|				}
  375|    510|			}
  376|       |
  377|    510|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 287, False: 223]
  ------------------
  378|    287|				free(this->ptr);
  379|    510|			this->ptr = new_buffer;
  380|    510|			buffer_capacity = target_capacity;
  381|    510|		}
  382|  19.6k|	}
_ZN11spirv_cross13AlignedBufferINS_12SPIRFunction9ParameterELm8EE4dataEv:
   60|  1.80k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.80k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.80k|#endif
   69|  1.80k|	}
_ZN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE6EEELm8EE4dataEv:
   60|  1.27k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.27k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.27k|#endif
   69|  1.27k|	}
_ZN11spirv_cross13AlignedBufferINS_12SPIRFunction29CombinedImageSamplerParameterELm8EE4dataEv:
   60|    900|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|    900|		return reinterpret_cast<T *>(aligned_char);
   68|    900|#endif
   69|    900|	}
_ZN11spirv_cross13AlignedBufferINSt3__18functionIFvvEEELm0EE4dataEv:
   89|  1.80k|	{
   90|  1.80k|		return nullptr;
   91|  1.80k|	}
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction9ParameterELm8EE5clearEv:
  300|    900|	{
  301|  1.06k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 166, False: 900]
  ------------------
  302|    166|			this->ptr[i].~T();
  303|    900|		this->buffer_size = 0;
  304|    900|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE6EEELm8EE5clearEv:
  300|    450|	{
  301|  10.2k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 9.81k, False: 450]
  ------------------
  302|  9.81k|			this->ptr[i].~T();
  303|    450|		this->buffer_size = 0;
  304|    450|	}
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction29CombinedImageSamplerParameterELm8EE5clearEv:
  300|    450|	{
  301|    450|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 450]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    450|		this->buffer_size = 0;
  304|    450|	}
_ZN11spirv_cross11SmallVectorINSt3__18functionIFvvEEELm0EE5clearEv:
  300|    900|	{
  301|    900|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 900]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    900|		this->buffer_size = 0;
  304|    900|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EE9push_backERKS3_:
  307|  4.18k|	{
  308|  4.18k|		reserve(this->buffer_size + 1);
  309|  4.18k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  4.18k|		this->buffer_size++;
  311|  4.18k|	}
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction9ParameterELm8EE9push_backEOS2_:
  314|    166|	{
  315|    166|		reserve(this->buffer_size + 1);
  316|    166|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|    166|		this->buffer_size++;
  318|    166|	}
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction9ParameterELm8EE7reserveEm:
  337|    166|	{
  338|    166|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 166]
  ------------------
  339|    166|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 166]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    166|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 166]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    166|	}
_ZNK11spirv_cross10VectorViewIPNS_12SPIRFunctionEE5emptyEv:
  110|    900|	{
  111|    900|		return buffer_size == 0;
  112|    900|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|    227|	{
  116|    227|		return buffer_size;
  117|    227|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EE7reserveEm:
  337|  4.30k|	{
  338|  4.30k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 4.30k]
  ------------------
  339|  4.30k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 4.30k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  4.30k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 227, False: 4.08k]
  ------------------
  346|    227|		{
  347|    227|			size_t target_capacity = buffer_capacity;
  348|    227|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 227, False: 0]
  ------------------
  349|    227|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    227|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  1.13k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 908, False: 227]
  ------------------
  357|    908|				target_capacity <<= 1u;
  358|       |
  359|    227|			T *new_buffer =
  360|    227|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 227, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    227|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 227]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    227|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 227, False: 0]
  ------------------
  368|    227|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|    227|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 227]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|    227|			}
  376|       |
  377|    227|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 227]
  ------------------
  378|      0|				free(this->ptr);
  379|    227|			this->ptr = new_buffer;
  380|    227|			buffer_capacity = target_capacity;
  381|    227|		}
  382|  4.30k|	}
_ZN11spirv_cross13AlignedBufferIPNS_12SPIRFunctionELm0EE4dataEv:
   89|  1.42k|	{
   90|  1.42k|		return nullptr;
   91|  1.42k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EE9push_backEOS2_:
  314|  3.63k|	{
  315|  3.63k|		reserve(this->buffer_size + 1);
  316|  3.63k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  3.63k|		this->buffer_size++;
  318|  3.63k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|    227|	{
  331|    227|		reserve(this->buffer_size + 1);
  332|    227|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|    227|		this->buffer_size++;
  334|    227|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|    227|	{
  338|    227|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 227]
  ------------------
  339|    227|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 227]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    227|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 227]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    227|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRFunctionEE13MallocDeleterclEPS1_:
  615|    227|		{
  616|    227|			::free(ptr);
  617|    227|		}
_ZN11spirv_cross10VectorViewIPNS_12SPIRFunctionEE4backEv:
  160|    450|	{
  161|    450|		return ptr[buffer_size - 1];
  162|    450|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EE8pop_backEv:
  321|    450|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|    450|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 450, False: 0]
  ------------------
  325|    450|			resize(this->buffer_size - 1);
  326|    450|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EE6resizeEm:
  512|    450|	{
  513|    450|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 450, False: 0]
  ------------------
  514|    450|		{
  515|    900|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 450, False: 450]
  ------------------
  516|    450|				this->ptr[i].~T();
  517|    450|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|    450|		this->buffer_size = new_size;
  526|    450|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE6EEELm8EE7reserveEm:
  337|  9.81k|	{
  338|  9.81k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 9.81k]
  ------------------
  339|  9.81k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 9.81k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  9.81k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 372, False: 9.44k]
  ------------------
  346|    372|		{
  347|    372|			size_t target_capacity = buffer_capacity;
  348|    372|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 372]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    372|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    744|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 372, False: 372]
  ------------------
  357|    372|				target_capacity <<= 1u;
  358|       |
  359|    372|			T *new_buffer =
  360|    372|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 372, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    372|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 372]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    372|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 372, False: 0]
  ------------------
  368|    372|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  11.6k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 11.3k, False: 372]
  ------------------
  371|  11.3k|				{
  372|  11.3k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  11.3k|					this->ptr[i].~T();
  374|  11.3k|				}
  375|    372|			}
  376|       |
  377|    372|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 223, False: 149]
  ------------------
  378|    223|				free(this->ptr);
  379|    372|			this->ptr = new_buffer;
  380|    372|			buffer_capacity = target_capacity;
  381|    372|		}
  382|  9.81k|	}
_ZN11spirv_cross13AlignedBufferIPNS_15SPIRAccessChainELm0EE4dataEv:
   89|  1.20k|	{
   90|  1.20k|		return nullptr;
   91|  1.20k|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_15SPIRAccessChainENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZNK11spirv_cross10VectorViewIPNS_12SPIRVariableEE5emptyEv:
  110|  19.0k|	{
  111|  19.0k|		return buffer_size == 0;
  112|  19.0k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|    333|	{
  116|    333|		return buffer_size;
  117|    333|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EE7reserveEm:
  337|  16.8k|	{
  338|  16.8k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 16.8k]
  ------------------
  339|  16.8k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 16.8k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  16.8k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 394, False: 16.4k]
  ------------------
  346|    394|		{
  347|    394|			size_t target_capacity = buffer_capacity;
  348|    394|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 258, False: 136]
  ------------------
  349|    258|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    394|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  1.56k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 1.16k, False: 394]
  ------------------
  357|  1.16k|				target_capacity <<= 1u;
  358|       |
  359|    394|			T *new_buffer =
  360|    394|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 394, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    394|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 394]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    394|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 394, False: 0]
  ------------------
  368|    394|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  2.79k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 2.40k, False: 394]
  ------------------
  371|  2.40k|				{
  372|  2.40k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  2.40k|					this->ptr[i].~T();
  374|  2.40k|				}
  375|    394|			}
  376|       |
  377|    394|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 136, False: 258]
  ------------------
  378|    136|				free(this->ptr);
  379|    394|			this->ptr = new_buffer;
  380|    394|			buffer_capacity = target_capacity;
  381|    394|		}
  382|  16.8k|	}
_ZN11spirv_cross13AlignedBufferIPNS_12SPIRVariableELm0EE4dataEv:
   89|  1.59k|	{
   90|  1.59k|		return nullptr;
   91|  1.59k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EE9push_backEOS2_:
  314|  6.97k|	{
  315|  6.97k|		reserve(this->buffer_size + 1);
  316|  6.97k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  6.97k|		this->buffer_size++;
  318|  6.97k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|    333|	{
  331|    333|		reserve(this->buffer_size + 1);
  332|    333|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|    333|		this->buffer_size++;
  334|    333|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|    333|	{
  338|    333|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 333]
  ------------------
  339|    333|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 333]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    333|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 333]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    333|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRVariableEE13MallocDeleterclEPS1_:
  615|    333|		{
  616|    333|			::free(ptr);
  617|    333|		}
_ZN11spirv_cross10VectorViewIPNS_12SPIRVariableEE4backEv:
  160|  9.50k|	{
  161|  9.50k|		return ptr[buffer_size - 1];
  162|  9.50k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EE8pop_backEv:
  321|  9.50k|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|  9.50k|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 9.50k, False: 0]
  ------------------
  325|  9.50k|			resize(this->buffer_size - 1);
  326|  9.50k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EE6resizeEm:
  512|  9.50k|	{
  513|  9.50k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 9.50k, False: 0]
  ------------------
  514|  9.50k|		{
  515|  19.0k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 9.50k, False: 9.50k]
  ------------------
  516|  9.50k|				this->ptr[i].~T();
  517|  9.50k|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|  9.50k|		this->buffer_size = new_size;
  526|  9.50k|	}
_ZN11spirv_cross13AlignedBufferINS_7TypedIDILNS_5TypesE3EEELm8EE4dataEv:
   60|  30.7k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  30.7k|		return reinterpret_cast<T *>(aligned_char);
   68|  30.7k|#endif
   69|  30.7k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE3EEELm8EE5clearEv:
  300|  15.3k|	{
  301|  21.4k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 6.10k, False: 15.3k]
  ------------------
  302|  6.10k|			this->ptr[i].~T();
  303|  15.3k|		this->buffer_size = 0;
  304|  15.3k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE3EEELm8EE7reserveEm:
  337|  8.38k|	{
  338|  8.38k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 8.38k]
  ------------------
  339|  8.38k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 8.38k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  8.38k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 6, False: 8.37k]
  ------------------
  346|      6|		{
  347|      6|			size_t target_capacity = buffer_capacity;
  348|      6|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 6]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      6|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|     16|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 10, False: 6]
  ------------------
  357|     10|				target_capacity <<= 1u;
  358|       |
  359|      6|			T *new_buffer =
  360|      6|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 6, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      6|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 6]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      6|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 6, False: 0]
  ------------------
  368|      6|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      6|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 6]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      6|			}
  376|       |
  377|      6|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 6]
  ------------------
  378|      0|				free(this->ptr);
  379|      6|			this->ptr = new_buffer;
  380|      6|			buffer_capacity = target_capacity;
  381|      6|		}
  382|  8.38k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE3EEELm8EE9push_backEOS3_:
  314|  6.10k|	{
  315|  6.10k|		reserve(this->buffer_size + 1);
  316|  6.10k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  6.10k|		this->buffer_size++;
  318|  6.10k|	}
_ZNK11spirv_cross10VectorViewIPNS_12SPIRConstantEE5emptyEv:
  110|  25.3k|	{
  111|  25.3k|		return buffer_size == 0;
  112|  25.3k|	}
_ZNK11spirv_cross10VectorViewINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEEE4sizeEv:
  115|    466|	{
  116|    466|		return buffer_size;
  117|    466|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EE7reserveEm:
  337|  29.4k|	{
  338|  29.4k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 29.4k]
  ------------------
  339|  29.4k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 29.4k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  29.4k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 596, False: 28.8k]
  ------------------
  346|    596|		{
  347|    596|			size_t target_capacity = buffer_capacity;
  348|    596|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 277, False: 319]
  ------------------
  349|    277|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    596|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  2.02k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 1.42k, False: 596]
  ------------------
  357|  1.42k|				target_capacity <<= 1u;
  358|       |
  359|    596|			T *new_buffer =
  360|    596|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 596, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    596|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 596]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    596|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 596, False: 0]
  ------------------
  368|    596|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  8.62k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 8.03k, False: 596]
  ------------------
  371|  8.03k|				{
  372|  8.03k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  8.03k|					this->ptr[i].~T();
  374|  8.03k|				}
  375|    596|			}
  376|       |
  377|    596|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 319, False: 277]
  ------------------
  378|    319|				free(this->ptr);
  379|    596|			this->ptr = new_buffer;
  380|    596|			buffer_capacity = target_capacity;
  381|    596|		}
  382|  29.4k|	}
_ZN11spirv_cross13AlignedBufferIPNS_12SPIRConstantELm0EE4dataEv:
   89|  1.79k|	{
   90|  1.79k|		return nullptr;
   91|  1.79k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EE9push_backEOS2_:
  314|  16.3k|	{
  315|  16.3k|		reserve(this->buffer_size + 1);
  316|  16.3k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  16.3k|		this->buffer_size++;
  318|  16.3k|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE12emplace_backIJRPS3_EEEvDpOT_:
  330|    466|	{
  331|    466|		reserve(this->buffer_size + 1);
  332|    466|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|    466|		this->buffer_size++;
  334|    466|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE7reserveEm:
  337|    466|	{
  338|    466|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 466]
  ------------------
  339|    466|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 466]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    466|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 0, False: 466]
  ------------------
  346|      0|		{
  347|      0|			size_t target_capacity = buffer_capacity;
  348|      0|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|      0|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|      0|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 0, False: 0]
  ------------------
  357|      0|				target_capacity <<= 1u;
  358|       |
  359|      0|			T *new_buffer =
  360|      0|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 0, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|      0|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 0]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|      0|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 0, False: 0]
  ------------------
  368|      0|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|      0|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 0, False: 0]
  ------------------
  371|      0|				{
  372|      0|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|      0|					this->ptr[i].~T();
  374|      0|				}
  375|      0|			}
  376|       |
  377|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 0, False: 0]
  ------------------
  378|      0|				free(this->ptr);
  379|      0|			this->ptr = new_buffer;
  380|      0|			buffer_capacity = target_capacity;
  381|      0|		}
  382|    466|	}
_ZN11spirv_cross13AlignedBufferINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE4dataEv:
   60|  1.20k|	{
   61|       |#if defined(_MSC_VER) && _MSC_VER < 1900
   62|       |		// MSVC 2013 workarounds, sigh ...
   63|       |		// Only use this workaround on MSVC 2013 due to some confusion around default initialized unions.
   64|       |		// Spec seems to suggest the memory will be zero-initialized, which is *not* what we want.
   65|       |		return reinterpret_cast<T *>(u.aligned_char);
   66|       |#else
   67|  1.20k|		return reinterpret_cast<T *>(aligned_char);
   68|  1.20k|#endif
   69|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE13MallocDeleterclEPS1_:
  615|    466|		{
  616|    466|			::free(ptr);
  617|    466|		}
_ZN11spirv_cross10VectorViewIPNS_12SPIRConstantEE4backEv:
  160|  12.6k|	{
  161|  12.6k|		return ptr[buffer_size - 1];
  162|  12.6k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EE8pop_backEv:
  321|  12.6k|	{
  322|       |		// Work around false positive warning on GCC 8.3.
  323|       |		// Calling pop_back on empty vector is undefined.
  324|  12.6k|		if (!this->empty())
  ------------------
  |  Branch (324:7): [True: 12.6k, False: 0]
  ------------------
  325|  12.6k|			resize(this->buffer_size - 1);
  326|  12.6k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EE6resizeEm:
  512|  12.6k|	{
  513|  12.6k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 12.6k, False: 0]
  ------------------
  514|  12.6k|		{
  515|  25.3k|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 12.6k, False: 12.6k]
  ------------------
  516|  12.6k|				this->ptr[i].~T();
  517|  12.6k|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|  12.6k|		this->buffer_size = new_size;
  526|  12.6k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EEC2Ev:
  209|  28.4k|	{
  210|  28.4k|		this->ptr = stack_storage.data();
  211|  28.4k|		buffer_capacity = N;
  212|  28.4k|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE2EEEEC2Ev:
  195|  28.4k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE3EEELm8EEC2Ev:
  209|  15.3k|	{
  210|  15.3k|		this->ptr = stack_storage.data();
  211|  15.3k|		buffer_capacity = N;
  212|  15.3k|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE3EEEEC2Ev:
  195|  15.3k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE3EEELm8EED2Ev:
  293|  15.3k|	{
  294|  15.3k|		clear();
  295|  15.3k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 6, False: 15.3k]
  ------------------
  296|      6|			free(this->ptr);
  297|  15.3k|	}
_ZN11spirv_cross11SmallVectorIjLm8EEC2Ev:
  209|  67.1k|	{
  210|  67.1k|		this->ptr = stack_storage.data();
  211|  67.1k|		buffer_capacity = N;
  212|  67.1k|	}
_ZN11spirv_cross10VectorViewIjEC2Ev:
  195|  67.1k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__14pairIjjEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__14pairIjjEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_11InstructionELm8EEC2Ev:
  209|  10.3k|	{
  210|  10.3k|		this->ptr = stack_storage.data();
  211|  10.3k|		buffer_capacity = N;
  212|  10.3k|	}
_ZN11spirv_cross10VectorViewINS_11InstructionEEC2Ev:
  195|  10.3k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_11InstructionELm8EED2Ev:
  293|  10.3k|	{
  294|  10.3k|		clear();
  295|  10.3k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 1.15k, False: 9.24k]
  ------------------
  296|  1.15k|			free(this->ptr);
  297|  10.3k|	}
_ZN11spirv_cross11SmallVectorINS_11InstructionELm8EE9push_backERKS1_:
  307|   621k|	{
  308|   621k|		reserve(this->buffer_size + 1);
  309|   621k|		new (&this->ptr[this->buffer_size]) T(t);
  310|   621k|		this->buffer_size++;
  311|   621k|	}
_ZN11spirv_cross10VectorViewINS_11InstructionEE5beginEv:
  130|    574|	{
  131|    574|		return ptr;
  132|    574|	}
_ZN11spirv_cross10VectorViewINS_11InstructionEE3endEv:
  135|    574|	{
  136|    574|		return ptr + buffer_size;
  137|    574|	}
_ZN11spirv_cross10VectorViewINSt3__14pairIjjEEE5beginEv:
  130|    399|	{
  131|    399|		return ptr;
  132|    399|	}
_ZN11spirv_cross10VectorViewINSt3__14pairIjjEEE3endEv:
  135|    399|	{
  136|    399|		return ptr + buffer_size;
  137|    399|	}
_ZN11spirv_cross10VectorViewINS_7VariantEEixEm:
  100|   363k|	{
  101|   363k|		return ptr[i];
  102|   363k|	}
_ZN11spirv_cross10ObjectPoolINS_10SPIRStringEE8allocateIJNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEEEEPS1_DpOT_:
  571|    886|	{
  572|    886|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 4, False: 882]
  ------------------
  573|      4|		{
  574|      4|			unsigned num_objects = start_object_count << memory.size();
  575|      4|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|      4|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 4]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|      4|			vacants.reserve(num_objects);
  580|     68|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 64, False: 4]
  ------------------
  581|     64|				vacants.push_back(&ptr[i]);
  582|       |
  583|      4|			memory.emplace_back(ptr);
  584|      4|		}
  585|       |
  586|    886|		T *ptr = vacants.back();
  587|    886|		vacants.pop_back();
  588|    886|		new (ptr) T(std::forward<P>(p)...);
  589|    886|		return ptr;
  590|    886|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRUndefEE8allocateIJRjEEEPS1_DpOT_:
  571|  1.81k|	{
  572|  1.81k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 71, False: 1.74k]
  ------------------
  573|     71|		{
  574|     71|			unsigned num_objects = start_object_count << memory.size();
  575|     71|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     71|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 71]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     71|			vacants.reserve(num_objects);
  580|  1.20k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 1.13k, False: 71]
  ------------------
  581|  1.13k|				vacants.push_back(&ptr[i]);
  582|       |
  583|     71|			memory.emplace_back(ptr);
  584|     71|		}
  585|       |
  586|  1.81k|		T *ptr = vacants.back();
  587|  1.81k|		vacants.pop_back();
  588|  1.81k|		new (ptr) T(std::forward<P>(p)...);
  589|  1.81k|		return ptr;
  590|  1.81k|	}
_ZN11spirv_cross11SmallVectorIN3spv10CapabilityELm8EE9push_backEOS2_:
  314|  3.60k|	{
  315|  3.60k|		reserve(this->buffer_size + 1);
  316|  3.60k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  3.60k|		this->buffer_size++;
  318|  3.60k|	}
_ZN11spirv_cross11SmallVectorIN3spv10CapabilityELm8EE7reserveEm:
  337|  3.60k|	{
  338|  3.60k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 3.60k]
  ------------------
  339|  3.60k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 3.60k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  3.60k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 57, False: 3.55k]
  ------------------
  346|     57|		{
  347|     57|			size_t target_capacity = buffer_capacity;
  348|     57|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 57]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|     57|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    114|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 57, False: 57]
  ------------------
  357|     57|				target_capacity <<= 1u;
  358|       |
  359|     57|			T *new_buffer =
  360|     57|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 57, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|     57|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 57]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|     57|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 57, False: 0]
  ------------------
  368|     57|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  4.92k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 4.86k, False: 57]
  ------------------
  371|  4.86k|				{
  372|  4.86k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  4.86k|					this->ptr[i].~T();
  374|  4.86k|				}
  375|     57|			}
  376|       |
  377|     57|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 45, False: 12]
  ------------------
  378|     45|				free(this->ptr);
  379|     57|			this->ptr = new_buffer;
  380|     57|			buffer_capacity = target_capacity;
  381|     57|		}
  382|  3.60k|	}
_ZN11spirv_cross11SmallVectorINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEELm8EE9push_backEOS7_:
  314|   313k|	{
  315|   313k|		reserve(this->buffer_size + 1);
  316|   313k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|   313k|		this->buffer_size++;
  318|   313k|	}
_ZN11spirv_cross11SmallVectorINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEELm8EE7reserveEm:
  337|   313k|	{
  338|   313k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 313k]
  ------------------
  339|   313k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 313k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|   313k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 306, False: 313k]
  ------------------
  346|    306|		{
  347|    306|			size_t target_capacity = buffer_capacity;
  348|    306|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 306]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    306|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    612|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 306, False: 306]
  ------------------
  357|    306|				target_capacity <<= 1u;
  358|       |
  359|    306|			T *new_buffer =
  360|    306|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 306, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    306|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 306]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    306|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 306, False: 0]
  ------------------
  368|    306|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|   394k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 394k, False: 306]
  ------------------
  371|   394k|				{
  372|   394k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|   394k|					this->ptr[i].~T();
  374|   394k|				}
  375|    306|			}
  376|       |
  377|    306|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 272, False: 34]
  ------------------
  378|    272|				free(this->ptr);
  379|    306|			this->ptr = new_buffer;
  380|    306|			buffer_capacity = target_capacity;
  381|    306|		}
  382|   313k|	}
_ZN11spirv_cross10ObjectPoolINS_13SPIRExtensionEE8allocateIJRNS1_9ExtensionEEEEPS1_DpOT_:
  571|    508|	{
  572|    508|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 284, False: 224]
  ------------------
  573|    284|		{
  574|    284|			unsigned num_objects = start_object_count << memory.size();
  575|    284|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|    284|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 284]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|    284|			vacants.reserve(num_objects);
  580|  4.82k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 4.54k, False: 284]
  ------------------
  581|  4.54k|				vacants.push_back(&ptr[i]);
  582|       |
  583|    284|			memory.emplace_back(ptr);
  584|    284|		}
  585|       |
  586|    508|		T *ptr = vacants.back();
  587|    508|		vacants.pop_back();
  588|    508|		new (ptr) T(std::forward<P>(p)...);
  589|    508|		return ptr;
  590|    508|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EEC2EOS4_:
  234|  5.49k|	SmallVector(SmallVector &&other) SPIRV_CROSS_NOEXCEPT : SmallVector()
  235|  5.49k|	{
  236|  5.49k|		*this = std::move(other);
  237|  5.49k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EEaSEOS4_:
  240|  5.49k|	{
  241|  5.49k|		clear();
  242|  5.49k|		if (other.ptr != other.stack_storage.data())
  ------------------
  |  Branch (242:7): [True: 0, False: 5.49k]
  ------------------
  243|      0|		{
  244|       |			// Pilfer allocated pointer.
  245|      0|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (245:8): [True: 0, False: 0]
  ------------------
  246|      0|				free(this->ptr);
  247|      0|			this->ptr = other.ptr;
  248|      0|			this->buffer_size = other.buffer_size;
  249|      0|			buffer_capacity = other.buffer_capacity;
  250|      0|			other.ptr = nullptr;
  251|      0|			other.buffer_size = 0;
  252|      0|			other.buffer_capacity = 0;
  253|      0|		}
  254|  5.49k|		else
  255|  5.49k|		{
  256|       |			// Need to move the stack contents individually.
  257|  5.49k|			reserve(other.buffer_size);
  258|  5.49k|			for (size_t i = 0; i < other.buffer_size; i++)
  ------------------
  |  Branch (258:23): [True: 0, False: 5.49k]
  ------------------
  259|      0|			{
  260|      0|				new (&this->ptr[i]) T(std::move(other.ptr[i]));
  261|      0|				other.ptr[i].~T();
  262|      0|			}
  263|  5.49k|			this->buffer_size = other.buffer_size;
  264|  5.49k|			other.buffer_size = 0;
  265|  5.49k|		}
  266|  5.49k|		return *this;
  267|  5.49k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE2EEELm8EE9push_backEOS3_:
  314|  9.92k|	{
  315|  9.92k|		reserve(this->buffer_size + 1);
  316|  9.92k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  9.92k|		this->buffer_size++;
  318|  9.92k|	}
_ZN11spirv_cross11SmallVectorINS_4Meta10DecorationELm0EEC2Ev:
  209|  8.15k|	{
  210|  8.15k|		this->ptr = stack_storage.data();
  211|  8.15k|		buffer_capacity = N;
  212|  8.15k|	}
_ZN11spirv_cross10VectorViewINS_4Meta10DecorationEEC2Ev:
  195|  8.15k|	VectorView() = default;
_ZN11spirv_cross10ObjectPoolINS_8SPIRTypeEE8allocateIJRN3spv2OpEEEEPS1_DpOT_:
  571|  18.7k|	{
  572|  18.7k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 410, False: 18.3k]
  ------------------
  573|    410|		{
  574|    410|			unsigned num_objects = start_object_count << memory.size();
  575|    410|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|    410|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 410]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|    410|			vacants.reserve(num_objects);
  580|  7.86k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 7.45k, False: 410]
  ------------------
  581|  7.45k|				vacants.push_back(&ptr[i]);
  582|       |
  583|    410|			memory.emplace_back(ptr);
  584|    410|		}
  585|       |
  586|  18.7k|		T *ptr = vacants.back();
  587|  18.7k|		vacants.pop_back();
  588|  18.7k|		new (ptr) T(std::forward<P>(p)...);
  589|  18.7k|		return ptr;
  590|  18.7k|	}
_ZN11spirv_cross11SmallVectorIbLm8EEC2Ev:
  209|  22.2k|	{
  210|  22.2k|		this->ptr = stack_storage.data();
  211|  22.2k|		buffer_capacity = N;
  212|  22.2k|	}
_ZN11spirv_cross10VectorViewIbEC2Ev:
  195|  22.2k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EEC2Ev:
  209|  22.2k|	{
  210|  22.2k|		this->ptr = stack_storage.data();
  211|  22.2k|		buffer_capacity = N;
  212|  22.2k|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE1EEEEC2Ev:
  195|  22.2k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EED2Ev:
  293|  22.2k|	{
  294|  22.2k|		clear();
  295|  22.2k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 48, False: 22.2k]
  ------------------
  296|     48|			free(this->ptr);
  297|  22.2k|	}
_ZN11spirv_cross11SmallVectorIbLm8EED2Ev:
  293|  22.2k|	{
  294|  22.2k|		clear();
  295|  22.2k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 528, False: 21.7k]
  ------------------
  296|    528|			free(this->ptr);
  297|  22.2k|	}
_ZN11spirv_cross11SmallVectorIjLm8EEC2ERKS1_:
  269|  6.90k|	SmallVector(const SmallVector &other) SPIRV_CROSS_NOEXCEPT : SmallVector()
  270|  6.90k|	{
  271|  6.90k|		*this = other;
  272|  6.90k|	}
_ZN11spirv_cross11SmallVectorIbLm8EEC2ERKS1_:
  269|  3.45k|	SmallVector(const SmallVector &other) SPIRV_CROSS_NOEXCEPT : SmallVector()
  270|  3.45k|	{
  271|  3.45k|		*this = other;
  272|  3.45k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EEC2ERKS4_:
  269|  3.45k|	SmallVector(const SmallVector &other) SPIRV_CROSS_NOEXCEPT : SmallVector()
  270|  3.45k|	{
  271|  3.45k|		*this = other;
  272|  3.45k|	}
_ZN11spirv_cross11SmallVectorINSt3__14pairIjjEELm8EE9push_backEOS3_:
  314|  2.82k|	{
  315|  2.82k|		reserve(this->buffer_size + 1);
  316|  2.82k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  2.82k|		this->buffer_size++;
  318|  2.82k|	}
_ZN11spirv_cross11SmallVectorINSt3__14pairIjjEELm8EE7reserveEm:
  337|  2.82k|	{
  338|  2.82k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 2.82k]
  ------------------
  339|  2.82k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 2.82k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  2.82k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 60, False: 2.76k]
  ------------------
  346|     60|		{
  347|     60|			size_t target_capacity = buffer_capacity;
  348|     60|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 60]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|     60|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|    120|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 60, False: 60]
  ------------------
  357|     60|				target_capacity <<= 1u;
  358|       |
  359|     60|			T *new_buffer =
  360|     60|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 60, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|     60|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 60]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|     60|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 60, False: 0]
  ------------------
  368|     60|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|  3.74k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 3.68k, False: 60]
  ------------------
  371|  3.68k|				{
  372|  3.68k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|  3.68k|					this->ptr[i].~T();
  374|  3.68k|				}
  375|     60|			}
  376|       |
  377|     60|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 44, False: 16]
  ------------------
  378|     44|				free(this->ptr);
  379|     60|			this->ptr = new_buffer;
  380|     60|			buffer_capacity = target_capacity;
  381|     60|		}
  382|  2.82k|	}
_ZN11spirv_cross11SmallVectorIbLm8EE9push_backERKb:
  307|    383|	{
  308|    383|		reserve(this->buffer_size + 1);
  309|    383|		new (&this->ptr[this->buffer_size]) T(t);
  310|    383|		this->buffer_size++;
  311|    383|	}
_ZN11spirv_cross11SmallVectorIjLm8EE9push_backEOj:
  314|  1.18k|	{
  315|  1.18k|		reserve(this->buffer_size + 1);
  316|  1.18k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  1.18k|		this->buffer_size++;
  318|  1.18k|	}
_ZN11spirv_cross11SmallVectorIbLm8EE9push_backEOb:
  314|    801|	{
  315|    801|		reserve(this->buffer_size + 1);
  316|    801|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|    801|		this->buffer_size++;
  318|    801|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE1EEELm8EE9push_backEOS3_:
  314|  4.39k|	{
  315|  4.39k|		reserve(this->buffer_size + 1);
  316|  4.39k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  4.39k|		this->buffer_size++;
  318|  4.39k|	}
_ZN11spirv_cross10ObjectPoolINS_21SPIRFunctionPrototypeEE8allocateIJRjEEEPS1_DpOT_:
  571|  5.83k|	{
  572|  5.83k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 268, False: 5.56k]
  ------------------
  573|    268|		{
  574|    268|			unsigned num_objects = start_object_count << memory.size();
  575|    268|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|    268|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 268]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|    268|			vacants.reserve(num_objects);
  580|  4.55k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 4.28k, False: 268]
  ------------------
  581|  4.28k|				vacants.push_back(&ptr[i]);
  582|       |
  583|    268|			memory.emplace_back(ptr);
  584|    268|		}
  585|       |
  586|  5.83k|		T *ptr = vacants.back();
  587|  5.83k|		vacants.pop_back();
  588|  5.83k|		new (ptr) T(std::forward<P>(p)...);
  589|  5.83k|		return ptr;
  590|  5.83k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRVariableEE8allocateIJRjRN3spv12StorageClassES4_EEEPS1_DpOT_:
  571|  6.43k|	{
  572|  6.43k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 276, False: 6.15k]
  ------------------
  573|    276|		{
  574|    276|			unsigned num_objects = start_object_count << memory.size();
  575|    276|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|    276|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 276]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|    276|			vacants.reserve(num_objects);
  580|  5.42k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 5.15k, False: 276]
  ------------------
  581|  5.15k|				vacants.push_back(&ptr[i]);
  582|       |
  583|    276|			memory.emplace_back(ptr);
  584|    276|		}
  585|       |
  586|  6.43k|		T *ptr = vacants.back();
  587|  6.43k|		vacants.pop_back();
  588|  6.43k|		new (ptr) T(std::forward<P>(p)...);
  589|  6.43k|		return ptr;
  590|  6.43k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EEC2Ev:
  209|  29.3k|	{
  210|  29.3k|		this->ptr = stack_storage.data();
  211|  29.3k|		buffer_capacity = N;
  212|  29.3k|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE0EEEEC2Ev:
  195|  29.3k|	VectorView() = default;
_ZN11spirv_cross10ObjectPoolINS_12SPIRVariableEE8allocateIJRjN3spv12StorageClassEEEEPS1_DpOT_:
  571|  3.07k|	{
  572|  3.07k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 57, False: 3.01k]
  ------------------
  573|     57|		{
  574|     57|			unsigned num_objects = start_object_count << memory.size();
  575|     57|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     57|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 57]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     57|			vacants.reserve(num_objects);
  580|  1.88k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 1.82k, False: 57]
  ------------------
  581|  1.82k|				vacants.push_back(&ptr[i]);
  582|       |
  583|     57|			memory.emplace_back(ptr);
  584|     57|		}
  585|       |
  586|  3.07k|		T *ptr = vacants.back();
  587|  3.07k|		vacants.pop_back();
  588|  3.07k|		new (ptr) T(std::forward<P>(p)...);
  589|  3.07k|		return ptr;
  590|  3.07k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock3PhiELm8EE9push_backEOS2_:
  314|  6.29k|	{
  315|  6.29k|		reserve(this->buffer_size + 1);
  316|  6.29k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  6.29k|		this->buffer_size++;
  318|  6.29k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE8allocateIJRKjmbEEEPS1_DpOT_:
  571|     18|	{
  572|     18|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 5, False: 13]
  ------------------
  573|      5|		{
  574|      5|			unsigned num_objects = start_object_count << memory.size();
  575|      5|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|      5|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 5]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|      5|			vacants.reserve(num_objects);
  580|    101|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 96, False: 5]
  ------------------
  581|     96|				vacants.push_back(&ptr[i]);
  582|       |
  583|      5|			memory.emplace_back(ptr);
  584|      5|		}
  585|       |
  586|     18|		T *ptr = vacants.back();
  587|     18|		vacants.pop_back();
  588|     18|		new (ptr) T(std::forward<P>(p)...);
  589|     18|		return ptr;
  590|     18|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE8allocateIJRKjS5_bEEEPS1_DpOT_:
  571|  3.90k|	{
  572|  3.90k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 306, False: 3.59k]
  ------------------
  573|    306|		{
  574|    306|			unsigned num_objects = start_object_count << memory.size();
  575|    306|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|    306|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 306]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|    306|			vacants.reserve(num_objects);
  580|  6.54k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 6.24k, False: 306]
  ------------------
  581|  6.24k|				vacants.push_back(&ptr[i]);
  582|       |
  583|    306|			memory.emplace_back(ptr);
  584|    306|		}
  585|       |
  586|  3.90k|		T *ptr = vacants.back();
  587|  3.90k|		vacants.pop_back();
  588|  3.90k|		new (ptr) T(std::forward<P>(p)...);
  589|  3.90k|		return ptr;
  590|  3.90k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE8allocateIJRKjjbEEEPS1_DpOT_:
  571|    613|	{
  572|    613|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 17, False: 596]
  ------------------
  573|     17|		{
  574|     17|			unsigned num_objects = start_object_count << memory.size();
  575|     17|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     17|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 17]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     17|			vacants.reserve(num_objects);
  580|    321|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 304, False: 17]
  ------------------
  581|    304|				vacants.push_back(&ptr[i]);
  582|       |
  583|     17|			memory.emplace_back(ptr);
  584|     17|		}
  585|       |
  586|    613|		T *ptr = vacants.back();
  587|    613|		vacants.pop_back();
  588|    613|		new (ptr) T(std::forward<P>(p)...);
  589|    613|		return ptr;
  590|    613|	}
_ZNK11spirv_cross10VectorViewIjE5emptyEv:
  110|  7.55k|	{
  111|  7.55k|		return buffer_size == 0;
  112|  7.55k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE8allocateIJRjPKjjbEEEPS1_DpOT_:
  571|    409|	{
  572|    409|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 0, False: 409]
  ------------------
  573|      0|		{
  574|      0|			unsigned num_objects = start_object_count << memory.size();
  575|      0|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|      0|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 0]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|      0|			vacants.reserve(num_objects);
  580|      0|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 0, False: 0]
  ------------------
  581|      0|				vacants.push_back(&ptr[i]);
  582|       |
  583|      0|			memory.emplace_back(ptr);
  584|      0|		}
  585|       |
  586|    409|		T *ptr = vacants.back();
  587|    409|		vacants.pop_back();
  588|    409|		new (ptr) T(std::forward<P>(p)...);
  589|    409|		return ptr;
  590|    409|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE8allocateIJRjRA4_PKS1_S4_bEEEPS1_DpOT_:
  571|    669|	{
  572|    669|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 12, False: 657]
  ------------------
  573|     12|		{
  574|     12|			unsigned num_objects = start_object_count << memory.size();
  575|     12|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     12|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 12]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     12|			vacants.reserve(num_objects);
  580|    396|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 384, False: 12]
  ------------------
  581|    384|				vacants.push_back(&ptr[i]);
  582|       |
  583|     12|			memory.emplace_back(ptr);
  584|     12|		}
  585|       |
  586|    669|		T *ptr = vacants.back();
  587|    669|		vacants.pop_back();
  588|    669|		new (ptr) T(std::forward<P>(p)...);
  589|    669|		return ptr;
  590|    669|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRFunctionEE8allocateIJRjS4_EEEPS1_DpOT_:
  571|    450|	{
  572|    450|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 227, False: 223]
  ------------------
  573|    227|		{
  574|    227|			unsigned num_objects = start_object_count << memory.size();
  575|    227|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|    227|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 227]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|    227|			vacants.reserve(num_objects);
  580|  3.85k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 3.63k, False: 227]
  ------------------
  581|  3.63k|				vacants.push_back(&ptr[i]);
  582|       |
  583|    227|			memory.emplace_back(ptr);
  584|    227|		}
  585|       |
  586|    450|		T *ptr = vacants.back();
  587|    450|		vacants.pop_back();
  588|    450|		new (ptr) T(std::forward<P>(p)...);
  589|    450|		return ptr;
  590|    450|	}
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction9ParameterELm8EEC2Ev:
  209|    900|	{
  210|    900|		this->ptr = stack_storage.data();
  211|    900|		buffer_capacity = N;
  212|    900|	}
_ZN11spirv_cross10VectorViewINS_12SPIRFunction9ParameterEEC2Ev:
  195|    900|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE6EEELm8EEC2Ev:
  209|    450|	{
  210|    450|		this->ptr = stack_storage.data();
  211|    450|		buffer_capacity = N;
  212|    450|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE6EEEEC2Ev:
  195|    450|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction29CombinedImageSamplerParameterELm8EEC2Ev:
  209|    450|	{
  210|    450|		this->ptr = stack_storage.data();
  211|    450|		buffer_capacity = N;
  212|    450|	}
_ZN11spirv_cross10VectorViewINS_12SPIRFunction29CombinedImageSamplerParameterEEC2Ev:
  195|    450|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__18functionIFvvEEELm0EEC2Ev:
  209|    900|	{
  210|    900|		this->ptr = stack_storage.data();
  211|    900|		buffer_capacity = N;
  212|    900|	}
_ZN11spirv_cross10VectorViewINSt3__18functionIFvvEEEEC2Ev:
  195|    900|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction9ParameterELm8EED2Ev:
  293|    900|	{
  294|    900|		clear();
  295|    900|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 900]
  ------------------
  296|      0|			free(this->ptr);
  297|    900|	}
_ZN11spirv_cross11SmallVectorINSt3__18functionIFvvEEELm0EED2Ev:
  293|    900|	{
  294|    900|		clear();
  295|    900|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 900]
  ------------------
  296|      0|			free(this->ptr);
  297|    900|	}
_ZN11spirv_cross11SmallVectorINS_12SPIRFunction29CombinedImageSamplerParameterELm8EED2Ev:
  293|    450|	{
  294|    450|		clear();
  295|    450|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 450]
  ------------------
  296|      0|			free(this->ptr);
  297|    450|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE6EEELm8EED2Ev:
  293|    450|	{
  294|    450|		clear();
  295|    450|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 149, False: 301]
  ------------------
  296|    149|			free(this->ptr);
  297|    450|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE6EEELm8EE9push_backEOS3_:
  314|  9.81k|	{
  315|  9.81k|		reserve(this->buffer_size + 1);
  316|  9.81k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  9.81k|		this->buffer_size++;
  318|  9.81k|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRBlockEE8allocateIJEEEPS1_DpOT_:
  571|  9.80k|	{
  572|  9.80k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 350, False: 9.45k]
  ------------------
  573|    350|		{
  574|    350|			unsigned num_objects = start_object_count << memory.size();
  575|    350|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|    350|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 350]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|    350|			vacants.reserve(num_objects);
  580|  10.9k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 10.5k, False: 350]
  ------------------
  581|  10.5k|				vacants.push_back(&ptr[i]);
  582|       |
  583|    350|			memory.emplace_back(ptr);
  584|    350|		}
  585|       |
  586|  9.80k|		T *ptr = vacants.back();
  587|  9.80k|		vacants.pop_back();
  588|  9.80k|		new (ptr) T(std::forward<P>(p)...);
  589|  9.80k|		return ptr;
  590|  9.80k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock3PhiELm8EEC2Ev:
  209|  9.80k|	{
  210|  9.80k|		this->ptr = stack_storage.data();
  211|  9.80k|		buffer_capacity = N;
  212|  9.80k|	}
_ZN11spirv_cross10VectorViewINS_9SPIRBlock3PhiEEC2Ev:
  195|  9.80k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__14pairINS_7TypedIDILNS_5TypesE1EEENS3_ILS4_0EEEEELm8EEC2Ev:
  209|  19.6k|	{
  210|  19.6k|		this->ptr = stack_storage.data();
  211|  19.6k|		buffer_capacity = N;
  212|  19.6k|	}
_ZN11spirv_cross10VectorViewINSt3__14pairINS_7TypedIDILNS_5TypesE1EEENS3_ILS4_0EEEEEEC2Ev:
  195|  19.6k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock4CaseELm8EEC2Ev:
  209|  19.6k|	{
  210|  19.6k|		this->ptr = stack_storage.data();
  211|  19.6k|		buffer_capacity = N;
  212|  19.6k|	}
_ZN11spirv_cross10VectorViewINS_9SPIRBlock4CaseEEC2Ev:
  195|  19.6k|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock4CaseELm8EED2Ev:
  293|  19.6k|	{
  294|  19.6k|		clear();
  295|  19.6k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 84, False: 19.5k]
  ------------------
  296|     84|			free(this->ptr);
  297|  19.6k|	}
_ZN11spirv_cross11SmallVectorINSt3__14pairINS_7TypedIDILNS_5TypesE1EEENS3_ILS4_0EEEEELm8EED2Ev:
  293|  19.6k|	{
  294|  19.6k|		clear();
  295|  19.6k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 19.6k]
  ------------------
  296|      0|			free(this->ptr);
  297|  19.6k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock3PhiELm8EED2Ev:
  293|  9.80k|	{
  294|  9.80k|		clear();
  295|  9.80k|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 55, False: 9.74k]
  ------------------
  296|     55|			free(this->ptr);
  297|  9.80k|	}
_ZN11spirv_cross10ObjectPoolINS_8SPIRTypeEE8allocateIJN3spv2OpEEEEPS1_DpOT_:
  571|     28|	{
  572|     28|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 2, False: 26]
  ------------------
  573|      2|		{
  574|      2|			unsigned num_objects = start_object_count << memory.size();
  575|      2|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|      2|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 2]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|      2|			vacants.reserve(num_objects);
  580|     66|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 64, False: 2]
  ------------------
  581|     64|				vacants.push_back(&ptr[i]);
  582|       |
  583|      2|			memory.emplace_back(ptr);
  584|      2|		}
  585|       |
  586|     28|		T *ptr = vacants.back();
  587|     28|		vacants.pop_back();
  588|     28|		new (ptr) T(std::forward<P>(p)...);
  589|     28|		return ptr;
  590|     28|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE8allocateIJRjEEEPS1_DpOT_:
  571|  5.19k|	{
  572|  5.19k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 85, False: 5.10k]
  ------------------
  573|     85|		{
  574|     85|			unsigned num_objects = start_object_count << memory.size();
  575|     85|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     85|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 85]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     85|			vacants.reserve(num_objects);
  580|  6.32k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 6.24k, False: 85]
  ------------------
  581|  6.24k|				vacants.push_back(&ptr[i]);
  582|       |
  583|     85|			memory.emplace_back(ptr);
  584|     85|		}
  585|       |
  586|  5.19k|		T *ptr = vacants.back();
  587|  5.19k|		vacants.pop_back();
  588|  5.19k|		new (ptr) T(std::forward<P>(p)...);
  589|  5.19k|		return ptr;
  590|  5.19k|	}
_ZN11spirv_cross10VectorViewIhEixEm:
  100|  14.4k|	{
  101|  14.4k|		return ptr[i];
  102|  14.4k|	}
_ZN11spirv_cross11SmallVectorINS_9SPIRBlock4CaseELm8EE9push_backEOS2_:
  314|  1.20k|	{
  315|  1.20k|		reserve(this->buffer_size + 1);
  316|  1.20k|		new (&this->ptr[this->buffer_size]) T(std::move(t));
  317|  1.20k|		this->buffer_size++;
  318|  1.20k|	}
_ZN11spirv_cross10ObjectPoolINS_14SPIRConstantOpEE8allocateIJRjRN3spv2OpEPKjjEEEPS1_DpOT_:
  571|    791|	{
  572|    791|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 13, False: 778]
  ------------------
  573|     13|		{
  574|     13|			unsigned num_objects = start_object_count << memory.size();
  575|     13|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     13|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 13]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     13|			vacants.reserve(num_objects);
  580|    221|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 208, False: 13]
  ------------------
  581|    208|				vacants.push_back(&ptr[i]);
  582|       |
  583|     13|			memory.emplace_back(ptr);
  584|     13|		}
  585|       |
  586|    791|		T *ptr = vacants.back();
  587|    791|		vacants.pop_back();
  588|    791|		new (ptr) T(std::forward<P>(p)...);
  589|    791|		return ptr;
  590|    791|	}
_ZNK11spirv_cross10VectorViewIjE4sizeEv:
  115|  11.1k|	{
  116|  11.1k|		return buffer_size;
  117|  11.1k|	}
_ZNK11spirv_cross10VectorViewIjE4dataEv:
  125|    448|	{
  126|    448|		return ptr;
  127|    448|	}
_ZNK11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE1EEEE4sizeEv:
  115|  18.3k|	{
  116|  18.3k|		return buffer_size;
  117|  18.3k|	}
_ZNK11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE1EEEEixEm:
  105|  3.51k|	{
  106|  3.51k|		return ptr[i];
  107|  3.51k|	}
_ZNK11spirv_cross10VectorViewINS_7VariantEEixEm:
  105|  3.51k|	{
  106|  3.51k|		return ptr[i];
  107|  3.51k|	}
_ZN11spirv_cross11SmallVectorINS_7VariantELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINS_7VariantEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorIN3spv10CapabilityELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIN3spv10CapabilityEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorIhLm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIhEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross10ObjectPoolINS_8SPIRTypeEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross14ObjectPoolBaseD2Ev:
  556|  7.80k|	virtual ~ObjectPoolBase() = default;
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_8SPIRTypeEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_8SPIRTypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|  1.04k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 442, False: 600]
  ------------------
  302|    442|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 354, False: 246]
  ------------------
  296|    354|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EE5clearEv:
  300|    600|	{
  301|  9.08k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 8.48k, False: 600]
  ------------------
  302|  8.48k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_8SPIRTypeEE17deallocate_opaqueEPv:
  599|  22.2k|	{
  600|  22.2k|		deallocate(static_cast<T *>(ptr));
  601|  22.2k|	}
_ZN11spirv_cross10ObjectPoolINS_8SPIRTypeEE10deallocateEPS1_:
  593|  22.2k|	{
  594|  22.2k|		ptr->~T();
  595|  22.2k|		vacants.push_back(ptr);
  596|  22.2k|	}
_ZN11spirv_cross11SmallVectorIPNS_8SPIRTypeELm0EE9push_backERKS2_:
  307|  22.2k|	{
  308|  22.2k|		reserve(this->buffer_size + 1);
  309|  22.2k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  22.2k|		this->buffer_size++;
  311|  22.2k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRVariableEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_12SPIRVariableEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRVariableENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    933|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 333, False: 600]
  ------------------
  302|    333|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 258, False: 342]
  ------------------
  296|    258|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EE5clearEv:
  300|    600|	{
  301|  7.57k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 6.97k, False: 600]
  ------------------
  302|  6.97k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRVariableEE17deallocate_opaqueEPv:
  599|  9.50k|	{
  600|  9.50k|		deallocate(static_cast<T *>(ptr));
  601|  9.50k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRVariableEE10deallocateEPS1_:
  593|  9.50k|	{
  594|  9.50k|		ptr->~T();
  595|  9.50k|		vacants.push_back(ptr);
  596|  9.50k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRVariableELm0EE9push_backERKS2_:
  307|  9.50k|	{
  308|  9.50k|		reserve(this->buffer_size + 1);
  309|  9.50k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  9.50k|		this->buffer_size++;
  311|  9.50k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_12SPIRConstantEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRConstantENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|  1.06k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 466, False: 600]
  ------------------
  302|    466|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 277, False: 323]
  ------------------
  296|    277|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EE5clearEv:
  300|    600|	{
  301|  16.9k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 16.3k, False: 600]
  ------------------
  302|  16.3k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE17deallocate_opaqueEPv:
  599|  12.6k|	{
  600|  12.6k|		deallocate(static_cast<T *>(ptr));
  601|  12.6k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE10deallocateEPS1_:
  593|  12.6k|	{
  594|  12.6k|		ptr->~T();
  595|  12.6k|		vacants.push_back(ptr);
  596|  12.6k|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRConstantELm0EE9push_backERKS2_:
  307|  12.6k|	{
  308|  12.6k|		reserve(this->buffer_size + 1);
  309|  12.6k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  12.6k|		this->buffer_size++;
  311|  12.6k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRFunctionEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_12SPIRFunctionEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_12SPIRFunctionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    827|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 227, False: 600]
  ------------------
  302|    227|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 227, False: 373]
  ------------------
  296|    227|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EE5clearEv:
  300|    600|	{
  301|  4.23k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 3.63k, False: 600]
  ------------------
  302|  3.63k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRFunctionEE17deallocate_opaqueEPv:
  599|    450|	{
  600|    450|		deallocate(static_cast<T *>(ptr));
  601|    450|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRFunctionEE10deallocateEPS1_:
  593|    450|	{
  594|    450|		ptr->~T();
  595|    450|		vacants.push_back(ptr);
  596|    450|	}
_ZN11spirv_cross11SmallVectorIPNS_12SPIRFunctionELm0EE9push_backERKS2_:
  307|    450|	{
  308|    450|		reserve(this->buffer_size + 1);
  309|    450|		new (&this->ptr[this->buffer_size]) T(t);
  310|    450|		this->buffer_size++;
  311|    450|	}
_ZN11spirv_cross10ObjectPoolINS_21SPIRFunctionPrototypeEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_21SPIRFunctionPrototypeEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_21SPIRFunctionPrototypeENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    868|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 268, False: 600]
  ------------------
  302|    268|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 268, False: 332]
  ------------------
  296|    268|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EE5clearEv:
  300|    600|	{
  301|  4.88k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 4.28k, False: 600]
  ------------------
  302|  4.28k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_21SPIRFunctionPrototypeEE17deallocate_opaqueEPv:
  599|  5.83k|	{
  600|  5.83k|		deallocate(static_cast<T *>(ptr));
  601|  5.83k|	}
_ZN11spirv_cross10ObjectPoolINS_21SPIRFunctionPrototypeEE10deallocateEPS1_:
  593|  5.83k|	{
  594|  5.83k|		ptr->~T();
  595|  5.83k|		vacants.push_back(ptr);
  596|  5.83k|	}
_ZN11spirv_cross11SmallVectorIPNS_21SPIRFunctionPrototypeELm0EE9push_backERKS2_:
  307|  5.83k|	{
  308|  5.83k|		reserve(this->buffer_size + 1);
  309|  5.83k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  5.83k|		this->buffer_size++;
  311|  5.83k|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRBlockEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_9SPIRBlockEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRBlockENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    950|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 350, False: 600]
  ------------------
  302|    350|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 227, False: 373]
  ------------------
  296|    227|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EE5clearEv:
  300|    600|	{
  301|  11.1k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 10.5k, False: 600]
  ------------------
  302|  10.5k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRBlockEE17deallocate_opaqueEPv:
  599|  9.80k|	{
  600|  9.80k|		deallocate(static_cast<T *>(ptr));
  601|  9.80k|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRBlockEE10deallocateEPS1_:
  593|  9.80k|	{
  594|  9.80k|		ptr->~T();
  595|  9.80k|		vacants.push_back(ptr);
  596|  9.80k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRBlockELm0EE9push_backERKS2_:
  307|  9.80k|	{
  308|  9.80k|		reserve(this->buffer_size + 1);
  309|  9.80k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  9.80k|		this->buffer_size++;
  311|  9.80k|	}
_ZN11spirv_cross10ObjectPoolINS_13SPIRExtensionEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_13SPIRExtensionEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_13SPIRExtensionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    884|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 284, False: 600]
  ------------------
  302|    284|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 284, False: 316]
  ------------------
  296|    284|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EE5clearEv:
  300|    600|	{
  301|  5.14k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 4.54k, False: 600]
  ------------------
  302|  4.54k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_13SPIRExtensionEE17deallocate_opaqueEPv:
  599|    508|	{
  600|    508|		deallocate(static_cast<T *>(ptr));
  601|    508|	}
_ZN11spirv_cross10ObjectPoolINS_13SPIRExtensionEE10deallocateEPS1_:
  593|    508|	{
  594|    508|		ptr->~T();
  595|    508|		vacants.push_back(ptr);
  596|    508|	}
_ZN11spirv_cross11SmallVectorIPNS_13SPIRExtensionELm0EE9push_backERKS2_:
  307|    508|	{
  308|    508|		reserve(this->buffer_size + 1);
  309|    508|		new (&this->ptr[this->buffer_size]) T(t);
  310|    508|		this->buffer_size++;
  311|    508|	}
_ZN11spirv_cross10ObjectPoolINS_14SPIRExpressionEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRExpressionELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_14SPIRExpressionEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRExpressionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_14SPIRExpressionENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRExpressionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRExpressionENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    600|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 600]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRExpressionELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRExpressionELm0EE5clearEv:
  300|    600|	{
  301|    600|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 600]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_14SPIRConstantOpEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_14SPIRConstantOpEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_14SPIRConstantOpENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    613|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 13, False: 600]
  ------------------
  302|     13|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 13, False: 587]
  ------------------
  296|     13|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EE5clearEv:
  300|    600|	{
  301|    808|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 208, False: 600]
  ------------------
  302|    208|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_14SPIRConstantOpEE17deallocate_opaqueEPv:
  599|    791|	{
  600|    791|		deallocate(static_cast<T *>(ptr));
  601|    791|	}
_ZN11spirv_cross10ObjectPoolINS_14SPIRConstantOpEE10deallocateEPS1_:
  593|    791|	{
  594|    791|		ptr->~T();
  595|    791|		vacants.push_back(ptr);
  596|    791|	}
_ZN11spirv_cross11SmallVectorIPNS_14SPIRConstantOpELm0EE9push_backERKS2_:
  307|    791|	{
  308|    791|		reserve(this->buffer_size + 1);
  309|    791|		new (&this->ptr[this->buffer_size]) T(t);
  310|    791|		this->buffer_size++;
  311|    791|	}
_ZN11spirv_cross10ObjectPoolINS_24SPIRCombinedImageSamplerEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_24SPIRCombinedImageSamplerELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_24SPIRCombinedImageSamplerEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_24SPIRCombinedImageSamplerENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_24SPIRCombinedImageSamplerENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_24SPIRCombinedImageSamplerENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_24SPIRCombinedImageSamplerENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    600|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 600]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_24SPIRCombinedImageSamplerELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_24SPIRCombinedImageSamplerELm0EE5clearEv:
  300|    600|	{
  301|    600|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 600]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_15SPIRAccessChainEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_15SPIRAccessChainELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_15SPIRAccessChainEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_15SPIRAccessChainENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_15SPIRAccessChainENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_15SPIRAccessChainENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_15SPIRAccessChainENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    600|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 600]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_15SPIRAccessChainELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_15SPIRAccessChainELm0EE5clearEv:
  300|    600|	{
  301|    600|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 0, False: 600]
  ------------------
  302|      0|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRUndefEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_9SPIRUndefEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_9SPIRUndefENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    671|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 71, False: 600]
  ------------------
  302|     71|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 71, False: 529]
  ------------------
  296|     71|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EE5clearEv:
  300|    600|	{
  301|  1.73k|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 1.13k, False: 600]
  ------------------
  302|  1.13k|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRUndefEE17deallocate_opaqueEPv:
  599|  1.81k|	{
  600|  1.81k|		deallocate(static_cast<T *>(ptr));
  601|  1.81k|	}
_ZN11spirv_cross10ObjectPoolINS_9SPIRUndefEE10deallocateEPS1_:
  593|  1.81k|	{
  594|  1.81k|		ptr->~T();
  595|  1.81k|		vacants.push_back(ptr);
  596|  1.81k|	}
_ZN11spirv_cross11SmallVectorIPNS_9SPIRUndefELm0EE9push_backERKS2_:
  307|  1.81k|	{
  308|  1.81k|		reserve(this->buffer_size + 1);
  309|  1.81k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  1.81k|		this->buffer_size++;
  311|  1.81k|	}
_ZN11spirv_cross10ObjectPoolINS_10SPIRStringEEC2Ej:
  565|    600|	    : start_object_count(start_object_count_)
  566|    600|	{
  567|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewIPNS_10SPIRStringEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EEC2Ev:
  209|    600|	{
  210|    600|		this->ptr = stack_storage.data();
  211|    600|		buffer_capacity = N;
  212|    600|	}
_ZN11spirv_cross10VectorViewINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEEEC2Ev:
  195|    600|	VectorView() = default;
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 0, False: 600]
  ------------------
  296|      0|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorINSt3__110unique_ptrINS_10SPIRStringENS_10ObjectPoolIS3_E13MallocDeleterEEELm8EE5clearEv:
  300|    600|	{
  301|    604|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 4, False: 600]
  ------------------
  302|      4|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EED2Ev:
  293|    600|	{
  294|    600|		clear();
  295|    600|		if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (295:7): [True: 4, False: 596]
  ------------------
  296|      4|			free(this->ptr);
  297|    600|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EE5clearEv:
  300|    600|	{
  301|    664|		for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (301:22): [True: 64, False: 600]
  ------------------
  302|     64|			this->ptr[i].~T();
  303|    600|		this->buffer_size = 0;
  304|    600|	}
_ZN11spirv_cross10ObjectPoolINS_10SPIRStringEE17deallocate_opaqueEPv:
  599|    886|	{
  600|    886|		deallocate(static_cast<T *>(ptr));
  601|    886|	}
_ZN11spirv_cross10ObjectPoolINS_10SPIRStringEE10deallocateEPS1_:
  593|    886|	{
  594|    886|		ptr->~T();
  595|    886|		vacants.push_back(ptr);
  596|    886|	}
_ZN11spirv_cross11SmallVectorIPNS_10SPIRStringELm0EE9push_backERKS2_:
  307|    886|	{
  308|    886|		reserve(this->buffer_size + 1);
  309|    886|		new (&this->ptr[this->buffer_size]) T(t);
  310|    886|		this->buffer_size++;
  311|    886|	}
_ZN11spirv_cross11SmallVectorIhLm8EE7reserveEm:
  337|  2.48k|	{
  338|  2.48k|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 2.48k]
  ------------------
  339|  2.48k|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 2.48k]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  2.48k|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 559, False: 1.92k]
  ------------------
  346|    559|		{
  347|    559|			size_t target_capacity = buffer_capacity;
  348|    559|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 559]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    559|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  4.69k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 4.13k, False: 559]
  ------------------
  357|  4.13k|				target_capacity <<= 1u;
  358|       |
  359|    559|			T *new_buffer =
  360|    559|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 559, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    559|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 559]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    559|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 559, False: 0]
  ------------------
  368|    559|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|    686|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 127, False: 559]
  ------------------
  371|    127|				{
  372|    127|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|    127|					this->ptr[i].~T();
  374|    127|				}
  375|    559|			}
  376|       |
  377|    559|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 1, False: 558]
  ------------------
  378|      1|				free(this->ptr);
  379|    559|			this->ptr = new_buffer;
  380|    559|			buffer_capacity = target_capacity;
  381|    559|		}
  382|  2.48k|	}
_ZN11spirv_cross11SmallVectorINS_4Meta10DecorationELm0EE7reserveEm:
  337|    464|	{
  338|    464|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 464]
  ------------------
  339|    464|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 464]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|    464|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 459, False: 5]
  ------------------
  346|    459|		{
  347|    459|			size_t target_capacity = buffer_capacity;
  348|    459|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 381, False: 78]
  ------------------
  349|    381|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    459|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  1.20k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 745, False: 459]
  ------------------
  357|    745|				target_capacity <<= 1u;
  358|       |
  359|    459|			T *new_buffer =
  360|    459|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 459, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    459|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 459]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    459|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 459, False: 0]
  ------------------
  368|    459|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|   269k|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 268k, False: 459]
  ------------------
  371|   268k|				{
  372|   268k|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|   268k|					this->ptr[i].~T();
  374|   268k|				}
  375|    459|			}
  376|       |
  377|    459|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 78, False: 381]
  ------------------
  378|     78|				free(this->ptr);
  379|    459|			this->ptr = new_buffer;
  380|    459|			buffer_capacity = target_capacity;
  381|    459|		}
  382|    464|	}
_ZN11spirv_cross11SmallVectorINS_7VariantELm8EE7reserveEm:
  337|  37.8M|	{
  338|  37.8M|		if ((count > (std::numeric_limits<size_t>::max)() / sizeof(T)) ||
  ------------------
  |  Branch (338:7): [True: 0, False: 37.8M]
  ------------------
  339|  37.8M|		    (count > (std::numeric_limits<size_t>::max)() / 2))
  ------------------
  |  Branch (339:7): [True: 0, False: 37.8M]
  ------------------
  340|      0|		{
  341|       |			// Only way this should ever happen is with garbage input, terminate.
  342|      0|			std::terminate();
  343|      0|		}
  344|       |
  345|  37.8M|		if (count > buffer_capacity)
  ------------------
  |  Branch (345:7): [True: 559, False: 37.8M]
  ------------------
  346|    559|		{
  347|    559|			size_t target_capacity = buffer_capacity;
  348|    559|			if (target_capacity == 0)
  ------------------
  |  Branch (348:8): [True: 0, False: 559]
  ------------------
  349|      0|				target_capacity = 1;
  350|       |
  351|       |			// Weird parens works around macro issues on Windows if NOMINMAX is not used.
  352|    559|			target_capacity = (std::max)(target_capacity, N);
  353|       |
  354|       |			// Need to ensure there is a POT value of target capacity which is larger than count,
  355|       |			// otherwise this will overflow.
  356|  4.69k|			while (target_capacity < count)
  ------------------
  |  Branch (356:11): [True: 4.13k, False: 559]
  ------------------
  357|  4.13k|				target_capacity <<= 1u;
  358|       |
  359|    559|			T *new_buffer =
  360|    559|			    target_capacity > N ? static_cast<T *>(malloc(target_capacity * sizeof(T))) : stack_storage.data();
  ------------------
  |  Branch (360:8): [True: 559, False: 0]
  ------------------
  361|       |
  362|       |			// If we actually fail this malloc, we are hosed anyways, there is no reason to attempt recovery.
  363|    559|			if (!new_buffer)
  ------------------
  |  Branch (363:8): [True: 0, False: 559]
  ------------------
  364|      0|				std::terminate();
  365|       |
  366|       |			// In case for some reason two allocations both come from same stack.
  367|    559|			if (new_buffer != this->ptr)
  ------------------
  |  Branch (367:8): [True: 559, False: 0]
  ------------------
  368|    559|			{
  369|       |				// We don't deal with types which can throw in move constructor.
  370|    686|				for (size_t i = 0; i < this->buffer_size; i++)
  ------------------
  |  Branch (370:24): [True: 127, False: 559]
  ------------------
  371|    127|				{
  372|    127|					new (&new_buffer[i]) T(std::move(this->ptr[i]));
  373|    127|					this->ptr[i].~T();
  374|    127|				}
  375|    559|			}
  376|       |
  377|    559|			if (this->ptr != stack_storage.data())
  ------------------
  |  Branch (377:8): [True: 1, False: 558]
  ------------------
  378|      1|				free(this->ptr);
  379|    559|			this->ptr = new_buffer;
  380|    559|			buffer_capacity = target_capacity;
  381|    559|		}
  382|  37.8M|	}
_ZNK11spirv_cross10VectorViewINS_7VariantEE4sizeEv:
  115|  37.9M|	{
  116|  37.9M|		return buffer_size;
  117|  37.9M|	}
_ZN11spirv_cross11SmallVectorINS_7VariantELm8EE12emplace_backIJPNS_15ObjectPoolGroupEEEEvDpOT_:
  330|  37.8M|	{
  331|  37.8M|		reserve(this->buffer_size + 1);
  332|  37.8M|		new (&this->ptr[this->buffer_size]) T(std::forward<Ts>(ts)...);
  333|  37.8M|		this->buffer_size++;
  334|  37.8M|	}
_ZN11spirv_cross11SmallVectorIhLm8EE6resizeEm:
  512|  2.49k|	{
  513|  2.49k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 0, False: 2.49k]
  ------------------
  514|      0|		{
  515|      0|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 0, False: 0]
  ------------------
  516|      0|				this->ptr[i].~T();
  517|      0|		}
  518|  2.49k|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 2.48k, False: 14]
  ------------------
  519|  2.48k|		{
  520|  2.48k|			reserve(new_size);
  521|  37.8M|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 37.8M, False: 2.48k]
  ------------------
  522|  37.8M|				new (&this->ptr[i]) T();
  523|  2.48k|		}
  524|       |
  525|  2.49k|		this->buffer_size = new_size;
  526|  2.49k|	}
_ZNK11spirv_cross10VectorViewINS_4Meta10DecorationEE4sizeEv:
  115|  10.9k|	{
  116|  10.9k|		return buffer_size;
  117|  10.9k|	}
_ZN11spirv_cross11SmallVectorINS_4Meta10DecorationELm0EE6resizeEm:
  512|  10.9k|	{
  513|  10.9k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 0, False: 10.9k]
  ------------------
  514|      0|		{
  515|      0|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 0, False: 0]
  ------------------
  516|      0|				this->ptr[i].~T();
  517|      0|		}
  518|  10.9k|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 464, False: 10.4k]
  ------------------
  519|    464|		{
  520|    464|			reserve(new_size);
  521|  5.93M|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 5.93M, False: 464]
  ------------------
  522|  5.93M|				new (&this->ptr[i]) T();
  523|    464|		}
  524|       |
  525|  10.9k|		this->buffer_size = new_size;
  526|  10.9k|	}
_ZN11spirv_cross10VectorViewINS_4Meta10DecorationEEixEm:
  100|  10.9k|	{
  101|  10.9k|		return ptr[i];
  102|  10.9k|	}
_ZN11spirv_cross10VectorViewIjEixEm:
  100|  4.51k|	{
  101|  4.51k|		return ptr[i];
  102|  4.51k|	}
_ZNK11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE1EEEE5emptyEv:
  110|  6.38k|	{
  111|  6.38k|		return buffer_size == 0;
  112|  6.38k|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EE5eraseEPS3_S5_:
  498|     18|	{
  499|     18|		if (end_erase == this->end())
  ------------------
  |  Branch (499:7): [True: 18, False: 0]
  ------------------
  500|     18|		{
  501|     18|			resize(size_t(start_erase - this->begin()));
  502|     18|		}
  503|      0|		else
  504|      0|		{
  505|      0|			auto new_size = this->buffer_size - (end_erase - start_erase);
  506|      0|			std::move(end_erase, this->end(), start_erase);
  507|      0|			resize(new_size);
  508|      0|		}
  509|     18|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EE6resizeEm:
  512|     18|	{
  513|     18|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 18, False: 0]
  ------------------
  514|     18|		{
  515|     36|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 18, False: 18]
  ------------------
  516|     18|				this->ptr[i].~T();
  517|     18|		}
  518|      0|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 0, False: 0]
  ------------------
  519|      0|		{
  520|      0|			reserve(new_size);
  521|      0|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 0, False: 0]
  ------------------
  522|      0|				new (&this->ptr[i]) T();
  523|      0|		}
  524|       |
  525|     18|		this->buffer_size = new_size;
  526|     18|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE0EEEE5beginEv:
  130|     36|	{
  131|     36|		return ptr;
  132|     36|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE0EEEE3endEv:
  135|     54|	{
  136|     54|		return ptr + buffer_size;
  137|     54|	}
_ZN11spirv_cross11SmallVectorINS_7TypedIDILNS_5TypesE0EEELm8EE9push_backERKS3_:
  307|  46.9k|	{
  308|  46.9k|		reserve(this->buffer_size + 1);
  309|  46.9k|		new (&this->ptr[this->buffer_size]) T(t);
  310|  46.9k|		this->buffer_size++;
  311|  46.9k|	}
_ZN11spirv_cross10VectorViewIbE4backEv:
  160|    368|	{
  161|    368|		return ptr[buffer_size - 1];
  162|    368|	}
_ZN11spirv_cross10VectorViewIjE4backEv:
  160|    366|	{
  161|    366|		return ptr[buffer_size - 1];
  162|    366|	}
_ZN11spirv_cross11SmallVectorIjLm8EEC2Em:
  287|  1.87k|	explicit SmallVector(size_t count) SPIRV_CROSS_NOEXCEPT : SmallVector()
  288|  1.87k|	{
  289|  1.87k|		resize(count);
  290|  1.87k|	}
_ZN11spirv_cross11SmallVectorIjLm8EE6resizeEm:
  512|  1.87k|	{
  513|  1.87k|		if (new_size < this->buffer_size)
  ------------------
  |  Branch (513:7): [True: 0, False: 1.87k]
  ------------------
  514|      0|		{
  515|      0|			for (size_t i = new_size; i < this->buffer_size; i++)
  ------------------
  |  Branch (515:30): [True: 0, False: 0]
  ------------------
  516|      0|				this->ptr[i].~T();
  517|      0|		}
  518|  1.87k|		else if (new_size > this->buffer_size)
  ------------------
  |  Branch (518:12): [True: 1.50k, False: 366]
  ------------------
  519|  1.50k|		{
  520|  1.50k|			reserve(new_size);
  521|  6.02k|			for (size_t i = this->buffer_size; i < new_size; i++)
  ------------------
  |  Branch (521:39): [True: 4.51k, False: 1.50k]
  ------------------
  522|  4.51k|				new (&this->ptr[i]) T();
  523|  1.50k|		}
  524|       |
  525|  1.87k|		this->buffer_size = new_size;
  526|  1.87k|	}
_ZN11spirv_cross10VectorViewIjE4dataEv:
  120|  1.87k|	{
  121|  1.87k|		return ptr;
  122|  1.87k|	}
_ZN11spirv_cross10ObjectPoolINS_12SPIRConstantEE8allocateIJRjPjjbEEEPS1_DpOT_:
  571|  1.87k|	{
  572|  1.87k|		if (vacants.empty())
  ------------------
  |  Branch (572:7): [True: 41, False: 1.83k]
  ------------------
  573|     41|		{
  574|     41|			unsigned num_objects = start_object_count << memory.size();
  575|     41|			T *ptr = static_cast<T *>(malloc(num_objects * sizeof(T)));
  576|     41|			if (!ptr)
  ------------------
  |  Branch (576:8): [True: 0, False: 41]
  ------------------
  577|      0|				return nullptr;
  578|       |
  579|     41|			vacants.reserve(num_objects);
  580|  3.11k|			for (unsigned i = 0; i < num_objects; i++)
  ------------------
  |  Branch (580:25): [True: 3.07k, False: 41]
  ------------------
  581|  3.07k|				vacants.push_back(&ptr[i]);
  582|       |
  583|     41|			memory.emplace_back(ptr);
  584|     41|		}
  585|       |
  586|  1.87k|		T *ptr = vacants.back();
  587|  1.87k|		vacants.pop_back();
  588|  1.87k|		new (ptr) T(std::forward<P>(p)...);
  589|  1.87k|		return ptr;
  590|  1.87k|	}
_ZN11spirv_cross10VectorViewINS_7TypedIDILNS_5TypesE1EEEEixEm:
  100|  4.51k|	{
  101|  4.51k|		return ptr[i];
  102|  4.51k|	}

_ZN11spirv_cross13CompilerErrorC2EPKc:
   71|    438|	    : std::runtime_error(str)
   72|    438|	{
   73|    438|	}

_ZN11spirv_cross8ParsedIRC2Ev:
   34|    600|{
   35|       |	// If we move ParsedIR, we need to make sure the pointer stays fixed since the child Variant objects consume a pointer to this group,
   36|       |	// so need an extra pointer here.
   37|    600|	pool_group.reset(new ObjectPoolGroup);
   38|       |
   39|    600|	pool_group->pools[TypeType].reset(new ObjectPool<SPIRType>);
   40|    600|	pool_group->pools[TypeVariable].reset(new ObjectPool<SPIRVariable>);
   41|    600|	pool_group->pools[TypeConstant].reset(new ObjectPool<SPIRConstant>);
   42|    600|	pool_group->pools[TypeFunction].reset(new ObjectPool<SPIRFunction>);
   43|    600|	pool_group->pools[TypeFunctionPrototype].reset(new ObjectPool<SPIRFunctionPrototype>);
   44|    600|	pool_group->pools[TypeBlock].reset(new ObjectPool<SPIRBlock>);
   45|    600|	pool_group->pools[TypeExtension].reset(new ObjectPool<SPIRExtension>);
   46|    600|	pool_group->pools[TypeExpression].reset(new ObjectPool<SPIRExpression>);
   47|    600|	pool_group->pools[TypeConstantOp].reset(new ObjectPool<SPIRConstantOp>);
   48|    600|	pool_group->pools[TypeCombinedImageSampler].reset(new ObjectPool<SPIRCombinedImageSampler>);
   49|    600|	pool_group->pools[TypeAccessChain].reset(new ObjectPool<SPIRAccessChain>);
   50|    600|	pool_group->pools[TypeUndef].reset(new ObjectPool<SPIRUndef>);
   51|    600|	pool_group->pools[TypeString].reset(new ObjectPool<SPIRString>);
   52|    600|}
_ZN11spirv_cross8ParsedIR13set_id_boundsEj:
  137|    596|{
  138|    596|	ids.reserve(bounds);
  139|  37.8M|	while (ids.size() < bounds)
  ------------------
  |  Branch (139:9): [True: 37.8M, False: 596]
  ------------------
  140|  37.8M|		ids.emplace_back(pool_group.get());
  141|       |
  142|    596|	block_meta.resize(bounds);
  143|    596|}
_ZNK11spirv_cross8ParsedIR8get_nameENS_7TypedIDILNS_5TypesE0EEE:
  300|  10.3k|{
  301|  10.3k|	auto *m = find_meta(id);
  302|  10.3k|	if (m)
  ------------------
  |  Branch (302:6): [True: 7.68k, False: 2.62k]
  ------------------
  303|  7.68k|		return m->decoration.alias;
  304|  2.62k|	else
  305|  2.62k|		return empty_string;
  306|  10.3k|}
_ZN11spirv_cross8ParsedIR8set_nameENS_7TypedIDILNS_5TypesE0EEERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
  346|  9.67k|{
  347|  9.67k|	auto &m = meta[id];
  348|  9.67k|	m.decoration.alias = name;
  349|  9.67k|	if (!is_valid_identifier(name) || is_reserved_identifier(name, false, false))
  ------------------
  |  Branch (349:6): [True: 3.81k, False: 5.86k]
  |  Branch (349:36): [True: 589, False: 5.27k]
  ------------------
  350|  4.40k|		meta_needing_name_fixup.insert(id);
  351|  9.67k|}
_ZN11spirv_cross8ParsedIR15set_member_nameENS_7TypedIDILNS_5TypesE1EEEjRKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
  354|  1.65k|{
  355|  1.65k|	auto &m = meta[id];
  356|  1.65k|	m.members.resize(max(m.members.size(), size_t(index) + 1));
  357|  1.65k|	m.members[index].alias = name;
  358|  1.65k|	if (!is_valid_identifier(name) || is_reserved_identifier(name, true, false))
  ------------------
  |  Branch (358:6): [True: 310, False: 1.34k]
  |  Branch (358:36): [True: 41, False: 1.30k]
  ------------------
  359|    351|		meta_needing_name_fixup.insert(id);
  360|  1.65k|}
_ZN11spirv_cross8ParsedIR21set_decoration_stringENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
  363|  1.79k|{
  364|  1.79k|	auto &dec = meta[id].decoration;
  365|  1.79k|	dec.decoration_flags.set(decoration);
  366|       |
  367|  1.79k|	switch (decoration)
  368|  1.79k|	{
  369|  1.20k|	case DecorationHlslSemanticGOOGLE:
  ------------------
  |  Branch (369:2): [True: 1.20k, False: 592]
  ------------------
  370|  1.20k|		dec.hlsl_semantic = argument;
  371|  1.20k|		break;
  372|       |
  373|      0|	case DecorationUserTypeGOOGLE:
  ------------------
  |  Branch (373:2): [True: 0, False: 1.79k]
  ------------------
  374|      0|		dec.user_type = argument;
  375|      0|		break;
  376|       |
  377|    592|	default:
  ------------------
  |  Branch (377:2): [True: 592, False: 1.20k]
  ------------------
  378|    592|		break;
  379|  1.79k|	}
  380|  1.79k|}
_ZN11spirv_cross8ParsedIR14set_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationEj:
  383|  21.1k|{
  384|  21.1k|	auto &dec = meta[id].decoration;
  385|  21.1k|	dec.decoration_flags.set(decoration);
  386|       |
  387|  21.1k|	switch (decoration)
  388|  21.1k|	{
  389|    153|	case DecorationBuiltIn:
  ------------------
  |  Branch (389:2): [True: 153, False: 21.0k]
  ------------------
  390|    153|		dec.builtin = true;
  391|    153|		dec.builtin_type = static_cast<BuiltIn>(argument);
  392|    153|		break;
  393|       |
  394|    473|	case DecorationLocation:
  ------------------
  |  Branch (394:2): [True: 473, False: 20.6k]
  ------------------
  395|    473|		dec.location = argument;
  396|    473|		break;
  397|       |
  398|      0|	case DecorationComponent:
  ------------------
  |  Branch (398:2): [True: 0, False: 21.1k]
  ------------------
  399|      0|		dec.component = argument;
  400|      0|		break;
  401|       |
  402|     76|	case DecorationOffset:
  ------------------
  |  Branch (402:2): [True: 76, False: 21.0k]
  ------------------
  403|     76|		dec.offset = argument;
  404|     76|		break;
  405|       |
  406|     13|	case DecorationXfbBuffer:
  ------------------
  |  Branch (406:2): [True: 13, False: 21.1k]
  ------------------
  407|     13|		dec.xfb_buffer = argument;
  408|     13|		break;
  409|       |
  410|      0|	case DecorationXfbStride:
  ------------------
  |  Branch (410:2): [True: 0, False: 21.1k]
  ------------------
  411|      0|		dec.xfb_stride = argument;
  412|      0|		break;
  413|       |
  414|      0|	case DecorationStream:
  ------------------
  |  Branch (414:2): [True: 0, False: 21.1k]
  ------------------
  415|      0|		dec.stream = argument;
  416|      0|		break;
  417|       |
  418|      0|	case DecorationArrayStride:
  ------------------
  |  Branch (418:2): [True: 0, False: 21.1k]
  ------------------
  419|      0|		dec.array_stride = argument;
  420|      0|		break;
  421|       |
  422|     21|	case DecorationMatrixStride:
  ------------------
  |  Branch (422:2): [True: 21, False: 21.1k]
  ------------------
  423|     21|		dec.matrix_stride = argument;
  424|     21|		break;
  425|       |
  426|    314|	case DecorationBinding:
  ------------------
  |  Branch (426:2): [True: 314, False: 20.8k]
  ------------------
  427|    314|		dec.binding = argument;
  428|    314|		break;
  429|       |
  430|  1.10k|	case DecorationDescriptorSet:
  ------------------
  |  Branch (430:2): [True: 1.10k, False: 20.0k]
  ------------------
  431|  1.10k|		dec.set = argument;
  432|  1.10k|		break;
  433|       |
  434|      0|	case DecorationInputAttachmentIndex:
  ------------------
  |  Branch (434:2): [True: 0, False: 21.1k]
  ------------------
  435|      0|		dec.input_attachment = argument;
  436|      0|		break;
  437|       |
  438|    196|	case DecorationSpecId:
  ------------------
  |  Branch (438:2): [True: 196, False: 20.9k]
  ------------------
  439|    196|		dec.spec_id = argument;
  440|    196|		break;
  441|       |
  442|    181|	case DecorationIndex:
  ------------------
  |  Branch (442:2): [True: 181, False: 20.9k]
  ------------------
  443|    181|		dec.index = argument;
  444|    181|		break;
  445|       |
  446|      0|	case DecorationHlslCounterBufferGOOGLE:
  ------------------
  |  Branch (446:2): [True: 0, False: 21.1k]
  ------------------
  447|      0|		meta[id].hlsl_magic_counter_buffer = argument;
  448|      0|		meta[argument].hlsl_is_magic_counter_buffer = true;
  449|      0|		break;
  450|       |
  451|      0|	case DecorationFPRoundingMode:
  ------------------
  |  Branch (451:2): [True: 0, False: 21.1k]
  ------------------
  452|      0|		dec.fp_rounding_mode = static_cast<FPRoundingMode>(argument);
  453|      0|		break;
  454|       |
  455|  18.6k|	default:
  ------------------
  |  Branch (455:2): [True: 18.6k, False: 2.53k]
  ------------------
  456|  18.6k|		break;
  457|  21.1k|	}
  458|  21.1k|}
_ZN11spirv_cross8ParsedIR21set_member_decorationENS_7TypedIDILNS_5TypesE1EEEjN3spv10DecorationEj:
  461|  7.69k|{
  462|  7.69k|	auto &m = meta[id];
  463|  7.69k|	m.members.resize(max(m.members.size(), size_t(index) + 1));
  464|  7.69k|	auto &dec = m.members[index];
  465|  7.69k|	dec.decoration_flags.set(decoration);
  466|       |
  467|  7.69k|	switch (decoration)
  468|  7.69k|	{
  469|      0|	case DecorationBuiltIn:
  ------------------
  |  Branch (469:2): [True: 0, False: 7.69k]
  ------------------
  470|      0|		dec.builtin = true;
  471|      0|		dec.builtin_type = static_cast<BuiltIn>(argument);
  472|      0|		break;
  473|       |
  474|    193|	case DecorationLocation:
  ------------------
  |  Branch (474:2): [True: 193, False: 7.50k]
  ------------------
  475|    193|		dec.location = argument;
  476|    193|		break;
  477|       |
  478|      0|	case DecorationComponent:
  ------------------
  |  Branch (478:2): [True: 0, False: 7.69k]
  ------------------
  479|      0|		dec.component = argument;
  480|      0|		break;
  481|       |
  482|      4|	case DecorationBinding:
  ------------------
  |  Branch (482:2): [True: 4, False: 7.68k]
  ------------------
  483|      4|		dec.binding = argument;
  484|      4|		break;
  485|       |
  486|  1.92k|	case DecorationOffset:
  ------------------
  |  Branch (486:2): [True: 1.92k, False: 5.76k]
  ------------------
  487|  1.92k|		dec.offset = argument;
  488|  1.92k|		break;
  489|       |
  490|      0|	case DecorationXfbBuffer:
  ------------------
  |  Branch (490:2): [True: 0, False: 7.69k]
  ------------------
  491|      0|		dec.xfb_buffer = argument;
  492|      0|		break;
  493|       |
  494|      0|	case DecorationXfbStride:
  ------------------
  |  Branch (494:2): [True: 0, False: 7.69k]
  ------------------
  495|      0|		dec.xfb_stride = argument;
  496|      0|		break;
  497|       |
  498|      0|	case DecorationStream:
  ------------------
  |  Branch (498:2): [True: 0, False: 7.69k]
  ------------------
  499|      0|		dec.stream = argument;
  500|      0|		break;
  501|       |
  502|  1.57k|	case DecorationSpecId:
  ------------------
  |  Branch (502:2): [True: 1.57k, False: 6.12k]
  ------------------
  503|  1.57k|		dec.spec_id = argument;
  504|  1.57k|		break;
  505|       |
  506|    130|	case DecorationMatrixStride:
  ------------------
  |  Branch (506:2): [True: 130, False: 7.56k]
  ------------------
  507|    130|		dec.matrix_stride = argument;
  508|    130|		break;
  509|       |
  510|      0|	case DecorationIndex:
  ------------------
  |  Branch (510:2): [True: 0, False: 7.69k]
  ------------------
  511|      0|		dec.index = argument;
  512|      0|		break;
  513|       |
  514|  3.86k|	default:
  ------------------
  |  Branch (514:2): [True: 3.86k, False: 3.82k]
  ------------------
  515|  3.86k|		break;
  516|  7.69k|	}
  517|  7.69k|}
_ZN11spirv_cross8ParsedIR25mark_used_as_array_lengthENS_7TypedIDILNS_5TypesE0EEE:
  522|    383|{
  523|    383|	switch (ids[id].get_type())
  524|    383|	{
  525|    383|	case TypeConstant:
  ------------------
  |  Branch (525:2): [True: 383, False: 0]
  ------------------
  526|    383|		get<SPIRConstant>(id).is_used_as_array_length = true;
  527|    383|		break;
  528|       |
  529|      0|	case TypeConstantOp:
  ------------------
  |  Branch (529:2): [True: 0, False: 383]
  ------------------
  530|      0|	{
  531|      0|		auto &cop = get<SPIRConstantOp>(id);
  532|      0|		if (cop.opcode == OpCompositeExtract)
  ------------------
  |  Branch (532:7): [True: 0, False: 0]
  ------------------
  533|      0|			mark_used_as_array_length(cop.arguments[0]);
  534|      0|		else if (cop.opcode == OpCompositeInsert)
  ------------------
  |  Branch (534:12): [True: 0, False: 0]
  ------------------
  535|      0|		{
  536|      0|			mark_used_as_array_length(cop.arguments[0]);
  537|      0|			mark_used_as_array_length(cop.arguments[1]);
  538|      0|		}
  539|      0|		else
  540|      0|			for (uint32_t arg_id : cop.arguments)
  ------------------
  |  Branch (540:25): [True: 0, False: 0]
  ------------------
  541|      0|				mark_used_as_array_length(arg_id);
  542|      0|		break;
  543|      0|	}
  544|       |
  545|      0|	case TypeUndef:
  ------------------
  |  Branch (545:2): [True: 0, False: 383]
  ------------------
  546|      0|		break;
  547|       |
  548|      0|	default:
  ------------------
  |  Branch (548:2): [True: 0, False: 383]
  ------------------
  549|      0|		assert(0);
  550|    383|	}
  551|    383|}
_ZNK11spirv_cross8ParsedIR14get_decorationENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE:
  605|  19.3k|{
  606|  19.3k|	auto *m = find_meta(id);
  607|  19.3k|	if (!m)
  ------------------
  |  Branch (607:6): [True: 0, False: 19.3k]
  ------------------
  608|      0|		return 0;
  609|       |
  610|  19.3k|	auto &dec = m->decoration;
  611|  19.3k|	if (!dec.decoration_flags.get(decoration))
  ------------------
  |  Branch (611:6): [True: 0, False: 19.3k]
  ------------------
  612|      0|		return 0;
  613|       |
  614|  19.3k|	switch (decoration)
  615|  19.3k|	{
  616|      0|	case DecorationBuiltIn:
  ------------------
  |  Branch (616:2): [True: 0, False: 19.3k]
  ------------------
  617|      0|		return dec.builtin_type;
  618|    246|	case DecorationLocation:
  ------------------
  |  Branch (618:2): [True: 246, False: 19.1k]
  ------------------
  619|    246|		return dec.location;
  620|      0|	case DecorationComponent:
  ------------------
  |  Branch (620:2): [True: 0, False: 19.3k]
  ------------------
  621|      0|		return dec.component;
  622|  1.74k|	case DecorationOffset:
  ------------------
  |  Branch (622:2): [True: 1.74k, False: 17.6k]
  ------------------
  623|  1.74k|		return dec.offset;
  624|      0|	case DecorationXfbBuffer:
  ------------------
  |  Branch (624:2): [True: 0, False: 19.3k]
  ------------------
  625|      0|		return dec.xfb_buffer;
  626|      0|	case DecorationXfbStride:
  ------------------
  |  Branch (626:2): [True: 0, False: 19.3k]
  ------------------
  627|      0|		return dec.xfb_stride;
  628|      0|	case DecorationStream:
  ------------------
  |  Branch (628:2): [True: 0, False: 19.3k]
  ------------------
  629|      0|		return dec.stream;
  630|    120|	case DecorationBinding:
  ------------------
  |  Branch (630:2): [True: 120, False: 19.2k]
  ------------------
  631|    120|		return dec.binding;
  632|  1.57k|	case DecorationDescriptorSet:
  ------------------
  |  Branch (632:2): [True: 1.57k, False: 17.7k]
  ------------------
  633|  1.57k|		return dec.set;
  634|      0|	case DecorationInputAttachmentIndex:
  ------------------
  |  Branch (634:2): [True: 0, False: 19.3k]
  ------------------
  635|      0|		return dec.input_attachment;
  636|  1.75k|	case DecorationSpecId:
  ------------------
  |  Branch (636:2): [True: 1.75k, False: 17.6k]
  ------------------
  637|  1.75k|		return dec.spec_id;
  638|      0|	case DecorationArrayStride:
  ------------------
  |  Branch (638:2): [True: 0, False: 19.3k]
  ------------------
  639|      0|		return dec.array_stride;
  640|    128|	case DecorationMatrixStride:
  ------------------
  |  Branch (640:2): [True: 128, False: 19.2k]
  ------------------
  641|    128|		return dec.matrix_stride;
  642|    180|	case DecorationIndex:
  ------------------
  |  Branch (642:2): [True: 180, False: 19.1k]
  ------------------
  643|    180|		return dec.index;
  644|      0|	case DecorationFPRoundingMode:
  ------------------
  |  Branch (644:2): [True: 0, False: 19.3k]
  ------------------
  645|      0|		return dec.fp_rounding_mode;
  646|  13.6k|	default:
  ------------------
  |  Branch (646:2): [True: 13.6k, False: 5.74k]
  ------------------
  647|  13.6k|		return 1;
  648|  19.3k|	}
  649|  19.3k|}
_ZNK11spirv_cross8ParsedIR21get_decoration_stringENS_7TypedIDILNS_5TypesE0EEEN3spv10DecorationE:
  652|  2.77k|{
  653|  2.77k|	auto *m = find_meta(id);
  654|  2.77k|	if (!m)
  ------------------
  |  Branch (654:6): [True: 0, False: 2.77k]
  ------------------
  655|      0|		return empty_string;
  656|       |
  657|  2.77k|	auto &dec = m->decoration;
  658|       |
  659|  2.77k|	if (!dec.decoration_flags.get(decoration))
  ------------------
  |  Branch (659:6): [True: 0, False: 2.77k]
  ------------------
  660|      0|		return empty_string;
  661|       |
  662|  2.77k|	switch (decoration)
  663|  2.77k|	{
  664|  2.77k|	case DecorationHlslSemanticGOOGLE:
  ------------------
  |  Branch (664:2): [True: 2.77k, False: 0]
  ------------------
  665|  2.77k|		return dec.hlsl_semantic;
  666|       |
  667|      0|	case DecorationUserTypeGOOGLE:
  ------------------
  |  Branch (667:2): [True: 0, False: 2.77k]
  ------------------
  668|      0|		return dec.user_type;
  669|       |
  670|      0|	default:
  ------------------
  |  Branch (670:2): [True: 0, False: 2.77k]
  ------------------
  671|      0|		return empty_string;
  672|  2.77k|	}
  673|  2.77k|}
_ZN11spirv_cross8ParsedIR28set_member_decoration_stringENS_7TypedIDILNS_5TypesE1EEEjN3spv10DecorationERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
  809|  1.57k|{
  810|  1.57k|	auto &m = meta[id];
  811|  1.57k|	m.members.resize(max(m.members.size(), size_t(index) + 1));
  812|  1.57k|	auto &dec = meta[id].members[index];
  813|  1.57k|	dec.decoration_flags.set(decoration);
  814|       |
  815|  1.57k|	switch (decoration)
  816|  1.57k|	{
  817|  1.57k|	case DecorationHlslSemanticGOOGLE:
  ------------------
  |  Branch (817:2): [True: 1.57k, False: 0]
  ------------------
  818|  1.57k|		dec.hlsl_semantic = argument;
  819|  1.57k|		break;
  820|       |
  821|      0|	default:
  ------------------
  |  Branch (821:2): [True: 0, False: 1.57k]
  ------------------
  822|      0|		break;
  823|  1.57k|	}
  824|  1.57k|}
_ZN11spirv_cross8ParsedIR17increase_bound_byEj:
  902|  1.90k|{
  903|  1.90k|	auto curr_bound = ids.size();
  904|  1.90k|	auto new_bound = curr_bound + incr_amount;
  905|       |
  906|  1.90k|	ids.reserve(ids.size() + incr_amount);
  907|  6.84k|	for (uint32_t i = 0; i < incr_amount; i++)
  ------------------
  |  Branch (907:23): [True: 4.93k, False: 1.90k]
  ------------------
  908|  4.93k|		ids.emplace_back(pool_group.get());
  909|       |
  910|  1.90k|	block_meta.resize(new_bound);
  911|  1.90k|	return uint32_t(curr_bound);
  912|  1.90k|}
_ZN11spirv_cross8ParsedIR15remove_typed_idENS_5TypesENS_7TypedIDILS1_0EEE:
  915|     18|{
  916|     18|	auto &type_ids = ids_for_type[type];
  917|     18|	type_ids.erase(remove(begin(type_ids), end(type_ids), id), end(type_ids));
  918|     18|}
_ZN11spirv_cross8ParsedIR12add_typed_idENS_5TypesENS_7TypedIDILS1_0EEE:
  930|  64.5k|{
  931|  64.5k|	assert(id < ids.size());
  932|       |
  933|  64.5k|	if (loop_iteration_depth_hard != 0)
  ------------------
  |  Branch (933:6): [True: 0, False: 64.5k]
  ------------------
  934|      0|		SPIRV_CROSS_THROW("Cannot add typed ID while looping over it.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  935|       |
  936|  64.5k|	if (loop_iteration_depth_soft != 0)
  ------------------
  |  Branch (936:6): [True: 0, False: 64.5k]
  ------------------
  937|      0|	{
  938|      0|		if (!ids[id].empty())
  ------------------
  |  Branch (938:7): [True: 0, False: 0]
  ------------------
  939|      0|			SPIRV_CROSS_THROW("Cannot override IDs when loop is soft locked.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  940|      0|		return;
  941|      0|	}
  942|       |
  943|  64.5k|	if (ids[id].empty() || ids[id].get_type() != type)
  ------------------
  |  Branch (943:6): [True: 22.4k, False: 42.0k]
  |  Branch (943:25): [True: 18, False: 42.0k]
  ------------------
  944|  22.4k|	{
  945|  22.4k|		switch (type)
  946|  22.4k|		{
  947|  8.65k|		case TypeConstant:
  ------------------
  |  Branch (947:3): [True: 8.65k, False: 13.8k]
  ------------------
  948|  8.65k|			ids_for_constant_or_variable.push_back(id);
  949|  8.65k|			ids_for_constant_undef_or_type.push_back(id);
  950|  8.65k|			break;
  951|       |
  952|  3.12k|		case TypeVariable:
  ------------------
  |  Branch (952:3): [True: 3.12k, False: 19.3k]
  ------------------
  953|  3.12k|			ids_for_constant_or_variable.push_back(id);
  954|  3.12k|			break;
  955|       |
  956|  3.96k|		case TypeType:
  ------------------
  |  Branch (956:3): [True: 3.96k, False: 18.4k]
  ------------------
  957|  3.97k|		case TypeConstantOp:
  ------------------
  |  Branch (957:3): [True: 13, False: 22.4k]
  ------------------
  958|  4.08k|		case TypeUndef:
  ------------------
  |  Branch (958:3): [True: 104, False: 22.3k]
  ------------------
  959|  4.08k|			ids_for_constant_undef_or_type.push_back(id);
  960|  4.08k|			break;
  961|       |
  962|  6.59k|		default:
  ------------------
  |  Branch (962:3): [True: 6.59k, False: 15.8k]
  ------------------
  963|  6.59k|			break;
  964|  22.4k|		}
  965|  22.4k|	}
  966|       |
  967|  64.5k|	if (ids[id].empty())
  ------------------
  |  Branch (967:6): [True: 22.4k, False: 42.0k]
  ------------------
  968|  22.4k|	{
  969|  22.4k|		ids_for_type[type].push_back(id);
  970|  22.4k|	}
  971|  42.0k|	else if (ids[id].get_type() != type)
  ------------------
  |  Branch (971:11): [True: 18, False: 42.0k]
  ------------------
  972|     18|	{
  973|     18|		remove_typed_id(ids[id].get_type(), id);
  974|     18|		ids_for_type[type].push_back(id);
  975|     18|	}
  976|  64.5k|}
_ZNK11spirv_cross8ParsedIR9find_metaENS_7TypedIDILNS_5TypesE0EEE:
  979|  32.4k|{
  980|  32.4k|	auto itr = meta.find(id);
  981|  32.4k|	if (itr != end(meta))
  ------------------
  |  Branch (981:6): [True: 29.8k, False: 2.62k]
  ------------------
  982|  29.8k|		return &itr->second;
  983|  2.62k|	else
  984|  2.62k|		return nullptr;
  985|  32.4k|}
_ZN11spirv_cross8ParsedIR18make_constant_nullEjjb:
 1034|  7.03k|{
 1035|  7.03k|	assert(id < ids.size());
 1036|       |
 1037|  7.03k|	auto &constant_type = get<SPIRType>(type);
 1038|       |
 1039|  7.03k|	if (constant_type.pointer)
  ------------------
  |  Branch (1039:6): [True: 280, False: 6.75k]
  ------------------
 1040|    280|	{
 1041|    280|		if (add_to_typed_id_set)
  ------------------
  |  Branch (1041:7): [True: 280, False: 0]
  ------------------
 1042|    280|			add_typed_id(TypeConstant, id);
 1043|    280|		auto &constant = variant_set<SPIRConstant>(ids[id], type);
 1044|    280|		constant.self = id;
 1045|    280|		constant.make_null(constant_type);
 1046|    280|	}
 1047|  6.75k|	else if (!constant_type.array.empty())
  ------------------
  |  Branch (1047:11): [True: 368, False: 6.38k]
  ------------------
 1048|    368|	{
 1049|    368|		assert(constant_type.parent_type);
 1050|    368|		uint32_t parent_id = increase_bound_by(1);
 1051|    368|		make_constant_null(parent_id, constant_type.parent_type, add_to_typed_id_set);
 1052|       |
 1053|       |		// The array size of OpConstantNull can be either literal or specialization constant.
 1054|       |		// In the latter case, we cannot take the value as-is, as it can be changed to anything.
 1055|       |		// Rather, we assume it to be *one* for the sake of initializer.
 1056|    368|		bool is_literal_array_size = constant_type.array_size_literal.back();
 1057|    368|		uint32_t count = is_literal_array_size ? constant_type.array.back() : 1;
  ------------------
  |  Branch (1057:20): [True: 366, False: 2]
  ------------------
 1058|       |
 1059|    368|		SmallVector<uint32_t> elements(count);
 1060|    370|		for (uint32_t i = 0; i < count; i++)
  ------------------
  |  Branch (1060:24): [True: 2, False: 368]
  ------------------
 1061|      2|			elements[i] = parent_id;
 1062|       |
 1063|    368|		if (add_to_typed_id_set)
  ------------------
  |  Branch (1063:7): [True: 368, False: 0]
  ------------------
 1064|    368|			add_typed_id(TypeConstant, id);
 1065|    368|		auto& constant = variant_set<SPIRConstant>(ids[id], type, elements.data(), uint32_t(elements.size()), false);
 1066|    368|		constant.self = id;
 1067|    368|		constant.is_null_array_specialized_length = !is_literal_array_size;
 1068|    368|	}
 1069|  6.38k|	else if (!constant_type.member_types.empty())
  ------------------
  |  Branch (1069:11): [True: 1.50k, False: 4.88k]
  ------------------
 1070|  1.50k|	{
 1071|  1.50k|		uint32_t member_ids = increase_bound_by(uint32_t(constant_type.member_types.size()));
 1072|  1.50k|		SmallVector<uint32_t> elements(constant_type.member_types.size());
 1073|  6.02k|		for (uint32_t i = 0; i < constant_type.member_types.size(); i++)
  ------------------
  |  Branch (1073:24): [True: 4.51k, False: 1.50k]
  ------------------
 1074|  4.51k|		{
 1075|  4.51k|			make_constant_null(member_ids + i, constant_type.member_types[i], add_to_typed_id_set);
 1076|  4.51k|			elements[i] = member_ids + i;
 1077|  4.51k|		}
 1078|       |
 1079|  1.50k|		if (add_to_typed_id_set)
  ------------------
  |  Branch (1079:7): [True: 1.50k, False: 0]
  ------------------
 1080|  1.50k|			add_typed_id(TypeConstant, id);
 1081|  1.50k|		variant_set<SPIRConstant>(ids[id], type, elements.data(), uint32_t(elements.size()), false).self = id;
 1082|  1.50k|	}
 1083|  4.88k|	else
 1084|  4.88k|	{
 1085|  4.88k|		if (add_to_typed_id_set)
  ------------------
  |  Branch (1085:7): [True: 4.88k, False: 1]
  ------------------
 1086|  4.88k|			add_typed_id(TypeConstant, id);
 1087|  4.88k|		auto &constant = variant_set<SPIRConstant>(ids[id], type);
 1088|  4.88k|		constant.self = id;
 1089|  4.88k|		constant.make_null(constant_type);
 1090|  4.88k|	}
 1091|  7.03k|}
spirv_cross_parsed_ir.cpp:_ZN11spirv_crossL22is_reserved_identifierERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEbb:
  197|  7.20k|{
  198|  7.20k|	if (!allow_reserved_prefixes && is_reserved_prefix(name))
  ------------------
  |  Branch (198:6): [True: 7.20k, False: 0]
  |  Branch (198:34): [True: 270, False: 6.93k]
  ------------------
  199|    270|		return true;
  200|       |
  201|  6.93k|	if (member)
  ------------------
  |  Branch (201:6): [True: 1.30k, False: 5.63k]
  ------------------
  202|  1.30k|	{
  203|       |		// Reserved member identifiers come in one form:
  204|       |		// _m[0-9]+$.
  205|  1.30k|		if (name.size() < 3)
  ------------------
  |  Branch (205:7): [True: 393, False: 910]
  ------------------
  206|    393|			return false;
  207|       |
  208|    910|		if (name.compare(0, 2, "_m", 2) != 0)
  ------------------
  |  Branch (208:7): [True: 321, False: 589]
  ------------------
  209|    321|			return false;
  210|       |
  211|    589|		size_t index = 2;
  212|    589|		while (index < name.size() && is_numeric(name[index]))
  ------------------
  |  Branch (212:10): [True: 589, False: 0]
  |  Branch (212:33): [True: 0, False: 589]
  ------------------
  213|      0|			index++;
  214|       |
  215|    589|		return index == name.size();
  216|    910|	}
  217|  5.63k|	else
  218|  5.63k|	{
  219|       |		// Reserved non-member identifiers come in two forms:
  220|       |		// _[0-9]+$, used for temporaries which map directly to a SPIR-V ID.
  221|       |		// _[0-9]+_, used for auxillary temporaries which derived from a SPIR-V ID.
  222|  5.63k|		if (name.size() < 2)
  ------------------
  |  Branch (222:7): [True: 2.05k, False: 3.57k]
  ------------------
  223|  2.05k|			return false;
  224|       |
  225|  3.57k|		if (name[0] != '_' || !is_numeric(name[1]))
  ------------------
  |  Branch (225:7): [True: 2.84k, False: 736]
  |  Branch (225:25): [True: 184, False: 552]
  ------------------
  226|  3.02k|			return false;
  227|       |
  228|    552|		size_t index = 2;
  229|  1.62k|		while (index < name.size() && is_numeric(name[index]))
  ------------------
  |  Branch (229:10): [True: 1.26k, False: 360]
  |  Branch (229:33): [True: 1.07k, False: 192]
  ------------------
  230|  1.07k|			index++;
  231|       |
  232|    552|		return index == name.size() || (index < name.size() && name[index] == '_');
  ------------------
  |  Branch (232:10): [True: 360, False: 192]
  |  Branch (232:35): [True: 192, False: 0]
  |  Branch (232:58): [True: 0, False: 192]
  ------------------
  233|  3.57k|	}
  234|  6.93k|}
spirv_cross_parsed_ir.cpp:_ZN11spirv_crossL18is_reserved_prefixERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  188|  7.20k|{
  189|       |	// Generic reserved identifiers used by the implementation.
  190|  7.20k|	return name.compare(0, 3, "gl_", 3) == 0 ||
  ------------------
  |  Branch (190:9): [True: 229, False: 6.97k]
  ------------------
  191|       |	       // Ignore this case for now, might rewrite internal code to always use spv prefix.
  192|       |	       //name.compare(0, 11, "SPIRV_Cross", 11) == 0 ||
  193|  7.20k|	       name.compare(0, 3, "spv", 3) == 0;
  ------------------
  |  Branch (193:9): [True: 41, False: 6.93k]
  ------------------
  194|  7.20k|}
spirv_cross_parsed_ir.cpp:_ZN11spirv_crossL10is_numericEc:
  152|  24.3k|{
  153|  24.3k|	return c >= '0' && c <= '9';
  ------------------
  |  Branch (153:9): [True: 19.5k, False: 4.76k]
  |  Branch (153:21): [True: 5.21k, False: 14.3k]
  ------------------
  154|  24.3k|}
spirv_cross_parsed_ir.cpp:_ZN11spirv_crossL19is_valid_identifierERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  162|  11.3k|{
  163|  11.3k|	if (name.empty())
  ------------------
  |  Branch (163:6): [True: 635, False: 10.6k]
  ------------------
  164|    635|		return true;
  165|       |
  166|  10.6k|	if (is_numeric(name[0]))
  ------------------
  |  Branch (166:6): [True: 84, False: 10.6k]
  ------------------
  167|     84|		return false;
  168|       |
  169|  10.6k|	for (auto c : name)
  ------------------
  |  Branch (169:14): [True: 46.8k, False: 7.18k]
  ------------------
  170|  46.8k|		if (!is_alphanumeric(c) && c != '_')
  ------------------
  |  Branch (170:7): [True: 7.52k, False: 39.3k]
  |  Branch (170:30): [True: 3.42k, False: 4.10k]
  ------------------
  171|  3.42k|			return false;
  172|       |
  173|  7.18k|	bool saw_underscore = false;
  174|       |	// Two underscores in a row is not a valid identifier either.
  175|       |	// Technically reserved, but it's easier to treat it as invalid.
  176|  7.18k|	for (auto c : name)
  ------------------
  |  Branch (176:14): [True: 32.6k, False: 6.57k]
  ------------------
  177|  32.6k|	{
  178|  32.6k|		bool is_underscore = c == '_';
  179|  32.6k|		if (is_underscore && saw_underscore)
  ------------------
  |  Branch (179:7): [True: 3.75k, False: 28.8k]
  |  Branch (179:24): [True: 614, False: 3.14k]
  ------------------
  180|    614|			return false;
  181|  32.0k|		saw_underscore = is_underscore;
  182|  32.0k|	}
  183|       |
  184|  6.57k|	return true;
  185|  7.18k|}
spirv_cross_parsed_ir.cpp:_ZN11spirv_crossL15is_alphanumericEc:
  157|  46.8k|{
  158|  46.8k|	return is_alpha(c) || is_numeric(c);
  ------------------
  |  Branch (158:9): [True: 35.8k, False: 11.0k]
  |  Branch (158:24): [True: 3.50k, False: 7.52k]
  ------------------
  159|  46.8k|}
spirv_cross_parsed_ir.cpp:_ZN11spirv_crossL8is_alphaEc:
  147|  46.8k|{
  148|  46.8k|	return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
  ------------------
  |  Branch (148:10): [True: 30.0k, False: 16.7k]
  |  Branch (148:22): [True: 29.9k, False: 124]
  |  Branch (148:36): [True: 10.1k, False: 6.80k]
  |  Branch (148:48): [True: 5.88k, False: 4.22k]
  ------------------
  149|  46.8k|}

_ZN11spirv_cross8ParsedIR6SourceC2Ev:
  119|    600|		Source() = default;
_ZN11spirv_cross8ParsedIR3getINS_12SPIRConstantEEERT_j:
  237|    383|	{
  238|    383|		return variant_get<T>(ids[id]);
  239|    383|	}
_ZN11spirv_cross8ParsedIR3getINS_8SPIRTypeEEERT_j:
  237|  7.03k|	{
  238|  7.03k|		return variant_get<T>(ids[id]);
  239|  7.03k|	}

_ZN11spirv_cross6ParserC2ENSt3__16vectorIjNS1_9allocatorIjEEEE:
   33|    600|{
   34|    600|	ir.spirv = std::move(spirv);
   35|    600|}
_ZN11spirv_cross6Parser5parseEv:
   80|    600|{
   81|    600|	auto &spirv = ir.spirv;
   82|       |
   83|    600|	auto len = spirv.size();
   84|    600|	if (len < 5)
  ------------------
  |  Branch (84:6): [True: 0, False: 600]
  ------------------
   85|      0|		SPIRV_CROSS_THROW("SPIRV file too small.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
   86|       |
   87|    600|	auto s = spirv.data();
   88|       |
   89|       |	// Endian-swap if we need to.
   90|    600|	if (s[0] == swap_endian(MagicNumber))
  ------------------
  |  Branch (90:6): [True: 0, False: 600]
  ------------------
   91|      0|		transform(begin(spirv), end(spirv), begin(spirv), [](uint32_t c) { return swap_endian(c); });
   92|       |
   93|    600|	if (s[0] != MagicNumber || !is_valid_spirv_version(s[1]))
  ------------------
  |  Branch (93:6): [True: 0, False: 600]
  |  Branch (93:29): [True: 0, False: 600]
  ------------------
   94|      0|		SPIRV_CROSS_THROW("Invalid SPIRV format.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
   95|       |
   96|    600|	uint32_t bound = s[3];
   97|       |
   98|    600|	const uint32_t MaximumNumberOfIDs = 0x3fffff;
   99|    600|	if (bound > MaximumNumberOfIDs)
  ------------------
  |  Branch (99:6): [True: 4, False: 596]
  ------------------
  100|      4|		SPIRV_CROSS_THROW("ID bound exceeds limit of 0x3fffff.\n");
  ------------------
  |  |   76|      4|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  101|       |
  102|    596|	ir.set_id_bounds(bound);
  103|       |
  104|    596|	uint32_t offset = 5;
  105|       |
  106|    596|	SmallVector<Instruction> instructions;
  107|   597k|	while (offset < len)
  ------------------
  |  Branch (107:9): [True: 596k, False: 574]
  ------------------
  108|   596k|	{
  109|   596k|		Instruction instr = {};
  110|   596k|		instr.op = spirv[offset] & 0xffff;
  111|   596k|		instr.count = (spirv[offset] >> 16) & 0xffff;
  112|       |
  113|   596k|		if (instr.count == 0)
  ------------------
  |  Branch (113:7): [True: 17, False: 596k]
  ------------------
  114|     17|			SPIRV_CROSS_THROW("SPIR-V instructions cannot consume 0 words. Invalid SPIR-V file.");
  ------------------
  |  |   76|     17|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  115|       |
  116|   596k|		instr.offset = offset + 1;
  117|   596k|		instr.length = instr.count - 1;
  118|       |
  119|   596k|		offset += instr.count;
  120|       |
  121|   596k|		if (offset > spirv.size())
  ------------------
  |  Branch (121:7): [True: 5, False: 596k]
  ------------------
  122|      5|			SPIRV_CROSS_THROW("SPIR-V instruction goes out of bounds.");
  ------------------
  |  |   76|      5|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  123|       |
  124|   596k|		instructions.push_back(instr);
  125|   596k|	}
  126|       |
  127|    574|	for (auto &i : instructions)
  ------------------
  |  Branch (127:15): [True: 471k, False: 574]
  ------------------
  128|   471k|		parse(i);
  129|       |
  130|    574|	for (auto &fixup : forward_pointer_fixups)
  ------------------
  |  Branch (130:19): [True: 663, False: 574]
  ------------------
  131|    663|	{
  132|    663|		auto &target = get<SPIRType>(fixup.first);
  133|    663|		auto &source = get<SPIRType>(fixup.second);
  134|    663|		target.member_types = source.member_types;
  135|    663|		target.basetype = source.basetype;
  136|    663|		target.self = source.self;
  137|    663|	}
  138|    574|	forward_pointer_fixups.clear();
  139|       |
  140|    574|	if (current_function)
  ------------------
  |  Branch (140:6): [True: 98, False: 476]
  ------------------
  141|     98|		SPIRV_CROSS_THROW("Function was not terminated.");
  ------------------
  |  |   76|     98|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  142|    476|	if (current_block)
  ------------------
  |  Branch (142:6): [True: 0, False: 476]
  ------------------
  143|      0|		SPIRV_CROSS_THROW("Block was not terminated.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  144|    476|	if (ir.default_entry_point == 0)
  ------------------
  |  Branch (144:6): [True: 139, False: 337]
  ------------------
  145|    139|		SPIRV_CROSS_THROW("There is no entry point in the SPIR-V module.");
  ------------------
  |  |   76|    139|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  146|    476|}
_ZNK11spirv_cross6Parser6streamERKNS_11InstructionE:
  149|   471k|{
  150|       |	// If we're not going to use any arguments, just return nullptr.
  151|       |	// We want to avoid case where we return an out of range pointer
  152|       |	// that trips debug assertions on some platforms.
  153|   471k|	if (!instr.length)
  ------------------
  |  Branch (153:6): [True: 334k, False: 136k]
  ------------------
  154|   334k|		return nullptr;
  155|       |
  156|   136k|	if (instr.offset + instr.length > ir.spirv.size())
  ------------------
  |  Branch (156:6): [True: 0, False: 136k]
  ------------------
  157|      0|		SPIRV_CROSS_THROW("Compiler::stream() out of range.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  158|   136k|	return &ir.spirv[instr.offset];
  159|   136k|}
_ZN11spirv_cross6Parser5parseERKNS_11InstructionE:
  181|   471k|{
  182|   471k|	auto *ops = stream(instruction);
  183|   471k|	auto op = static_cast<Op>(instruction.op);
  184|   471k|	uint32_t length = instruction.length;
  185|       |
  186|       |	// HACK for glslang that might emit OpEmitMeshTasksEXT followed by return / branch.
  187|       |	// Instead of failing hard, just ignore it.
  188|   471k|	if (ignore_trailing_block_opcodes)
  ------------------
  |  Branch (188:6): [True: 0, False: 471k]
  ------------------
  189|      0|	{
  190|      0|		ignore_trailing_block_opcodes = false;
  191|      0|		if (op == OpReturn || op == OpBranch || op == OpUnreachable)
  ------------------
  |  Branch (191:7): [True: 0, False: 0]
  |  Branch (191:25): [True: 0, False: 0]
  |  Branch (191:43): [True: 0, False: 0]
  ------------------
  192|      0|			return;
  193|      0|	}
  194|       |
  195|   471k|	switch (op)
  196|   471k|	{
  197|    323|	case OpSourceContinued:
  ------------------
  |  Branch (197:2): [True: 323, False: 471k]
  ------------------
  198|    546|	case OpSourceExtension:
  ------------------
  |  Branch (198:2): [True: 223, False: 471k]
  ------------------
  199|  1.21k|	case OpNop:
  ------------------
  |  Branch (199:2): [True: 667, False: 470k]
  ------------------
  200|  1.94k|	case OpModuleProcessed:
  ------------------
  |  Branch (200:2): [True: 736, False: 470k]
  ------------------
  201|  1.94k|		break;
  202|       |
  203|    886|	case OpString:
  ------------------
  |  Branch (203:2): [True: 886, False: 470k]
  ------------------
  204|    886|	{
  205|    886|		set<SPIRString>(ops[0], extract_string(ir.spirv, instruction.offset + 1));
  206|    886|		break;
  207|  1.21k|	}
  208|       |
  209|    811|	case OpMemoryModel:
  ------------------
  |  Branch (209:2): [True: 811, False: 470k]
  ------------------
  210|    811|		ir.addressing_model = static_cast<AddressingModel>(ops[0]);
  211|    811|		ir.memory_model = static_cast<MemoryModel>(ops[1]);
  212|    811|		break;
  213|       |
  214|    585|	case OpSource:
  ------------------
  |  Branch (214:2): [True: 585, False: 471k]
  ------------------
  215|    585|	{
  216|    585|		auto lang = static_cast<SourceLanguage>(ops[0]);
  217|    585|		switch (lang)
  218|    585|		{
  219|    190|		case SourceLanguageESSL:
  ------------------
  |  Branch (219:3): [True: 190, False: 395]
  ------------------
  220|    190|			ir.source.es = true;
  221|    190|			ir.source.version = ops[1];
  222|    190|			ir.source.known = true;
  223|    190|			ir.source.hlsl = false;
  224|    190|			break;
  225|       |
  226|    149|		case SourceLanguageGLSL:
  ------------------
  |  Branch (226:3): [True: 149, False: 436]
  ------------------
  227|    149|			ir.source.es = false;
  228|    149|			ir.source.version = ops[1];
  229|    149|			ir.source.known = true;
  230|    149|			ir.source.hlsl = false;
  231|    149|			break;
  232|       |
  233|      7|		case SourceLanguageHLSL:
  ------------------
  |  Branch (233:3): [True: 7, False: 578]
  ------------------
  234|       |			// For purposes of cross-compiling, this is GLSL 450.
  235|      7|			ir.source.es = false;
  236|      7|			ir.source.version = 450;
  237|      7|			ir.source.known = true;
  238|      7|			ir.source.hlsl = true;
  239|      7|			break;
  240|       |
  241|    239|		default:
  ------------------
  |  Branch (241:3): [True: 239, False: 346]
  ------------------
  242|    239|			ir.source.known = false;
  243|    239|			break;
  244|    585|		}
  245|    585|		break;
  246|    585|	}
  247|       |
  248|  1.81k|	case OpUndef:
  ------------------
  |  Branch (248:2): [True: 1.81k, False: 469k]
  ------------------
  249|  1.81k|	{
  250|  1.81k|		uint32_t result_type = ops[0];
  251|  1.81k|		uint32_t id = ops[1];
  252|  1.81k|		set<SPIRUndef>(id, result_type);
  253|  1.81k|		if (current_block)
  ------------------
  |  Branch (253:7): [True: 3, False: 1.80k]
  ------------------
  254|      3|			current_block->ops.push_back(instruction);
  255|  1.81k|		break;
  256|    585|	}
  257|       |
  258|  3.60k|	case OpCapability:
  ------------------
  |  Branch (258:2): [True: 3.60k, False: 468k]
  ------------------
  259|  3.60k|	{
  260|  3.60k|		uint32_t cap = ops[0];
  261|  3.60k|		if (cap == CapabilityKernel)
  ------------------
  |  Branch (261:7): [True: 0, False: 3.60k]
  ------------------
  262|      0|			SPIRV_CROSS_THROW("Kernel capability not supported.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  263|       |
  264|  3.60k|		ir.declared_capabilities.push_back(static_cast<Capability>(ops[0]));
  265|  3.60k|		break;
  266|  3.60k|	}
  267|       |
  268|   313k|	case OpExtension:
  ------------------
  |  Branch (268:2): [True: 313k, False: 157k]
  ------------------
  269|   313k|	{
  270|   313k|		auto ext = extract_string(ir.spirv, instruction.offset);
  271|   313k|		ir.declared_extensions.push_back(std::move(ext));
  272|   313k|		break;
  273|  3.60k|	}
  274|       |
  275|    508|	case OpExtInstImport:
  ------------------
  |  Branch (275:2): [True: 508, False: 471k]
  ------------------
  276|    508|	{
  277|    508|		uint32_t id = ops[0];
  278|       |
  279|    508|		SPIRExtension::Extension spirv_ext = SPIRExtension::Unsupported;
  280|       |
  281|    508|		auto ext = extract_string(ir.spirv, instruction.offset + 1);
  282|    508|		if (ext == "GLSL.std.450")
  ------------------
  |  Branch (282:7): [True: 167, False: 341]
  ------------------
  283|    167|			spirv_ext = SPIRExtension::GLSL;
  284|    341|		else if (ext == "DebugInfo")
  ------------------
  |  Branch (284:12): [True: 0, False: 341]
  ------------------
  285|      0|			spirv_ext = SPIRExtension::SPV_debug_info;
  286|    341|		else if (ext == "SPV_AMD_shader_ballot")
  ------------------
  |  Branch (286:12): [True: 0, False: 341]
  ------------------
  287|      0|			spirv_ext = SPIRExtension::SPV_AMD_shader_ballot;
  288|    341|		else if (ext == "SPV_AMD_shader_explicit_vertex_parameter")
  ------------------
  |  Branch (288:12): [True: 0, False: 341]
  ------------------
  289|      0|			spirv_ext = SPIRExtension::SPV_AMD_shader_explicit_vertex_parameter;
  290|    341|		else if (ext == "SPV_AMD_shader_trinary_minmax")
  ------------------
  |  Branch (290:12): [True: 0, False: 341]
  ------------------
  291|      0|			spirv_ext = SPIRExtension::SPV_AMD_shader_trinary_minmax;
  292|    341|		else if (ext == "SPV_AMD_gcn_shader")
  ------------------
  |  Branch (292:12): [True: 0, False: 341]
  ------------------
  293|      0|			spirv_ext = SPIRExtension::SPV_AMD_gcn_shader;
  294|    341|		else if (ext == "NonSemantic.DebugPrintf")
  ------------------
  |  Branch (294:12): [True: 0, False: 341]
  ------------------
  295|      0|			spirv_ext = SPIRExtension::NonSemanticDebugPrintf;
  296|    341|		else if (ext == "NonSemantic.Shader.DebugInfo.100")
  ------------------
  |  Branch (296:12): [True: 0, False: 341]
  ------------------
  297|      0|			spirv_ext = SPIRExtension::NonSemanticShaderDebugInfo;
  298|    341|		else if (ext.find("NonSemantic.") == 0)
  ------------------
  |  Branch (298:12): [True: 0, False: 341]
  ------------------
  299|      0|			spirv_ext = SPIRExtension::NonSemanticGeneric;
  300|       |
  301|    508|		set<SPIRExtension>(id, spirv_ext);
  302|       |		// Other SPIR-V extensions which have ExtInstrs are currently not supported.
  303|       |
  304|    508|		break;
  305|  3.60k|	}
  306|       |
  307|  1.23k|	case OpExtInst:
  ------------------
  |  Branch (307:2): [True: 1.23k, False: 470k]
  ------------------
  308|  1.23k|	case OpExtInstWithForwardRefsKHR:
  ------------------
  |  Branch (308:2): [True: 0, False: 471k]
  ------------------
  309|  1.23k|	{
  310|       |		// The SPIR-V debug information extended instructions might come at global scope.
  311|  1.23k|		if (current_block)
  ------------------
  |  Branch (311:7): [True: 1.23k, False: 4]
  ------------------
  312|  1.23k|		{
  313|  1.23k|			current_block->ops.push_back(instruction);
  314|  1.23k|			if (length >= 2)
  ------------------
  |  Branch (314:8): [True: 1.23k, False: 0]
  ------------------
  315|  1.23k|			{
  316|  1.23k|				const auto *type = maybe_get<SPIRType>(ops[0]);
  317|  1.23k|				if (type)
  ------------------
  |  Branch (317:9): [True: 1.18k, False: 46]
  ------------------
  318|  1.18k|					ir.load_type_width.insert({ ops[1], type->width });
  319|  1.23k|			}
  320|  1.23k|		}
  321|  1.23k|		break;
  322|  1.23k|	}
  323|       |
  324|  2.74k|	case OpEntryPoint:
  ------------------
  |  Branch (324:2): [True: 2.74k, False: 468k]
  ------------------
  325|  2.74k|	{
  326|  2.74k|		auto itr =
  327|  2.74k|		    ir.entry_points.insert(make_pair(ops[1], SPIREntryPoint(ops[1], static_cast<ExecutionModel>(ops[0]),
  328|  2.74k|		                                                            extract_string(ir.spirv, instruction.offset + 2))));
  329|  2.74k|		auto &e = itr.first->second;
  330|       |
  331|       |		// Strings need nul-terminator and consume the whole word.
  332|  2.74k|		uint32_t strlen_words = uint32_t((e.name.size() + 1 + 3) >> 2);
  333|       |
  334|  12.6k|		for (uint32_t i = strlen_words + 2; i < instruction.length; i++)
  ------------------
  |  Branch (334:39): [True: 9.92k, False: 2.74k]
  ------------------
  335|  9.92k|			e.interface_variables.push_back(ops[i]);
  336|       |
  337|       |		// Set the name of the entry point in case OpName is not provided later.
  338|  2.74k|		ir.set_name(ops[1], e.name);
  339|       |
  340|       |		// If we don't have an entry, make the first one our "default".
  341|  2.74k|		if (!ir.default_entry_point)
  ------------------
  |  Branch (341:7): [True: 345, False: 2.40k]
  ------------------
  342|    345|			ir.default_entry_point = ops[1];
  343|  2.74k|		break;
  344|  1.23k|	}
  345|       |
  346|  6.35k|	case OpExecutionMode:
  ------------------
  |  Branch (346:2): [True: 6.35k, False: 465k]
  ------------------
  347|  6.35k|	{
  348|  6.35k|		auto &execution = ir.entry_points[ops[0]];
  349|  6.35k|		auto mode = static_cast<ExecutionMode>(ops[1]);
  350|  6.35k|		execution.flags.set(mode);
  351|       |
  352|  6.35k|		switch (mode)
  353|  6.35k|		{
  354|  2.22k|		case ExecutionModeInvocations:
  ------------------
  |  Branch (354:3): [True: 2.22k, False: 4.13k]
  ------------------
  355|  2.22k|			execution.invocations = ops[2];
  356|  2.22k|			break;
  357|       |
  358|    216|		case ExecutionModeLocalSize:
  ------------------
  |  Branch (358:3): [True: 216, False: 6.14k]
  ------------------
  359|    216|			execution.workgroup_size.x = ops[2];
  360|    216|			execution.workgroup_size.y = ops[3];
  361|    216|			execution.workgroup_size.z = ops[4];
  362|    216|			break;
  363|       |
  364|     20|		case ExecutionModeOutputVertices:
  ------------------
  |  Branch (364:3): [True: 20, False: 6.33k]
  ------------------
  365|     20|			execution.output_vertices = ops[2];
  366|     20|			break;
  367|       |
  368|      0|		case ExecutionModeOutputPrimitivesEXT:
  ------------------
  |  Branch (368:3): [True: 0, False: 6.35k]
  ------------------
  369|      0|			execution.output_primitives = ops[2];
  370|      0|			break;
  371|       |
  372|  3.89k|		default:
  ------------------
  |  Branch (372:3): [True: 3.89k, False: 2.46k]
  ------------------
  373|  3.89k|			break;
  374|  6.35k|		}
  375|  6.35k|		break;
  376|  6.35k|	}
  377|       |
  378|  6.35k|	case OpExecutionModeId:
  ------------------
  |  Branch (378:2): [True: 0, False: 471k]
  ------------------
  379|      0|	{
  380|      0|		auto &execution = ir.entry_points[ops[0]];
  381|      0|		auto mode = static_cast<ExecutionMode>(ops[1]);
  382|      0|		execution.flags.set(mode);
  383|       |
  384|      0|		if (mode == ExecutionModeLocalSizeId)
  ------------------
  |  Branch (384:7): [True: 0, False: 0]
  ------------------
  385|      0|		{
  386|      0|			execution.workgroup_size.id_x = ops[2];
  387|      0|			execution.workgroup_size.id_y = ops[3];
  388|      0|			execution.workgroup_size.id_z = ops[4];
  389|      0|		}
  390|       |
  391|      0|		break;
  392|  6.35k|	}
  393|       |
  394|  6.92k|	case OpName:
  ------------------
  |  Branch (394:2): [True: 6.92k, False: 464k]
  ------------------
  395|  6.92k|	{
  396|  6.92k|		uint32_t id = ops[0];
  397|  6.92k|		ir.set_name(id, extract_string(ir.spirv, instruction.offset + 1));
  398|  6.92k|		break;
  399|  6.35k|	}
  400|       |
  401|  1.65k|	case OpMemberName:
  ------------------
  |  Branch (401:2): [True: 1.65k, False: 470k]
  ------------------
  402|  1.65k|	{
  403|  1.65k|		uint32_t id = ops[0];
  404|  1.65k|		uint32_t member = ops[1];
  405|  1.65k|		ir.set_member_name(id, member, extract_string(ir.spirv, instruction.offset + 2));
  406|  1.65k|		break;
  407|  6.35k|	}
  408|       |
  409|    130|	case OpDecorationGroup:
  ------------------
  |  Branch (409:2): [True: 130, False: 471k]
  ------------------
  410|    130|	{
  411|       |		// Noop, this simply means an ID should be a collector of decorations.
  412|       |		// The meta array is already a flat array of decorations which will contain the relevant decorations.
  413|    130|		break;
  414|  6.35k|	}
  415|       |
  416|    834|	case OpGroupDecorate:
  ------------------
  |  Branch (416:2): [True: 834, False: 470k]
  ------------------
  417|    834|	{
  418|    834|		uint32_t group_id = ops[0];
  419|    834|		auto &decorations = ir.meta[group_id].decoration;
  420|    834|		auto &flags = decorations.decoration_flags;
  421|       |
  422|       |		// Copies decorations from one ID to another. Only copy decorations which are set in the group,
  423|       |		// i.e., we cannot just copy the meta structure directly.
  424|  3.67k|		for (uint32_t i = 1; i < length; i++)
  ------------------
  |  Branch (424:24): [True: 2.84k, False: 834]
  ------------------
  425|  2.84k|		{
  426|  2.84k|			uint32_t target = ops[i];
  427|  2.84k|			flags.for_each_bit([&](uint32_t bit) {
  428|  2.84k|				auto decoration = static_cast<Decoration>(bit);
  429|       |
  430|  2.84k|				if (decoration_is_string(decoration))
  431|  2.84k|				{
  432|  2.84k|					ir.set_decoration_string(target, decoration, ir.get_decoration_string(group_id, decoration));
  433|  2.84k|				}
  434|  2.84k|				else
  435|  2.84k|				{
  436|  2.84k|					ir.meta[target].decoration_word_offset[decoration] =
  437|  2.84k|					    ir.meta[group_id].decoration_word_offset[decoration];
  438|  2.84k|					ir.set_decoration(target, decoration, ir.get_decoration(group_id, decoration));
  439|  2.84k|				}
  440|  2.84k|			});
  441|  2.84k|		}
  442|    834|		break;
  443|  6.35k|	}
  444|       |
  445|  2.14k|	case OpGroupMemberDecorate:
  ------------------
  |  Branch (445:2): [True: 2.14k, False: 469k]
  ------------------
  446|  2.14k|	{
  447|  2.14k|		uint32_t group_id = ops[0];
  448|  2.14k|		auto &flags = ir.meta[group_id].decoration.decoration_flags;
  449|       |
  450|       |		// Copies decorations from one ID to another. Only copy decorations which are set in the group,
  451|       |		// i.e., we cannot just copy the meta structure directly.
  452|  4.53k|		for (uint32_t i = 1; i + 1 < length; i += 2)
  ------------------
  |  Branch (452:24): [True: 2.39k, False: 2.14k]
  ------------------
  453|  2.39k|		{
  454|  2.39k|			uint32_t target = ops[i + 0];
  455|  2.39k|			uint32_t index = ops[i + 1];
  456|  2.39k|			flags.for_each_bit([&](uint32_t bit) {
  457|  2.39k|				auto decoration = static_cast<Decoration>(bit);
  458|       |
  459|  2.39k|				if (decoration_is_string(decoration))
  460|  2.39k|					ir.set_member_decoration_string(target, index, decoration,
  461|  2.39k|					                                ir.get_decoration_string(group_id, decoration));
  462|  2.39k|				else
  463|  2.39k|					ir.set_member_decoration(target, index, decoration, ir.get_decoration(group_id, decoration));
  464|  2.39k|			});
  465|  2.39k|		}
  466|  2.14k|		break;
  467|  6.35k|	}
  468|       |
  469|  9.09k|	case OpDecorate:
  ------------------
  |  Branch (469:2): [True: 9.09k, False: 462k]
  ------------------
  470|  9.09k|	case OpDecorateId:
  ------------------
  |  Branch (470:2): [True: 0, False: 471k]
  ------------------
  471|  9.09k|	{
  472|       |		// OpDecorateId technically supports an array of arguments, but our only supported decorations are single uint,
  473|       |		// so merge decorate and decorate-id here.
  474|  9.09k|		uint32_t id = ops[0];
  475|       |
  476|  9.09k|		auto decoration = static_cast<Decoration>(ops[1]);
  477|  9.09k|		if (length >= 3)
  ------------------
  |  Branch (477:7): [True: 3.48k, False: 5.60k]
  ------------------
  478|  3.48k|		{
  479|  3.48k|			ir.meta[id].decoration_word_offset[decoration] = uint32_t(&ops[2] - ir.spirv.data());
  480|  3.48k|			ir.set_decoration(id, decoration, ops[2]);
  481|  3.48k|		}
  482|  5.60k|		else
  483|  5.60k|			ir.set_decoration(id, decoration);
  484|       |
  485|  9.09k|		break;
  486|  9.09k|	}
  487|       |
  488|    592|	case OpDecorateStringGOOGLE:
  ------------------
  |  Branch (488:2): [True: 592, False: 471k]
  ------------------
  489|    592|	{
  490|    592|		uint32_t id = ops[0];
  491|    592|		auto decoration = static_cast<Decoration>(ops[1]);
  492|    592|		ir.set_decoration_string(id, decoration, extract_string(ir.spirv, instruction.offset + 2));
  493|    592|		break;
  494|  9.09k|	}
  495|       |
  496|    404|	case OpMemberDecorate:
  ------------------
  |  Branch (496:2): [True: 404, False: 471k]
  ------------------
  497|    404|	{
  498|    404|		uint32_t id = ops[0];
  499|    404|		uint32_t member = ops[1];
  500|    404|		auto decoration = static_cast<Decoration>(ops[2]);
  501|    404|		if (length >= 4)
  ------------------
  |  Branch (501:7): [True: 375, False: 29]
  ------------------
  502|    375|			ir.set_member_decoration(id, member, decoration, ops[3]);
  503|     29|		else
  504|     29|			ir.set_member_decoration(id, member, decoration);
  505|    404|		break;
  506|  9.09k|	}
  507|       |
  508|      0|	case OpMemberDecorateStringGOOGLE:
  ------------------
  |  Branch (508:2): [True: 0, False: 471k]
  ------------------
  509|      0|	{
  510|      0|		uint32_t id = ops[0];
  511|      0|		uint32_t member = ops[1];
  512|      0|		auto decoration = static_cast<Decoration>(ops[2]);
  513|      0|		ir.set_member_decoration_string(id, member, decoration, extract_string(ir.spirv, instruction.offset + 3));
  514|      0|		break;
  515|  9.09k|	}
  516|       |
  517|       |	// Build up basic types.
  518|    609|	case OpTypeVoid:
  ------------------
  |  Branch (518:2): [True: 609, False: 471k]
  ------------------
  519|    609|	{
  520|    609|		uint32_t id = ops[0];
  521|    609|		auto &type = set<SPIRType>(id, op);
  522|    609|		type.basetype = SPIRType::Void;
  523|    609|		break;
  524|  9.09k|	}
  525|       |
  526|    182|	case OpTypeBool:
  ------------------
  |  Branch (526:2): [True: 182, False: 471k]
  ------------------
  527|    182|	{
  528|    182|		uint32_t id = ops[0];
  529|    182|		auto &type = set<SPIRType>(id, op);
  530|    182|		type.basetype = SPIRType::Boolean;
  531|    182|		type.width = 1;
  532|    182|		break;
  533|  9.09k|	}
  534|       |
  535|    656|	case OpTypeFloat:
  ------------------
  |  Branch (535:2): [True: 656, False: 471k]
  ------------------
  536|    656|	{
  537|    656|		uint32_t id = ops[0];
  538|    656|		uint32_t width = ops[1];
  539|    656|		auto &type = set<SPIRType>(id, op);
  540|       |
  541|    656|		if (width != 16 && length > 2)
  ------------------
  |  Branch (541:7): [True: 656, False: 0]
  |  Branch (541:22): [True: 0, False: 656]
  ------------------
  542|      0|			SPIRV_CROSS_THROW("Unrecognized FP encoding mode for OpTypeFloat.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  543|       |
  544|    656|		if (width == 64)
  ------------------
  |  Branch (544:7): [True: 9, False: 647]
  ------------------
  545|      9|			type.basetype = SPIRType::Double;
  546|    647|		else if (width == 32)
  ------------------
  |  Branch (546:12): [True: 642, False: 5]
  ------------------
  547|    642|			type.basetype = SPIRType::Float;
  548|      5|		else if (width == 16)
  ------------------
  |  Branch (548:12): [True: 0, False: 5]
  ------------------
  549|      0|		{
  550|      0|			if (length > 2)
  ------------------
  |  Branch (550:8): [True: 0, False: 0]
  ------------------
  551|      0|			{
  552|      0|				if (ops[2] == spv::FPEncodingBFloat16KHR)
  ------------------
  |  Branch (552:9): [True: 0, False: 0]
  ------------------
  553|      0|					type.basetype = SPIRType::BFloat16;
  554|      0|				else
  555|      0|					SPIRV_CROSS_THROW("Unrecognized encoding for OpTypeFloat 16.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  556|      0|			}
  557|      0|			else
  558|      0|				type.basetype = SPIRType::Half;
  559|      0|		}
  560|      5|		else
  561|      5|			SPIRV_CROSS_THROW("Unrecognized bit-width of floating point type.");
  ------------------
  |  |   76|      5|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  562|    651|		type.width = width;
  563|    651|		break;
  564|    656|	}
  565|       |
  566|    857|	case OpTypeInt:
  ------------------
  |  Branch (566:2): [True: 857, False: 470k]
  ------------------
  567|    857|	{
  568|    857|		uint32_t id = ops[0];
  569|    857|		uint32_t width = ops[1];
  570|    857|		bool signedness = ops[2] != 0;
  571|    857|		auto &type = set<SPIRType>(id, op);
  572|    857|		type.basetype = signedness ? to_signed_basetype(width) : to_unsigned_basetype(width);
  ------------------
  |  Branch (572:19): [True: 463, False: 394]
  ------------------
  573|    857|		type.width = width;
  574|    857|		break;
  575|    656|	}
  576|       |
  577|       |	// Build composite types by "inheriting".
  578|       |	// NOTE: The self member is also copied! For pointers and array modifiers this is a good thing
  579|       |	// since we can refer to decorations on pointee classes which is needed for UBO/SSBO, I/O blocks in geometry/tess etc.
  580|  1.95k|	case OpTypeVector:
  ------------------
  |  Branch (580:2): [True: 1.95k, False: 469k]
  ------------------
  581|  1.95k|	{
  582|  1.95k|		uint32_t id = ops[0];
  583|  1.95k|		uint32_t vecsize = ops[2];
  584|       |
  585|  1.95k|		auto &base = get<SPIRType>(ops[1]);
  586|  1.95k|		auto &vecbase = set<SPIRType>(id, base);
  587|       |
  588|  1.95k|		vecbase.op = op;
  589|  1.95k|		vecbase.vecsize = vecsize;
  590|  1.95k|		vecbase.self = id;
  591|  1.95k|		vecbase.parent_type = ops[1];
  592|  1.95k|		break;
  593|    656|	}
  594|       |
  595|    315|	case OpTypeMatrix:
  ------------------
  |  Branch (595:2): [True: 315, False: 471k]
  ------------------
  596|    315|	{
  597|    315|		uint32_t id = ops[0];
  598|    315|		uint32_t colcount = ops[2];
  599|       |
  600|    315|		auto &base = get<SPIRType>(ops[1]);
  601|    315|		auto &matrixbase = set<SPIRType>(id, base);
  602|       |
  603|    315|		matrixbase.op = op;
  604|    315|		matrixbase.columns = colcount;
  605|    315|		matrixbase.self = id;
  606|    315|		matrixbase.parent_type = ops[1];
  607|    315|		break;
  608|    656|	}
  609|       |
  610|      0|	case OpTypeCooperativeMatrixKHR:
  ------------------
  |  Branch (610:2): [True: 0, False: 471k]
  ------------------
  611|      0|	{
  612|      0|		uint32_t id = ops[0];
  613|      0|		auto &base = get<SPIRType>(ops[1]);
  614|      0|		auto &matrixbase = set<SPIRType>(id, base);
  615|       |
  616|      0|		matrixbase.op = op;
  617|      0|		matrixbase.cooperative.scope_id = ops[2];
  618|      0|		matrixbase.cooperative.rows_id = ops[3];
  619|      0|		matrixbase.cooperative.columns_id = ops[4];
  620|      0|		matrixbase.cooperative.use_id = ops[5];
  621|      0|		matrixbase.self = id;
  622|      0|		matrixbase.parent_type = ops[1];
  623|      0|		break;
  624|    656|	}
  625|       |
  626|    383|	case OpTypeArray:
  ------------------
  |  Branch (626:2): [True: 383, False: 471k]
  ------------------
  627|    383|	{
  628|    383|		uint32_t id = ops[0];
  629|    383|		uint32_t tid = ops[1];
  630|    383|		auto &base = get<SPIRType>(tid);
  631|    383|		auto &arraybase = set<SPIRType>(id, base);
  632|       |
  633|    383|		arraybase.op = op;
  634|    383|		arraybase.parent_type = tid;
  635|       |
  636|    383|		uint32_t cid = ops[2];
  637|    383|		ir.mark_used_as_array_length(cid);
  638|    383|		auto *c = maybe_get<SPIRConstant>(cid);
  639|    383|		bool literal = c && !c->specialization;
  ------------------
  |  Branch (639:18): [True: 383, False: 0]
  |  Branch (639:23): [True: 278, False: 105]
  ------------------
  640|       |
  641|       |		// We're copying type information into Array types, so we'll need a fixup for any physical pointer
  642|       |		// references.
  643|    383|		if (base.forward_pointer)
  ------------------
  |  Branch (643:7): [True: 96, False: 287]
  ------------------
  644|     96|			forward_pointer_fixups.push_back({ id, tid });
  645|       |
  646|    383|		arraybase.array_size_literal.push_back(literal);
  647|    383|		arraybase.array.push_back(literal ? c->scalar() : cid);
  ------------------
  |  Branch (647:29): [True: 278, False: 105]
  ------------------
  648|       |
  649|       |		// .self resolves down to non-array/non-pointer type.
  650|    383|		arraybase.self = base.self;
  651|    383|		break;
  652|    656|	}
  653|       |
  654|    802|	case OpTypeRuntimeArray:
  ------------------
  |  Branch (654:2): [True: 802, False: 470k]
  ------------------
  655|    802|	{
  656|    802|		uint32_t id = ops[0];
  657|       |
  658|    802|		auto &base = get<SPIRType>(ops[1]);
  659|    802|		auto &arraybase = set<SPIRType>(id, base);
  660|       |
  661|       |		// We're copying type information into Array types, so we'll need a fixup for any physical pointer
  662|       |		// references.
  663|    802|		if (base.forward_pointer)
  ------------------
  |  Branch (663:7): [True: 621, False: 181]
  ------------------
  664|    621|			forward_pointer_fixups.push_back({ id, ops[1] });
  665|       |
  666|    802|		arraybase.op = op;
  667|    802|		arraybase.array.push_back(0);
  668|    802|		arraybase.array_size_literal.push_back(true);
  669|    802|		arraybase.parent_type = ops[1];
  670|       |
  671|       |		// .self resolves down to non-array/non-pointer type.
  672|    802|		arraybase.self = base.self;
  673|    802|		break;
  674|    656|	}
  675|       |
  676|  1.10k|	case OpTypeImage:
  ------------------
  |  Branch (676:2): [True: 1.10k, False: 470k]
  ------------------
  677|  1.10k|	{
  678|  1.10k|		uint32_t id = ops[0];
  679|  1.10k|		auto &type = set<SPIRType>(id, op);
  680|  1.10k|		type.basetype = SPIRType::Image;
  681|  1.10k|		type.image.type = ops[1];
  682|  1.10k|		type.image.dim = static_cast<Dim>(ops[2]);
  683|  1.10k|		type.image.depth = ops[3] == 1;
  684|  1.10k|		type.image.arrayed = ops[4] != 0;
  685|  1.10k|		type.image.ms = ops[5] != 0;
  686|  1.10k|		type.image.sampled = ops[6];
  687|  1.10k|		type.image.format = static_cast<ImageFormat>(ops[7]);
  688|  1.10k|		type.image.access = (length >= 9) ? static_cast<AccessQualifier>(ops[8]) : AccessQualifierMax;
  ------------------
  |  Branch (688:23): [True: 0, False: 1.10k]
  ------------------
  689|  1.10k|		break;
  690|    656|	}
  691|       |
  692|  1.08k|	case OpTypeSampledImage:
  ------------------
  |  Branch (692:2): [True: 1.08k, False: 470k]
  ------------------
  693|  1.08k|	{
  694|  1.08k|		uint32_t id = ops[0];
  695|  1.08k|		uint32_t imagetype = ops[1];
  696|  1.08k|		auto &type = set<SPIRType>(id, op);
  697|  1.08k|		type = get<SPIRType>(imagetype);
  698|  1.08k|		type.basetype = SPIRType::SampledImage;
  699|  1.08k|		type.self = id;
  700|  1.08k|		break;
  701|    656|	}
  702|       |
  703|      4|	case OpTypeSampler:
  ------------------
  |  Branch (703:2): [True: 4, False: 471k]
  ------------------
  704|      4|	{
  705|      4|		uint32_t id = ops[0];
  706|      4|		auto &type = set<SPIRType>(id, op);
  707|      4|		type.basetype = SPIRType::Sampler;
  708|      4|		break;
  709|    656|	}
  710|       |
  711|  8.25k|	case OpTypePointer:
  ------------------
  |  Branch (711:2): [True: 8.25k, False: 463k]
  ------------------
  712|  8.25k|	{
  713|  8.25k|		uint32_t id = ops[0];
  714|       |
  715|       |		// Very rarely, we might receive a FunctionPrototype here.
  716|       |		// We won't be able to compile it, but we shouldn't crash when parsing.
  717|       |		// We should be able to reflect.
  718|  8.25k|		auto *base = maybe_get<SPIRType>(ops[2]);
  719|  8.25k|		auto &ptrbase = set<SPIRType>(id, op);
  720|       |
  721|  8.25k|		if (base)
  ------------------
  |  Branch (721:7): [True: 7.94k, False: 314]
  ------------------
  722|  7.94k|		{
  723|  7.94k|			ptrbase = *base;
  724|  7.94k|			ptrbase.op = op;
  725|  7.94k|		}
  726|       |
  727|  8.25k|		ptrbase.pointer = true;
  728|  8.25k|		ptrbase.pointer_depth++;
  729|  8.25k|		ptrbase.storage = static_cast<StorageClass>(ops[1]);
  730|       |
  731|  8.25k|		if (ptrbase.storage == StorageClassAtomicCounter)
  ------------------
  |  Branch (731:7): [True: 61, False: 8.19k]
  ------------------
  732|     61|			ptrbase.basetype = SPIRType::AtomicCounter;
  733|       |
  734|  8.25k|		if (base && base->forward_pointer)
  ------------------
  |  Branch (734:7): [True: 7.94k, False: 314]
  |  Branch (734:15): [True: 2.11k, False: 5.83k]
  ------------------
  735|  2.11k|			forward_pointer_fixups.push_back({ id, ops[2] });
  736|       |
  737|  8.25k|		ptrbase.parent_type = ops[2];
  738|       |
  739|       |		// Do NOT set ptrbase.self!
  740|  8.25k|		break;
  741|    656|	}
  742|       |
  743|    102|	case OpTypeForwardPointer:
  ------------------
  |  Branch (743:2): [True: 102, False: 471k]
  ------------------
  744|    102|	{
  745|    102|		uint32_t id = ops[0];
  746|    102|		auto &ptrbase = set<SPIRType>(id, op);
  747|    102|		ptrbase.pointer = true;
  748|    102|		ptrbase.pointer_depth++;
  749|    102|		ptrbase.storage = static_cast<StorageClass>(ops[1]);
  750|    102|		ptrbase.forward_pointer = true;
  751|       |
  752|    102|		if (ptrbase.storage == StorageClassAtomicCounter)
  ------------------
  |  Branch (752:7): [True: 52, False: 50]
  ------------------
  753|     52|			ptrbase.basetype = SPIRType::AtomicCounter;
  754|       |
  755|    102|		break;
  756|    656|	}
  757|       |
  758|  5.93k|	case OpTypeStruct:
  ------------------
  |  Branch (758:2): [True: 5.93k, False: 465k]
  ------------------
  759|  5.93k|	{
  760|  5.93k|		uint32_t id = ops[0];
  761|  5.93k|		auto &type = set<SPIRType>(id, op);
  762|  5.93k|		type.basetype = SPIRType::Struct;
  763|  10.3k|		for (uint32_t i = 1; i < length; i++)
  ------------------
  |  Branch (763:24): [True: 4.39k, False: 5.93k]
  ------------------
  764|  4.39k|			type.member_types.push_back(ops[i]);
  765|       |
  766|       |		// Check if we have seen this struct type before, with just different
  767|       |		// decorations.
  768|       |		//
  769|       |		// Add workaround for issue #17 as well by looking at OpName for the struct
  770|       |		// types, which we shouldn't normally do.
  771|       |		// We should not normally have to consider type aliases like this to begin with
  772|       |		// however ... glslang issues #304, #307 cover this.
  773|       |
  774|       |		// For stripped names, never consider struct type aliasing.
  775|       |		// We risk declaring the same struct multiple times, but type-punning is not allowed
  776|       |		// so this is safe.
  777|  5.93k|		bool consider_aliasing = !ir.get_name(type.self).empty();
  778|  5.93k|		if (consider_aliasing)
  ------------------
  |  Branch (778:7): [True: 1.54k, False: 4.39k]
  ------------------
  779|  1.54k|		{
  780|  1.54k|			for (auto &other : global_struct_cache)
  ------------------
  |  Branch (780:21): [True: 2.18k, False: 211]
  ------------------
  781|  2.18k|			{
  782|  2.18k|				if (ir.get_name(type.self) == ir.get_name(other) &&
  ------------------
  |  Branch (782:9): [True: 1.35k, False: 834]
  |  Branch (782:9): [True: 1.33k, False: 854]
  ------------------
  783|  2.18k|				    types_are_logically_equivalent(type, get<SPIRType>(other)))
  ------------------
  |  Branch (783:9): [True: 1.33k, False: 20]
  ------------------
  784|  1.33k|				{
  785|  1.33k|					type.type_alias = other;
  786|  1.33k|					break;
  787|  1.33k|				}
  788|  2.18k|			}
  789|       |
  790|  1.54k|			if (type.type_alias == TypeID(0))
  ------------------
  |  Branch (790:8): [True: 211, False: 1.33k]
  ------------------
  791|    211|				global_struct_cache.push_back(id);
  792|  1.54k|		}
  793|  5.93k|		break;
  794|    656|	}
  795|       |
  796|  5.83k|	case OpTypeFunction:
  ------------------
  |  Branch (796:2): [True: 5.83k, False: 465k]
  ------------------
  797|  5.83k|	{
  798|  5.83k|		uint32_t id = ops[0];
  799|  5.83k|		uint32_t ret = ops[1];
  800|       |
  801|  5.83k|		auto &func = set<SPIRFunctionPrototype>(id, ret);
  802|  76.3k|		for (uint32_t i = 2; i < length; i++)
  ------------------
  |  Branch (802:24): [True: 70.5k, False: 5.83k]
  ------------------
  803|  70.5k|			func.parameter_types.push_back(ops[i]);
  804|  5.83k|		break;
  805|    656|	}
  806|       |
  807|      0|	case OpTypeAccelerationStructureKHR:
  ------------------
  |  Branch (807:2): [True: 0, False: 471k]
  ------------------
  808|      0|	{
  809|      0|		uint32_t id = ops[0];
  810|      0|		auto &type = set<SPIRType>(id, op);
  811|      0|		type.basetype = SPIRType::AccelerationStructure;
  812|      0|		break;
  813|    656|	}
  814|       |
  815|      0|	case OpTypeRayQueryKHR:
  ------------------
  |  Branch (815:2): [True: 0, False: 471k]
  ------------------
  816|      0|	{
  817|      0|		uint32_t id = ops[0];
  818|      0|		auto &type = set<SPIRType>(id, op);
  819|      0|		type.basetype = SPIRType::RayQuery;
  820|      0|		break;
  821|    656|	}
  822|       |
  823|       |	// Variable declaration
  824|       |	// All variables are essentially pointers with a storage qualifier.
  825|  6.44k|	case OpVariable:
  ------------------
  |  Branch (825:2): [True: 6.44k, False: 465k]
  ------------------
  826|  6.44k|	{
  827|  6.44k|		uint32_t type = ops[0];
  828|  6.44k|		uint32_t id = ops[1];
  829|  6.44k|		auto storage = static_cast<StorageClass>(ops[2]);
  830|  6.44k|		uint32_t initializer = length == 4 ? ops[3] : 0;
  ------------------
  |  Branch (830:26): [True: 489, False: 5.95k]
  ------------------
  831|       |
  832|  6.44k|		if (storage == StorageClassFunction)
  ------------------
  |  Branch (832:7): [True: 1.28k, False: 5.15k]
  ------------------
  833|  1.28k|		{
  834|  1.28k|			if (!current_function)
  ------------------
  |  Branch (834:8): [True: 7, False: 1.27k]
  ------------------
  835|      7|				SPIRV_CROSS_THROW("No function currently in scope");
  ------------------
  |  |   76|      7|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  836|  1.27k|			current_function->add_local_variable(id);
  837|  1.27k|		}
  838|       |
  839|  6.43k|		set<SPIRVariable>(id, type, storage, initializer);
  840|  6.43k|		break;
  841|  6.44k|	}
  842|       |
  843|       |	// OpPhi
  844|       |	// OpPhi is a fairly magical opcode.
  845|       |	// It selects temporary variables based on which parent block we *came from*.
  846|       |	// In high-level languages we can "de-SSA" by creating a function local, and flush out temporaries to this function-local
  847|       |	// variable to emulate SSA Phi.
  848|  2.91k|	case OpPhi:
  ------------------
  |  Branch (848:2): [True: 2.91k, False: 468k]
  ------------------
  849|  2.91k|	{
  850|  2.91k|		if (!current_function)
  ------------------
  |  Branch (850:7): [True: 0, False: 2.91k]
  ------------------
  851|      0|			SPIRV_CROSS_THROW("No function currently in scope");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  852|  2.91k|		if (!current_block)
  ------------------
  |  Branch (852:7): [True: 3, False: 2.90k]
  ------------------
  853|      3|			SPIRV_CROSS_THROW("No block currently in scope");
  ------------------
  |  |   76|      3|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  854|       |
  855|  2.90k|		uint32_t result_type = ops[0];
  856|  2.90k|		uint32_t id = ops[1];
  857|       |
  858|       |		// Instead of a temporary, create a new function-wide temporary with this ID instead.
  859|  2.90k|		auto &var = set<SPIRVariable>(id, result_type, spv::StorageClassFunction);
  860|  2.90k|		var.phi_variable = true;
  861|       |
  862|  2.90k|		current_function->add_local_variable(id);
  863|       |
  864|  9.19k|		for (uint32_t i = 2; i + 2 <= length; i += 2)
  ------------------
  |  Branch (864:24): [True: 6.29k, False: 2.90k]
  ------------------
  865|  6.29k|			current_block->phi_variables.push_back({ ops[i], ops[i + 1], id });
  866|  2.90k|		break;
  867|  2.91k|	}
  868|       |
  869|       |		// Constants
  870|     21|	case OpSpecConstant:
  ------------------
  |  Branch (870:2): [True: 21, False: 471k]
  ------------------
  871|  3.92k|	case OpConstant:
  ------------------
  |  Branch (871:2): [True: 3.90k, False: 467k]
  ------------------
  872|  3.92k|	{
  873|  3.92k|		uint32_t id = ops[1];
  874|  3.92k|		auto &type = get<SPIRType>(ops[0]);
  875|       |
  876|  3.92k|		if (type.width > 32)
  ------------------
  |  Branch (876:7): [True: 18, False: 3.91k]
  ------------------
  877|     18|			set<SPIRConstant>(id, ops[0], ops[2] | (uint64_t(ops[3]) << 32), op == OpSpecConstant);
  878|  3.91k|		else
  879|  3.91k|			set<SPIRConstant>(id, ops[0], ops[2], op == OpSpecConstant);
  880|  3.92k|		break;
  881|     21|	}
  882|       |
  883|    388|	case OpSpecConstantFalse:
  ------------------
  |  Branch (883:2): [True: 388, False: 471k]
  ------------------
  884|    438|	case OpConstantFalse:
  ------------------
  |  Branch (884:2): [True: 50, False: 471k]
  ------------------
  885|    438|	{
  886|    438|		uint32_t id = ops[1];
  887|    438|		set<SPIRConstant>(id, ops[0], uint32_t(0), op == OpSpecConstantFalse);
  888|    438|		break;
  889|    388|	}
  890|       |
  891|     55|	case OpSpecConstantTrue:
  ------------------
  |  Branch (891:2): [True: 55, False: 471k]
  ------------------
  892|    175|	case OpConstantTrue:
  ------------------
  |  Branch (892:2): [True: 120, False: 471k]
  ------------------
  893|    175|	{
  894|    175|		uint32_t id = ops[1];
  895|    175|		set<SPIRConstant>(id, ops[0], uint32_t(1), op == OpSpecConstantTrue);
  896|    175|		break;
  897|     55|	}
  898|       |
  899|  2.15k|	case OpConstantNull:
  ------------------
  |  Branch (899:2): [True: 2.15k, False: 469k]
  ------------------
  900|  2.15k|	{
  901|  2.15k|		uint32_t id = ops[1];
  902|  2.15k|		uint32_t type = ops[0];
  903|  2.15k|		ir.make_constant_null(id, type, true);
  904|  2.15k|		break;
  905|     55|	}
  906|       |
  907|    253|	case OpSpecConstantComposite:
  ------------------
  |  Branch (907:2): [True: 253, False: 471k]
  ------------------
  908|  1.08k|	case OpConstantComposite:
  ------------------
  |  Branch (908:2): [True: 834, False: 470k]
  ------------------
  909|  1.08k|	{
  910|  1.08k|		uint32_t id = ops[1];
  911|  1.08k|		uint32_t type = ops[0];
  912|       |
  913|  1.08k|		auto &ctype = get<SPIRType>(type);
  914|       |
  915|       |		// We can have constants which are structs and arrays.
  916|       |		// In this case, our SPIRConstant will be a list of other SPIRConstant ids which we
  917|       |		// can refer to.
  918|  1.08k|		if (ctype.basetype == SPIRType::Struct || !ctype.array.empty())
  ------------------
  |  Branch (918:7): [True: 291, False: 796]
  |  Branch (918:45): [True: 119, False: 677]
  ------------------
  919|    409|		{
  920|    409|			set<SPIRConstant>(id, type, ops + 2, length - 2, op == OpSpecConstantComposite);
  921|    409|		}
  922|    678|		else
  923|    678|		{
  924|    678|			uint32_t elements = length - 2;
  925|    678|			if (elements > 4)
  ------------------
  |  Branch (925:8): [True: 1, False: 677]
  ------------------
  926|      1|				SPIRV_CROSS_THROW("OpConstantComposite only supports 1, 2, 3 and 4 elements.");
  ------------------
  |  |   76|      1|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  927|       |
  928|    677|			SPIRConstant remapped_constant_ops[4];
  929|    677|			const SPIRConstant *c[4];
  930|  2.65k|			for (uint32_t i = 0; i < elements; i++)
  ------------------
  |  Branch (930:25): [True: 1.97k, False: 677]
  ------------------
  931|  1.97k|			{
  932|       |				// Specialization constants operations can also be part of this.
  933|       |				// We do not know their value, so any attempt to query SPIRConstant later
  934|       |				// will fail. We can only propagate the ID of the expression and use to_expression on it.
  935|  1.97k|				auto *constant_op = maybe_get<SPIRConstantOp>(ops[2 + i]);
  936|  1.97k|				auto *undef_op = maybe_get<SPIRUndef>(ops[2 + i]);
  937|  1.97k|				if (constant_op)
  ------------------
  |  Branch (937:9): [True: 0, False: 1.97k]
  ------------------
  938|      0|				{
  939|      0|					if (op == OpConstantComposite)
  ------------------
  |  Branch (939:10): [True: 0, False: 0]
  ------------------
  940|      0|						SPIRV_CROSS_THROW("Specialization constant operation used in OpConstantComposite.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  941|       |
  942|      0|					remapped_constant_ops[i].make_null(get<SPIRType>(constant_op->basetype));
  943|      0|					remapped_constant_ops[i].self = constant_op->self;
  944|      0|					remapped_constant_ops[i].constant_type = constant_op->basetype;
  945|      0|					remapped_constant_ops[i].specialization = true;
  946|      0|					c[i] = &remapped_constant_ops[i];
  947|      0|				}
  948|  1.97k|				else if (undef_op)
  ------------------
  |  Branch (948:14): [True: 0, False: 1.97k]
  ------------------
  949|      0|				{
  950|       |					// Undefined, just pick 0.
  951|      0|					remapped_constant_ops[i].make_null(get<SPIRType>(undef_op->basetype));
  952|      0|					remapped_constant_ops[i].constant_type = undef_op->basetype;
  953|      0|					c[i] = &remapped_constant_ops[i];
  954|      0|				}
  955|  1.97k|				else
  956|  1.97k|					c[i] = &get<SPIRConstant>(ops[2 + i]);
  957|  1.97k|			}
  958|    677|			set<SPIRConstant>(id, type, c, elements, op == OpSpecConstantComposite);
  959|    677|		}
  960|  1.08k|		break;
  961|  1.08k|	}
  962|       |
  963|       |	// Functions
  964|  1.08k|	case OpFunction:
  ------------------
  |  Branch (964:2): [True: 451, False: 471k]
  ------------------
  965|    451|	{
  966|    451|		uint32_t res = ops[0];
  967|    451|		uint32_t id = ops[1];
  968|       |		// Control
  969|    451|		uint32_t type = ops[3];
  970|       |
  971|    451|		if (current_function)
  ------------------
  |  Branch (971:7): [True: 1, False: 450]
  ------------------
  972|      1|			SPIRV_CROSS_THROW("Must end a function before starting a new one!");
  ------------------
  |  |   76|      1|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  973|       |
  974|    450|		current_function = &set<SPIRFunction>(id, res, type);
  975|    450|		break;
  976|    451|	}
  977|       |
  978|    168|	case OpFunctionParameter:
  ------------------
  |  Branch (978:2): [True: 168, False: 471k]
  ------------------
  979|    168|	{
  980|    168|		uint32_t type = ops[0];
  981|    168|		uint32_t id = ops[1];
  982|       |
  983|    168|		if (!current_function)
  ------------------
  |  Branch (983:7): [True: 2, False: 166]
  ------------------
  984|      2|			SPIRV_CROSS_THROW("Must be in a function!");
  ------------------
  |  |   76|      2|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  985|       |
  986|    166|		current_function->add_parameter(type, id);
  987|    166|		set<SPIRVariable>(id, type, StorageClassFunction);
  988|    166|		break;
  989|    168|	}
  990|       |
  991|  1.12k|	case OpFunctionEnd:
  ------------------
  |  Branch (991:2): [True: 1.12k, False: 470k]
  ------------------
  992|  1.12k|	{
  993|  1.12k|		if (current_block)
  ------------------
  |  Branch (993:7): [True: 3, False: 1.12k]
  ------------------
  994|      3|		{
  995|       |			// Very specific error message, but seems to come up quite often.
  996|      3|			SPIRV_CROSS_THROW(
  ------------------
  |  |   76|      3|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  997|      3|			    "Cannot end a function before ending the current block.\n"
  998|      3|			    "Likely cause: If this SPIR-V was created from glslang HLSL, make sure the entry point is valid.");
  999|      3|		}
 1000|  1.12k|		current_function = nullptr;
 1001|  1.12k|		break;
 1002|  1.12k|	}
 1003|       |
 1004|       |	// Blocks
 1005|  9.81k|	case OpLabel:
  ------------------
  |  Branch (1005:2): [True: 9.81k, False: 461k]
  ------------------
 1006|  9.81k|	{
 1007|       |		// OpLabel always starts a block.
 1008|  9.81k|		if (!current_function)
  ------------------
  |  Branch (1008:7): [True: 4, False: 9.81k]
  ------------------
 1009|      4|			SPIRV_CROSS_THROW("Blocks cannot exist outside functions!");
  ------------------
  |  |   76|      4|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1010|       |
 1011|  9.81k|		uint32_t id = ops[0];
 1012|       |
 1013|  9.81k|		current_function->blocks.push_back(id);
 1014|  9.81k|		if (!current_function->entry_block)
  ------------------
  |  Branch (1014:7): [True: 450, False: 9.36k]
  ------------------
 1015|    450|			current_function->entry_block = id;
 1016|       |
 1017|  9.81k|		if (current_block)
  ------------------
  |  Branch (1017:7): [True: 11, False: 9.80k]
  ------------------
 1018|     11|			SPIRV_CROSS_THROW("Cannot start a block before ending the current block.");
  ------------------
  |  |   76|     11|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1019|       |
 1020|  9.80k|		current_block = &set<SPIRBlock>(id);
 1021|  9.80k|		break;
 1022|  9.81k|	}
 1023|       |
 1024|       |	// Branch instructions end blocks.
 1025|  5.55k|	case OpBranch:
  ------------------
  |  Branch (1025:2): [True: 5.55k, False: 466k]
  ------------------
 1026|  5.55k|	{
 1027|  5.55k|		if (!current_block)
  ------------------
  |  Branch (1027:7): [True: 8, False: 5.54k]
  ------------------
 1028|      8|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      8|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1029|       |
 1030|  5.54k|		uint32_t target = ops[0];
 1031|  5.54k|		current_block->terminator = SPIRBlock::Direct;
 1032|  5.54k|		current_block->next_block = target;
 1033|  5.54k|		current_block = nullptr;
 1034|  5.54k|		break;
 1035|  5.55k|	}
 1036|       |
 1037|  2.74k|	case OpBranchConditional:
  ------------------
  |  Branch (1037:2): [True: 2.74k, False: 468k]
  ------------------
 1038|  2.74k|	{
 1039|  2.74k|		if (!current_block)
  ------------------
  |  Branch (1039:7): [True: 0, False: 2.74k]
  ------------------
 1040|      0|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1041|       |
 1042|  2.74k|		current_block->condition = ops[0];
 1043|  2.74k|		current_block->true_block = ops[1];
 1044|  2.74k|		current_block->false_block = ops[2];
 1045|       |
 1046|  2.74k|		current_block->terminator = SPIRBlock::Select;
 1047|       |
 1048|  2.74k|		if (current_block->true_block == current_block->false_block)
  ------------------
  |  Branch (1048:7): [True: 80, False: 2.66k]
  ------------------
 1049|     80|		{
 1050|       |			// Bogus conditional, translate to a direct branch.
 1051|       |			// Avoids some ugly edge cases later when analyzing CFGs.
 1052|       |
 1053|       |			// There are some super jank cases where the merge block is different from the true/false,
 1054|       |			// and later branches can "break" out of the selection construct this way.
 1055|       |			// This is complete nonsense, but CTS hits this case.
 1056|       |			// In this scenario, we should see the selection construct as more of a Switch with one default case.
 1057|       |			// The problem here is that this breaks any attempt to break out of outer switch statements,
 1058|       |			// but it's theoretically solvable if this ever comes up using the ladder breaking system ...
 1059|       |
 1060|     80|			if (current_block->true_block != current_block->next_block &&
  ------------------
  |  Branch (1060:8): [True: 80, False: 0]
  ------------------
 1061|     80|			    current_block->merge == SPIRBlock::MergeSelection)
  ------------------
  |  Branch (1061:8): [True: 28, False: 52]
  ------------------
 1062|     28|			{
 1063|     28|				uint32_t ids = ir.increase_bound_by(2);
 1064|       |
 1065|     28|				auto &type = set<SPIRType>(ids, OpTypeInt);
 1066|     28|				type.basetype = SPIRType::Int;
 1067|     28|				type.width = 32;
 1068|     28|				auto &c = set<SPIRConstant>(ids + 1, ids);
 1069|       |
 1070|     28|				current_block->condition = c.self;
 1071|     28|				current_block->default_block = current_block->true_block;
 1072|     28|				current_block->terminator = SPIRBlock::MultiSelect;
 1073|     28|				ir.block_meta[current_block->next_block] &= ~ParsedIR::BLOCK_META_SELECTION_MERGE_BIT;
 1074|     28|				ir.block_meta[current_block->next_block] |= ParsedIR::BLOCK_META_MULTISELECT_MERGE_BIT;
 1075|     28|			}
 1076|     52|			else
 1077|     52|			{
 1078|       |				// Collapse loops if we have to.
 1079|     52|				bool collapsed_loop = current_block->true_block == current_block->merge_block &&
  ------------------
  |  Branch (1079:27): [True: 41, False: 11]
  ------------------
 1080|     52|				                      current_block->merge == SPIRBlock::MergeLoop;
  ------------------
  |  Branch (1080:27): [True: 41, False: 0]
  ------------------
 1081|       |
 1082|     52|				if (collapsed_loop)
  ------------------
  |  Branch (1082:9): [True: 41, False: 11]
  ------------------
 1083|     41|				{
 1084|     41|					ir.block_meta[current_block->merge_block] &= ~ParsedIR::BLOCK_META_LOOP_MERGE_BIT;
 1085|     41|					ir.block_meta[current_block->continue_block] &= ~ParsedIR::BLOCK_META_CONTINUE_BIT;
 1086|     41|				}
 1087|       |
 1088|     52|				current_block->next_block = current_block->true_block;
 1089|     52|				current_block->condition = 0;
 1090|     52|				current_block->true_block = 0;
 1091|     52|				current_block->false_block = 0;
 1092|     52|				current_block->merge_block = 0;
 1093|     52|				current_block->merge = SPIRBlock::MergeNone;
 1094|     52|				current_block->terminator = SPIRBlock::Direct;
 1095|     52|			}
 1096|     80|		}
 1097|       |
 1098|  2.74k|		current_block = nullptr;
 1099|  2.74k|		break;
 1100|  2.74k|	}
 1101|       |
 1102|    539|	case OpSwitch:
  ------------------
  |  Branch (1102:2): [True: 539, False: 471k]
  ------------------
 1103|    539|	{
 1104|    539|		if (!current_block)
  ------------------
  |  Branch (1104:7): [True: 0, False: 539]
  ------------------
 1105|      0|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1106|       |
 1107|    539|		current_block->terminator = SPIRBlock::MultiSelect;
 1108|       |
 1109|    539|		current_block->condition = ops[0];
 1110|    539|		current_block->default_block = ops[1];
 1111|       |
 1112|    539|		uint32_t remaining_ops = length - 2;
 1113|    539|		if ((remaining_ops % 2) == 0)
  ------------------
  |  Branch (1113:7): [True: 538, False: 1]
  ------------------
 1114|    538|		{
 1115|  1.52k|			for (uint32_t i = 2; i + 2 <= length; i += 2)
  ------------------
  |  Branch (1115:25): [True: 983, False: 538]
  ------------------
 1116|    983|				current_block->cases_32bit.push_back({ ops[i], ops[i + 1] });
 1117|    538|		}
 1118|       |
 1119|    539|		if ((remaining_ops % 3) == 0)
  ------------------
  |  Branch (1119:7): [True: 474, False: 65]
  ------------------
 1120|    474|		{
 1121|    692|			for (uint32_t i = 2; i + 3 <= length; i += 3)
  ------------------
  |  Branch (1121:25): [True: 218, False: 474]
  ------------------
 1122|    218|			{
 1123|    218|				uint64_t value = (static_cast<uint64_t>(ops[i + 1]) << 32) | ops[i];
 1124|    218|				current_block->cases_64bit.push_back({ value, ops[i + 2] });
 1125|    218|			}
 1126|    474|		}
 1127|       |
 1128|       |		// If we jump to next block, make it break instead since we're inside a switch case block at that point.
 1129|    539|		ir.block_meta[current_block->next_block] |= ParsedIR::BLOCK_META_MULTISELECT_MERGE_BIT;
 1130|       |
 1131|    539|		current_block = nullptr;
 1132|    539|		break;
 1133|    539|	}
 1134|       |
 1135|     19|	case OpKill:
  ------------------
  |  Branch (1135:2): [True: 19, False: 471k]
  ------------------
 1136|     19|	case OpTerminateInvocation:
  ------------------
  |  Branch (1136:2): [True: 0, False: 471k]
  ------------------
 1137|     19|	{
 1138|     19|		if (!current_block)
  ------------------
  |  Branch (1138:7): [True: 0, False: 19]
  ------------------
 1139|      0|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1140|     19|		current_block->terminator = SPIRBlock::Kill;
 1141|     19|		current_block = nullptr;
 1142|     19|		break;
 1143|     19|	}
 1144|       |
 1145|      0|	case OpTerminateRayKHR:
  ------------------
  |  Branch (1145:2): [True: 0, False: 471k]
  ------------------
 1146|       |		// NV variant is not a terminator.
 1147|      0|		if (!current_block)
  ------------------
  |  Branch (1147:7): [True: 0, False: 0]
  ------------------
 1148|      0|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1149|      0|		current_block->terminator = SPIRBlock::TerminateRay;
 1150|      0|		current_block = nullptr;
 1151|      0|		break;
 1152|       |
 1153|      0|	case OpIgnoreIntersectionKHR:
  ------------------
  |  Branch (1153:2): [True: 0, False: 471k]
  ------------------
 1154|       |		// NV variant is not a terminator.
 1155|      0|		if (!current_block)
  ------------------
  |  Branch (1155:7): [True: 0, False: 0]
  ------------------
 1156|      0|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1157|      0|		current_block->terminator = SPIRBlock::IgnoreIntersection;
 1158|      0|		current_block = nullptr;
 1159|      0|		break;
 1160|       |
 1161|      0|	case OpEmitMeshTasksEXT:
  ------------------
  |  Branch (1161:2): [True: 0, False: 471k]
  ------------------
 1162|      0|		if (!current_block)
  ------------------
  |  Branch (1162:7): [True: 0, False: 0]
  ------------------
 1163|      0|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1164|      0|		current_block->terminator = SPIRBlock::EmitMeshTasks;
 1165|      0|		for (uint32_t i = 0; i < 3; i++)
  ------------------
  |  Branch (1165:24): [True: 0, False: 0]
  ------------------
 1166|      0|			current_block->mesh.groups[i] = ops[i];
 1167|      0|		current_block->mesh.payload = length >= 4 ? ops[3] : 0;
  ------------------
  |  Branch (1167:33): [True: 0, False: 0]
  ------------------
 1168|      0|		current_block = nullptr;
 1169|       |		// Currently glslang is bugged and does not treat EmitMeshTasksEXT as a terminator.
 1170|      0|		ignore_trailing_block_opcodes = true;
 1171|      0|		break;
 1172|       |
 1173|    284|	case OpReturn:
  ------------------
  |  Branch (1173:2): [True: 284, False: 471k]
  ------------------
 1174|    284|	{
 1175|    284|		if (!current_block)
  ------------------
  |  Branch (1175:7): [True: 1, False: 283]
  ------------------
 1176|      1|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      1|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1177|    283|		current_block->terminator = SPIRBlock::Return;
 1178|    283|		current_block = nullptr;
 1179|    283|		break;
 1180|    284|	}
 1181|       |
 1182|    135|	case OpReturnValue:
  ------------------
  |  Branch (1182:2): [True: 135, False: 471k]
  ------------------
 1183|    135|	{
 1184|    135|		if (!current_block)
  ------------------
  |  Branch (1184:7): [True: 1, False: 134]
  ------------------
 1185|      1|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      1|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1186|    134|		current_block->terminator = SPIRBlock::Return;
 1187|    134|		current_block->return_value = ops[0];
 1188|    134|		current_block = nullptr;
 1189|    134|		break;
 1190|    135|	}
 1191|       |
 1192|    432|	case OpUnreachable:
  ------------------
  |  Branch (1192:2): [True: 432, False: 471k]
  ------------------
 1193|    432|	{
 1194|    432|		if (!current_block)
  ------------------
  |  Branch (1194:7): [True: 0, False: 432]
  ------------------
 1195|      0|			SPIRV_CROSS_THROW("Trying to end a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1196|    432|		current_block->terminator = SPIRBlock::Unreachable;
 1197|    432|		current_block = nullptr;
 1198|    432|		break;
 1199|    432|	}
 1200|       |
 1201|  2.30k|	case OpSelectionMerge:
  ------------------
  |  Branch (1201:2): [True: 2.30k, False: 469k]
  ------------------
 1202|  2.30k|	{
 1203|  2.30k|		if (!current_block)
  ------------------
  |  Branch (1203:7): [True: 0, False: 2.30k]
  ------------------
 1204|      0|			SPIRV_CROSS_THROW("Trying to modify a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1205|       |
 1206|  2.30k|		current_block->next_block = ops[0];
 1207|  2.30k|		current_block->merge = SPIRBlock::MergeSelection;
 1208|  2.30k|		ir.block_meta[current_block->next_block] |= ParsedIR::BLOCK_META_SELECTION_MERGE_BIT;
 1209|       |
 1210|  2.30k|		if (length >= 2)
  ------------------
  |  Branch (1210:7): [True: 2.30k, False: 0]
  ------------------
 1211|  2.30k|		{
 1212|  2.30k|			if (ops[1] & SelectionControlFlattenMask)
  ------------------
  |  Branch (1212:8): [True: 18, False: 2.28k]
  ------------------
 1213|     18|				current_block->hint = SPIRBlock::HintFlatten;
 1214|  2.28k|			else if (ops[1] & SelectionControlDontFlattenMask)
  ------------------
  |  Branch (1214:13): [True: 127, False: 2.16k]
  ------------------
 1215|    127|				current_block->hint = SPIRBlock::HintDontFlatten;
 1216|  2.30k|		}
 1217|  2.30k|		break;
 1218|  2.30k|	}
 1219|       |
 1220|  4.40k|	case OpLoopMerge:
  ------------------
  |  Branch (1220:2): [True: 4.40k, False: 467k]
  ------------------
 1221|  4.40k|	{
 1222|  4.40k|		if (!current_block)
  ------------------
  |  Branch (1222:7): [True: 0, False: 4.40k]
  ------------------
 1223|      0|			SPIRV_CROSS_THROW("Trying to modify a non-existing block.");
  ------------------
  |  |   76|      0|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1224|       |
 1225|  4.40k|		current_block->merge_block = ops[0];
 1226|  4.40k|		current_block->continue_block = ops[1];
 1227|  4.40k|		current_block->merge = SPIRBlock::MergeLoop;
 1228|       |
 1229|  4.40k|		ir.block_meta[current_block->self] |= ParsedIR::BLOCK_META_LOOP_HEADER_BIT;
 1230|  4.40k|		ir.block_meta[current_block->merge_block] |= ParsedIR::BLOCK_META_LOOP_MERGE_BIT;
 1231|       |
 1232|  4.40k|		ir.continue_block_to_loop_header[current_block->continue_block] = BlockID(current_block->self);
 1233|       |
 1234|       |		// Don't add loop headers to continue blocks,
 1235|       |		// which would make it impossible branch into the loop header since
 1236|       |		// they are treated as continues.
 1237|  4.40k|		if (current_block->continue_block != BlockID(current_block->self))
  ------------------
  |  Branch (1237:7): [True: 2.67k, False: 1.72k]
  ------------------
 1238|  2.67k|			ir.block_meta[current_block->continue_block] |= ParsedIR::BLOCK_META_CONTINUE_BIT;
 1239|       |
 1240|  4.40k|		if (length >= 3)
  ------------------
  |  Branch (1240:7): [True: 4.37k, False: 27]
  ------------------
 1241|  4.37k|		{
 1242|  4.37k|			if (ops[2] & LoopControlUnrollMask)
  ------------------
  |  Branch (1242:8): [True: 2.56k, False: 1.81k]
  ------------------
 1243|  2.56k|				current_block->hint = SPIRBlock::HintUnroll;
 1244|  1.81k|			else if (ops[2] & LoopControlDontUnrollMask)
  ------------------
  |  Branch (1244:13): [True: 289, False: 1.52k]
  ------------------
 1245|    289|				current_block->hint = SPIRBlock::HintDontUnroll;
 1246|  4.37k|		}
 1247|  4.40k|		break;
 1248|  4.40k|	}
 1249|       |
 1250|    794|	case OpSpecConstantOp:
  ------------------
  |  Branch (1250:2): [True: 794, False: 470k]
  ------------------
 1251|    794|	{
 1252|    794|		if (length < 3)
  ------------------
  |  Branch (1252:7): [True: 3, False: 791]
  ------------------
 1253|      3|			SPIRV_CROSS_THROW("OpSpecConstantOp not enough arguments.");
  ------------------
  |  |   76|      3|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1254|       |
 1255|    791|		uint32_t result_type = ops[0];
 1256|    791|		uint32_t id = ops[1];
 1257|    791|		auto spec_op = static_cast<Op>(ops[2]);
 1258|       |
 1259|    791|		set<SPIRConstantOp>(id, result_type, spec_op, ops + 3, length - 3);
 1260|    791|		break;
 1261|    794|	}
 1262|       |
 1263|  18.5k|	case OpLine:
  ------------------
  |  Branch (1263:2): [True: 18.5k, False: 453k]
  ------------------
 1264|  18.5k|	{
 1265|       |		// OpLine might come at global scope, but we don't care about those since they will not be declared in any
 1266|       |		// meaningful correct order.
 1267|       |		// Ignore all OpLine directives which live outside a function.
 1268|  18.5k|		if (current_block)
  ------------------
  |  Branch (1268:7): [True: 0, False: 18.5k]
  ------------------
 1269|      0|			current_block->ops.push_back(instruction);
 1270|       |
 1271|       |		// Line directives may arrive before first OpLabel.
 1272|       |		// Treat this as the line of the function declaration,
 1273|       |		// so warnings for arguments can propagate properly.
 1274|  18.5k|		if (current_function)
  ------------------
  |  Branch (1274:7): [True: 0, False: 18.5k]
  ------------------
 1275|      0|		{
 1276|       |			// Store the first one we find and emit it before creating the function prototype.
 1277|      0|			if (current_function->entry_line.file_id == 0)
  ------------------
  |  Branch (1277:8): [True: 0, False: 0]
  ------------------
 1278|      0|			{
 1279|      0|				current_function->entry_line.file_id = ops[0];
 1280|      0|				current_function->entry_line.line_literal = ops[1];
 1281|      0|			}
 1282|      0|		}
 1283|  18.5k|		break;
 1284|    794|	}
 1285|       |
 1286|      8|	case OpNoLine:
  ------------------
  |  Branch (1286:2): [True: 8, False: 471k]
  ------------------
 1287|      8|	{
 1288|       |		// OpNoLine might come at global scope.
 1289|      8|		if (current_block)
  ------------------
  |  Branch (1289:7): [True: 0, False: 8]
  ------------------
 1290|      0|			current_block->ops.push_back(instruction);
 1291|      8|		break;
 1292|    794|	}
 1293|       |
 1294|       |	// Actual opcodes.
 1295|  22.9k|	default:
  ------------------
  |  Branch (1295:2): [True: 22.9k, False: 448k]
  ------------------
 1296|  22.9k|	{
 1297|  22.9k|		if (length >= 2)
  ------------------
  |  Branch (1297:7): [True: 22.9k, False: 39]
  ------------------
 1298|  22.9k|		{
 1299|  22.9k|			const auto *type = maybe_get<SPIRType>(ops[0]);
 1300|  22.9k|			if (type)
  ------------------
  |  Branch (1300:8): [True: 17.6k, False: 5.29k]
  ------------------
 1301|  17.6k|				ir.load_type_width.insert({ ops[1], type->width });
 1302|  22.9k|		}
 1303|       |
 1304|  22.9k|		if (!current_block)
  ------------------
  |  Branch (1304:7): [True: 60, False: 22.8k]
  ------------------
 1305|     60|			SPIRV_CROSS_THROW("Currently no block to insert opcode.");
  ------------------
  |  |   76|     60|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
 1306|       |
 1307|  22.8k|		current_block->ops.push_back(instruction);
 1308|  22.8k|		break;
 1309|  22.9k|	}
 1310|   471k|	}
 1311|   471k|}
_ZNK11spirv_cross6Parser30types_are_logically_equivalentERKNS_8SPIRTypeES3_:
 1314|  3.11k|{
 1315|  3.11k|	if (a.basetype != b.basetype)
  ------------------
  |  Branch (1315:6): [True: 0, False: 3.11k]
  ------------------
 1316|      0|		return false;
 1317|  3.11k|	if (a.width != b.width)
  ------------------
  |  Branch (1317:6): [True: 0, False: 3.11k]
  ------------------
 1318|      0|		return false;
 1319|  3.11k|	if (a.vecsize != b.vecsize)
  ------------------
  |  Branch (1319:6): [True: 17, False: 3.09k]
  ------------------
 1320|     17|		return false;
 1321|  3.09k|	if (a.columns != b.columns)
  ------------------
  |  Branch (1321:6): [True: 3, False: 3.09k]
  ------------------
 1322|      3|		return false;
 1323|  3.09k|	if (a.array.size() != b.array.size())
  ------------------
  |  Branch (1323:6): [True: 0, False: 3.09k]
  ------------------
 1324|      0|		return false;
 1325|       |
 1326|  3.09k|	size_t array_count = a.array.size();
 1327|  3.09k|	if (array_count && memcmp(a.array.data(), b.array.data(), array_count * sizeof(uint32_t)) != 0)
  ------------------
  |  Branch (1327:6): [True: 224, False: 2.86k]
  |  Branch (1327:21): [True: 0, False: 224]
  ------------------
 1328|      0|		return false;
 1329|       |
 1330|  3.09k|	if (a.basetype == SPIRType::Image || a.basetype == SPIRType::SampledImage)
  ------------------
  |  Branch (1330:6): [True: 16, False: 3.07k]
  |  Branch (1330:39): [True: 0, False: 3.07k]
  ------------------
 1331|     16|	{
 1332|     16|		if (memcmp(&a.image, &b.image, sizeof(SPIRType::Image)) != 0)
  ------------------
  |  Branch (1332:7): [True: 0, False: 16]
  ------------------
 1333|      0|			return false;
 1334|     16|	}
 1335|       |
 1336|  3.09k|	if (a.member_types.size() != b.member_types.size())
  ------------------
  |  Branch (1336:6): [True: 0, False: 3.09k]
  ------------------
 1337|      0|		return false;
 1338|       |
 1339|  3.09k|	size_t member_types = a.member_types.size();
 1340|  4.83k|	for (size_t i = 0; i < member_types; i++)
  ------------------
  |  Branch (1340:21): [True: 1.75k, False: 3.07k]
  ------------------
 1341|  1.75k|	{
 1342|  1.75k|		if (!types_are_logically_equivalent(get<SPIRType>(a.member_types[i]), get<SPIRType>(b.member_types[i])))
  ------------------
  |  Branch (1342:7): [True: 20, False: 1.73k]
  ------------------
 1343|     20|			return false;
 1344|  1.75k|	}
 1345|       |
 1346|  3.07k|	return true;
 1347|  3.09k|}
spirv_parser.cpp:_ZN11spirv_crossL11swap_endianEj:
   55|    600|{
   56|    600|	return ((v >> 24) & 0x000000ffu) | ((v >> 8) & 0x0000ff00u) | ((v << 8) & 0x00ff0000u) | ((v << 24) & 0xff000000u);
   57|    600|}
spirv_parser.cpp:_ZN11spirv_crossL22is_valid_spirv_versionEj:
   60|    600|{
   61|    600|	switch (version)
   62|    600|	{
   63|       |	// Allow v99 since it tends to just work.
   64|      0|	case 99:
  ------------------
  |  Branch (64:2): [True: 0, False: 600]
  ------------------
   65|      0|	case 0x10000: // SPIR-V 1.0
  ------------------
  |  Branch (65:2): [True: 0, False: 600]
  ------------------
   66|      0|	case 0x10100: // SPIR-V 1.1
  ------------------
  |  Branch (66:2): [True: 0, False: 600]
  ------------------
   67|      0|	case 0x10200: // SPIR-V 1.2
  ------------------
  |  Branch (67:2): [True: 0, False: 600]
  ------------------
   68|      0|	case 0x10300: // SPIR-V 1.3
  ------------------
  |  Branch (68:2): [True: 0, False: 600]
  ------------------
   69|      0|	case 0x10400: // SPIR-V 1.4
  ------------------
  |  Branch (69:2): [True: 0, False: 600]
  ------------------
   70|      0|	case 0x10500: // SPIR-V 1.5
  ------------------
  |  Branch (70:2): [True: 0, False: 600]
  ------------------
   71|    600|	case 0x10600: // SPIR-V 1.6
  ------------------
  |  Branch (71:2): [True: 600, False: 0]
  ------------------
   72|    600|		return true;
   73|       |
   74|      0|	default:
  ------------------
  |  Branch (74:2): [True: 0, False: 600]
  ------------------
   75|      0|		return false;
   76|    600|	}
   77|    600|}
spirv_parser.cpp:_ZN11spirv_crossL14extract_stringERKNSt3__16vectorIjNS0_9allocatorIjEEEEj:
  162|   327k|{
  163|   327k|	string ret;
  164|   338k|	for (uint32_t i = offset; i < spirv.size(); i++)
  ------------------
  |  Branch (164:28): [True: 338k, False: 29]
  ------------------
  165|   338k|	{
  166|   338k|		uint32_t w = spirv[i];
  167|       |
  168|   716k|		for (uint32_t j = 0; j < 4; j++, w >>= 8)
  ------------------
  |  Branch (168:24): [True: 704k, False: 11.4k]
  ------------------
  169|   704k|		{
  170|   704k|			char c = w & 0xff;
  171|   704k|			if (c == '\0')
  ------------------
  |  Branch (171:8): [True: 327k, False: 377k]
  ------------------
  172|   327k|				return ret;
  173|   377k|			ret += c;
  174|   377k|		}
  175|   338k|	}
  176|       |
  177|     29|	SPIRV_CROSS_THROW("String was not terminated before EOF");
  ------------------
  |  |   76|     29|#define SPIRV_CROSS_THROW(x) throw CompilerError(x)
  ------------------
  178|   327k|}
spirv_parser.cpp:_ZZN11spirv_cross6Parser5parseERKNS_11InstructionEENK3$_0clEj:
  427|  13.2k|			flags.for_each_bit([&](uint32_t bit) {
  428|  13.2k|				auto decoration = static_cast<Decoration>(bit);
  429|       |
  430|  13.2k|				if (decoration_is_string(decoration))
  ------------------
  |  Branch (430:9): [True: 1.20k, False: 12.0k]
  ------------------
  431|  1.20k|				{
  432|  1.20k|					ir.set_decoration_string(target, decoration, ir.get_decoration_string(group_id, decoration));
  433|  1.20k|				}
  434|  12.0k|				else
  435|  12.0k|				{
  436|  12.0k|					ir.meta[target].decoration_word_offset[decoration] =
  437|  12.0k|					    ir.meta[group_id].decoration_word_offset[decoration];
  438|  12.0k|					ir.set_decoration(target, decoration, ir.get_decoration(group_id, decoration));
  439|  12.0k|				}
  440|  13.2k|			});
spirv_parser.cpp:_ZN11spirv_crossL20decoration_is_stringEN3spv10DecorationE:
   43|  22.1k|{
   44|  22.1k|	switch (decoration)
   45|  22.1k|	{
   46|  2.77k|	case DecorationHlslSemanticGOOGLE:
  ------------------
  |  Branch (46:2): [True: 2.77k, False: 19.3k]
  ------------------
   47|  2.77k|		return true;
   48|       |
   49|  19.3k|	default:
  ------------------
  |  Branch (49:2): [True: 19.3k, False: 2.77k]
  ------------------
   50|  19.3k|		return false;
   51|  22.1k|	}
   52|  22.1k|}
spirv_parser.cpp:_ZZN11spirv_cross6Parser5parseERKNS_11InstructionEENK3$_1clEj:
  456|  8.86k|			flags.for_each_bit([&](uint32_t bit) {
  457|  8.86k|				auto decoration = static_cast<Decoration>(bit);
  458|       |
  459|  8.86k|				if (decoration_is_string(decoration))
  ------------------
  |  Branch (459:9): [True: 1.57k, False: 7.28k]
  ------------------
  460|  1.57k|					ir.set_member_decoration_string(target, index, decoration,
  461|  1.57k|					                                ir.get_decoration_string(group_id, decoration));
  462|  7.28k|				else
  463|  7.28k|					ir.set_member_decoration(target, index, decoration, ir.get_decoration(group_id, decoration));
  464|  8.86k|			});

_ZN11spirv_cross6Parser13get_parsed_irEv:
   41|    600|	{
   42|    600|		return ir;
   43|    600|	}
_ZN11spirv_cross6Parser3getINS_8SPIRTypeEEERT_j:
   66|  38.9k|	{
   67|  38.9k|		return variant_get<T>(ir.ids[id]);
   68|  38.9k|	}
_ZN11spirv_cross6Parser3setINS_10SPIRStringEJNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEERT_jDpOT0_:
   57|    886|	{
   58|    886|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|    886|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|    886|		var.self = id;
   61|    886|		return var;
   62|    886|	}
_ZN11spirv_cross6Parser3setINS_9SPIRUndefEJRjEEERT_jDpOT0_:
   57|  1.81k|	{
   58|  1.81k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  1.81k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  1.81k|		var.self = id;
   61|  1.81k|		return var;
   62|  1.81k|	}
_ZN11spirv_cross6Parser3setINS_13SPIRExtensionEJRNS2_9ExtensionEEEERT_jDpOT0_:
   57|    508|	{
   58|    508|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|    508|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|    508|		var.self = id;
   61|    508|		return var;
   62|    508|	}
_ZN11spirv_cross6Parser9maybe_getINS_8SPIRTypeEEEPT_j:
   72|  32.4k|	{
   73|  32.4k|		if (ir.ids[id].get_type() == static_cast<Types>(T::type))
  ------------------
  |  Branch (73:7): [True: 26.7k, False: 5.65k]
  ------------------
   74|  26.7k|			return &get<T>(id);
   75|  5.65k|		else
   76|  5.65k|			return nullptr;
   77|  32.4k|	}
_ZN11spirv_cross6Parser3setINS_8SPIRTypeEJRN3spv2OpEEEERT_jDpOT0_:
   57|  18.7k|	{
   58|  18.7k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  18.7k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  18.7k|		var.self = id;
   61|  18.7k|		return var;
   62|  18.7k|	}
_ZN11spirv_cross6Parser3setINS_8SPIRTypeEJRS2_EEERT_jDpOT0_:
   57|  3.45k|	{
   58|  3.45k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  3.45k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  3.45k|		var.self = id;
   61|  3.45k|		return var;
   62|  3.45k|	}
_ZN11spirv_cross6Parser9maybe_getINS_12SPIRConstantEEEPT_j:
   72|    383|	{
   73|    383|		if (ir.ids[id].get_type() == static_cast<Types>(T::type))
  ------------------
  |  Branch (73:7): [True: 383, False: 0]
  ------------------
   74|    383|			return &get<T>(id);
   75|      0|		else
   76|      0|			return nullptr;
   77|    383|	}
_ZN11spirv_cross6Parser3setINS_21SPIRFunctionPrototypeEJRjEEERT_jDpOT0_:
   57|  5.83k|	{
   58|  5.83k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  5.83k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  5.83k|		var.self = id;
   61|  5.83k|		return var;
   62|  5.83k|	}
_ZN11spirv_cross6Parser3setINS_12SPIRVariableEJRjRN3spv12StorageClassES3_EEERT_jDpOT0_:
   57|  6.43k|	{
   58|  6.43k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  6.43k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  6.43k|		var.self = id;
   61|  6.43k|		return var;
   62|  6.43k|	}
_ZN11spirv_cross6Parser3setINS_12SPIRVariableEJRjN3spv12StorageClassEEEERT_jDpOT0_:
   57|  3.07k|	{
   58|  3.07k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  3.07k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  3.07k|		var.self = id;
   61|  3.07k|		return var;
   62|  3.07k|	}
_ZN11spirv_cross6Parser3setINS_12SPIRConstantEJRKjmbEEERT_jDpOT0_:
   57|     18|	{
   58|     18|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|     18|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|     18|		var.self = id;
   61|     18|		return var;
   62|     18|	}
_ZN11spirv_cross6Parser3setINS_12SPIRConstantEJRKjS4_bEEERT_jDpOT0_:
   57|  3.90k|	{
   58|  3.90k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  3.90k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  3.90k|		var.self = id;
   61|  3.90k|		return var;
   62|  3.90k|	}
_ZN11spirv_cross6Parser3setINS_12SPIRConstantEJRKjjbEEERT_jDpOT0_:
   57|    613|	{
   58|    613|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|    613|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|    613|		var.self = id;
   61|    613|		return var;
   62|    613|	}
_ZN11spirv_cross6Parser3setINS_12SPIRConstantEJRjPKjjbEEERT_jDpOT0_:
   57|    409|	{
   58|    409|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|    409|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|    409|		var.self = id;
   61|    409|		return var;
   62|    409|	}
_ZN11spirv_cross6Parser9maybe_getINS_14SPIRConstantOpEEEPT_j:
   72|  1.97k|	{
   73|  1.97k|		if (ir.ids[id].get_type() == static_cast<Types>(T::type))
  ------------------
  |  Branch (73:7): [True: 0, False: 1.97k]
  ------------------
   74|      0|			return &get<T>(id);
   75|  1.97k|		else
   76|  1.97k|			return nullptr;
   77|  1.97k|	}
_ZN11spirv_cross6Parser9maybe_getINS_9SPIRUndefEEEPT_j:
   72|  1.97k|	{
   73|  1.97k|		if (ir.ids[id].get_type() == static_cast<Types>(T::type))
  ------------------
  |  Branch (73:7): [True: 0, False: 1.97k]
  ------------------
   74|      0|			return &get<T>(id);
   75|  1.97k|		else
   76|  1.97k|			return nullptr;
   77|  1.97k|	}
_ZN11spirv_cross6Parser3getINS_12SPIRConstantEEERT_j:
   66|  2.36k|	{
   67|  2.36k|		return variant_get<T>(ir.ids[id]);
   68|  2.36k|	}
_ZN11spirv_cross6Parser3setINS_12SPIRConstantEJRjRA4_PKS2_S3_bEEERT_jDpOT0_:
   57|    669|	{
   58|    669|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|    669|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|    669|		var.self = id;
   61|    669|		return var;
   62|    669|	}
_ZN11spirv_cross6Parser3setINS_12SPIRFunctionEJRjS3_EEERT_jDpOT0_:
   57|    450|	{
   58|    450|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|    450|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|    450|		var.self = id;
   61|    450|		return var;
   62|    450|	}
_ZN11spirv_cross6Parser3setINS_9SPIRBlockEJEEERT_jDpOT0_:
   57|  9.80k|	{
   58|  9.80k|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|  9.80k|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|  9.80k|		var.self = id;
   61|  9.80k|		return var;
   62|  9.80k|	}
_ZN11spirv_cross6Parser3setINS_8SPIRTypeEJN3spv2OpEEEERT_jDpOT0_:
   57|     28|	{
   58|     28|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|     28|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|     28|		var.self = id;
   61|     28|		return var;
   62|     28|	}
_ZN11spirv_cross6Parser3setINS_12SPIRConstantEJRjEEERT_jDpOT0_:
   57|     28|	{
   58|     28|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|     28|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|     28|		var.self = id;
   61|     28|		return var;
   62|     28|	}
_ZN11spirv_cross6Parser3setINS_14SPIRConstantOpEJRjRN3spv2OpEPKjjEEERT_jDpOT0_:
   57|    791|	{
   58|    791|		ir.add_typed_id(static_cast<Types>(T::type), id);
   59|    791|		auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
   60|    791|		var.self = id;
   61|    791|		return var;
   62|    791|	}
_ZNK11spirv_cross6Parser3getINS_8SPIRTypeEEERKT_j:
   81|  3.51k|	{
   82|  3.51k|		return variant_get<T>(ir.ids[id]);
   83|  3.51k|	}

