diff options
Diffstat (limited to 'contrib/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp')
| -rw-r--r-- | contrib/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp | 26 | 
1 files changed, 22 insertions, 4 deletions
diff --git a/contrib/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp b/contrib/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp index 018439018553..0af14ed17bf6 100644 --- a/contrib/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -147,7 +147,7 @@ bool CodeGenPrepare::runOnFunction(Function &F) {    if (!DisableBranchOpts) {      MadeChange = false;      for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) -      MadeChange |= ConstantFoldTerminator(BB); +      MadeChange |= ConstantFoldTerminator(BB, true);      if (MadeChange)        ModifiedDT = true; @@ -371,9 +371,11 @@ static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI){    // If these values will be promoted, find out what they will be promoted    // to.  This helps us consider truncates on PPC as noop copies when they    // are. -  if (TLI.getTypeAction(SrcVT) == TargetLowering::Promote) +  if (TLI.getTypeAction(CI->getContext(), SrcVT) == +      TargetLowering::TypePromoteInteger)      SrcVT = TLI.getTypeToTransformTo(CI->getContext(), SrcVT); -  if (TLI.getTypeAction(DstVT) == TargetLowering::Promote) +  if (TLI.getTypeAction(CI->getContext(), DstVT) == +      TargetLowering::TypePromoteInteger)      DstVT = TLI.getTypeToTransformTo(CI->getContext(), DstVT);    // If, after promotion, these are the same types, this is a noop copy. @@ -548,7 +550,23 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI) {    // From here on out we're working with named functions.    if (CI->getCalledFunction() == 0) return false; -   + +  // llvm.dbg.value is far away from the value then iSel may not be able +  // handle it properly. iSel will drop llvm.dbg.value if it can not  +  // find a node corresponding to the value. +  if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(CI)) +    if (Instruction *VI = dyn_cast_or_null<Instruction>(DVI->getValue())) +      if (!VI->isTerminator() && +          (DVI->getParent() != VI->getParent() || DT->dominates(DVI, VI))) { +        DEBUG(dbgs() << "Moving Debug Value before :\n" << *DVI << ' ' << *VI); +        DVI->removeFromParent(); +        if (isa<PHINode>(VI)) +          DVI->insertBefore(VI->getParent()->getFirstNonPHI()); +        else +          DVI->insertAfter(VI); +        return true; +      } +    // We'll need TargetData from here on out.    const TargetData *TD = TLI ? TLI->getTargetData() : 0;    if (!TD) return false;  | 
