aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-08-08 16:05:54 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2014-08-13 12:53:11 +0200
commitd6a79aa6b06726d19d231d1da3ecb5b6509f0f1a (patch)
treebf8be13ad49f5d2c8eb3884f2ddf16a957d52c7e /src/qml/jit
parent39b51e1d61399ab896219fe6cd4b2028aca9c069 (diff)
V4 RegAlloc: fix callee saved register range handling
This makes sure that the index of the fixed(FP)RegisterRanges matches the indexes for normal-/fpRegisters, because this index is used to check if a chosen register intersects with a fixed (= caller saved) register at call sites. Change-Id: Ie31554dbe8ed99cb38ca6b2506da663be41d82f6 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jit')
-rw-r--r--src/qml/jit/qv4regalloc.cpp34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/qml/jit/qv4regalloc.cpp b/src/qml/jit/qv4regalloc.cpp
index 50f35e3db5..588b6d9707 100644
--- a/src/qml/jit/qv4regalloc.cpp
+++ b/src/qml/jit/qv4regalloc.cpp
@@ -1350,24 +1350,26 @@ void RegisterAllocator::prepareRanges()
ltiWithCalls.addRange(callPosition, callPosition);
const int regCount = _normalRegisters.size();
- _fixedRegisterRanges.reserve(regCount);
+ _fixedRegisterRanges.resize(regCount);
for (int reg = 0; reg < regCount; ++reg) {
if (_normalRegisters.at(reg)->isCallerSaved()) {
LifeTimeInterval *lti = cloneFixedInterval(reg, false, ltiWithCalls);
- _fixedRegisterRanges.append(lti);
- if (lti->isValid())
+ if (lti->isValid()) {
+ _fixedRegisterRanges[reg] = lti;
_active.append(lti);
+ }
}
}
const int fpRegCount = _fpRegisters.size();
- _fixedFPRegisterRanges.reserve(fpRegCount);
+ _fixedFPRegisterRanges.resize(fpRegCount);
for (int fpReg = 0; fpReg < fpRegCount; ++fpReg) {
if (_fpRegisters.at(fpReg)->isCallerSaved()) {
LifeTimeInterval *lti = cloneFixedInterval(fpReg, true, ltiWithCalls);
- _fixedFPRegisterRanges.append(lti);
- if (lti->isValid())
+ if (lti->isValid()) {
+ _fixedFPRegisterRanges[fpReg] = lti;
_active.append(lti);
+ }
}
}
}
@@ -1681,16 +1683,18 @@ void RegisterAllocator::allocateBlockedReg(LifeTimeInterval &current)
splitInactiveAtEndOfLifetimeHole(reg, needsFPReg, position);
// make sure that current does not intersect with the fixed interval for reg
- const LifeTimeInterval &fixedRegRange = needsFPReg ? *_fixedFPRegisterRanges.at(reg)
- : *_fixedRegisterRanges.at(reg);
- int ni = nextIntersection(current, fixedRegRange);
- if (ni != -1) {
- if (DebugRegAlloc) {
- QTextStream out(stderr, QIODevice::WriteOnly);
- out << "***-- current range intersects with a fixed reg use at " << ni << ", so splitting it." << endl;
+ const LifeTimeInterval *fixedRegRange = needsFPReg ? _fixedFPRegisterRanges.at(reg)
+ : _fixedRegisterRanges.at(reg);
+ if (fixedRegRange) {
+ int ni = nextIntersection(current, *fixedRegRange);
+ if (ni != -1) {
+ if (DebugRegAlloc) {
+ QTextStream out(stderr, QIODevice::WriteOnly);
+ out << "***-- current range intersects with a fixed reg use at " << ni << ", so splitting it." << endl;
+ }
+ // current does overlap with a fixed interval, so split current before that intersection.
+ split(current, ni, true);
}
- // current does overlap with a fixed interval, so split current before that intersection.
- split(current, ni, true);
}
}