From bbbbfc06a053896a335161c9aa41bee93048daba Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 16 Dec 2014 11:40:24 +0100 Subject: V4: fix reverse type propagation Only do integer add/sub/mul when all operands are known to be integers. [ChangeLog][QtQml] Fixed invalidly opportunistic truncating of non-integer values for additions/subtractions/multiplications in JavaScript and binding expressions. Change-Id: I21b3bede2fb3e8033305591110b98cc9e6bf52f8 Reviewed-by: Simon Hausmann --- src/qml/compiler/qv4ssa.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'src/qml/compiler/qv4ssa.cpp') diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp index 8b218492a9..5861138dbe 100644 --- a/src/qml/compiler/qv4ssa.cpp +++ b/src/qml/compiler/qv4ssa.cpp @@ -2562,17 +2562,21 @@ public: } else if (m->source->asConvert()) { break; } else if (Binop *b = m->source->asBinop()) { + bool iterateOnOperands = true; + switch (b->op) { + case OpSub: + case OpMul: case OpAdd: - if (b->left->type & NumberType || b->right->type & NumberType) + if (b->left->type == SInt32Type && b->right->type == SInt32Type) { + iterateOnOperands = false; break; - else + } else { continue; + } case OpBitAnd: case OpBitOr: case OpBitXor: - case OpSub: - case OpMul: case OpLShift: case OpRShift: case OpURShift: @@ -2580,10 +2584,13 @@ public: default: continue; } - if (Temp *lt = b->left->asTemp()) - candidates.append(*lt); - if (Temp *rt = b->right->asTemp()) - candidates.append(*rt); + + if (iterateOnOperands) { + if (Temp *lt = b->left->asTemp()) + candidates.append(*lt); + if (Temp *rt = b->right->asTemp()) + candidates.append(*rt); + } } else if (Unop *u = m->source->asUnop()) { if (u->op == OpCompl || u->op == OpUPlus) { if (Temp *t = u->expr->asTemp()) -- cgit v1.2.3