diff options
-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; |