diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopRotation.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopRotation.cpp b/llvm/lib/Transforms/Scalar/LoopRotation.cpp index 214f41790f9..a27a314cac5 100644 --- a/llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ b/llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -111,6 +111,40 @@ static void RewriteUsesOfClonedInstructions(BasicBlock *OrigHeader, // Anything else can be handled by SSAUpdater. SSA.RewriteUse(U); } + + // Replace MetadataAsValue(ValueAsMetadata(OrigHeaderVal)) uses in debug + // intrinsics. + LLVMContext &C = OrigHeader->getContext(); + if (auto *VAM = ValueAsMetadata::getIfExists(OrigHeaderVal)) { + if (auto *MAV = MetadataAsValue::getIfExists(C, VAM)) { + for (auto UI = MAV->use_begin(), E = MAV->use_end(); UI != E; ) { + // Grab the use before incrementing the iterator. Otherwise, altering + // the Use will invalidate the iterator. + Use &U = *UI++; + DbgInfoIntrinsic *UserInst = dyn_cast<DbgInfoIntrinsic>(U.getUser()); + if (!UserInst) continue; + + // The original users in the OrigHeader are already using the original + // definitions. + BasicBlock *UserBB = UserInst->getParent(); + if (UserBB == OrigHeader) + continue; + + // Users in the OrigPreHeader need to use the value to which the + // original definitions are mapped and anything else can be handled by + // the SSAUpdater. To avoid adding PHINodes, check if the value is + // available in UserBB, if not substitute undef. + Value *NewVal; + if (UserBB == OrigPreheader) + NewVal = OrigPreHeaderVal; + else if (SSA.HasValueForBlock(UserBB)) + NewVal = SSA.GetValueInMiddleOfBlock(UserBB); + else + NewVal = UndefValue::get(OrigHeaderVal->getType()); + U = MetadataAsValue::get(C, ValueAsMetadata::get(NewVal)); + } + } + } } } |

