* net/loveruby/cflat/compiler/IRGenerator.java (SuffixOp): do not calculate twice. Save expr value and reuse it.

git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4152 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2009-04-26 08:45:30 +00:00
parent f23dd70dd2
commit 68a99258e5
2 changed files with 30 additions and 11 deletions

View File

@ -1,3 +1,8 @@
Sun Apr 26 17:44:14 2009 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/IRGenerator.java (SuffixOp): do not
calculate twice. Save expr value and reuse it.
Sun Apr 26 17:24:42 2009 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/IRGenerator.java: must compile

View File

@ -494,21 +494,35 @@ class IRGenerator implements ASTVisitor<Void, ExprNode> {
}
public ExprNode visit(SuffixOpNode node) {
ExprNode lhs = transformLHS(node.expr());
if (isStatement()) {
return transformOpAssign(transformLHS(node.expr()),
binOp(node.operator()),
intValue(1));
// expr++; -> expr += 1;
return transformOpAssign(lhs, binOp(node.operator()), intValue(1));
}
else if (lhs.isConstantAddress()) {
// f(expr++) -> v = expr; expr = expr + 1, f(v)
DefinedVariable v = tmpVar(lhs.type());
assignBeforeStmt(ref(v), lhs);
String op = binOp(node.operator());
assignBeforeStmt(lhs,
binaryOp(lhs,
op,
expandPointerArithmetic(intValue(1), op, lhs)));
return ref(v);
}
else {
// f(expr++) -> a = &expr, *a += 1, f(*a - 1)
// f(expr--) -> a = &expr, *a -= 1, f(*a + 1)
ExprNode addr = addressOf(transformLHS(node.expr()));
DefinedVariable tmp = tmpVar(addr.type());
// f(expr++) -> a = &expr, v = *a; *a = *a + 1, f(v)
ExprNode addr = addressOf(lhs);
DefinedVariable a = tmpVar(addr.type());
DefinedVariable v = tmpVar(lhs.type());
assignBeforeStmt(ref(a), addr);
assignBeforeStmt(ref(v), deref(a));
String op = binOp(node.operator());
assignBeforeStmt(ref(tmp), addr);
ExprNode lhs = transformOpAssign(deref(tmp), op, intValue(1));
ExprNode rhs = expandPointerArithmetic(intValue(1), op, lhs);
return binaryOp(lhs, invert(op), rhs);
assignBeforeStmt(deref(a),
binaryOp(deref(a),
op,
expandPointerArithmetic(intValue(1), op, lhs)));
return ref(v);
}
}