aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/compiler/qv4jsir.cpp6
-rw-r--r--src/qml/compiler/qv4jsir_p.h6
-rw-r--r--src/qml/compiler/qv4ssa.cpp27
3 files changed, 19 insertions, 20 deletions
diff --git a/src/qml/compiler/qv4jsir.cpp b/src/qml/compiler/qv4jsir.cpp
index fcaf1a0321..aea696dcda 100644
--- a/src/qml/compiler/qv4jsir.cpp
+++ b/src/qml/compiler/qv4jsir.cpp
@@ -581,11 +581,11 @@ void Phi::dump(QTextStream &out, Stmt::Mode mode)
{
targetTemp->dump(out);
out << " = phi(";
- for (int i = 0, ei = incoming.size(); i < ei; ++i) {
+ for (int i = 0, ei = d->incoming.size(); i < ei; ++i) {
if (i > 0)
out << ", ";
- if (incoming[i])
- incoming[i]->dump(out);
+ if (d->incoming[i])
+ d->incoming[i]->dump(out);
}
out << ");";
}
diff --git a/src/qml/compiler/qv4jsir_p.h b/src/qml/compiler/qv4jsir_p.h
index 4b716fc2ac..d322ea8a96 100644
--- a/src/qml/compiler/qv4jsir_p.h
+++ b/src/qml/compiler/qv4jsir_p.h
@@ -523,10 +523,7 @@ struct Stmt {
};
struct Data {
- QVector<unsigned> uses;
- QVector<unsigned> defs;
- QBitArray liveIn;
- QBitArray liveOut;
+ QVector<Expr *> incoming; // used by Phi nodes
};
Data *d;
@@ -661,7 +658,6 @@ struct Try: Stmt {
struct Phi: Stmt {
Temp *targetTemp;
- QVector<Expr *> incoming;
virtual void accept(StmtVisitor *v) { v->visitPhi(this); }
virtual Phi *asPhi() { return this; }
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp
index a139ed9fff..d0583e36c7 100644
--- a/src/qml/compiler/qv4ssa.cpp
+++ b/src/qml/compiler/qv4ssa.cpp
@@ -524,15 +524,16 @@ void insertPhiNode(const Temp &a, BasicBlock *y, Function *f) {
#endif
Phi *phiNode = f->New<Phi>();
+ phiNode->d = new Stmt::Data;
phiNode->targetTemp = f->New<Temp>();
phiNode->targetTemp->init(a.kind, a.index, 0);
y->statements.prepend(phiNode);
- phiNode->incoming.resize(y->in.size());
+ phiNode->d->incoming.resize(y->in.size());
for (int i = 0, ei = y->in.size(); i < ei; ++i) {
Temp *t = f->New<Temp>();
t->init(a.kind, a.index, 0);
- phiNode->incoming[i] = t;
+ phiNode->d->incoming[i] = t;
}
}
@@ -652,7 +653,7 @@ public:
Q_ASSERT(j >= 0 && j < Y->in.size());
foreach (Stmt *s, Y->statements) {
if (Phi *phi = s->asPhi()) {
- Temp *t = phi->incoming[j]->asTemp();
+ Temp *t = phi->d->incoming[j]->asTemp();
unsigned newTmp = stack[*t].top();
// qDebug()<<"I: replacing phi use"<<a<<"with"<<newTmp<<"in L"<<Y->index;
t->index = newTmp;
@@ -913,7 +914,7 @@ protected:
virtual void visitPhi(Phi *s) {
addDef(s->targetTemp);
- foreach (Expr *e, s->incoming)
+ foreach (Expr *e, s->d->incoming)
addUse(e->asTemp());
}
@@ -990,6 +991,7 @@ void cleanupPhis(DefUsesCalculator &defUses)
BasicBlock *bb = defUses.defStmtBlock(targetVar);
int idx = bb->statements.indexOf(phi);
+ bb->statements[idx]->destroyData();
bb->statements.remove(idx);
foreach (const Temp &usedVar, defUses.usedVars(phi))
@@ -1376,9 +1378,9 @@ protected:
virtual void visitRet(Ret *s) { _ty = run(s->expr); }
virtual void visitTry(Try *s) { setType(s->exceptionVar, ObjectType); _ty = TypingResult(MissingType); }
virtual void visitPhi(Phi *s) {
- _ty = run(s->incoming[0]);
- for (int i = 1, ei = s->incoming.size(); i != ei; ++i) {
- TypingResult ty = run(s->incoming[i]);
+ _ty = run(s->d->incoming[0]);
+ for (int i = 1, ei = s->d->incoming.size(); i != ei; ++i) {
+ TypingResult ty = run(s->d->incoming[i]);
_ty.type |= ty.type;
_ty.fullyTyped &= ty.fullyTyped;
}
@@ -1549,7 +1551,7 @@ protected:
virtual void visitTry(Try *) {}
virtual void visitPhi(Phi *s) {
Type ty = s->targetTemp->type;
- foreach (Expr *e, s->incoming)
+ foreach (Expr *e, s->d->incoming)
if (e->asConst())
run(e, ty);
}
@@ -1896,7 +1898,7 @@ private:
foreach (Stmt *s, successor->statements) {
if (Phi *phi = s->asPhi()) {
- if (Temp *t = phi->incoming[bbIndex]->asTemp())
+ if (Temp *t = phi->d->incoming[bbIndex]->asTemp())
live.insert(*t);
} else {
break;
@@ -2080,8 +2082,9 @@ void Optimizer::convertOutOfSSA() {
Stmt *s = stmts.first();
if (Phi *phi = s->asPhi()) {
stmts.removeFirst();
- for (int i = 0, ei = phi->incoming.size(); i != ei; ++i)
- insertMove(function, bb->in[i], phi->targetTemp, phi->incoming[i]);
+ for (int i = 0, ei = phi->d->incoming.size(); i != ei; ++i)
+ insertMove(function, bb->in[i], phi->targetTemp, phi->d->incoming[i]);
+ phi->destroyData();
} else {
break;
}
@@ -2099,7 +2102,7 @@ QList<Optimizer::SSADeconstructionMove> Optimizer::ssaDeconstructionMoves(BasicB
foreach (Stmt *s, outEdge->statements) {
if (Phi *phi = s->asPhi()) {
SSADeconstructionMove m;
- m.source = phi->incoming[inIdx];
+ m.source = phi->d->incoming[inIdx];
m.target = phi->targetTemp;
moves.append(m);
} else {