mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-14 14:24:05 +00:00
Reimplement isPotentiallyReachable to make nocapture deduction much stronger.
Adds unit tests for it too. Split BasicBlockUtils into an analysis-half and a transforms-half, and put the analysis bits into a new Analysis/CFG.{h,cpp}. Promote isPotentiallyReachable into llvm::isPotentiallyReachable and move it into Analysis/CFG. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187283 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -19,6 +19,7 @@
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Analysis/CFG.h"
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/Analysis/ProfileInfo.h"
|
||||
@ -84,39 +85,6 @@ bool BreakCriticalEdges::runOnFunction(Function &F) {
|
||||
// Implementation of the external critical edge manipulation functions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// isCriticalEdge - Return true if the specified edge is a critical edge.
|
||||
// Critical edges are edges from a block with multiple successors to a block
|
||||
// with multiple predecessors.
|
||||
//
|
||||
bool llvm::isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum,
|
||||
bool AllowIdenticalEdges) {
|
||||
assert(SuccNum < TI->getNumSuccessors() && "Illegal edge specification!");
|
||||
if (TI->getNumSuccessors() == 1) return false;
|
||||
|
||||
const BasicBlock *Dest = TI->getSuccessor(SuccNum);
|
||||
const_pred_iterator I = pred_begin(Dest), E = pred_end(Dest);
|
||||
|
||||
// If there is more than one predecessor, this is a critical edge...
|
||||
assert(I != E && "No preds, but we have an edge to the block?");
|
||||
const BasicBlock *FirstPred = *I;
|
||||
++I; // Skip one edge due to the incoming arc from TI.
|
||||
if (!AllowIdenticalEdges)
|
||||
return I != E;
|
||||
|
||||
// If AllowIdenticalEdges is true, then we allow this edge to be considered
|
||||
// non-critical iff all preds come from TI's block.
|
||||
while (I != E) {
|
||||
const BasicBlock *P = *I;
|
||||
if (P != FirstPred)
|
||||
return true;
|
||||
// Note: leave this as is until no one ever compiles with either gcc 4.0.1
|
||||
// or Xcode 2. This seems to work around the pred_iterator assert in PR 2207
|
||||
E = pred_end(P);
|
||||
++I;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// createPHIsForSplitLoopExit - When a loop exit edge is split, LCSSA form
|
||||
/// may require new PHIs in the new exit block. This function inserts the
|
||||
/// new PHIs, as needed. Preds is a list of preds inside the loop, SplitBB
|
||||
|
Reference in New Issue
Block a user