Lines Matching refs:ir

61 #include "ir.h"
280 void truncate_after_instruction(exec_node *ir)
282 if (!ir)
285 while (!ir->get_next()->is_tail_sentinel()) {
286 ((ir_instruction *)ir->get_next())->remove();
291 void move_outer_block_inside(ir_instruction *ir, exec_list *inner_block)
293 while (!ir->get_next()->is_tail_sentinel()) {
294 ir_instruction *move_ir = (ir_instruction *)ir->get_next();
305 void insert_lowered_return(ir_return *ir)
310 ir->insert_before(
311 new(ir) ir_assignment(
312 new (ir) ir_dereference_variable(return_value),
313 ir->value));
315 ir->insert_before(
316 new(ir) ir_assignment(
317 new (ir) ir_dereference_variable(return_flag),
318 new (ir) ir_constant(true)));
329 void lower_return_unconditionally(ir_instruction *ir)
331 if (get_jump_strength(ir) != strength_return) {
334 insert_lowered_return((ir_return*)ir);
335 ir->replace_with(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
338 virtual void visit(class ir_loop_jump * ir)
344 truncate_after_instruction(ir);
352 this->block.min_strength = ir->is_break() ? strength_break : strength_continue;
360 virtual void visit(class ir_return * ir)
366 truncate_after_instruction(ir);
382 virtual void visit(class ir_discard * ir)
391 (void) ir;
394 enum jump_strength get_jump_strength(ir_instruction* ir)
396 if(!ir)
398 else if(ir->ir_type == ir_type_loop_jump) {
399 if(((ir_loop_jump*)ir)->is_break())
403 } else if(ir->ir_type == ir_type_return)
409 bool should_lower_jump(ir_jump* ir)
411 unsigned strength = get_jump_strength(ir);
426 if(this->function.nesting_depth == 0 && ir->get_next()->is_tail_sentinel())
456 virtual void visit(ir_if *ir)
458 if(this->loop.nesting_depth == 0 && ir->get_next()->is_tail_sentinel())
469 * unconditional jumps at the end of ir->then_instructions and
470 * ir->else_instructions, which are handled below.
472 block_records[0] = visit_block(&ir->then_instructions);
473 block_records[1] = visit_block(&ir->else_instructions);
477 /* Determine which of ir->then_instructions and
478 * ir->else_instructions end with an unconditional jump.
481 exec_list& list = i ? ir->else_instructions : ir->then_instructions;
493 * ir->then_instructions and ir->else_instructions.
514 ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_continue));
516 ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
519 ir->insert_after(new(ir) ir_return(NULL));
579 lowered = new(ir) ir_loop_jump(ir_loop_jump::jump_break);
609 jumps[lower]->replace_with(new(ir) ir_assignment(new (ir) ir_dereference_variable(execute_flag), new (ir) ir_constant(false)));
642 ir->insert_after(jumps[move_out]);
671 truncate_after_instruction(ir);
692 exec_list* list = move_into ? &ir->else_instructions : &ir->then_instructions;
693 exec_node* next = ir->get_next();
695 move_outer_block_inside(ir, list);
726 for(ir_after = (ir_instruction*)ir->get_next(); !ir_after->is_tail_sentinel();)
748 if(!ir->get_next()->is_tail_sentinel()) {
750 ir_if* if_execute = new(ir) ir_if(new(ir) ir_dereference_variable(this->loop.execute_flag));
751 move_outer_block_inside(ir, &if_execute->then_instructions);
752 ir->insert_after(if_execute);
760 virtual void visit(ir_loop *ir)
781 this->loop = loop_record(this->function.signature, ir);
788 block_record body = visit_block(&ir->body_instructions);
794 = (ir_instruction *) ir->body_instructions.get_tail();
824 ir_if* return_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->function.return_flag));
837 return_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
844 move_outer_block_inside(ir, &return_if->else_instructions);
850 return_if->then_instructions.push_tail(new(ir) ir_return(NULL));
855 new(ir) ir_return(new(ir) ir_dereference_variable(return_value)));
859 ir->insert_after(return_if);
866 virtual void visit(ir_function_signature *ir)
873 if (strcmp(ir->function_name(), "main") == 0)
880 this->function = function_record(ir, lower_return);
881 this->loop = loop_record(ir);
889 visit_block(&ir->body);
898 if (ir->return_type->is_void() &&
899 get_jump_strength((ir_instruction *) ir->body.get_tail())) {
900 ir_jump *jump = (ir_jump *) ir->body.get_tail();
906 ir->body.push_tail(new(ir) ir_return(new (ir) ir_dereference_variable(this->function.return_value)));
912 virtual void visit(class ir_function * ir)
914 visit_block(&ir->signatures);