V4 regalloc: do not overwrite register availability in hole.
authorErik Verbruggen <erik.verbruggen@me.com>
Tue, 27 Aug 2013 13:10:51 +0000 (15:10 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 28 Aug 2013 18:22:02 +0000 (20:22 +0200)
When a fixed interval for a register is inactive, the register is free
until that interval becomes active, or (and this was missing), until
another interval uses it before that position. So instead of blindly
overwriting the freeUntilPos, take the qMin of the existing one with
the intersection position.

Change-Id: I2730a748ef1e46b4782fbb9814e800eca52172f0
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/compiler/qv4regalloc.cpp

index d2f2fe3..ddac257 100644 (file)
@@ -1312,7 +1312,7 @@ void RegisterAllocator::tryAllocateFreeReg(LifeTimeInterval &current, const int
             if (it.isFP() == needsFPReg && it.reg() != LifeTimeInterval::Invalid) {
                 const int intersectionPos = nextIntersection(current, it, position);
                 if (!isPhiTarget && it.isFixedInterval() && current.end() == intersectionPos)
-                    freeUntilPos[it.reg()] = intersectionPos + 1;
+                    freeUntilPos[it.reg()] = qMin(freeUntilPos[it.reg()], intersectionPos + 1);
                 else if (intersectionPos != -1)
                     freeUntilPos[it.reg()] = qMin(freeUntilPos[it.reg()], intersectionPos);
             }