diff options
Diffstat (limited to 'lib/Transforms/Utils/LCSSA.cpp')
| -rw-r--r-- | lib/Transforms/Utils/LCSSA.cpp | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index a1f8e7484bcf..53d444b309d5 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -41,6 +41,7 @@  #include "llvm/IR/Dominators.h"  #include "llvm/IR/Function.h"  #include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h"  #include "llvm/IR/PredIteratorCache.h"  #include "llvm/Pass.h"  #include "llvm/Transforms/Utils.h" @@ -201,6 +202,21 @@ bool llvm::formLCSSAForInstructions(SmallVectorImpl<Instruction *> &Worklist,        SSAUpdate.RewriteUse(*UseToRewrite);      } +    SmallVector<DbgValueInst *, 4> DbgValues; +    llvm::findDbgValues(DbgValues, I); + +    // Update pre-existing debug value uses that reside outside the loop. +    auto &Ctx = I->getContext(); +    for (auto DVI : DbgValues) { +      BasicBlock *UserBB = DVI->getParent(); +      if (InstBB == UserBB || L->contains(UserBB)) +        continue; +      // We currently only handle debug values residing in blocks where we have +      // inserted a PHI instruction. +      if (Value *V = SSAUpdate.FindValueForBlock(UserBB)) +        DVI->setOperand(0, MetadataAsValue::get(Ctx, ValueAsMetadata::get(V))); +    } +      // SSAUpdater might have inserted phi-nodes inside other loops. We'll need      // to post-process them to keep LCSSA form.      for (PHINode *InsertedPN : InsertedPHIs) {  | 
