diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-05-14 14:44:27 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-06-13 10:29:33 +0200 |
commit | d74927cf5d6b6601e9ac01c22475c2cbe07f1a0e (patch) | |
tree | 1e67e34da64e87adf1f615d9b9bafa8bec38ece4 /src/qml/compiler/qv4jsir.cpp | |
parent | cb0a47a48d5dc0ce4f5e8cfa68a39cd4cbfde11c (diff) |
V4 RegAlloc: change life-time intervals from closed to half-open.
There are two changes in this patch, that go hand-in-hand. First, when
re-numbering the statements in order of occurrence in the scheduled
basic-blocks, the (new) position is not stored in the statement itself,
but in the LifeTimeIntervals class. This makes it possible to re-use
information gathered during SSA formation or optimization.
The re-numbering itself has also changed, resulting in some minor
changes to the life-time interval calculation. The new numbering
is described in LifeTimeIntervals::renumber(). The reason is to make it
easy for the register allocator and stack-slot allocator to distinguish
between definition of a temporary and its uses. Example:
20: %3 = %2 + %1
22: print(%3)
If the life-time of %2 or %1 ends at 20, then at the point that %3 gets
assigned, it can re-use the storage occupied by %1 or %2. Also, when
both %1 and %2 need to get a register assigned (because they were
spilled to the stack, for example), %3 should be allocated "after" both
%1 and %2. So, instead of having a closed interval of [20-22] for %3, we
want to use an open interval of (20-22]. To simulate the "open" part, the
life-time of %3 is set to [21-22]. So, all statements live on even
positions, and temporaries defined by a statement start at
statmentPosition + 1.
Change-Id: I0eda2c653b0edf1a529bd0762d338b0ea9a66aa0
Sanity-Review: Qt Sanity Bot <qt_sanitybot@qt-project.org>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4jsir.cpp')
-rw-r--r-- | src/qml/compiler/qv4jsir.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/qml/compiler/qv4jsir.cpp b/src/qml/compiler/qv4jsir.cpp index 6b309cc282..9a1a8bab42 100644 --- a/src/qml/compiler/qv4jsir.cpp +++ b/src/qml/compiler/qv4jsir.cpp @@ -956,8 +956,7 @@ void IRPrinter::print(BasicBlock *bb) QTextStream os(&buf); QTextStream *prevOut = &os; std::swap(out, prevOut); - if (s->id() >= 0) - *out << s->id() << ": "; + addStmtNr(s); s->accept(this); if (s->location.isValid()) { out->flush(); @@ -1226,6 +1225,12 @@ QString IRPrinter::escape(const QString &s) return r; } +void IRPrinter::addStmtNr(Stmt *s) +{ + if (s->id() >= 0) + *out << s->id() << ": "; +} + QString IRPrinter::dumpStart(const Expr *e) { if (e->type == UnknownType) |