Lines Matching refs:ir

61 #include "ir.h"
200 void truncate_after_instruction(exec_node *ir)
202 if (!ir)
205 while (!ir->get_next()->is_tail_sentinel()) {
206 ((ir_instruction *)ir->get_next())->remove();
211 void move_outer_block_inside(ir_instruction *ir, exec_list *inner_block)
213 while (!ir->get_next()->is_tail_sentinel()) {
214 ir_instruction *move_ir = (ir_instruction *)ir->get_next();
221 virtual void visit(class ir_loop_jump * ir)
223 truncate_after_instruction(ir);
224 this->block.min_strength = ir->is_break() ? strength_break : strength_continue;
227 virtual void visit(class ir_return * ir)
229 truncate_after_instruction(ir);
233 virtual void visit(class ir_discard * ir)
237 enum jump_strength get_jump_strength(ir_instruction* ir)
239 if(!ir)
241 else if(ir->ir_type == ir_type_loop_jump) {
242 if(((ir_loop_jump*)ir)->is_break())
246 } else if(ir->ir_type == ir_type_return)
252 bool should_lower_jump(ir_jump* ir)
254 unsigned strength = get_jump_strength(ir);
267 if(ir->get_next()->is_tail_sentinel() && (this->loop.nesting_depth == 0
275 if(this->function.nesting_depth == 0 && ir->get_next()->is_tail_sentinel())
296 virtual void visit(ir_if *ir)
298 if(this->loop.nesting_depth == 0 && ir->get_next()->is_tail_sentinel())
307 block_records[0] = visit_block(&ir->then_instructions);
308 block_records[1] = visit_block(&ir->else_instructions);
312 exec_list& list = i ? ir->else_instructions : ir->then_instructions;
333 ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_continue));
335 ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
338 ir->insert_after(new(ir) ir_return(NULL));
376 jumps[lower]->insert_before(new(ir) ir_assignment(new (ir) ir_dereference_variable(return_value), ((ir_return*)jumps[lower])->value, NULL));
378 jumps[lower]->insert_before(new(ir) ir_assignment(new (ir) ir_dereference_variable(return_flag), new (ir) ir_constant(true), NULL));
382 lowered = new(ir) ir_loop_jump(ir_loop_jump::jump_break);
398 jumps[lower]->insert_before(new(ir) ir_assignment(new (ir) ir_dereference_variable(this->loop.get_break_flag()), new (ir) ir_constant(true), 0));
403 jumps[lower]->replace_with(new(ir) ir_assignment(new (ir) ir_dereference_variable(execute_flag), new (ir) ir_constant(false), 0));
423 ir->insert_after(jumps[move_out]);
437 truncate_after_instruction(ir);
449 exec_list* list = move_into ? &ir->else_instructions : &ir->then_instructions;
450 exec_node* next = ir->get_next();
452 move_outer_block_inside(ir, list);
463 for(ir_after = (ir_instruction*)ir->get_next(); !ir_after->is_tail_sentinel();)
482 if(!ir->get_next()->is_tail_sentinel()) {
484 ir_if* if_execute = new(ir) ir_if(new(ir) ir_dereference_variable(this->loop.execute_flag));
485 move_outer_block_inside(ir, &if_execute->then_instructions);
486 ir->insert_after(if_execute);
494 virtual void visit(ir_loop *ir)
498 this->loop = loop_record(this->function.signature, ir);
500 block_record body = visit_block(&ir->body_instructions);
507 ir_if* break_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->loop.break_flag));
508 break_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
509 ir->body_instructions.push_tail(break_if);
514 ir_if* return_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->function.return_flag));
517 return_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
519 move_outer_block_inside(ir, &return_if->else_instructions);
520 ir->insert_after(return_if);
527 virtual void visit(ir_function_signature *ir)
535 this->function = function_record(ir);
536 this->loop = loop_record(ir);
539 visit_block(&ir->body);
542 ir->body.push_tail(new(ir) ir_return(new (ir) ir_dereference_variable(this->function.return_value)));
548 virtual void visit(class ir_function * ir)
550 visit_block(&ir->signatures);