ahatanak added inline comments.

================
Comment at: llvm/lib/IR/Instruction.cpp:580
+    if (auto *CB = dyn_cast<CallBase>(this))
+      return objcarc::hasRetainRVOrClaimRVAttr(CB);
+    return false;
----------------
fhahn wrote:
> ahatanak wrote:
> > fhahn wrote:
> > > rjmccall wrote:
> > > > nikic wrote:
> > > > > This change looks pretty fishy. Objective C shouldn't be hijacking 
> > > > > LLVMs core instruction model in this way. If it writes to memory, 
> > > > > this should either be reflected in the attributes, or modeled using 
> > > > > operand bundles.
> > > > > 
> > > > > @fhahn Did you review these changes? If not, I'd suggest to revert 
> > > > > this patch and get a review on the LLVM changes.
> > > > This could definitely be an operand bundle, and I suppose the presence 
> > > > of a bundle does force a conservative assumption on passes.
> > > > @fhahn Did you review these changes? 
> > > 
> > > Nope I didn't have time to look at this so far.
> > > 
> > > <snip>
> > > 
> > > Can functions marked as `readonly`/`readnone` be called with the objc 
> > > attributes? 
> > > 
> > > I'm not very familiar with ObjC, but even for a function that just 
> > > returns a passed in object id, don't we need to retain & release the 
> > > object in the function? Which means the function cannot be `readonly` 
> > > because we need to call `@llvm.objc*` functions? If that's the case, 
> > > could we just check in the verifier that the attributes are never used 
> > > with `readonly` functions?
> > > 
> > > If there are indeed cases where we can call `readonly` functions, operand 
> > > bundles would probably be safest. It would probably also good to have at 
> > > least a few alias-analysis tests, to make sure things work as expected.
> > A function compiled using ARC can call a function compiled using MRR, which 
> > can be readonly/readnone. Also, a function compiled using ARC can be marked 
> > as readonly/readnone (if an optimization pass wants to do so) after ARC 
> > optimizer removes the retainRV/autoreleaseRV pair.
> > 
> > ```
> > define i8* @foo() {
> >   %1 = tail call i8* @readonlyMRRFunc()
> >   ; This function can be readonly if ARC optimizer removes the following 
> > two instructions.
> >   %2 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %1)
> >   %3 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %2)
> >   ret i8* 
> > }
> > ```
> > A function compiled using ARC can call a function compiled using MRR, which 
> > can be readonly/readnone
> 
> Ok, sounds like a bundle would be a good option then?
Yes. I think bundle should be used here.

I'm considering passing an integer flag, which distinguishes between retain and 
claim (e.g., 0 for retain and 1 for claim), to the bundles:

```
call i8* @foo() [ "clang.arc.rv"(i64 0) ]
```

Do you see any problems with this approach? Alternatively, we could pass the 
pointer to the runtime function (e.g., pointer to 
`@llvm.objc.retainAutoreleasedReturnValue`).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D92808/new/

https://reviews.llvm.org/D92808

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to