if (ns->is_ssa) {
child = comp->var_nodes[ns->ssa->index];
- /* Clone consts for each successor */
switch (child->op) {
- case ppir_op_const:
- child = ppir_node_clone(node->block, child);
- break;
- case ppir_op_load_varying: {
- bool is_load_coords = false;
+ case ppir_op_load_varying:
+ /* If at least one successor is load_texture, promote it to
+ * load_coords to ensure that is has exactly one successor */
if (node->op == ppir_op_load_texture) {
nir_tex_src *nts = (nir_tex_src *)ns;
if (nts->src_type == nir_tex_src_coord)
- is_load_coords = true;
- }
-
- if (!is_load_coords) {
- /* Clone varying loads for each block */
- if (child->block != node->block) {
- ppir_node *new = ppir_node_clone(node->block, child);
- /* If we clone it for every block and there is no user of
- * the original load left, delete the original one. */
- ppir_delete_if_orphan(node->block, child);
- child = new;
- comp->var_nodes[ns->ssa->index] = child;
- }
- break;
- }
- /* At least one successor is load_texture, promote it to load_coords
- * to ensure that is has exactly one successor */
- child->op = ppir_op_load_coords;
- }
- /* Fallthrough */
- case ppir_op_load_uniform:
- case ppir_op_load_coords:
- case ppir_op_load_coords_reg:
- /* Clone uniform and texture coord loads for each block.
- * Also ensure that each load has a single successor.
- * Let's do a fetch each time and hope for a cache hit instead
- * of increasing reg pressure.
- */
- if (child->block != node->block || !ppir_node_is_root(child)) {
- child = ppir_node_clone(node->block, child);
- comp->var_nodes[ns->ssa->index] = child;
+ child->op = ppir_op_load_coords;
}
break;
default:
child = comp->var_nodes[(reg->index << 2) + comp->reg_base + swizzle];
/* Reg is read before it was written, create a dummy node for it */
if (!child) {
- child = ppir_node_create_reg(node->block, ppir_op_undef, reg,
+ child = ppir_node_create_reg(node->block, ppir_op_dummy, reg,
u_bit_consecutive(0, 4));
comp->var_nodes[(reg->index << 2) + comp->reg_base + swizzle] = child;
}
/* Don't add dummies or recursive deps for ops like r1 = r1 + ssa1 */
- if (child && node != child && child->op != ppir_op_undef)
+ if (child && node != child && child->op != ppir_op_dummy)
ppir_node_add_dep(node, child, ppir_dep_src);
}
}
ppir_dest *dest = &alu->dest;
dest->ssa.undef = true;
- ppir_reg *ssa = &dest->ssa;
-
- list_add(&ssa->list, &block->comp->reg_list);
return node;
}