diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 | 
| commit | 5a5ac124e1efaf208671f01c46edb15f29ed2a0b (patch) | |
| tree | a6140557876943cdd800ee997c9317283394b22c /lib/Transforms/Utils/DemoteRegToStack.cpp | |
| parent | f03b5bed27d0d2eafd68562ce14f8b5e3f1f0801 (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Utils/DemoteRegToStack.cpp')
| -rw-r--r-- | lib/Transforms/Utils/DemoteRegToStack.cpp | 34 | 
1 files changed, 16 insertions, 18 deletions
| diff --git a/lib/Transforms/Utils/DemoteRegToStack.cpp b/lib/Transforms/Utils/DemoteRegToStack.cpp index 9972b22a07e4..003da58ee798 100644 --- a/lib/Transforms/Utils/DemoteRegToStack.cpp +++ b/lib/Transforms/Utils/DemoteRegToStack.cpp @@ -39,6 +39,19 @@ AllocaInst *llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads,                            F->getEntryBlock().begin());    } +  // We cannot demote invoke instructions to the stack if their normal edge +  // is critical. Therefore, split the critical edge and create a basic block +  // into which the store can be inserted. +  if (InvokeInst *II = dyn_cast<InvokeInst>(&I)) { +    if (!II->getNormalDest()->getSinglePredecessor()) { +      unsigned SuccNum = GetSuccessorNumber(II->getParent(), II->getNormalDest()); +      assert(isCriticalEdge(II, SuccNum) && "Expected a critical edge!"); +      BasicBlock *BB = SplitCriticalEdge(II, SuccNum); +      assert(BB && "Unable to split critical edge."); +      (void)BB; +    } +  } +    // Change all of the users of the instruction to read from the stack slot.    while (!I.use_empty()) {      Instruction *U = cast<Instruction>(I.user_back()); @@ -71,7 +84,6 @@ AllocaInst *llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads,      }    } -    // Insert stores of the computed value into the stack slot. We have to be    // careful if I is an invoke instruction, because we can't insert the store    // AFTER the terminator instruction. @@ -79,27 +91,13 @@ AllocaInst *llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads,    if (!isa<TerminatorInst>(I)) {      InsertPt = &I;      ++InsertPt; +    for (; isa<PHINode>(InsertPt) || isa<LandingPadInst>(InsertPt); ++InsertPt) +      /* empty */;   // Don't insert before PHI nodes or landingpad instrs.    } else {      InvokeInst &II = cast<InvokeInst>(I); -    if (II.getNormalDest()->getSinglePredecessor()) -      InsertPt = II.getNormalDest()->getFirstInsertionPt(); -    else { -      // We cannot demote invoke instructions to the stack if their normal edge -      // is critical.  Therefore, split the critical edge and insert the store -      // in the newly created basic block. -      unsigned SuccNum = GetSuccessorNumber(I.getParent(), II.getNormalDest()); -      TerminatorInst *TI = &cast<TerminatorInst>(I); -      assert (isCriticalEdge(TI, SuccNum) && -              "Expected a critical edge!"); -      BasicBlock *BB = SplitCriticalEdge(TI, SuccNum); -      assert (BB && "Unable to split critical edge."); -      InsertPt = BB->getFirstInsertionPt(); -    } +    InsertPt = II.getNormalDest()->getFirstInsertionPt();    } -  for (; isa<PHINode>(InsertPt) || isa<LandingPadInst>(InsertPt); ++InsertPt) -    /* empty */;   // Don't insert before PHI nodes or landingpad instrs. -    new StoreInst(&I, Slot, InsertPt);    return Slot;  } | 
