diff options
Diffstat (limited to 'llvm/lib/Transforms/Coroutines/CoroFrame.cpp')
-rw-r--r-- | llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index 9c16d3750998..1fb48419df1c 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -27,6 +27,7 @@ #include "llvm/IR/Dominators.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/InstIterator.h" +#include "llvm/IR/IntrinsicInst.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/MathExtras.h" @@ -1571,7 +1572,7 @@ static Instruction *insertSpills(const FrameDataInfo &FrameData, // Create a store instruction storing the value into the // coroutine frame. Instruction *InsertPt = nullptr; - bool NeedToCopyArgPtrValue = false; + Type *ByValTy = nullptr; if (auto *Arg = dyn_cast<Argument>(Def)) { // For arguments, we will place the store instruction right after // the coroutine frame pointer instruction, i.e. bitcast of @@ -1583,8 +1584,7 @@ static Instruction *insertSpills(const FrameDataInfo &FrameData, Arg->getParent()->removeParamAttr(Arg->getArgNo(), Attribute::NoCapture); if (Arg->hasByValAttr()) - NeedToCopyArgPtrValue = true; - + ByValTy = Arg->getParamByValType(); } else if (auto *CSI = dyn_cast<AnyCoroSuspendInst>(Def)) { // Don't spill immediately after a suspend; splitting assumes // that the suspend will be followed by a branch. @@ -1619,11 +1619,10 @@ static Instruction *insertSpills(const FrameDataInfo &FrameData, Builder.SetInsertPoint(InsertPt); auto *G = Builder.CreateConstInBoundsGEP2_32( FrameTy, FramePtr, 0, Index, Def->getName() + Twine(".spill.addr")); - if (NeedToCopyArgPtrValue) { + if (ByValTy) { // For byval arguments, we need to store the pointed value in the frame, // instead of the pointer itself. - auto *Value = - Builder.CreateLoad(Def->getType()->getPointerElementType(), Def); + auto *Value = Builder.CreateLoad(ByValTy, Def); Builder.CreateAlignedStore(Value, G, SpillAlignment); } else { Builder.CreateAlignedStore(Def, G, SpillAlignment); @@ -1641,7 +1640,7 @@ static Instruction *insertSpills(const FrameDataInfo &FrameData, auto *GEP = GetFramePointer(E.first); GEP->setName(E.first->getName() + Twine(".reload.addr")); - if (NeedToCopyArgPtrValue) + if (ByValTy) CurrentReload = GEP; else CurrentReload = Builder.CreateAlignedLoad( @@ -1664,6 +1663,12 @@ static Instruction *insertSpills(const FrameDataInfo &FrameData, } } + // Salvage debug info on any dbg.addr that we see. We do not insert them + // into each block where we have a use though. + if (auto *DI = dyn_cast<DbgAddrIntrinsic>(U)) { + coro::salvageDebugInfo(DbgPtrAllocaCache, DI, Shape.OptimizeFrame); + } + // If we have a single edge PHINode, remove it and replace it with a // reload from the coroutine frame. (We already took care of multi edge // PHINodes by rewriting them in the rewritePHIs function). @@ -2581,8 +2586,10 @@ void coro::salvageDebugInfo( DVI->replaceVariableLocationOp(OriginalStorage, Storage); DVI->setExpression(Expr); - /// It makes no sense to move the dbg.value intrinsic. - if (!isa<DbgValueInst>(DVI)) { + // We only hoist dbg.declare today since it doesn't make sense to hoist + // dbg.value or dbg.addr since they do not have the same function wide + // guarantees that dbg.declare does. + if (!isa<DbgValueInst>(DVI) && !isa<DbgAddrIntrinsic>(DVI)) { if (auto *II = dyn_cast<InvokeInst>(Storage)) DVI->moveBefore(II->getNormalDest()->getFirstNonPHI()); else if (auto *CBI = dyn_cast<CallBrInst>(Storage)) |