aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4ssa.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@me.com>2013-09-03 11:19:02 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-12 16:54:03 +0200
commitb8d0d3cbdd69291bd750912a6d8d6703a7feeb6a (patch)
treee2a82c7ab3b834e5edbe9d91a6214ed25defe64e /src/qml/compiler/qv4ssa.cpp
parent0a57d81f924a552ae115ed85b2815089fe0ecc19 (diff)
V4: fix variable collection for assignment to non-temporaries.
Change-Id: Ie1de760824d8927cf10cbc1e02145f40d812e8ee Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4ssa.cpp')
-rw-r--r--src/qml/compiler/qv4ssa.cpp30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp
index 7e9290b848..098f6eef10 100644
--- a/src/qml/compiler/qv4ssa.cpp
+++ b/src/qml/compiler/qv4ssa.cpp
@@ -423,7 +423,7 @@ public:
VariableCollector(Function *function)
: variablesCanEscape(function->variablesCanEscape())
{
-#ifdef SHOW_SSA
+#if defined(SHOW_SSA)
qout << "Variables collected:" << endl;
#endif // SHOW_SSA
@@ -436,7 +436,7 @@ public:
}
}
-#ifdef SHOW_SSA
+#if defined(SHOW_SSA)
qout << "Non-locals:" << endl;
foreach (const Temp &nonLocal, nonLocals) {
qout << "\t";
@@ -499,7 +499,7 @@ protected:
if (Temp *t = s->target->asTemp()) {
if (isCollectable(t)) {
-#ifdef SHOW_SSA
+#if defined(SHOW_SSA)
qout << '\t';
t->dump(qout);
qout << " -> L" << currentBB->index << endl;
@@ -511,6 +511,8 @@ protected:
// For semi-pruned SSA:
killed.insert(*t);
}
+ } else {
+ s->target->accept(this);
}
}
@@ -1041,15 +1043,19 @@ public:
_worklist.removeFirst();
if (_defUses.useCount(v) == 0) {
-// qDebug()<<"-"<<v<<"has no uses...";
+#if defined(SHOW_SSA)
+ qout<<"- ";v.dump(qout);qout<<" has no uses..."<<endl;
+#endif
Stmt *s = _defUses.defStmt(v);
if (!s) {
_defUses.removeDef(v);
} else if (!hasSideEffect(s)) {
-#ifdef SHOW_SSA
- qout<<"-- defining stmt for";
+#if defined(SHOW_SSA)
+ qout<<"-- defining stmt for ";
v.dump(qout);
- qout<<"has no side effect"<<endl;
+ qout<<" has no side effect: ";
+ s->dump(qout);
+ qout<<endl;
#endif
QVector<Stmt *> &stmts = _defUses.defStmtBlock(v)->statements;
int idx = stmts.indexOf(s);
@@ -1063,11 +1069,6 @@ public:
}
}
}
-
-#ifdef SHOW_SSA
- qout<<"******************* After dead-code elimination:";
- _defUses.dump();
-#endif
}
private:
@@ -2770,7 +2771,7 @@ void Optimizer::run()
// Number all basic blocks, so we have nice numbers in the dumps:
for (int i = 0; i < function->basicBlocks.size(); ++i)
function->basicBlocks[i]->index = i;
- showMeTheCode(function);
+// showMeTheCode(function);
cleanupBasicBlocks(function);
@@ -2782,6 +2783,7 @@ void Optimizer::run()
static bool doOpt = qgetenv("QV4_NO_OPT").isEmpty();
if (!function->hasTry && !function->hasWith && doSSA) {
+// qout << "SSA for " << *function->name << endl;
// qout << "Starting edge splitting..." << endl;
splitCriticalEdges(function);
// showMeTheCode(function);
@@ -2826,7 +2828,7 @@ void Optimizer::run()
checkCriticalEdges(function->basicBlocks);
#endif
-// qout << "Finished." << endl;
+// qout << "Finished SSA." << endl;
inSSA = true;
} else {
inSSA = false;