Lines Matching refs:ir

61 #include "ir.h"
286 void truncate_after_instruction(exec_node *ir)
288 if (!ir)
291 while (!ir->get_next()->is_tail_sentinel()) {
292 ((ir_instruction *)ir->get_next())->remove();
297 void move_outer_block_inside(ir_instruction *ir, exec_list *inner_block)
299 while (!ir->get_next()->is_tail_sentinel()) {
300 ir_instruction *move_ir = (ir_instruction *)ir->get_next();
311 void insert_lowered_return(ir_return *ir)
316 ir->insert_before(
317 new(ir) ir_assignment(
318 new (ir) ir_dereference_variable(return_value),
319 ir->value));
321 ir->insert_before(
322 new(ir) ir_assignment(
323 new (ir) ir_dereference_variable(return_flag),
324 new (ir) ir_constant(true)));
335 void lower_return_unconditionally(ir_instruction *ir)
337 if (get_jump_strength(ir) != strength_return) {
340 insert_lowered_return((ir_return*)ir);
341 ir->replace_with(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
363 void lower_break_unconditionally(ir_instruction *ir)
365 if (get_jump_strength(ir) != strength_break) {
368 ir->replace_with(create_lowered_break());
377 ir_instruction *ir = (ir_instruction *) block->get_tail();
378 lower_break_unconditionally(ir);
379 ir_if *ir_if = ir->as_if();
388 virtual void visit(class ir_loop_jump * ir)
394 truncate_after_instruction(ir);
402 this->block.min_strength = ir->is_break() ? strength_break : strength_continue;
410 virtual void visit(class ir_return * ir)
416 truncate_after_instruction(ir);
432 virtual void visit(class ir_discard * ir)
441 (void) ir;
444 enum jump_strength get_jump_strength(ir_instruction* ir)
446 if(!ir)
448 else if(ir->ir_type == ir_type_loop_jump) {
449 if(((ir_loop_jump*)ir)->is_break())
453 } else if(ir->ir_type == ir_type_return)
459 bool should_lower_jump(ir_jump* ir)
461 unsigned strength = get_jump_strength(ir);
474 if(ir->get_next()->is_tail_sentinel() && (this->loop.nesting_depth == 0
482 if(this->function.nesting_depth == 0 && ir->get_next()->is_tail_sentinel())
512 virtual void visit(ir_if *ir)
514 if(this->loop.nesting_depth == 0 && ir->get_next()->is_tail_sentinel())
525 * unconditional jumps at the end of ir->then_instructions and
526 * ir->else_instructions, which are handled below.
528 block_records[0] = visit_block(&ir->then_instructions);
529 block_records[1] = visit_block(&ir->else_instructions);
533 /* Determine which of ir->then_instructions and
534 * ir->else_instructions end with an unconditional jump.
537 exec_list& list = i ? ir->else_instructions : ir->then_instructions;
549 * ir->then_instructions and ir->else_instructions.
570 ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_continue));
572 ir->insert_after(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
575 ir->insert_after(new(ir) ir_return(NULL));
635 lowered = new(ir) ir_loop_jump(ir_loop_jump::jump_break);
677 jumps[lower]->replace_with(new(ir) ir_assignment(new (ir) ir_dereference_variable(execute_flag), new (ir) ir_constant(false), 0));
710 ir->insert_after(jumps[move_out]);
739 truncate_after_instruction(ir);
760 exec_list* list = move_into ? &ir->else_instructions : &ir->then_instructions;
761 exec_node* next = ir->get_next();
763 move_outer_block_inside(ir, list);
794 for(ir_after = (ir_instruction*)ir->get_next(); !ir_after->is_tail_sentinel();)
816 if(!ir->get_next()->is_tail_sentinel()) {
818 ir_if* if_execute = new(ir) ir_if(new(ir) ir_dereference_variable(this->loop.execute_flag));
819 move_outer_block_inside(ir, &if_execute->then_instructions);
820 ir->insert_after(if_execute);
828 virtual void visit(ir_loop *ir)
849 this->loop = loop_record(this->function.signature, ir);
856 block_record body = visit_block(&ir->body_instructions);
862 = (ir_instruction *) ir->body_instructions.get_tail();
899 lower_final_breaks(&ir->body_instructions);
901 ir_if* break_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->loop.break_flag));
902 break_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
903 ir->body_instructions.push_tail(break_if);
914 ir_if* return_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->function.return_flag));
927 return_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
935 move_outer_block_inside(ir, &return_if->else_instructions);
936 ir->insert_after(return_if);
943 virtual void visit(ir_function_signature *ir)
950 if (strcmp(ir->function_name(), "main") == 0)
957 this->function = function_record(ir, lower_return);
958 this->loop = loop_record(ir);
966 visit_block(&ir->body);
975 if (ir->return_type->is_void() &&
976 get_jump_strength((ir_instruction *) ir->body.get_tail())) {
977 ir_jump *jump = (ir_jump *) ir->body.get_tail();
983 ir->body.push_tail(new(ir) ir_return(new (ir) ir_dereference_variable(this->function.return_value)));
989 virtual void visit(class ir_function * ir)
991 visit_block(&ir->signatures);