Lines Matching defs:state
54 get_ssa(Program* program, unsigned block_idx, ssa_state* state, bool input)
57 if (state->visited[block_idx])
58 return state->outputs[block_idx];
61 Operand output = get_ssa(program, block_idx, state, true);
62 state->visited[block_idx] = true;
63 state->outputs[block_idx] = output;
68 if (state->any_pred_defined[block_idx] == pred_defined::undef)
74 if (block.loop_nest_depth < state->loop_nest_depth) {
77 } else if (block.loop_nest_depth > state->loop_nest_depth || pred == 1 ||
79 op = get_ssa(program, block.linear_preds[0], state, false);
82 bool previously_visited = state->visited[block_idx];
87 state->visited[block_idx] = true;
88 state->outputs[block_idx] = Operand(Temp(program->allocateTmp(program->lane_mask)));
94 ops[i] = get_ssa(program, block.linear_preds[i], state, false);
101 if (!previously_visited && state->visited[block_idx])
102 return state->outputs[block_idx];
105 op = state->outputs[block_idx];
138 build_merge_code(Program* program, ssa_state* state, Block* block, Operand cur)
141 Definition dst = Definition(state->outputs[block_idx].getTemp());
142 Operand prev = get_ssa(program, block_idx, state, true);
153 pred_defined defined = state->any_pred_defined[block_idx];
196 init_any_pred_defined(Program* program, ssa_state* state, Block* block, aco_ptr<Instruction>& phi)
198 std::fill(state->any_pred_defined.begin(), state->any_pred_defined.end(), pred_defined::undef);
206 state->any_pred_defined[succ] |= defined;
214 while (program->blocks[start - 1].loop_nest_depth >= state->loop_nest_depth)
219 state->any_pred_defined[start] = pred_defined::temp;
223 while (program->blocks[end].loop_nest_depth >= state->loop_nest_depth)
226 state->any_pred_defined[block->index] = pred_defined::undef;
235 state->any_pred_defined[start] |= pred_defined::zero;
237 state->any_pred_defined[start - 1] = pred_defined::const_0;
242 if (state->any_pred_defined[j] == pred_defined::undef)
245 state->any_pred_defined[succ] |= state->any_pred_defined[j];
248 state->any_pred_defined[block->index] = pred_defined::undef;
252 lower_divergent_bool_phi(Program* program, ssa_state* state, Block* block,
257 if (!state->checked_preds_for_uniform) {
258 state->all_preds_uniform = !(block->kind & block_kind_merge) &&
261 state->all_preds_uniform =
262 state->all_preds_uniform && (program->blocks[pred].kind & block_kind_uniform);
263 state->checked_preds_for_uniform = true;
266 if (state->all_preds_uniform) {
272 state->visited.resize(program->blocks.size());
273 state->outputs.resize(program->blocks.size());
274 state->any_pred_defined.resize(program->blocks.size());
275 state->loop_nest_depth = block->loop_nest_depth;
277 state->loop_nest_depth += 1;
278 std::fill(state->visited.begin(), state->visited.end(), false);
279 init_any_pred_defined(program, state, block, phi);
283 if (state->any_pred_defined[pred] != pred_defined::undef)
284 state->outputs[pred] = Operand(bld.tmp(bld.lm));
286 state->outputs[pred] = phi->operands[i];
287 assert(state->outputs[pred].size() == bld.lm.size());
288 state->visited[pred] = true;
292 build_merge_code(program, state, &program->blocks[block->logical_preds[i]], phi->operands[i]);
306 phi->operands[i] = get_ssa(program, block->linear_preds[i], state, false);
341 ssa_state state;
344 state.checked_preds_for_uniform = false;
350 lower_divergent_bool_phi(program, &state, &block, phi);