diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2017-02-03 15:42:08 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-02-04 12:03:00 +0000 |
commit | 04c98022d934b5ba0a6492e3556416386ce5d70e (patch) | |
tree | 120418ee3e945518f97fd5b709a4cfef6e9be947 /src/qml/compiler/qv4jsir_p.h | |
parent | bf19d3294f83fc061eddc719bc608bb19e500a5a (diff) |
Fix move ordering while resolving edges in register allocation
When register allocation on an IR in SSA form is done, the last step is
to turn the Phi nodes into moves and swaps and put those instructions in
the predecessors. As the Phi nodes are conceptually "executed in
parallel", this can result in cycles:
r1 <- r0
r0 <- r1
These have to be turned into a swap instruction. Also, the moves have to
be ordered in order to make sure that no values are overwritten:
r1 <- r0
r2 <- r1
Here the two moves need to be switched. The comments in the code
document the algorithm.
Change-Id: I4151988681f7554b00a3eb70d224e6e2f29ebf04
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4jsir_p.h')
-rw-r--r-- | src/qml/compiler/qv4jsir_p.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/qml/compiler/qv4jsir_p.h b/src/qml/compiler/qv4jsir_p.h index 73aa6c4975..a614d3fe1c 100644 --- a/src/qml/compiler/qv4jsir_p.h +++ b/src/qml/compiler/qv4jsir_p.h @@ -507,6 +507,16 @@ struct Q_AUTOTEST_EXPORT Temp: Expr { , memberResolver(0) {} + Temp(Type type, Kind kind, unsigned index) + : Expr(TempExpr) + , index(index) + , isReadOnly(0) + , kind(kind) + , memberResolver(0) + { + this->type = type; + } + void init(unsigned kind, unsigned index) { this->index = index; |