@@ -173,6 +173,7 @@ class MemoryBehaviorVisitor
173
173
174
174
MemBehavior visitLoadInst (LoadInst *LI);
175
175
MemBehavior visitStoreInst (StoreInst *SI);
176
+ MemBehavior visitCopyAddrInst (CopyAddrInst *CAI);
176
177
MemBehavior visitApplyInst (ApplyInst *AI);
177
178
MemBehavior visitTryApplyInst (TryApplyInst *AI);
178
179
MemBehavior visitBuiltinInst (BuiltinInst *BI);
@@ -243,6 +244,10 @@ MemBehavior MemoryBehaviorVisitor::visitLoadInst(LoadInst *LI) {
243
244
if (!mayAlias (LI->getOperand ()))
244
245
return MemBehavior::None;
245
246
247
+ // A take is modelled as a write. See MemoryBehavior::MayWrite.
248
+ if (LI->getOwnershipQualifier () == LoadOwnershipQualifier::Take)
249
+ return MemBehavior::MayReadWrite;
250
+
246
251
LLVM_DEBUG (llvm::dbgs () << " Could not prove that load inst does not alias "
247
252
" pointer. Returning may read.\n " );
248
253
return MemBehavior::MayRead;
@@ -266,6 +271,34 @@ MemBehavior MemoryBehaviorVisitor::visitStoreInst(StoreInst *SI) {
266
271
return MemBehavior::MayWrite;
267
272
}
268
273
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
+
269
302
MemBehavior MemoryBehaviorVisitor::visitBuiltinInst (BuiltinInst *BI) {
270
303
// If our callee is not a builtin, be conservative and return may have side
271
304
// effects.
0 commit comments