diff options
| author | Alina Sbirlea <asbirlea@google.com> | 2018-07-28 00:01:05 +0000 | 
|---|---|---|
| committer | Alina Sbirlea <asbirlea@google.com> | 2018-07-28 00:01:05 +0000 | 
| commit | 5666c7e4bd629bb6329cf8ac498507ef7bef673c (patch) | |
| tree | 9dbe59963f1b52fa6277b1b0d700a5b826a90b78 | |
| parent | 7bb4de47c9fc9b180d12dcd16d5d8a7e6596e432 (diff) | |
| download | bcm5719-llvm-5666c7e4bd629bb6329cf8ac498507ef7bef673c.tar.gz bcm5719-llvm-5666c7e4bd629bb6329cf8ac498507ef7bef673c.zip | |
[SimpleLoopUnswitch] Fix DT updates for trivial branch unswitching.
Summary:
Fixing 2 issues with the DT update in trivial branch switching, though I don't have a case where DT update fails.
1. After splitting ParentBB->UnswitchedBB edge, new edges become: ParentBB->LoopExitBB->UnswitchedBB, so remove ParentBB->LoopExitBB edge.
2. AFAIU, for multiple CFG changes, DT should be updated using batch updates, vs consecutive addEdge and removeEdge calls.
Reviewers: chandlerc, kuhar
Subscribers: sanjoy, jlebar, llvm-commits
Differential Revision: https://reviews.llvm.org/D49925
llvm-svn: 338180
| -rw-r--r-- | llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp | 6 | 
1 files changed, 4 insertions, 2 deletions
| diff --git a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp index 34510cb4073..5834b619046 100644 --- a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp @@ -459,9 +459,11 @@ static bool unswitchTrivialBranch(Loop &L, BranchInst &BI, DominatorTree &DT,                                                *ParentBB, *OldPH, FullUnswitch);    // Now we need to update the dominator tree. -  DT.insertEdge(OldPH, UnswitchedBB); +  SmallVector<DominatorTree::UpdateType, 2> DTUpdates; +  DTUpdates.push_back({DT.Insert, OldPH, UnswitchedBB});    if (FullUnswitch) -    DT.deleteEdge(ParentBB, UnswitchedBB); +    DTUpdates.push_back({DT.Delete, ParentBB, LoopExitBB}); +  DT.applyUpdates(DTUpdates);    // The constant we can replace all of our invariants with inside the loop    // body. If any of the invariants have a value other than this the loop won't | 

