1 /* 2 * Copyright 2015 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24 #include "vtn_private.h" 25 #include "nir/nir_vla.h" 26 27 static struct vtn_pointer * 28 vtn_pointer_for_image_or_sampler_variable(struct vtn_builder *b, 29 struct vtn_variable *var) 30 { 31 assert(var->type->base_type == vtn_base_type_image || 32 var->type->base_type == vtn_base_type_sampler); 33 34 struct vtn_type *ptr_type = rzalloc(b, struct vtn_type); 35 ptr_type->base_type = vtn_base_type_pointer; 36 ptr_type->storage_class = SpvStorageClassUniformConstant; 37 ptr_type->deref = var->type; 38 39 return vtn_pointer_for_variable(b, var, ptr_type); 40 } 41 42 static bool 43 vtn_cfg_handle_prepass_instruction(struct vtn_builder *b, SpvOp opcode, 44 const uint32_t *w, unsigned count) 45 { 46 switch (opcode) { 47 case SpvOpFunction: { 48 vtn_assert(b->func == NULL); 49 b->func = rzalloc(b, struct vtn_function); 50 51 list_inithead(&b->func->body); 52 b->func->control = w[3]; 53 54 MAYBE_UNUSED const struct glsl_type *result_type = 55 vtn_value(b, w[1], vtn_value_type_type)->type->type; 56 struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_function); 57 val->func = b->func; 58 59 const struct vtn_type *func_type = 60 vtn_value(b, w[4], vtn_value_type_type)->type; 61 62 vtn_assert(func_type->return_type->type == result_type); 63 64 nir_function *func = 65 nir_function_create(b->shader, ralloc_strdup(b->shader, val->name)); 66 67 func->num_params = func_type->length; 68 func->params = ralloc_array(b->shader, nir_parameter, func->num_params); 69 unsigned np = 0; 70 for (unsigned i = 0; i < func_type->length; i++) { 71 if (func_type->params[i]->base_type == vtn_base_type_pointer && 72 func_type->params[i]->type == NULL) { 73 func->params[np].type = func_type->params[i]->deref->type; 74 func->params[np].param_type = nir_parameter_inout; 75 np++; 76 } else if (func_type->params[i]->base_type == 77 vtn_base_type_sampled_image) { 78 /* Sampled images are actually two parameters */ 79 func->params = reralloc(b->shader, func->params, 80 nir_parameter, func->num_params++); 81 func->params[np].type = func_type->params[i]->type; 82 func->params[np].param_type = nir_parameter_in; 83 np++; 84 func->params[np].type = glsl_bare_sampler_type(); 85 func->params[np].param_type = nir_parameter_in; 86 np++; 87 } else { 88 func->params[np].type = func_type->params[i]->type; 89 func->params[np].param_type = nir_parameter_in; 90 np++; 91 } 92 } 93 assert(np == func->num_params); 94 95 func->return_type = func_type->return_type->type; 96 97 b->func->impl = nir_function_impl_create(func); 98 b->nb.cursor = nir_before_cf_list(&b->func->impl->body); 99 100 b->func_param_idx = 0; 101 break; 102 } 103 104 case SpvOpFunctionEnd: 105 b->func->end = w; 106 b->func = NULL; 107 break; 108 109 case SpvOpFunctionParameter: { 110 struct vtn_type *type = vtn_value(b, w[1], vtn_value_type_type)->type; 111 112 vtn_assert(b->func_param_idx < b->func->impl->num_params); 113 nir_variable *param = b->func->impl->params[b->func_param_idx++]; 114 115 if (type->base_type == vtn_base_type_pointer && type->type == NULL) { 116 struct vtn_variable *vtn_var = rzalloc(b, struct vtn_variable); 117 vtn_var->type = type->deref; 118 vtn_var->var = param; 119 120 vtn_assert(vtn_var->type->type == param->type); 121 122 struct vtn_type *without_array = vtn_var->type; 123 while(glsl_type_is_array(without_array->type)) 124 without_array = without_array->array_element; 125 126 if (glsl_type_is_image(without_array->type)) { 127 vtn_var->mode = vtn_variable_mode_image; 128 param->interface_type = without_array->type; 129 } else if (glsl_type_is_sampler(without_array->type)) { 130 vtn_var->mode = vtn_variable_mode_sampler; 131 param->interface_type = without_array->type; 132 } else { 133 vtn_var->mode = vtn_variable_mode_param; 134 } 135 136 struct vtn_value *val = 137 vtn_push_value(b, w[2], vtn_value_type_pointer); 138 139 /* Name the parameter so it shows up nicely in NIR */ 140 param->name = ralloc_strdup(param, val->name); 141 142 val->pointer = vtn_pointer_for_variable(b, vtn_var, type); 143 } else if (type->base_type == vtn_base_type_image || 144 type->base_type == vtn_base_type_sampler || 145 type->base_type == vtn_base_type_sampled_image) { 146 struct vtn_variable *vtn_var = rzalloc(b, struct vtn_variable); 147 vtn_var->type = type; 148 vtn_var->var = param; 149 param->interface_type = param->type; 150 151 if (type->base_type == vtn_base_type_sampled_image) { 152 /* Sampled images are actually two parameters. The first is the 153 * image and the second is the sampler. 154 */ 155 struct vtn_value *val = 156 vtn_push_value(b, w[2], vtn_value_type_sampled_image); 157 158 /* Name the parameter so it shows up nicely in NIR */ 159 param->name = ralloc_strdup(param, val->name); 160 161 /* Adjust the type of the image variable to the image type */ 162 vtn_var->type = type->image; 163 164 /* Now get the sampler parameter and set up its variable */ 165 param = b->func->impl->params[b->func_param_idx++]; 166 struct vtn_variable *sampler_var = rzalloc(b, struct vtn_variable); 167 sampler_var->type = rzalloc(b, struct vtn_type); 168 sampler_var->type->base_type = vtn_base_type_sampler; 169 sampler_var->type->type = glsl_bare_sampler_type(); 170 sampler_var->var = param; 171 param->interface_type = param->type; 172 param->name = ralloc_strdup(param, val->name); 173 174 val->sampled_image = ralloc(b, struct vtn_sampled_image); 175 val->sampled_image->type = type; 176 val->sampled_image->image = 177 vtn_pointer_for_image_or_sampler_variable(b, vtn_var); 178 val->sampled_image->sampler = 179 vtn_pointer_for_image_or_sampler_variable(b, sampler_var); 180 } else { 181 struct vtn_value *val = 182 vtn_push_value(b, w[2], vtn_value_type_pointer); 183 184 /* Name the parameter so it shows up nicely in NIR */ 185 param->name = ralloc_strdup(param, val->name); 186 187 val->pointer = 188 vtn_pointer_for_image_or_sampler_variable(b, vtn_var); 189 } 190 } else { 191 /* We're a regular SSA value. */ 192 struct vtn_ssa_value *param_ssa = 193 vtn_local_load(b, nir_deref_var_create(b, param)); 194 struct vtn_value *val = vtn_push_ssa(b, w[2], type, param_ssa); 195 196 /* Name the parameter so it shows up nicely in NIR */ 197 param->name = ralloc_strdup(param, val->name); 198 } 199 break; 200 } 201 202 case SpvOpLabel: { 203 vtn_assert(b->block == NULL); 204 b->block = rzalloc(b, struct vtn_block); 205 b->block->node.type = vtn_cf_node_type_block; 206 b->block->label = w; 207 vtn_push_value(b, w[1], vtn_value_type_block)->block = b->block; 208 209 if (b->func->start_block == NULL) { 210 /* This is the first block encountered for this function. In this 211 * case, we set the start block and add it to the list of 212 * implemented functions that we'll walk later. 213 */ 214 b->func->start_block = b->block; 215 exec_list_push_tail(&b->functions, &b->func->node); 216 } 217 break; 218 } 219 220 case SpvOpSelectionMerge: 221 case SpvOpLoopMerge: 222 vtn_assert(b->block && b->block->merge == NULL); 223 b->block->merge = w; 224 break; 225 226 case SpvOpBranch: 227 case SpvOpBranchConditional: 228 case SpvOpSwitch: 229 case SpvOpKill: 230 case SpvOpReturn: 231 case SpvOpReturnValue: 232 case SpvOpUnreachable: 233 vtn_assert(b->block && b->block->branch == NULL); 234 b->block->branch = w; 235 b->block = NULL; 236 break; 237 238 default: 239 /* Continue on as per normal */ 240 return true; 241 } 242 243 return true; 244 } 245 246 static void 247 vtn_add_case(struct vtn_builder *b, struct vtn_switch *swtch, 248 struct vtn_block *break_block, 249 uint32_t block_id, uint64_t val, bool is_default) 250 { 251 struct vtn_block *case_block = 252 vtn_value(b, block_id, vtn_value_type_block)->block; 253 254 /* Don't create dummy cases that just break */ 255 if (case_block == break_block) 256 return; 257 258 if (case_block->switch_case == NULL) { 259 struct vtn_case *c = ralloc(b, struct vtn_case); 260 261 list_inithead(&c->body); 262 c->start_block = case_block; 263 c->fallthrough = NULL; 264 util_dynarray_init(&c->values, b); 265 c->is_default = false; 266 c->visited = false; 267 268 list_addtail(&c->link, &swtch->cases); 269 270 case_block->switch_case = c; 271 } 272 273 if (is_default) { 274 case_block->switch_case->is_default = true; 275 } else { 276 util_dynarray_append(&case_block->switch_case->values, uint64_t, val); 277 } 278 } 279 280 /* This function performs a depth-first search of the cases and puts them 281 * in fall-through order. 282 */ 283 static void 284 vtn_order_case(struct vtn_switch *swtch, struct vtn_case *cse) 285 { 286 if (cse->visited) 287 return; 288 289 cse->visited = true; 290 291 list_del(&cse->link); 292 293 if (cse->fallthrough) { 294 vtn_order_case(swtch, cse->fallthrough); 295 296 /* If we have a fall-through, place this case right before the case it 297 * falls through to. This ensures that fallthroughs come one after 298 * the other. These two can never get separated because that would 299 * imply something else falling through to the same case. Also, this 300 * can't break ordering because the DFS ensures that this case is 301 * visited before anything that falls through to it. 302 */ 303 list_addtail(&cse->link, &cse->fallthrough->link); 304 } else { 305 list_add(&cse->link, &swtch->cases); 306 } 307 } 308 309 static enum vtn_branch_type 310 vtn_get_branch_type(struct vtn_builder *b, 311 struct vtn_block *block, 312 struct vtn_case *swcase, struct vtn_block *switch_break, 313 struct vtn_block *loop_break, struct vtn_block *loop_cont) 314 { 315 if (block->switch_case) { 316 /* This branch is actually a fallthrough */ 317 vtn_assert(swcase->fallthrough == NULL || 318 swcase->fallthrough == block->switch_case); 319 swcase->fallthrough = block->switch_case; 320 return vtn_branch_type_switch_fallthrough; 321 } else if (block == loop_break) { 322 return vtn_branch_type_loop_break; 323 } else if (block == loop_cont) { 324 return vtn_branch_type_loop_continue; 325 } else if (block == switch_break) { 326 return vtn_branch_type_switch_break; 327 } else { 328 return vtn_branch_type_none; 329 } 330 } 331 332 static void 333 vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list, 334 struct vtn_block *start, struct vtn_case *switch_case, 335 struct vtn_block *switch_break, 336 struct vtn_block *loop_break, struct vtn_block *loop_cont, 337 struct vtn_block *end) 338 { 339 struct vtn_block *block = start; 340 while (block != end) { 341 if (block->merge && (*block->merge & SpvOpCodeMask) == SpvOpLoopMerge && 342 !block->loop) { 343 struct vtn_loop *loop = ralloc(b, struct vtn_loop); 344 345 loop->node.type = vtn_cf_node_type_loop; 346 list_inithead(&loop->body); 347 list_inithead(&loop->cont_body); 348 loop->control = block->merge[3]; 349 350 list_addtail(&loop->node.link, cf_list); 351 block->loop = loop; 352 353 struct vtn_block *new_loop_break = 354 vtn_value(b, block->merge[1], vtn_value_type_block)->block; 355 struct vtn_block *new_loop_cont = 356 vtn_value(b, block->merge[2], vtn_value_type_block)->block; 357 358 /* Note: This recursive call will start with the current block as 359 * its start block. If we weren't careful, we would get here 360 * again and end up in infinite recursion. This is why we set 361 * block->loop above and check for it before creating one. This 362 * way, we only create the loop once and the second call that 363 * tries to handle this loop goes to the cases below and gets 364 * handled as a regular block. 365 * 366 * Note: When we make the recursive walk calls, we pass NULL for 367 * the switch break since you have to break out of the loop first. 368 * We do, however, still pass the current switch case because it's 369 * possible that the merge block for the loop is the start of 370 * another case. 371 */ 372 vtn_cfg_walk_blocks(b, &loop->body, block, switch_case, NULL, 373 new_loop_break, new_loop_cont, NULL ); 374 vtn_cfg_walk_blocks(b, &loop->cont_body, new_loop_cont, NULL, NULL, 375 new_loop_break, NULL, block); 376 377 block = new_loop_break; 378 continue; 379 } 380 381 vtn_assert(block->node.link.next == NULL); 382 list_addtail(&block->node.link, cf_list); 383 384 switch (*block->branch & SpvOpCodeMask) { 385 case SpvOpBranch: { 386 struct vtn_block *branch_block = 387 vtn_value(b, block->branch[1], vtn_value_type_block)->block; 388 389 block->branch_type = vtn_get_branch_type(b, branch_block, 390 switch_case, switch_break, 391 loop_break, loop_cont); 392 393 if (block->branch_type != vtn_branch_type_none) 394 return; 395 396 block = branch_block; 397 continue; 398 } 399 400 case SpvOpReturn: 401 case SpvOpReturnValue: 402 block->branch_type = vtn_branch_type_return; 403 return; 404 405 case SpvOpKill: 406 block->branch_type = vtn_branch_type_discard; 407 return; 408 409 case SpvOpBranchConditional: { 410 struct vtn_block *then_block = 411 vtn_value(b, block->branch[2], vtn_value_type_block)->block; 412 struct vtn_block *else_block = 413 vtn_value(b, block->branch[3], vtn_value_type_block)->block; 414 415 struct vtn_if *if_stmt = ralloc(b, struct vtn_if); 416 417 if_stmt->node.type = vtn_cf_node_type_if; 418 if_stmt->condition = block->branch[1]; 419 list_inithead(&if_stmt->then_body); 420 list_inithead(&if_stmt->else_body); 421 422 list_addtail(&if_stmt->node.link, cf_list); 423 424 if (block->merge && 425 (*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge) { 426 if_stmt->control = block->merge[2]; 427 } 428 429 if_stmt->then_type = vtn_get_branch_type(b, then_block, 430 switch_case, switch_break, 431 loop_break, loop_cont); 432 if_stmt->else_type = vtn_get_branch_type(b, else_block, 433 switch_case, switch_break, 434 loop_break, loop_cont); 435 436 if (then_block == else_block) { 437 block->branch_type = if_stmt->then_type; 438 if (block->branch_type == vtn_branch_type_none) { 439 block = then_block; 440 continue; 441 } else { 442 return; 443 } 444 } else if (if_stmt->then_type == vtn_branch_type_none && 445 if_stmt->else_type == vtn_branch_type_none) { 446 /* Neither side of the if is something we can short-circuit. */ 447 vtn_assert((*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge); 448 struct vtn_block *merge_block = 449 vtn_value(b, block->merge[1], vtn_value_type_block)->block; 450 451 vtn_cfg_walk_blocks(b, &if_stmt->then_body, then_block, 452 switch_case, switch_break, 453 loop_break, loop_cont, merge_block); 454 vtn_cfg_walk_blocks(b, &if_stmt->else_body, else_block, 455 switch_case, switch_break, 456 loop_break, loop_cont, merge_block); 457 458 enum vtn_branch_type merge_type = 459 vtn_get_branch_type(b, merge_block, switch_case, switch_break, 460 loop_break, loop_cont); 461 if (merge_type == vtn_branch_type_none) { 462 block = merge_block; 463 continue; 464 } else { 465 return; 466 } 467 } else if (if_stmt->then_type != vtn_branch_type_none && 468 if_stmt->else_type != vtn_branch_type_none) { 469 /* Both sides were short-circuited. We're done here. */ 470 return; 471 } else { 472 /* Exeactly one side of the branch could be short-circuited. 473 * We set the branch up as a predicated break/continue and we 474 * continue on with the other side as if it were what comes 475 * after the if. 476 */ 477 if (if_stmt->then_type == vtn_branch_type_none) { 478 block = then_block; 479 } else { 480 block = else_block; 481 } 482 continue; 483 } 484 vtn_fail("Should have returned or continued"); 485 } 486 487 case SpvOpSwitch: { 488 vtn_assert((*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge); 489 struct vtn_block *break_block = 490 vtn_value(b, block->merge[1], vtn_value_type_block)->block; 491 492 struct vtn_switch *swtch = ralloc(b, struct vtn_switch); 493 494 swtch->node.type = vtn_cf_node_type_switch; 495 swtch->selector = block->branch[1]; 496 list_inithead(&swtch->cases); 497 498 list_addtail(&swtch->node.link, cf_list); 499 500 /* First, we go through and record all of the cases. */ 501 const uint32_t *branch_end = 502 block->branch + (block->branch[0] >> SpvWordCountShift); 503 504 struct vtn_value *cond_val = vtn_untyped_value(b, block->branch[1]); 505 vtn_fail_if(!cond_val->type || 506 cond_val->type->base_type != vtn_base_type_scalar, 507 "Selector of OpSelect must have a type of OpTypeInt"); 508 509 nir_alu_type cond_type = 510 nir_get_nir_type_for_glsl_type(cond_val->type->type); 511 vtn_fail_if(nir_alu_type_get_base_type(cond_type) != nir_type_int && 512 nir_alu_type_get_base_type(cond_type) != nir_type_uint, 513 "Selector of OpSelect must have a type of OpTypeInt"); 514 515 bool is_default = true; 516 const uint bitsize = nir_alu_type_get_type_size(cond_type); 517 for (const uint32_t *w = block->branch + 2; w < branch_end;) { 518 uint64_t literal = 0; 519 if (!is_default) { 520 if (bitsize <= 32) { 521 literal = *(w++); 522 } else { 523 assert(bitsize == 64); 524 literal = vtn_u64_literal(w); 525 w += 2; 526 } 527 } 528 529 uint32_t block_id = *(w++); 530 531 vtn_add_case(b, swtch, break_block, block_id, literal, is_default); 532 is_default = false; 533 } 534 535 /* Now, we go through and walk the blocks. While we walk through 536 * the blocks, we also gather the much-needed fall-through 537 * information. 538 */ 539 list_for_each_entry(struct vtn_case, cse, &swtch->cases, link) { 540 vtn_assert(cse->start_block != break_block); 541 vtn_cfg_walk_blocks(b, &cse->body, cse->start_block, cse, 542 break_block, loop_break, loop_cont, NULL); 543 } 544 545 /* Finally, we walk over all of the cases one more time and put 546 * them in fall-through order. 547 */ 548 for (const uint32_t *w = block->branch + 2; w < branch_end;) { 549 struct vtn_block *case_block = 550 vtn_value(b, *w, vtn_value_type_block)->block; 551 552 if (bitsize <= 32) { 553 w += 2; 554 } else { 555 assert(bitsize == 64); 556 w += 3; 557 } 558 559 if (case_block == break_block) 560 continue; 561 562 vtn_assert(case_block->switch_case); 563 564 vtn_order_case(swtch, case_block->switch_case); 565 } 566 567 enum vtn_branch_type branch_type = 568 vtn_get_branch_type(b, break_block, switch_case, NULL, 569 loop_break, loop_cont); 570 571 if (branch_type != vtn_branch_type_none) { 572 /* It is possible that the break is actually the continue block 573 * for the containing loop. In this case, we need to bail and let 574 * the loop parsing code handle the continue properly. 575 */ 576 vtn_assert(branch_type == vtn_branch_type_loop_continue); 577 return; 578 } 579 580 block = break_block; 581 continue; 582 } 583 584 case SpvOpUnreachable: 585 return; 586 587 default: 588 vtn_fail("Unhandled opcode"); 589 } 590 } 591 } 592 593 void 594 vtn_build_cfg(struct vtn_builder *b, const uint32_t *words, const uint32_t *end) 595 { 596 vtn_foreach_instruction(b, words, end, 597 vtn_cfg_handle_prepass_instruction); 598 599 foreach_list_typed(struct vtn_function, func, node, &b->functions) { 600 vtn_cfg_walk_blocks(b, &func->body, func->start_block, 601 NULL, NULL, NULL, NULL, NULL); 602 } 603 } 604 605 static bool 606 vtn_handle_phis_first_pass(struct vtn_builder *b, SpvOp opcode, 607 const uint32_t *w, unsigned count) 608 { 609 if (opcode == SpvOpLabel) 610 return true; /* Nothing to do */ 611 612 /* If this isn't a phi node, stop. */ 613 if (opcode != SpvOpPhi) 614 return false; 615 616 /* For handling phi nodes, we do a poor-man's out-of-ssa on the spot. 617 * For each phi, we create a variable with the appropreate type and 618 * do a load from that variable. Then, in a second pass, we add 619 * stores to that variable to each of the predecessor blocks. 620 * 621 * We could do something more intelligent here. However, in order to 622 * handle loops and things properly, we really need dominance 623 * information. It would end up basically being the into-SSA 624 * algorithm all over again. It's easier if we just let 625 * lower_vars_to_ssa do that for us instead of repeating it here. 626 */ 627 struct vtn_type *type = vtn_value(b, w[1], vtn_value_type_type)->type; 628 nir_variable *phi_var = 629 nir_local_variable_create(b->nb.impl, type->type, "phi"); 630 _mesa_hash_table_insert(b->phi_table, w, phi_var); 631 632 vtn_push_ssa(b, w[2], type, 633 vtn_local_load(b, nir_deref_var_create(b, phi_var))); 634 635 return true; 636 } 637 638 static bool 639 vtn_handle_phi_second_pass(struct vtn_builder *b, SpvOp opcode, 640 const uint32_t *w, unsigned count) 641 { 642 if (opcode != SpvOpPhi) 643 return true; 644 645 struct hash_entry *phi_entry = _mesa_hash_table_search(b->phi_table, w); 646 vtn_assert(phi_entry); 647 nir_variable *phi_var = phi_entry->data; 648 649 for (unsigned i = 3; i < count; i += 2) { 650 struct vtn_block *pred = 651 vtn_value(b, w[i + 1], vtn_value_type_block)->block; 652 653 b->nb.cursor = nir_after_instr(&pred->end_nop->instr); 654 655 struct vtn_ssa_value *src = vtn_ssa_value(b, w[i]); 656 657 vtn_local_store(b, src, nir_deref_var_create(b, phi_var)); 658 } 659 660 return true; 661 } 662 663 static void 664 vtn_emit_branch(struct vtn_builder *b, enum vtn_branch_type branch_type, 665 nir_variable *switch_fall_var, bool *has_switch_break) 666 { 667 switch (branch_type) { 668 case vtn_branch_type_switch_break: 669 nir_store_var(&b->nb, switch_fall_var, nir_imm_int(&b->nb, NIR_FALSE), 1); 670 *has_switch_break = true; 671 break; 672 case vtn_branch_type_switch_fallthrough: 673 break; /* Nothing to do */ 674 case vtn_branch_type_loop_break: 675 nir_jump(&b->nb, nir_jump_break); 676 break; 677 case vtn_branch_type_loop_continue: 678 nir_jump(&b->nb, nir_jump_continue); 679 break; 680 case vtn_branch_type_return: 681 nir_jump(&b->nb, nir_jump_return); 682 break; 683 case vtn_branch_type_discard: { 684 nir_intrinsic_instr *discard = 685 nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_discard); 686 nir_builder_instr_insert(&b->nb, &discard->instr); 687 break; 688 } 689 default: 690 vtn_fail("Invalid branch type"); 691 } 692 } 693 694 static void 695 vtn_emit_cf_list(struct vtn_builder *b, struct list_head *cf_list, 696 nir_variable *switch_fall_var, bool *has_switch_break, 697 vtn_instruction_handler handler) 698 { 699 list_for_each_entry(struct vtn_cf_node, node, cf_list, link) { 700 switch (node->type) { 701 case vtn_cf_node_type_block: { 702 struct vtn_block *block = (struct vtn_block *)node; 703 704 const uint32_t *block_start = block->label; 705 const uint32_t *block_end = block->merge ? block->merge : 706 block->branch; 707 708 block_start = vtn_foreach_instruction(b, block_start, block_end, 709 vtn_handle_phis_first_pass); 710 711 vtn_foreach_instruction(b, block_start, block_end, handler); 712 713 block->end_nop = nir_intrinsic_instr_create(b->nb.shader, 714 nir_intrinsic_nop); 715 nir_builder_instr_insert(&b->nb, &block->end_nop->instr); 716 717 if ((*block->branch & SpvOpCodeMask) == SpvOpReturnValue) { 718 struct vtn_ssa_value *src = vtn_ssa_value(b, block->branch[1]); 719 vtn_local_store(b, src, 720 nir_deref_var_create(b, b->nb.impl->return_var)); 721 } 722 723 if (block->branch_type != vtn_branch_type_none) { 724 vtn_emit_branch(b, block->branch_type, 725 switch_fall_var, has_switch_break); 726 } 727 728 break; 729 } 730 731 case vtn_cf_node_type_if: { 732 struct vtn_if *vtn_if = (struct vtn_if *)node; 733 bool sw_break = false; 734 735 nir_if *nif = 736 nir_push_if(&b->nb, vtn_ssa_value(b, vtn_if->condition)->def); 737 if (vtn_if->then_type == vtn_branch_type_none) { 738 vtn_emit_cf_list(b, &vtn_if->then_body, 739 switch_fall_var, &sw_break, handler); 740 } else { 741 vtn_emit_branch(b, vtn_if->then_type, switch_fall_var, &sw_break); 742 } 743 744 nir_push_else(&b->nb, nif); 745 if (vtn_if->else_type == vtn_branch_type_none) { 746 vtn_emit_cf_list(b, &vtn_if->else_body, 747 switch_fall_var, &sw_break, handler); 748 } else { 749 vtn_emit_branch(b, vtn_if->else_type, switch_fall_var, &sw_break); 750 } 751 752 nir_pop_if(&b->nb, nif); 753 754 /* If we encountered a switch break somewhere inside of the if, 755 * then it would have been handled correctly by calling 756 * emit_cf_list or emit_branch for the interrior. However, we 757 * need to predicate everything following on wether or not we're 758 * still going. 759 */ 760 if (sw_break) { 761 *has_switch_break = true; 762 nir_push_if(&b->nb, nir_load_var(&b->nb, switch_fall_var)); 763 } 764 break; 765 } 766 767 case vtn_cf_node_type_loop: { 768 struct vtn_loop *vtn_loop = (struct vtn_loop *)node; 769 770 nir_loop *loop = nir_push_loop(&b->nb); 771 vtn_emit_cf_list(b, &vtn_loop->body, NULL, NULL, handler); 772 773 if (!list_empty(&vtn_loop->cont_body)) { 774 /* If we have a non-trivial continue body then we need to put 775 * it at the beginning of the loop with a flag to ensure that 776 * it doesn't get executed in the first iteration. 777 */ 778 nir_variable *do_cont = 779 nir_local_variable_create(b->nb.impl, glsl_bool_type(), "cont"); 780 781 b->nb.cursor = nir_before_cf_node(&loop->cf_node); 782 nir_store_var(&b->nb, do_cont, nir_imm_int(&b->nb, NIR_FALSE), 1); 783 784 b->nb.cursor = nir_before_cf_list(&loop->body); 785 786 nir_if *cont_if = 787 nir_push_if(&b->nb, nir_load_var(&b->nb, do_cont)); 788 789 vtn_emit_cf_list(b, &vtn_loop->cont_body, NULL, NULL, handler); 790 791 nir_pop_if(&b->nb, cont_if); 792 793 nir_store_var(&b->nb, do_cont, nir_imm_int(&b->nb, NIR_TRUE), 1); 794 795 b->has_loop_continue = true; 796 } 797 798 nir_pop_loop(&b->nb, loop); 799 break; 800 } 801 802 case vtn_cf_node_type_switch: { 803 struct vtn_switch *vtn_switch = (struct vtn_switch *)node; 804 805 /* First, we create a variable to keep track of whether or not the 806 * switch is still going at any given point. Any switch breaks 807 * will set this variable to false. 808 */ 809 nir_variable *fall_var = 810 nir_local_variable_create(b->nb.impl, glsl_bool_type(), "fall"); 811 nir_store_var(&b->nb, fall_var, nir_imm_int(&b->nb, NIR_FALSE), 1); 812 813 /* Next, we gather up all of the conditions. We have to do this 814 * up-front because we also need to build an "any" condition so 815 * that we can use !any for default. 816 */ 817 const int num_cases = list_length(&vtn_switch->cases); 818 NIR_VLA(nir_ssa_def *, conditions, num_cases); 819 820 nir_ssa_def *sel = vtn_ssa_value(b, vtn_switch->selector)->def; 821 /* An accumulation of all conditions. Used for the default */ 822 nir_ssa_def *any = NULL; 823 824 int i = 0; 825 list_for_each_entry(struct vtn_case, cse, &vtn_switch->cases, link) { 826 if (cse->is_default) { 827 conditions[i++] = NULL; 828 continue; 829 } 830 831 nir_ssa_def *cond = NULL; 832 util_dynarray_foreach(&cse->values, uint64_t, val) { 833 nir_ssa_def *imm = nir_imm_intN_t(&b->nb, *val, sel->bit_size); 834 nir_ssa_def *is_val = nir_ieq(&b->nb, sel, imm); 835 836 cond = cond ? nir_ior(&b->nb, cond, is_val) : is_val; 837 } 838 839 any = any ? nir_ior(&b->nb, any, cond) : cond; 840 conditions[i++] = cond; 841 } 842 vtn_assert(i == num_cases); 843 844 /* Now we can walk the list of cases and actually emit code */ 845 i = 0; 846 list_for_each_entry(struct vtn_case, cse, &vtn_switch->cases, link) { 847 /* Figure out the condition */ 848 nir_ssa_def *cond = conditions[i++]; 849 if (cse->is_default) { 850 vtn_assert(cond == NULL); 851 cond = nir_inot(&b->nb, any); 852 } 853 /* Take fallthrough into account */ 854 cond = nir_ior(&b->nb, cond, nir_load_var(&b->nb, fall_var)); 855 856 nir_if *case_if = nir_push_if(&b->nb, cond); 857 858 bool has_break = false; 859 nir_store_var(&b->nb, fall_var, nir_imm_int(&b->nb, NIR_TRUE), 1); 860 vtn_emit_cf_list(b, &cse->body, fall_var, &has_break, handler); 861 (void)has_break; /* We don't care */ 862 863 nir_pop_if(&b->nb, case_if); 864 } 865 vtn_assert(i == num_cases); 866 867 break; 868 } 869 870 default: 871 vtn_fail("Invalid CF node type"); 872 } 873 } 874 } 875 876 void 877 vtn_function_emit(struct vtn_builder *b, struct vtn_function *func, 878 vtn_instruction_handler instruction_handler) 879 { 880 nir_builder_init(&b->nb, func->impl); 881 b->nb.cursor = nir_after_cf_list(&func->impl->body); 882 b->has_loop_continue = false; 883 b->phi_table = _mesa_hash_table_create(b, _mesa_hash_pointer, 884 _mesa_key_pointer_equal); 885 886 vtn_emit_cf_list(b, &func->body, NULL, NULL, instruction_handler); 887 888 vtn_foreach_instruction(b, func->start_block->label, func->end, 889 vtn_handle_phi_second_pass); 890 891 /* Continue blocks for loops get inserted before the body of the loop 892 * but instructions in the continue may use SSA defs in the loop body. 893 * Therefore, we need to repair SSA to insert the needed phi nodes. 894 */ 895 if (b->has_loop_continue) 896 nir_repair_ssa_impl(func->impl); 897 898 func->emitted = true; 899 } 900