@@ -173,6 +173,7 @@ class MemoryBehaviorVisitor
173173
174174 MemBehavior visitLoadInst (LoadInst *LI);
175175 MemBehavior visitStoreInst (StoreInst *SI);
176+ MemBehavior visitCopyAddrInst (CopyAddrInst *CAI);
176177 MemBehavior visitApplyInst (ApplyInst *AI);
177178 MemBehavior visitTryApplyInst (TryApplyInst *AI);
178179 MemBehavior visitBuiltinInst (BuiltinInst *BI);
@@ -243,6 +244,10 @@ MemBehavior MemoryBehaviorVisitor::visitLoadInst(LoadInst *LI) {
243244 if (!mayAlias (LI->getOperand ()))
244245 return MemBehavior::None;
245246
247+ // A take is modelled as a write. See MemoryBehavior::MayWrite.
248+ if (LI->getOwnershipQualifier () == LoadOwnershipQualifier::Take)
249+ return MemBehavior::MayReadWrite;
250+
246251 LLVM_DEBUG (llvm::dbgs () << " Could not prove that load inst does not alias "
247252 " pointer. Returning may read.\n " );
248253 return MemBehavior::MayRead;
@@ -266,6 +271,34 @@ MemBehavior MemoryBehaviorVisitor::visitStoreInst(StoreInst *SI) {
266271 return MemBehavior::MayWrite;
267272}
268273
274+ MemBehavior MemoryBehaviorVisitor::visitCopyAddrInst (CopyAddrInst *CAI) {
275+ // If it's an assign to the destination, a destructor might be called on the
276+ // old value. This can have any side effects.
277+ // We could also check if it's a trivial type (which cannot have any side
278+ // effect on destruction), but such copy_addr instructions are optimized to
279+ // load/stores anyway, so it's probably not worth it.
280+ if (!CAI->isInitializationOfDest ())
281+ return MemBehavior::MayHaveSideEffects;
282+
283+ bool mayWrite = mayAlias (CAI->getDest ());
284+ bool mayRead = mayAlias (CAI->getSrc ());
285+
286+ if (mayRead) {
287+ if (mayWrite)
288+ return MemBehavior::MayReadWrite;
289+
290+ // A take is modelled as a write. See MemoryBehavior::MayWrite.
291+ if (CAI->isTakeOfSrc ())
292+ return MemBehavior::MayReadWrite;
293+
294+ return MemBehavior::MayRead;
295+ }
296+ if (mayWrite)
297+ return MemBehavior::MayWrite;
298+
299+ return MemBehavior::None;
300+ }
301+
269302MemBehavior MemoryBehaviorVisitor::visitBuiltinInst (BuiltinInst *BI) {
270303 // If our callee is not a builtin, be conservative and return may have side
271304 // effects.
0 commit comments