qv4: assign split of edges to loop header to the correct group
authorFawzi Mohamed <fawzi.mohamed@digia.com>
Wed, 5 Nov 2014 10:27:15 +0000 (11:27 +0100)
committerFawzi Mohamed <fawzi.mohamed@theqtcompany.com>
Wed, 5 Nov 2014 15:26:20 +0000 (16:26 +0100)
(i.e assign split edges to the correct loop group, now for real)
The fix of 25b6fae1eb26645a30b3e7e254ce0b585757351c did try fix QTBUG-41766
and simplify the logic to assign the inserted statement to a loop group.
Unfortunately that was incorrect if the target basic block starts a group.
In that case if the source was already inside the group we should add it
to the target basic block, otherwise to the one containing the target
block (as before).
There was no visible regression caused by this.

Change-Id: Id50c42305fc5ac6aedaffa89d8f8dc3b5e976aa4
Task-number: QTBUG-41766
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/compiler/qv4ssa.cpp

index 31e3ed8..d2222a0 100644 (file)
@@ -2991,7 +2991,19 @@ void splitCriticalEdges(IR::Function *f, DominatorTree &df, StatementWorklist &w
             toBB->in[inIdx] = newBB;
             newBB->out.append(toBB);
 
-            newBB->setContainingGroup(toBB->containingGroup());
+            // add newBB to the correct loop group
+            if (toBB->isGroupStart()) {
+                BasicBlock *container;
+                for (container = fromBB->containingGroup(); container; container = container->containingGroup())
+                     if (container == toBB)
+                         break;
+                if (container == toBB) // if we were already inside the toBB loop
+                    newBB->setContainingGroup(toBB);
+                else
+                    newBB->setContainingGroup(toBB->containingGroup());
+            } else {
+                newBB->setContainingGroup(toBB->containingGroup());
+            }
 
             // patch the terminator
             Stmt *terminator = fromBB->terminator();