diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2012-03-29 11:46:41 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-03 16:22:04 +0200 |
commit | 373d78837d1d5049c5b1c2790d6f4023e6ecf974 (patch) | |
tree | 0b4b78c1024d886ea0cebcdce59696c9edf90c7f /src/qml/qml/v4/qv4irbuilder.cpp | |
parent | 187fe50cf5c17a6ebf73d209866364a903ca2084 (diff) |
Fix constant folding for simple binary expression
This change improves constant folding of numeric and
string literals.
Also, we go back generating quadruples instead of
IR-tree-expressions. This is kind of needed to reduce register
pressure in the V4 VM. That is, V4 has typed registers so before
reusing a register we need to look at the type and eventually
dispose its contents (e.g. when a QString or a QUrl is stored
in the register). Unfortunately, we can't effort to have all
these checks in the V4 instructions. So we change `binop'
to generate literals (e.g. CONST or STRING) or a TEMP (aka
a preassigned register that cannot be reused).
For exmaple, the IR code generated for
Rectangle {
color: "b" + "l" + ("u" + "e")
width: 10 + 20 + 30
}
is
====================
line: 3 column: 10
L0x811ca10:
t0 = string_to_color("blue");
return t0;
====================
line: 4 column: 10
L0x811ca50:
return 60;
Change-Id: I4d8482ddab9193d8469bda6461bfb2e5a3eeb197
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src/qml/qml/v4/qv4irbuilder.cpp')
-rw-r--r-- | src/qml/qml/v4/qv4irbuilder.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/qml/qml/v4/qv4irbuilder.cpp b/src/qml/qml/v4/qv4irbuilder.cpp index b8210b863f..31ed9a5a6a 100644 --- a/src/qml/qml/v4/qv4irbuilder.cpp +++ b/src/qml/qml/v4/qv4irbuilder.cpp @@ -892,7 +892,14 @@ void QV4IRBuilder::binop(AST::BinaryExpression *ast, ExprResult left, ExprResult _expr.format = ExprResult::cx; _block->CJUMP(_block->BINOP(IR::binaryOperator(ast->op), left, right), _expr.iftrue, _expr.iffalse); } else { - _expr.code = _block->BINOP(IR::binaryOperator(ast->op), left, right); + IR::Expr *e = _block->BINOP(IR::binaryOperator(ast->op), left, right); + if (e->asConst() != 0 || e->asString() != 0) + _expr.code = e; + else { + IR::Temp *t = _block->TEMP(e->type); + _block->MOVE(t, e); + _expr.code = t; + } } } |