Skip to content

Commit

Permalink
fix a bug in reducing embedded assignments
Browse files Browse the repository at this point in the history
  • Loading branch information
Xuejun Yang committed Jul 24, 2011
1 parent ce4cb99 commit 0b006c5
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 10 deletions.
3 changes: 2 additions & 1 deletion src/ExpressionAssign.h
Expand Up @@ -71,8 +71,9 @@ class ExpressionAssign : public Expression
virtual std::vector<const ExpressionVariable*> get_dereferenced_ptrs(void) const { return assign->get_dereferenced_ptrs();}
virtual void get_referenced_ptrs(std::vector<const Variable*>& ptrs) const { assign->get_referenced_ptrs(ptrs);}

const Expression* get_rhs(void) const { return assign->get_rhs();}
const Expression* get_rhs(void) const { return assign->get_expr();}
const Lhs* get_lhs(void) const { return assign->get_lhs();}
const StatementAssign* get_stm_assign(void) const { return assign;}
void Output(std::ostream &) const;
virtual void indented_output(std::ostream &out, int indent) const;

Expand Down
15 changes: 15 additions & 0 deletions src/Reducer.cpp
Expand Up @@ -1370,6 +1370,21 @@ Reducer::output_expr(const Expression* e, std::ostream &out)
}
}
}
else if (e->term_type == eAssignment) {
const ExpressionAssign* ea = dynamic_cast<const ExpressionAssign*>(e);
ostringstream oss;
// if RHS can be simplified, print the simplified version
if (output_expr(ea->get_rhs(), oss)) {
out << "(";
ea->get_lhs()->Output(out);
out << " ";
ea->get_stm_assign()->output_op(out);
out << " ";
out << oss.str();
out << ")";
return 1;
}
}
return 0;
}

Expand Down
17 changes: 8 additions & 9 deletions src/StatementAssign.cpp
Expand Up @@ -397,10 +397,10 @@ StatementAssign::~StatementAssign(void)
}

/*
*
* output assign operator
*/
static void
OutputAssignOp(eAssignOps op, std::ostream &out)
void
StatementAssign::output_op(std::ostream &out) const
{
switch (op) {
case eSimpleAssign: out << "="; break;
Expand Down Expand Up @@ -441,21 +441,21 @@ StatementAssign::OutputSimple(std::ostream &out) const
default:
lhs.Output(out);
out << " ";
OutputAssignOp(op, out);
output_op(out);
out << " ";
expr.Output(out);
break;

case ePreIncr:
case ePreDecr:
OutputAssignOp(op, out);
output_op(out);
lhs.Output(out);
break;

case ePostIncr:
case ePostDecr:
lhs.Output(out);
OutputAssignOp(op, out);
output_op(out);
break;
}
}
Expand All @@ -478,14 +478,13 @@ StatementAssign::OutputAsExpr(std::ostream &out) const
lhs.Output(out);
out << " ";
if (CGOptions::ccomp() && (bop != MAX_BINARY_OP) && (lhs.is_volatile())) {
OutputAssignOp(eSimpleAssign, out);
out << " ";
out << "=" << " ";
lhs.Output(out);
out << " " << FunctionInvocationBinary::get_binop_string(bop) << " ";
expr.Output(out);
}
else {
OutputAssignOp(op, out);
output_op(out);
out << " ";
expr.Output(out);
}
Expand Down
1 change: 1 addition & 0 deletions src/StatementAssign.h
Expand Up @@ -117,6 +117,7 @@ class StatementAssign : public Statement
virtual bool has_uncertain_call_recursive(void) const;

virtual void Output(std::ostream &out, FactMgr* fm, int indent = 0) const;
void output_op(std::ostream &out) const;

// XXX --- This should go away, once assignments are properly modeled as
// expressions.
Expand Down

0 comments on commit 0b006c5

Please sign in to comment.