diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2017-04-06 15:42:51 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2017-04-18 07:53:48 +0000 |
commit | 8d0d1b11e381130dec12f46b959c3107c3f47160 (patch) | |
tree | 584d150a9304add12e411aff1adba88f923e34d2 /src/qmldevtools | |
parent | 671ada303aaa16228511eee8032778fea0b84915 (diff) |
V4: Fix issues with very small loops5.8
Loops consisting of just a single basic block (e.g. a do-while loop with
no nested loops or if statements) have a back-edge to themselves. There
were 2 problems:
- loop detection would create LoopInfo for any loop header referred to
by blocks inside the loop (and a 1 block loop doesn't have body
blocks), nor would it mark the loop header as such
- when splitting critical edges, the newly inserted block would not be
marked as part of the loop
This is a problem specifically for 1 block loops: the block ends with
a CJUMP, so the back-edge is a critical edge. So the new block inserted
by edge splitting wouldn't be marked as belonging to the loop.
The end result was that the life-time intervals for temporaries that
are defined before the loop, but that are used inside the loop, and not
after the loop, would have their life-time ended before the loop ends
(instead of spanning the whole loop, *including* the back-edge). This
in turns could lead to the stack/register allocator re-using the storage
for that temporary, resulting in strange things happening.
Task-number: QTBUG-59012
Change-Id: Ic946c73913711272efea2151cb85350412ca2fde
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qmldevtools')
0 files changed, 0 insertions, 0 deletions