| 301 | } |
| 302 | |
| 303 | uint32_t CombineVariantDefs(const std::vector<VariantDef>& variant_defs, |
| 304 | const std::vector<size_t> var_ids, |
| 305 | IRContext* context, |
| 306 | std::map<std::vector<size_t>, uint32_t>& cache) { |
| 307 | assert(var_ids.size() <= variant_defs.size()); |
| 308 | uint32_t spec_const_comb_id = 0; |
| 309 | if (var_ids.size() != variant_defs.size()) { |
| 310 | // if not used by all variants |
| 311 | if (cache.find(var_ids) == cache.end()) { |
| 312 | // cache variant combinations |
| 313 | std::vector<uint32_t> spec_const_ids; |
| 314 | for (const auto& var_id : var_ids) { |
| 315 | const auto var_name = variant_defs[var_id].GetName(); |
| 316 | const auto var_spec_id = |
| 317 | FindSpecConstByName(context->module(), var_name); |
| 318 | spec_const_ids.push_back(var_spec_id); |
| 319 | } |
| 320 | spec_const_comb_id = |
| 321 | CombineIds(context, spec_const_ids, spv::Op::OpLogicalOr); |
| 322 | assert(spec_const_comb_id != 0); |
| 323 | cache.insert({var_ids, spec_const_comb_id}); |
| 324 | } else { |
| 325 | spec_const_comb_id = cache[var_ids]; |
| 326 | } |
| 327 | } |
| 328 | return spec_const_comb_id; |
| 329 | } |
| 330 | |
| 331 | bool strToInt(std::string s, uint32_t* x) { |
| 332 | for (const char& c : s) { |
no test coverage detected