diff options
Diffstat (limited to 'src/qml/compiler/qv4ssa.cpp')
-rw-r--r-- | src/qml/compiler/qv4ssa.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp index f9acf99a65..5e2c7ba722 100644 --- a/src/qml/compiler/qv4ssa.cpp +++ b/src/qml/compiler/qv4ssa.cpp @@ -1260,6 +1260,8 @@ protected: virtual void visitMember(Member *e) { e->base->accept(this); + if (e->freeOfSideEffects) + return; markAsSideEffect(); } @@ -2514,14 +2516,22 @@ void optimizeSSA(Function *function, DefUsesCalculator &defUses) } continue; } - if (Member *potentialEnumMember = m->source->asMember()) { - if (potentialEnumMember->memberIsEnum) { + if (Member *member = m->source->asMember()) { + if (member->memberIsEnum) { Const *c = function->New<Const>(); - c->init(SInt32Type, potentialEnumMember->enumValue); + c->init(SInt32Type, member->enumValue); W += replaceUses(targetTemp, c); defUses.removeDef(*targetTemp); *ref[s] = 0; - defUses.removeUse(s, *potentialEnumMember->base->asTemp()); + defUses.removeUse(s, *member->base->asTemp()); + continue; + } else if (member->attachedPropertiesId != 0 && member->property && member->base->asTemp()) { + // Attached properties have no dependency on their base. Isel doesn't + // need it and we can eliminate the temp used to initialize it. + defUses.removeUse(s, *member->base->asTemp()); + Const *c = function->New<Const>(); + c->init(SInt32Type, 0); + member->base = c; continue; } } |