Lines Matching defs:loop

27  * done by placing phi nodes at the exits of the loop for all values
28 * that are used outside the loop. The result is it transforms:
30 * loop { -> loop {
46 /* The loop we store information for */
47 nir_loop *loop;
51 /* Whether to skip loop invariant variables */
59 is_if_use_inside_loop(nir_src *use, nir_loop *loop)
62 nir_cf_node_as_block(nir_cf_node_prev(&loop->cf_node));
64 nir_cf_node_as_block(nir_cf_node_next(&loop->cf_node));
77 is_use_inside_loop(nir_src *use, nir_loop *loop)
80 nir_cf_node_as_block(nir_cf_node_prev(&loop->cf_node));
82 nir_cf_node_as_block(nir_cf_node_next(&loop->cf_node));
93 is_defined_before_loop(nir_ssa_def *def, nir_loop *loop)
97 nir_cf_node_as_block(nir_cf_node_prev(&loop->cf_node));
109 instr_is_invariant(nir_instr *instr, nir_loop *loop);
112 def_is_invariant(nir_ssa_def *def, nir_loop *loop)
114 if (is_defined_before_loop(def, loop))
118 def->parent_instr->pass_flags = instr_is_invariant(def->parent_instr, loop);
131 phi_is_invariant(nir_phi_instr *instr, nir_loop *loop)
133 /* Base case: it's a phi at the loop header
134 * Loop-header phis are updated in each loop iteration with
135 * the loop-carried value, and thus control-flow dependent
136 * on the loop itself.
138 if (instr->instr.block == nir_loop_first_block(loop))
142 if (!src_is_invariant(&src->src, loop))
146 /* All loop header- and LCSSA-phis should be handled by this point. */
154 if (!def_is_invariant(if_node->condition.ssa, loop))
161 /* An instruction is said to be loop-invariant if it
163 * - solely depends on variables defined outside of the loop or
167 instr_is_invariant(nir_instr *instr, nir_loop *loop)
178 return phi_is_invariant(nir_instr_as_phi(instr), loop);
186 return nir_foreach_src(instr, src_is_invariant, loop) ? invariant : not_invariant;
198 /* Don't create LCSSA-Phis for loop-invariant variables */
212 if (!is_use_inside_loop(use, state->loop)) {
218 if (!is_if_use_inside_loop(use, state->loop)) {
223 /* There where no sources that had defs outside the loop */
261 /* Run through all uses and rewrite those outside the loop to point to
270 if (!is_use_inside_loop(use, state->loop)) {
276 if (!is_if_use_inside_loop(use, state->loop)) {
286 setup_loop_state(lcssa_state *state, nir_loop *loop)
288 state->loop = loop;
290 nir_cf_node_as_block(nir_cf_node_next(&loop->cf_node));
319 nir_loop *loop = nir_cf_node_as_loop(cf_node);
320 foreach_list_typed(nir_cf_node, nested_node, node, &loop->body)
323 setup_loop_state(state, loop);
325 /* mark loop-invariant instructions */
327 /* Without a loop all instructions are invariant.
332 if (nir_loop_first_block(loop)->predecessors->entries == 1)
371 nir_convert_loop_to_lcssa(nir_loop *loop)
373 nir_function_impl *impl = nir_cf_node_get_function(&loop->cf_node);
378 setup_loop_state(state, loop);
383 nir_foreach_block_in_cf_node (block, &loop->cf_node) {