mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
[LCSSA] Handle PHI insertion in disjoint loops
Take two disjoint Loops L1 and L2. LoopSimplify fails to simplify some loops (e.g. when indirect branches are involved). In such situations, it can happen that an exit for L1 is the header of L2. Thus, when we create PHIs in one of such exits we are also inserting PHIs in L2 header. This could break LCSSA form for L2 because these inserted PHIs can also have uses in L2 exits, which are never handled in the current implementation. Provide a fix for this corner case and test that we don't assert/crash on that. Differential Revision: http://reviews.llvm.org/D6624 rdar://problem/19166231 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224740 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -49,7 +49,8 @@ bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, Pass *PP,
|
||||
/// If ScalarEvolution is passed in, it will be preserved.
|
||||
///
|
||||
/// Returns true if any modifications are made to the loop.
|
||||
bool formLCSSA(Loop &L, DominatorTree &DT, ScalarEvolution *SE = nullptr);
|
||||
bool formLCSSA(Loop &L, DominatorTree &DT, LoopInfo *LI,
|
||||
ScalarEvolution *SE = nullptr);
|
||||
|
||||
/// \brief Put a loop nest into LCSSA form.
|
||||
///
|
||||
@ -60,7 +61,7 @@ bool formLCSSA(Loop &L, DominatorTree &DT, ScalarEvolution *SE = nullptr);
|
||||
/// If ScalarEvolution is passed in, it will be preserved.
|
||||
///
|
||||
/// Returns true if any modifications are made to the loop.
|
||||
bool formLCSSARecursively(Loop &L, DominatorTree &DT,
|
||||
bool formLCSSARecursively(Loop &L, DominatorTree &DT, LoopInfo *LI,
|
||||
ScalarEvolution *SE = nullptr);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user