Add ir_loop_jump to represent 'break' and 'continue' in loops

This commit is contained in:
Ian Romanick
2010-04-05 16:28:15 -07:00
parent fad607a9be
commit f8e31e00b1
7 changed files with 71 additions and 0 deletions

45
ir.h
View File

@@ -532,6 +532,51 @@ public:
private:
ir_rvalue *value;
};
/**
* Jump instructions used inside loops
*
* These include \c break and \c continue. The \c break within a loop is
* different from the \c break within a switch-statement.
*
* \sa ir_switch_jump
*/
class ir_loop_jump : public ir_jump {
public:
enum jump_mode {
jump_break,
jump_continue
};
ir_loop_jump(ir_loop *loop, jump_mode mode)
: loop(loop), mode(mode)
{
/* empty */
}
virtual void accept(ir_visitor *v)
{
v->visit(this);
}
bool is_break() const
{
return mode == jump_break;
}
bool is_continue() const
{
return mode == jump_continue;
}
private:
/** Loop containing this break instruction. */
ir_loop *loop;
/** Mode selector for the jump instruction. */
enum jump_mode mode;
};
/*@}*/

View File

@@ -75,6 +75,7 @@ public:
virtual void visit(ir_return *);
virtual void visit(ir_if *);
virtual void visit(ir_loop *);
virtual void visit(ir_loop_jump *);
/*@}*/
/**
@@ -473,3 +474,11 @@ ir_constant_visitor::visit(ir_loop *ir)
(void) ir;
value = NULL;
}
void
ir_constant_visitor::visit(ir_loop_jump *ir)
{
(void) ir;
value = NULL;
}

View File

@@ -152,3 +152,10 @@ ir_constant_folding_visitor::visit(ir_loop *ir)
{
(void) ir;
}
void
ir_constant_folding_visitor::visit(ir_loop_jump *ir)
{
(void) ir;
}

View File

@@ -59,5 +59,6 @@ public:
virtual void visit(ir_return *);
virtual void visit(ir_if *);
virtual void visit(ir_loop *);
virtual void visit(ir_loop_jump *);
/*@}*/
};

View File

@@ -319,3 +319,10 @@ ir_print_visitor::visit(ir_loop *ir)
}
printf("))\n");
}
void
ir_print_visitor::visit(ir_loop_jump *ir)
{
printf("%s", ir->is_break() ? "break" : "continue");
}

View File

@@ -66,6 +66,7 @@ public:
virtual void visit(ir_return *);
virtual void visit(ir_if *);
virtual void visit(ir_loop *);
virtual void visit(ir_loop_jump *);
/*@}*/
private:

View File

@@ -57,6 +57,7 @@ public:
virtual void visit(class ir_return *) = 0;
virtual void visit(class ir_if *) = 0;
virtual void visit(class ir_loop *) = 0;
virtual void visit(class ir_loop_jump *) = 0;
/*@}*/
};