diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-03-14 10:17:27 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-19 08:14:53 +0100 |
commit | 44ca5f1be03420978cc8d5468c4c40dcd5174a06 (patch) | |
tree | 7d30284402d23fd448af568895a1753d64ab2a7a | |
parent | cfd3eda076e81d56f985c830663ae93317b6ef8b (diff) |
Enable constant propagation for all types
So far constant propagation was only enabled for
numbers and booleans. Enable it for all types now
and make sure the propagation does the right thing.
Change-Id: I202b0073f463d8a42e34931a736544207284b6dc
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r-- | src/qml/compiler/qv4jsir.cpp | 5 | ||||
-rw-r--r-- | src/qml/compiler/qv4ssa.cpp | 33 | ||||
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 3 |
3 files changed, 28 insertions, 13 deletions
diff --git a/src/qml/compiler/qv4jsir.cpp b/src/qml/compiler/qv4jsir.cpp index d9d0742b68..a656f4dffe 100644 --- a/src/qml/compiler/qv4jsir.cpp +++ b/src/qml/compiler/qv4jsir.cpp @@ -745,7 +745,12 @@ Expr *BasicBlock::CONST(Type type, double value) type = SInt32Type; else type = DoubleType; + } else if (type == NullType) { + value = 0; + } else if (type == UndefinedType) { + value = qSNaN(); } + e->init(type, value); return e; } diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp index ca0bbb1bb3..338041ad5d 100644 --- a/src/qml/compiler/qv4ssa.cpp +++ b/src/qml/compiler/qv4ssa.cpp @@ -2305,6 +2305,10 @@ void convertConst(Const *c, Type targetType) case BoolType: c->value = !(c->value == 0 || std::isnan(c->value)); break; + case NullType: + case UndefinedType: + c->value = qSNaN(); + c->type = targetType; default: Q_UNIMPLEMENTED(); Q_ASSERT(!"Unimplemented!"); @@ -2991,6 +2995,11 @@ private: } } + if (e1->type == IR::NullType && e2->type == IR::NullType) + return true; + if (e1->type == IR::UndefinedType && e2->type == IR::UndefinedType) + return true; + return false; } }; @@ -3116,18 +3125,20 @@ bool tryOptimizingComparison(Expr *&expr) expr = leftConst; return true; case OpStrictEqual: - if (!strictlyEqualTypes(leftConst->type, rightConst->type)) - return false; - // intentional fall-through + leftConst->value = Runtime::compareStrictEqual(&l, &r); + leftConst->type = BoolType; + expr = leftConst; + return true; case OpEqual: leftConst->value = Runtime::compareEqual(&l, &r); leftConst->type = BoolType; expr = leftConst; return true; case OpStrictNotEqual: - if (!strictlyEqualTypes(leftConst->type, rightConst->type)) - return false; - // intentional fall-through + leftConst->value = Runtime::compareStrictNotEqual(&l, &r); + leftConst->type = BoolType; + expr = leftConst; + return true; case OpNotEqual: leftConst->value = Runtime::compareNotEqual(&l, &r); leftConst->type = BoolType; @@ -3214,13 +3225,9 @@ void optimizeSSA(IR::Function *function, DefUsesCalculator &defUses, DominatorTr // constant propagation: if (Const *sourceConst = m->source->asConst()) { - if (sourceConst->type & NumberType || sourceConst->type == BoolType) { - // TODO: when propagating other constants, e.g. undefined, the other - // optimization passes have to be changed to cope with them. - W += replaceUses(targetTemp, sourceConst); - defUses.removeDef(*targetTemp); - W.clear(s); - } + W += replaceUses(targetTemp, sourceConst); + defUses.removeDef(*targetTemp); + W.clear(s); continue; } if (Member *member = m->source->asMember()) { diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index 4e644c434d..2393c9a8ca 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -338,8 +338,11 @@ Assembler::Jump Assembler::genTryDoubleConversion(IR::Expr *src, Assembler::FPRe convertUInt32ToDouble(toUInt32Register(src, Assembler::ScratchRegister), dest, Assembler::ReturnValueRegister); return Assembler::Jump(); + case IR::NullType: + case IR::UndefinedType: case IR::BoolType: // TODO? + case IR::StringType: return jump(); default: break; |